PICを少し便利に使うアセンブラマクロ
PICを初めてさわってみたんですが、アセンブラが癖ありますね。x86(やZ80)に慣れた人間には少々使いにくいのでマクロ集を作ってみました。あまり大がかりにならず、適当な規模にしてあります。
PICマクロ集
利用は用途を問わず自由にどうぞ。
| マクロ | W保存 | 機能 |
|---|---|---|
| bank0 | ○ | bank0に切り替え |
| bank1 | ○ | bank1に切り替え |
| bank2 | ○ | bank2に切り替え |
| bank3 | ○ | bank3に切り替え |
| 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 label | ○ | if (zero) goto label |
| jnz label | ○ | if (non zero) goto label |
| ja label | ○ | if (a>b) goto label |
| jae label | ○ | if (a>=b) goto label |
| jb label | ○ | if (a<b) goto label |
| jbe label | ○ | if (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
メモ
- PIC入門 … PICニモニック一覧