Count Seconds, Minutes, and Hours by Andrew Warren
SECONDS EQU [any register, on any page]
MINUTES EQU SECONDS+1
HOURS EQU MINUTES+1
TICK: MOVLW SECONDS ;First, initialize the FSR to point
MOVWF FSR ; at SECONDS.
CALL SUB1 ;Use the BCD-increment code to inc
CALL SUB0 ; SECONDS and then MINUTES.
CALL SUB0 ;Call it one last time to increment
; HOURS.
GOTO SUB2 ;Keep HOURS in the range [0-23].
SUB0: INCF FSR ;You enter here to point to the next
SKPNC ; register before incrementing it.
SUB1: INCF INDF ;Or enter here to just increment the
; register.
MOVLW 6 ;Use this MOVLW/ADDWF to see whether
ADDWF INDF ; reg is outside the range [0-9].
SKPDC ;Obscure DC flag usage was contributed
SUBWF INDF ; by Scott Dattalo.
MOVLW 0100H - 060H ;Load W with a value that'll make the
SUB2: ADDWF INDF,W ; ADDWF overflow if the reg > 60.
SKPNC ;If there's an overflow, clear the
CLRF INDF ; register.
RETLW 0100H - 024H ;Now return with W holding a value that
; will make ADDWF overflow if reg>24.