; Macros for automatic banks handling
; Written by Wojciech M. Zabolotny (wzab@ise.pw.edu.pl)
; Please consider the code below to be in public domain
;
; If anybody knows how to make it compilable under GPASM
; or how to fix GPASM to compile it, I'd be glad to hear 
; about it...
;
; HOW DOES IT WORK?
;
; 1. The xb_cur variable holds the current bank number
; 2. The xbank_inv informs that current bank number is unknown
;    (it should be used at the entry point of each subroutine
;    or at the labels beeing the targets of "goto")
; 3. The xmovwf, xincf and so on are the versions of standard
;    instructions which perform at the begining the check of
;    current bank and if necessary change the RP0,RP1 bits
;
; TO DO
; a. Not all x... instructions are implemented
; b. The bank management for FSR/INDF access is not handled
;    (up to that time I didn't need it ;-) )

xb_cur set 0

;Macro invalidating the bank setting
xbank_inv macro
xb_cur set 255
	ENDM

xbank_set macro xb_new
        IF xb_cur == 255
xb_cur set xb_new ^ 3
	ENDIF	    
	IF (xb_new & 1) && !(xb_cur & 1)
	  bsf STATUS,RP0
	ENDIF
	IF (xb_cur & 1) && !(xb_new & 1)
	  bcf STATUS,RP0
	ENDIF
	IF (xb_new & 2) && !(xb_cur & 2)
	  bsf STATUS,RP1
	ENDIF
	IF (xb_cur & 2) && !(xb_new & 2)
	  bcf STATUS,RP1
	ENDIF
xb_cur set xb_new
	ENDM

xbank_vset macro xvar
	xbank_set (xvar/0x80)
	ENDM

xmovwf macro xvar
	xbank_vset xvar
	movwf xvar
	endm

xmovfw macro xvar
	xbank_vset xvar
	movfw xvar
	endm

xclrf macro xvar
	xbank_vset xvar
	clrf xvar
	endm

xbsf	macro xvar,xbit
	xbank_vset xvar
	bsf xvar,xbit
	endm

xincf	macro xvar,xdest
	xbank_vset xvar
	incf xvar,xdest
	endm
	
xbcf	macro xvar,xbit
	xbank_vset xvar
	bcf xvar,xbit
	endm

xbtfsc	macro xvar,xbit
	xbank_vset xvar
	btfsc xvar,xbit
	endm
	
xbtfss	macro xvar,xbit
	xbank_vset xvar
	btfss xvar,xbit
	endm
	
xrrf    macro xvar,xdest
        xbank_vset xvar
	rrf xvar,xdest
	endm

xxorwf  macro xvar,xdest
        xbank_vset xvar
	xorwf xvar,xdest
	endm

xandwf  macro xvar,xdest
        xbank_vset xvar
	andwf xvar,xdest
	endm

xsubwf  macro xvar,xdest
        xbank_vset xvar
	subwf xvar,xdest
	endm
	