Sections:
; from David Cary: tested on PIC 16F877 ; inc incf count0,f skpnz incf count1,f skpnz incf count2,f ;... {repeat the last two lines for as wide a counter as is needed} ; w is unchanged. ; Status:Z is 1 if and only if counter is now all zeros. ; rest of Status unchanged.
;from Dmitry Kiryashov ;inc movlw 1 addwf count0,F skpnc addwf count1,F ;... {ed: repeat the last two lines for as wide a counter as is needed} ; w is now 1 ; Status:Z and Status:C are 1 if and only if counter is now all zeros. ;dec movlw 1 subwf count0,F skpc subwf count1,F ;... {ed: repeat the last two lines for as wide a counter as is needed} ; w is now 1 ; Status:C is now 0 if and only if counter rolled over and is now all ones ; Status:Z is set if the least significant byte of the counter is zero ; (not necessarily all bytes !) and in certain other cases.
Often we have a value Y (like the index to a circular buffer) that normally increases by 1 each iteration, but that we want to make sure stays in the range 0 <= Y < End. by forcing Y back to zero when it runs off the end of its range.
; if( w <= Y ){ Y = 0; }; ; Y is 8 bits ; by David Cary ; useful for circular buffers. ; Load the upper limit into w -- perhaps ; movlw End ; when End is a constant ; movfw End ; when End is a variable subwf Y,w skpnc clrf Y ; now 0 <= Y < End.
[FIXME: 16 bit version ?]
More sophisticated modulus routines are available (typically wrapped up in a routine that calculates both (A/B) and (A MOD B) at once).
Questions:
Code: