PIC17C75X
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
Bank_FSR
ALU_Temp
WREG_TEMP
BSR_S1
BSR_S2
BSR_S3
BSR_S4
BSR_S5
BSR_S6
;
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
0x40
0x41
0x42
0x43
0x01A
0x01B
0x01C
0x01D
0x01E
0x01F
; 1st location to save BSR
; 2nd location to save BSR (Label Not used in program)
; 3rd location to save BSR (Label Not used in program)
; 4th location to save BSR (Label Not used in program)
; 5th location to save BSR (Label Not used in program)
; 6th location to save BSR (Label Not used in program)
INITIALIZATION
CALL
;
CLEAR_RAM
; Must Clear all Data RAM
;
INIT_POINTERS
CLRF
; Must Initialize the pointers for POP and PUSH
; Set All banks to 0
BSR, F
CLRF
BSF
CLRF
MOVLW
MOVWF
MOVWF
MOVLW
MOVWF
:
ALUSTA, F
ALUSTA, FS1
WREG, F
BSR_S1
FSR0
Nobank_FSR
0x20
; FSR0 post increment
; Clear WREG
; Load FSR0 with 1st address to save BSR
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
CLRF
MOVPF
MOVPF
MOVPF
MOVFP
MOVFP
MOVFP
MOVFP
MOVPF
MOVFP
;
BSR, INDF0
BSR, F
; No Status bits are affected
; Periperal and Data RAM Bank 0 No Status bits are affected
;
; Save the FSR for BSR values
;
; Restore FSR value for other values
; Push ALUSTA value
; Push WREG value
ALUSTA, ALU_Temp
FSR0, Nobank_FSR
WREG, WREG_TEMP
Bank_FSR, FSR0
ALU_Temp, INDF0
WREG_TEMP, INDF0
PCLATH, INDF0
FSR0, Bank_FSR
Nobank_FSR, FSR0
; Push PCLATH value
; Restore FSR value for other values
;
:
; Interrupt Service Routine (ISR) code
;
POP
CLRF
MOVFP
DECF
MOVFP
MOVFP
BSF
MOVPF
MOVPF
DECF
MOVFP
MOVFP
MOVFP
ALUSTA, F
Bank_FSR, FSR0
FSR0, F
INDF0, PCLATH
INDF0, WREG
ALUSTA, FS1
INDF0, ALU_Temp
FSR0, Bank_FSR
Nobank_FSR, F
Nobank_FSR, FSR0
ALU_Temp, ALUSTA
INDF0, BSR
; FSR0 has auto-decrement, does not affect status bits
; Restore FSR value for other values
;
; Pop PCLATH value
; Pop WREG value
; FSR0 does not change
; Pop ALUSTA value
; Restore FSR value for other values
;
; Save the FSR for BSR values
;
; No Status bits are affected
;
RETFIE
; Return from interrupt (enable interrupts)
DS30264A-page 38
Preliminary
1997 Microchip Technology Inc.