;====================================================================
; Macros to create variables in RAM
;
ByteAddr SET 32 ; user RAM starts here
BYTE MACRO ByteName
ByteName EQU ByteAddr
ByteAddr SET ByteAddr+1
ENDM
WORD MACRO WordName
WordName EQU ByteAddr
ByteAddr SET ByteAddr+2
ENDM
LONG MACRO LongName
LongName EQU ByteAddr
ByteAddr SET ByteAddr+4
ENDM
;====================================================================
; 16 bit macros (Big-Endian)
;
mov16 MACRO src,dst
movf src,w
movwf dst
movf src+1,w
movwf dst+1
ENDM
movi16 MACRO lit,dst
movlw HIGH(lit)
movwf dst
movlw LOW(lit)
movwf dst+1
ENDM
tst16 MACRO src
tstf src+1
skpz
goto $+1
tstf src
ENDM
cmpi16 MACRO src,lit
movlw (lit>>8)&0xff
subwf src,w
skpz
goto $+3
movlw lit&0xff
subwf src+1,w
ENDM
clr16 MACRO dst
clrf dst
clrf dst+1
ENDM
inc16 MACRO dst
incf dst+1
skpnz
incf dst
ENDM
dec16 MACRO dst
decf dst+1
skpnz
decf dst
ENDM
add16 MACRO src,dst
movf src+1,w
addwf dst+1
skpnc
incf dst
movf src,w
addwf dst
ENDM
addi16 MACRO lit,dst
movf LOW(lit),w
addwf dst+1
skpnc
incf dst
movf HIGH(lit),w
addwf dst
ENDM
sub16 MACRO src,dst
movf src+1,w
subwf dst+1
movf src,w
skpc
incf src,w
subwf dst
ENDM
subi16 MACRO lit,dst
movlw LOW(lit)
subwf dst+1
movlw HIGH(lit)
skpc
movlw (HIGH(lit))+1
subwf dst
ENDM
rr16 MACRO dst
rrf dst
rrf dst+1
ENDM
rl16 MACRO dst
rlf dst+1
rlf dst
ENDM
com16 MACRO dst
comf dst+1
comf dst
ENDM
;---------------------------------------------
; 16->32 bit macros (Big-Endian)
;
; move 16 bit to 32 bit
mov1632 MACRO src,dst
clrf dst
clrf dst+1
movf src,w
movwf dst+2
movf src+1,w
movwf dst+3
ENDM
; add 16 bit to 32 bit
add1632 MACRO src,dst ; src(15:0), dst(31:0)
movf src+1,w
addwf dst+3 ; dst = dst + src(7:0)
skpc
goto $+6
incf dst+2
skpnz
incf dst+1
skpnz
incf dst
movf src,w
addwf dst+2 ; dst = dst + src (15:8)
skpc
goto $+4
incf dst+1
skpnz
incf dst
ENDM
;---------------------------------------------------
; 32 bit macros (Big-Endian)
clr32 MACRO dst
clrf dst
clrf dst+1
clrf dst+2
clrf dst+3
ENDM
mov32 MACRO src,dst
movf src,w
movwf dst
movf src+1,w
movwf dst+1
movf src+2,w
movwf dst+2
movf src+3,w
movwf dst+3
ENDM
movi32 MACRO lit,dst
movlw lit>>24
movwf dst
movlw (lit>>16)&0xff
movwf dst+1
movlw (lit>>8)&0xff
movwf dst+2
movlw lit&0xff
movwf dst+3
ENDM
; 32 bit left shift
rr32 MACRO dst
rrf dst
rrf dst+1
rrf dst+2
rrf dst+3
ENDM
; 32 bit right shift
rl32 MACRO dst
rlf dst+3
rlf dst+2
rlf dst+1
rlf dst
ENDM
; 32 bit 1's complememt
com32 MACRO dst
comf dst+3
comf dst+2
comf dst+1
comf dst
ENDM
; test 32 bit for zero
tst32 MACRO src
tstf src+3
skpz
goto $+8
tstf src+2
skpz
goto $+5
tstf src+1
skpz
goto $+1
tstf src
ENDM
; add 32 bit to 32 bit
add32 MACRO src,dst
movf src+3,w
addwf dst+3
skpc
goto $+6
incf dst+2
skpnz
incf dst+1
skpnz
incf dst
movf src+2,w
addwf dst+2
skpc
goto $+4
incf dst+1
skpnz
incf dst
movf src+1,w
addwf dst+1
skpnc
incf dst
movf src,w
addwf dst
ENDM
; compare 32 bit to literal
cmpi32 MACRO src,lit
movlw (lit>>24)&0xff
subwf src,w
skpz
goto $+11
movlw (lit>>16)&0xff
subwf src+1,w
skpz
goto $+7
movlw (lit>>8)&0xff
subwf src+2,w
skpz
goto $+3
movlw lit&0xff
subwf src+3,w
ENDM
;====================================================================