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: