個人の好みとなりますが、アセンブラコード中でどうしても使いづらい部分がいくつかあり、一部マクロで対応しています。
マクロは基本的に以下のよう書式です。
Label macro param1 {, param2…}
local locallabel
locallabel
endm
PICのアセンブラでは、いくつかの擬似命令(アセンブラがコードに置き換える命令)を持っていますが、これが少なく不便です。
たとえば、キャリービット操作の場合、ステータスレジスタアドレスとビット位置を指定するのですが以下のようにマクロにしています。
;
; Set Carry bit
;
setc macro
bsf STATUS, C ; Clear Carry
endm
;
; Clear Carry bit Subの場合CarryでなくBorrowであることに注意
;
clrc macro
bcf STATUS, C ; Set Carry
endm
; change CY
chgc macro
btg STATUS, C ; Exchange Carry
endm
また、CMP比較なども、どうしても理解に頭を使うためマクロ化して可読性をあげています。
; Compare Wreg=Fs then Branch
cmpeq macro fAdrs, jAdrs
local skipAdrs
cpfseq fAdrs
bra skipAdrs
bra jAdrs
skipAdrs
endm
; Compare Wreg<>Fs then Branch
cmpneq macro fAdrs, jAdrs
cpfseq fAdrs
bra jAdrs
endm
; Compare Wreg<=Fs then Branch
cmple macro fAdrs, jAdrs
cpfslt fAdrs ; skipnext if f<W
bra jAdrs
endm
; Compare Wreg>=Fs then Branch
cmpge macro fAdrs, jAdrs
cpfsgt fAdrs ; skipnext if f>W
bra jAdrs
endm
; Value(Literal) to Wreg
; Compare Wreg=Fs then Branch
cmpleq macro value, fAdrs, jAdrs
local skipAdrs
movlw value
cpfseq fAdrs
bra skipAdrs
bra jAdrs
skipAdrs
endm
使用例
Wregはリテラル値が入る。比較データはTOSLに入れる。
cmpleq 0x01, TOSL, RcvSOH ; SOH(01)は開始
cmpleq 0x04, TOSL, RcvEOT ; EOT(04)は終了
cmpleq 0x18, TOSL, RcvCAN ; CAN(18)は中断