Bank0: MACRO bcf STATUS, RP0 bcf STATUS, RP1 ENDM Bank1: MACRO bsf STATUS, RP0 bcf STATUS, RP1 ENDM Bank2: MACRO bcf STATUS, RP0 bsf STATUS, RP1 ENDM Bank3: MACRO bsf STATUS, RP0 bsf STATUS, RP1 ENDM ; ****************** Macro definitions ******************************** ;+++++ ; PAGE/BANK0/1/2/3 selects register bank 0/1/2/3. ; Leave set to BANK0 normally. BANK0 MACRO BCF STATUS,RP0 ; clear bank select bits BCF STATUS,RP1 BCF STATUS,IRP ; clear indirect adressing bit ENDM BANK1 MACRO BSF STATUS,RP0 ; BCF STATUS,RP1 ; BCF STATUS,IRP ; clear indirect adressing bit ENDM BANK2 MACRO BCF STATUS,RP0 ; BSF STATUS,RP1 BSF STATUS,IRP ; set bit for indirect adressing ENDM BANK3 MACRO BSF STATUS,RP0 ; BSF STATUS,RP1 BSF STATUS,IRP ; set bit for indirect adressing ENDM ; macros for accessing page's directly PAGE0 MACRO BCF PCLATH,3 BCF PCLATH,4 ENDM PAGE1 MACRO BSF PCLATH,3 BCF PCLATH,4 ENDM PAGE2 MACRO BCF PCLATH,3 BSF PCLATH,4 ENDM PAGE3 MACRO BSF PCLATH,3 BSF PCLATH,4 ENDM ;+++++ ; TABLE_JUMP Calculates an eventual page boundary crossing ; set's up the PCLATH register correctly ; Offset must be in w-reg, offset 0 jumps to the next instr. ; Uses one byte of dedicated ram TABLE_JUMP MACRO MOVWF Table_Temp ; save wanted offset MOVLW LOW($+8) ; get low adress ( of first instr. after macro ) ADDWF Table_Temp,F ; add offset MOVLW HIGH($+6) ; get highest 5 bits ( of first instr. after macro ) BTFSC STATUS,C ; page crossed ? ( 256 byte ) ADDLW 0x01 ; Yes add one to high adress MOVWF PCLATH ; load high adress in latch MOVF Table_Temp,W ; get computed adress MOVWF PCL ; And jump ENDM ;+++++ ; PUSH/PULL save and restore W,PCLATH,STATUS and FSR registers - ; used on interrupt entry/exit PUSH MACRO MOVWF Saved_W ; save w reg SWAPF STATUS,W ;The swapf instruction, unlike the movf, affects NO status bits, which is why it is used here. CLRF STATUS ; sets to BANK0 MOVWF Saved_Status ; save status reg MOVF PCLATH,W MOVWF Saved_Pclath ; save pclath CLRF PCLATH MOVF FSR,W MOVWF Saved_Fsr ; save fsr reg ENDM PULL MACRO MOVF Saved_Fsr,W ; get saved fsr reg MOVWF FSR ; restore MOVF Saved_Pclath,W ; get saved pclath MOVWF PCLATH ; restore SWAPF Saved_Status,W ; get saved status in w MOVWF STATUS ; restore status ( and bank ) SWAPF Saved_W,F ; reload into self to set status bits SWAPF Saved_W,W ; and restore ENDM ;+++++ ; INC_BUFFER advance buffer pointers wrap if necessary ; ; If buffer size is power of two, and buffer is aligned ; on an multiple of twice it size, this macro generates ; two instructions, Otherwise it generates six instructions. ; Originator: Eric Smith, eric@brouhaha.com for non-comercial use. INC_BUFFER MACRO Pointer, Base, Size LOCAL POWER_OF2, ALIGNED,BIT,VALUE POWER_OF2 SET !(Size&(Size-1)) ; calculate if power of 2 ALIGNED SET POWER_OF2&&((Base&(Size-1))==0) ; calculate if aligned IF ALIGNED VALUE SET Size BIT SET 0 WHILE VALUE>1 BIT SET BIT+1 VALUE SET VALUE>>1 ENDW ENDIF INCF Pointer,F ; increase pointer IF ALIGNED&&!(Base&(1<