MPASM Technic – マクロ

個人の好みとなりますが、アセンブラコード中でどうしても使いづらい部分がいくつかあり、一部マクロで対応しています。

マクロは基本的に以下のよう書式です。

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)は中断

カテゴリー: MPASM, PIC, PIC18F, PIC18F46K40, PIC18FxxK40 パーマリンク