PICを少し便利に使うアセンブラマクロ

はてブ数 2007/10/02デバイス

PICを初めてさわってみたんですが、アセンブラが癖ありますね。x86(やZ80)に慣れた人間には少々使いにくいのでマクロ集を作ってみました。あまり大がかりにならず、適当な規模にしてあります。

PICマクロ集

マクロ集

利用は用途を問わず自由にどうぞ。

マクロW保存機能
bank0bank0に切り替え
bank1bank1に切り替え
bank2bank2に切り替え
bank3bank3に切り替え
mov reg,reg2×reg ← reg2
movi reg,imm×reg ← imm
and reg,reg2×reg ← reg and reg2
andi reg,imm×reg ← reg and imm
test reg,reg2×w ← reg and reg2
testi reg,imm×w ← reg and imm
or reg,reg2×reg ← reg or reg2
ori reg,imm×reg ← reg or imm
xor reg,reg2×reg ← reg xor reg2
xori reg,imm×reg ← reg xor imm
add reg,reg2×reg ← reg + reg2
addi reg,imm×reg ← reg + imm
sub reg,reg2×reg ← reg - reg2
subi reg,imm×reg ← reg - imm
cmp reg,reg2×w ← reg - reg2
cmpi reg,imm×w ← reg - imm
xor reg,reg2×reg ← reg xor reg2
xori reg,imm×reg ← reg xor imm
jz labelif (zero) goto label
jnz labelif (non zero) goto label
ja labelif (a>b) goto label
jae labelif (a>=b) goto label
jb labelif (a<b) goto label
jbe labelif (a<=b) goto label
  • reg … レジスタファイル
  • imm … 即値
  • label … ラベル

注意

  • mov と movi、and と andi のように第2オペランドをレジスタ/即値で書き分けますが、互いに書き間違えてもアセンブルは通過してしまうのでご注意ください。
  • マクロは1命令ではないので、btfsc などで「次の1命令を飛ばす」を併用する場合は特にご注意ください。

条件分岐(jxx)の使用例

cmpi MEM0, h'20'  ; W = MEMO - 20h
ja   LABEL        ; if (MEMO > 20h) goto LABEL

メモ