;from Paul W. Webster MOVF file,W ANDLW fmask ; fmask for bit 0 is defined as 0x01 IORWF shadA,W ; add in desired outputs from shadow MOVWF PORTA
Only changes port A on the last cycle. Note that you must call this routine (subroutine/ macro) *whenever* you write to an output bit, which you always do using a BSF or BCF on shadA, never PORTA. You might also consider appending a
MOVWF shadAto keep shadA synchronized with the last byte written to PORTA.
;from Paul W. Webster ; WARNING: may trigger the "read-modify-write glitch" MOVF file,W XORWF PORTA,W ; derive "difference" value. ANDLW fmask ; fmask for bit 0 is defined as 0x01 XORWF PORTA,F ; Flip bit if not same.
We never use the following instructions on an output register like PORTA:
BSF PORTA,bit // don't do this! BCF PORTA,bit // don't do this either! IORWF PORTA,F // or this! XORWF PORTA,F // this either!because we want to avoid the "Read-Modify-Write problem" . Instead, we do the BSF or BCF on a byte of RAM (the "shadow register"), then copy that byte to the output register.