;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.