0100 ;TIMER 4›0110 ;BY FRED PINHO›0120 ;(c) 1985, ANTIC PUBLISHING›0160 *= $0600 ;RELOCATABLE›0170 ;SEE LISTING 2 FOR REMARKS ON PAGE 6 ASSEMBLY›0180 .TITLE "LISTING 4"›0190 .TAB 14,18,26›0200 .SET 1,4›0210 XITVBV = $E462›0220 CLD ;MUST BE DONE›0230 LDA 1021 ;TIMER ACTIVATED?›0240 BNE GOON ;YES. SKIP AROUND›0250 LDA #1 ;NO. SET DELAY FOR IMMEDIATE DISPLAY›0260 STA 1028›0270 LDA #0 ;SET LOCATIONS TO 0›0280 STA 18›0290 STA 19›0300 STA 20›0310 LDA #255 ;SET TO INDICATE ACTIVE TIMER›0320 STA 1021›0330 GOON DEC 1028 ;CALCULATE TIME?›0340 BNE EXIT ;NO. BYPASS ROUTINE›0350 LDA #10 ;YES. RESET DELAY COUNTER›0360 STA 1028›0370 LDA 20 ;GET TIMER COUNT›0380 STA 1022 ;LO BYTE›0390 LDA 19 ;HI BYTE›0400 DIVIDE LDX #8 ;DIVIDE BY 60›0410 LOOP1 ASL 1022 ;TO GET TOTAL SECONDS›0420 ROL A›0430 CMP #60›0440 BCC BRCH1›0450 SBC #60›0460 INC 1022›0470 BRCH1 DEX ›0480 BNE LOOP1›0490 STA 1023›0500 ;TOTAL SECONDS STORED IN REGISTER 1022›0510 LDX #8 ;DIVIDE BY 60›0520 LDA #0 ;TO GET MINUTES›0530 LOOP2 ASL 1022›0540 ROL A›0550 CMP #60›0560 BCC BRCH2›0570 SBC #60›0580 INC 1022›0590 BRCH2 DEX ›0600 BNE LOOP2›0610 STA 1023›0620 ;MINUTES IN 1022, REMAINING SECONDS IN 1023›0630 ;NOW DIVIDE BY 10 TO GET HI AND LO DIGITS OF DECIMAL NUMBER›0640 LDX #8›0650 LDA #0›0660 LOOP3 ASL 1023›0670 ROL A›0680 CMP #10›0690 BCC BRCH3›0700 SBC #10›0710 INC 1023›0720 BRCH3 DEX ›0730 BNE LOOP3›0740 STA 1024›0750 ;SECONDS(TENS PLACE) IN 1023›0760 ;SECONDS(UNIT PLACE) IN 1024›0770 DISPLAY CLC ;STORE 3 DIGITS INTO DISPLAY AREA›0780 LDY #0›0790 LDA 1022 ;MINUTES›0800 ADC #16 ;CONVERT TO SCREEN CODE›0810 STA (208),Y ;STORE›0820 INY ›0830 LDA #26 ;SCREEN CODE FOR ':'›0840 STA (208),Y›0850 INY ›0860 LDA 1023 ;SECONDS(HI)›0870 ADC #16›0880 STA (208),Y›0890 INY ›0900 LDA 1024 ;SECONDS(LO)›0910 ADC #16›0920 STA (208),Y›0930 LDA 1027 ;TIMER DONE?›0940 BNE DISABLE ;YES›0950 EXIT JMP XITVBV ;NO. JUST RETURN TO VBI›0960 DISABLE LDA #$62 ;RESTORE ORIGINAL VBI VECTOR›0970 STA 548›0980 LDA #$E4›0990 STA 549›1000 JMP XITVBV ;EXIT›1010 .END ›