I've just spent a ton of time debugging code that works great on the PicMaster running at 4 MHz, but messes up on the actual chip (16c74a) running at 16 MHz. I finally got it to run by disabling interrupts in the area where w is referenced in the main loop. Below is the code I'm using to store and restore context, then the ISR that uses these. Also shown are macros for EnableIRQ and DisableIRQ. Where am I going wrong??? Thanks! Harold DisableIRQ macro local DIRQloop ; Declare local symbol in macro DIRQloop bcf intcon,gie ; disable global interrupts btfsc intcon,gie ; make sure it's clear goto dirqLoop ; if not, go clear again endm EnableIRQ macro bsf intcon,gie ; set global interrupt enable endm cblock 0x20 ; reserve ram for save and restore context isrW ; Hold registers during ISR. isrW is also isrw! in bank 1 isrStatus isrFSR endc isrW1 equ 0xa0 SaveContext macro ; Save register context for isr. Swaps swap high and low halves of f with the result going either ; back to f or to w. Swap is used here because they affect no status bits. movwf isrW ; Save W swapf status,w ; get status in W (including bank select bits) swapping hi/lo halves bcf status,rp0 ; force to bank 0 movwf isrStatus ; and save swapped status movf fsr,0 ; Get fsr in w movwf isrFSR ; and save it endm RestoreContext macro movf isrFSR,0 ; get old fsr movwf fsr ; and restore it swapf isrStatus,w ; get old status (including bsr bits) in w, swapping back to normal movwf status ; restore it swapf isrw,1 ; swap halves in isrw making them backwards swapf isrw,0 ; swap back to forward and in W without affecting status endm ISR ; Determine cause of interrupt and do it. saveContext ; Save registers btfsc pir1,rcif ; check for received character call RxSerial ; Go get byte btfsc pir1,pspif ; Parallel slave port write? call readPSP ; Go handle it btfsc intcon,t0if ; Check for timer 0 interrupt call Timer0ISR ; go handle it (which transmits a byte on dmx) restoreContext retfie