© 2004 Microchip Technology Inc. DS70049C-page 2-7
Section 2. CPU
CPU
2
2.2.2.1 PUSH.S and POP.S Shadow Registers
The PUSH.S and POP.S instructions are useful for fast context save/restore during a function call
or Interrupt Service Routine (ISR). The PUSH.S instruction will transfer the following register
values into their respective shadow registers:
• W0...W3
• SR (N, OV, Z , C, DC bits only)
The POP.S instruction will restore the values from the shadow registers into these register
locations. A code example using the PUSH.S and POP.S instructions is shown below:
MyFunction:
PUSH.S ; Save W registers, MCU status
MOV #0x03,W0 ; load a literal value into W0
ADD RAM100 ; add W0 to contents of RAM100
BTSC SR,#Z ; is the result 0?
BSET Flags,#IsZero ; Yes, set a flag
POP.S ; Restore W regs, MCU status
RETURN
The PUSH.S instruction will overwrite the contents previously saved in the shadow registers. The
shadow registers are only one level in depth, so care must be taken if the shadow registers are
to be used for multiple software tasks.
The user must ensure that any task using the shadow registers will not be interrupted by a higher
priority task that also uses the shadow registers. If the higher priority task is allowed to interrupt
the lower priority task, the contents of the shadow registers saved in the lower priority task will
be overwritten by the higher priority task.
2.2.2.2 DO Loop Shadow Registers
The following registers are automatically saved in shadow registers when a DO instruction is
executed:
•DOSTART
•DOEND
• DCOUNT
The DO shadow registers are one level in depth, permitting two loops to be automatically nested.
Refer to Section 2.9.2.2 “DO Loop Nesting” for further details.
2.2.3 Uninitialized W Register Reset
The W register array (with the exception of W15) is cleared during all Resets and is considered
uninitialized until written to. An attempt to use an uninitialized register as an address pointer will
reset the device.
A word write must be performed to initialize a W register. A byte write will not affect the initialization
detection logic.