Datasheet

PIC17C7XX
DS30289C-page 42 1998-2013 Microchip Technology Inc.
EXAMPLE 6-2: SAVING STATUS AND WREG IN RAM (NESTED)
; The addresses that are used to store the CPUSTA and WREG values must be in the data memory
; address range of 1Ah - 1Fh. Up to 6 locations can be saved and restored using the MOVFP
; instruction. This instruction neither affects the status bits, nor corrupts the WREG register.
; This routine uses the FRS0, so it controls the FS1 and FS0 bits in the ALUSTA register.
;
Nobank_FSR EQU 0x40
Bank_FSR EQU 0x41
ALU_Temp EQU 0x42
WREG_TEMP EQU 0x43
BSR_S1 EQU 0x01A ; 1st location to save BSR
BSR_S2 EQU 0x01B ; 2nd location to save BSR (Label Not used in program)
BSR_S3 EQU 0x01C ; 3rd location to save BSR (Label Not used in program)
BSR_S4 EQU 0x01D ; 4th location to save BSR (Label Not used in program)
BSR_S5 EQU 0x01E ; 5th location to save BSR (Label Not used in program)
BSR_S6 EQU 0x01F ; 6th location to save BSR (Label Not used in program)
;
INITIALIZATION ;
CALL CLEAR_RAM ; Must Clear all Data RAM
;
INIT_POINTERS ; Must Initialize the pointers for POP and PUSH
CLRF BSR, F ; Set All banks to 0
CLRF ALUSTA, F ; FSR0 post increment
BSF ALUSTA, FS1
CLRF WREG, F ; Clear WREG
MOVLW BSR_S1 ; Load FSR0 with 1st address to save BSR
MOVWF FSR0
MOVWF Nobank_FSR
MOVLW 0x20
MOVWF Bank_FSR
:
: ; Your code
:
: ; At Interrupt Vector Address
PUSH BSF ALUSTA, FS0 ; FSR0 has auto-increment, does not affect status bits
BCF ALUSTA, FS1 ; does not affect status bits
MOVFP BSR, INDF0 ; No Status bits are affected
CLRF BSR, F ; Peripheral and Data RAM Bank 0 No Status bits are affected
MOVPF ALUSTA, ALU_Temp ;
MOVPF FSR0, Nobank_FSR ; Save the FSR for BSR values
MOVPF WREG, WREG_TEMP ;
MOVFP Bank_FSR, FSR0 ; Restore FSR value for other values
MOVFP ALU_Temp, INDF0 ; Push ALUSTA value
MOVFP WREG_TEMP, INDF0 ; Push WREG value
MOVFP PCLATH, INDF0 ; Push PCLATH value
MOVPF FSR0, Bank_FSR ; Restore FSR value for other values
MOVFP Nobank_FSR, FSR0 ;
;
: ; Interrupt Service Routine (ISR) code
;
POP CLRF ALUSTA, F ; FSR0 has auto-decrement, does not affect status bits
MOVFP Bank_FSR, FSR0 ; Restore FSR value for other values
DECF FSR0, F ;
MOVFP INDF0, PCLATH ; Pop PCLATH value
MOVFP INDF0, WREG ; Pop WREG value
BSF ALUSTA, FS1 ; FSR0 does not change
MOVPF INDF0, ALU_Temp ; Pop ALUSTA value
MOVPF FSR0, Bank_FSR ; Restore FSR value for other values
DECF Nobank_FSR, F ;
MOVFP Nobank_FSR, FSR0 ; Save the FSR for BSR values
MOVFP ALU_Temp, ALUSTA ;
MOVFP INDF0, BSR ; No Status bits are affected
;
RETFIE ; Return from interrupt (enable interrupts)