Simulating a Stopwatch Timer

*----------------------------------------------------------- * Title: Stopwatch timer * Written by : * Date: Dic 9, 2017 * Description: A program that displays minutes, seconds and * tenths with the following format: * mm:ss.s * Starts at zero. When a key is pressed, the * display increments, another press stops it. *----------------------------------------------------------- ORG $1000 START: first instruction of the program CLR.L D3; D3 will indicate stopwatch running, initialize to zero CLR.L D5; D5 will be 1 to restart the stopwatch LOOP: MOVEA.L #DISPLAY,A1 ; print current display MOVE.L #14,D0 TRAP #15 MOVE.L #7, D0; see if the user pressed a key TRAP #15 CMP #0,D1 BEQ NEXT; if no key was pressed, continue MOVE.L #5, D0; read the key into D1 TRAP #15 EORI #1, D3; flip the stopwatch state NEXT: CMP #0, D3; see if the stopwatch is running BEQ CLEAR; if not, loop displaying the current count, clear first CMP #0, D5; see if we need to restart the stopwatch BNE UPDATE; if not, update the display MOVE #8, D0; get time in hundredths of sec in D1 TRAP #15 MOVE.L D1, D4; set as the start of stopwatch MOVE.L #1,D5 ; set D5 to 1 to indicate no restart UPDATE: MOVE #8, D0; get time in hundredths of sec in D1 TRAP #15 SUB.L D4,D1 LEA DISPLAY, A0; get the address of display message into A0 DIVU #100, D1; time in hundredths of seconds in D1 MOVE.L D1, D2; save in D2 SWAP D1; move the upper 16 bits down to get remainder AND.L #$0000FFFF,D1 ; set left hand part of D1 to zero DIVU #10,D1 ; get tenths digit ADD #48,D1 MOVE.B D1,6(A0); save in display message AND.L #$0000FFFF,D2 ; set left hand part of D2 to zero DIVU #60, D2; time in seconds in D2 MOVE.L D2, D1; save in D1 SWAP D2 AND.L #$0000FFFF,D2 ; set left hand part of D2 to zero DIVU #10,D2 ; get first seconds digit ADD #48,D2 MOVE.B D2,3(A0); save in display message SWAP D2; move the upper 16 bits down to get remainder ADD #48,D2 MOVE.B D2,4(A0); save in display message AND.L #$0000FFFF,D1 ; set left hand part of D1 to zero DIVU #10,D1 ; get first minutes digit SWAP D1; move the upper 16 bits down to get remainder ADD #48,D1 MOVE.B D1,1(A0); save in display message SWAP D1 AND.L #$0000FFFF,D1 ; set left hand part of D1 to zero CMP #0,D1 ; see if we reached 10 minutes BEQ SKIP CLEAR: CLR.L D3; set as stopped CLR.L D5; restart the stopwatch SKIP: MOVE.B #$0D,D1 ; print carriage return MOVE #6,D0 TRAP #15 BRA LOOP; repeat DISPLAY: DC.B '00:00.0' ; line to display DC.B 0 DS.W 0 END START; last line of source