I have been working on a shot clock program that counts down from 24 sec to 0 and it buzzes. I have encountered some problems. The clock does count down from 24 sec to 0 and it buzzes but I'm having trouble looping it back to 24 seconds. For some reason it loops to 99 sec. Also I'm implementing a keyboard character "s" to resent the clock back to 24 sec at any given time but I'm not getting any results. Please! I need help!

* SHOTCLK.SRC

DUARTEQU $00C001 ;68681 base address
OPR_SET EQU 14*2
OPR_CLR EQU 15*2
ACR EQU 4*2
TBA EQU 6
CTUR EQU 6*2
CTLR EQU 7*2
IMR EQU 5*2
IVR EQU 12*2
STOP EQU 15*2
COUNT EQU 57600
TIMESTRT EQU $FFFF24FF ;SHOT CLOCK TIME
I2VECTOR EQU 26
PIA EQU $010001
CRA EQU 1*2
STEP EQU 16
COUNT2 EQU 50
HTOA EQU $00099E
RBAEQU6 ;Offset for transmit buffer A

NAMEMOVEA.L #BANNER,A1 ;send test message to
TRAP #1 ;console


ORG $8000
TIME JMP >INIT
JMP >L2ISR


* Pointers
INIT MOVEA.L #DUART,A0 ;A0 points to 68681
MOVEA.L #DIGITS,A1 ;A1 points to digits

* initialize MC14499 and BCD codes
MOVE.B #7,OPR_CLR(A0)
MOVE.L #TIMESTRT,(A1)
MOVE.B #$FF,4(A1)
MOVE.B #2,5(A1)
* initialize interrupts
MOVE.B #$08,IMR(A0)
MOVE.B #I2VECTOR,IVR(A0)
MOVE.W #COUNT,D0
MOVEP.W D0,CTUR(A0)
MOVE.B #$70,ACR(A0)
ORI.W #$0700,SR
ANDI.W #$F9FF,SR
MAINLOOP

* L2ISR - Level-2 Interrupt Service Routine.*

L2ISR MOVEM.L A0-A3,-(SP)
MOVEA.L #DUART,A0
MOVEA.L #DIGITS,A1
TST.B STOP(A0) ;clr interrupt source







TST.B >BUZZER
BEQ.S OFF
MOVE.B #$07,TBA(A0)
SUBQ.B #1,>BUZZER

OFFSUBQ.B #1,TIMEOUT-DIGITS(A1)
BNE.S SKIP
MOVE.L #BUZZERSET,A3
CMPM.L (A1)+,(A3)+
LEA.L -4(A1),A1
BNE STUFF
MOVE.B #5,>BUZZER

SHOT_POSMOVE.BRBA(A0),D0
CMP#'s',D0
BNESTUFF

STUFF MOVE.B #2,TIMEOUT-DIGITS(A1)
BSR UPDATE2
MOVEA.L #DIGITS+3,A1
MOVEA.L #INC+1,A2
MOVE.W #$04,CCR ;clear X, set Z
SBCD -(A2),-(A1) ;Decrement seconds
CMP.B #$60,(A1) ;SECONDS > 59
BLT.S SKIP
CLR.B (A1)
LEA 1(A2),A2
SKIP2 CMP.B #$13,(A1)
BNE.S SKIP
MOVE.B #$F1,(A1)
SKIP MOVEM.L (SP)+,A0-A3
RTE

* UPDATE2 - send 8 BCD digits to two MC14499s.*

UPDATE2 MOVEM.W D0-D5/A2,-(SP)
LEA 4(A1),A2
MOVE.W #4,D5
LOOP3 MOVE.B #1,OPR_SET(A0)
MOVE.B (A2),D0
BSR.S OUT4
SUBQ.W #2,D5
MOVE.W 0(A1,D5.W),D0
MOVE.B #4,D3

LOOP4 ROL.W #4,D0
BSR.S OUT4
SUBQ #1,D3
BNE LOOP4
TST.W D5
BNE LOOP3

MOVE.B #1,OPR_CLR(A0)
MOVEM.W (SP)+,D0-D5/A2
RTS

* OUT4 - send 4 bits to the MC14499.*

OUT4 MOVEM.W D0-D4,-(SP)
ROR.B #2,D0
MOVE.B #4,D3
LOOP2 ROL.B #1,D0
MOVE.B D0,D2
ANDI.B #$04,D0
MOVE.B D0,OPR_CLR(A0)
EORI.B #$04,D0
MOVE.B D0,OPR_SET(A0)
MOVE.B #$02,D4
MOVE.B D4,OPR_SET(A0)
NOP
NOP
MOVE.B D4,OPR_CLR(A0)
MOVE.B D2,D0
SUBQ #1,D3
BNE LOOP2
MOVEM.W (SP)+,D0-D4
RTS

INC DC.B 1 ;increment for BCD add

ORG $A000 ;data segment (digits)
DIGITS DS.B 4 ;4 bytes, 8 digits
DP DS.B 1 ;decimal points
TIMEOUT DS.B 1 ;counter for timeouts
BUZZER DC.B 0
MOVEA.L #PIA,A0 ;A0 -> DDRA
MOVE.B #$FF,(A0) ;Port A = output
MOVE.B #$04,CRA(A0) ;A0 -> Port A
CLR.B D0 ;init D0 = 0
LOOP MOVE.B D0,(A0) ;send to MC1408L8
ADD.B #STEP,D0 ;inc D0 by STEP
MOVE.W #COUNT,D1 ;create cheap-and-dirty
DBRA D1,* ; software delay
BRA LOOP ;do it again!
BANNER DC.B $0D,$0A,'*** Shot Clock ***'
DC.B $0D,$0A,0
BUZZERSET DC.L $FFFF00FF;TIME BUZZER GOES OFF

END TIME