;"ACCURATE" CLOCK MODULE¢;Copyright Pete Goodeve, 1982¢;=========================¢;¢;occupies cassette buffer¢;¢;Atari OS references:¢SETVBV EQU $E45C ; set-vector entry¢SYSVBV EQU $E45F ; OS VBLANK service¢VVBLKI EQU $222 ; immed. VBLANK vector¢CRITIC EQU $42 ; critical section flag¢CASINI EQU $2 ; "cassette" init vector¢BOOTF EQU 9 ; boot mode flag for init¢;¢;¢ ORG $400 ; cass. buffer(1024 dec)¢;¢TIMLOK DB $FF¢SECS DB 0¢MIN DB 0¢HRS DB 0¢DAYS DB 0¢;¢CNT60 DB 60 ; VBLANK ticks¢CSECS DB 0 ; contin. count¢ASECS DB 13 ; adjustment count¢;¢;¢INITON DS 1¢;Comes this way on RESET Button¢;via "Cassette Init" vector:¢RESET¢ JSR NUTHIN ; -- filled before use¢SETINT¢ LDX #<CLOCK¢ LDY #>CLOCK¢ LDA #6 ; "immediate VBLANK" code¢ JSR SETVBV ; set up interr# vect,¢NUTHIN¢ RTS¢;¢;¢;Immed VBLANK interrupt service¢;comes through here first:¢;¢CLOCK¢ DEC CNT60 ; count 60 ticks¢ BNE XIT ; before doing anything¢ INC CSECS ; keep track of seconds¢ LDX #60 ; (kept around for later)¢ STX CNT60 ; reset count¢ LDA CRITIC ; check if critical¢ ORA TIMLOK ; or if locked by user¢ BNE XIT ; gotta stop here¢; continue on if not critical¢; or locked ...:¢; repeats if seconds were missed¢CLKLP¢ DEC ASECS ; 13 second count down¢ BNE TICK¢ LDA #13¢ STA ASECS ; reset 13-sec count¢ DEC CNT60 ; and skip one tick¢TICK¢ INC SECS ; user's time¢ CPX SECS ; reached 60 yet!¢ BNE TOK ; nops¢ LDY #0¢ STY SECS ; reset seconds¢ INC MIN ; and bump minutes¢ CPX MIN ; over the hour?¢ BNE TOK ; not yet¢ STY MIN ; and so on¢ INC HRS¢ LDA #24¢ CMP HRS¢ BNE TOK¢ STY HRS¢ INC DAYS¢;...etc. if needed¢TOK¢ DEC CSECS ; were any missed?¢ BNE CLKLP ; round again if so¢VVON DS 1¢;continue with VBLANK chain:¢XIT¢ JMP SYSVBV ; altered at setup¢;¢;¢;¢;*** INITIAL ENTRY HERE¢;gets overwritten by BASIC¢WINDIT¢ LDX CASINI+1 ; Cassette Init vect¢ BEQ NOINI ; zero if not used¢ LDY CASINI ; rest of current vect¢SETON¢ STX INITON+1 ; set up JSR address¢ STY INITON ; so stuff gets done¢ LDA #<RESET ; plug in our own¢ STA CASINI+1 ; reset sequence¢ LDA #>RESET¢ STA CASINI¢ LDA VVBLKI ; current immed VBLANK¢ STA VVON ; will be done after us¢ LDA VVBLKI+1¢ STA VVON+1¢ LDA BOOTF ; bootstrap mode flag¢ ORA #2 ; must include "cassette.'¢ STA BOOTF¢ JMP SETINT ; go set VBLANK vector¢;¢NOINI¢ LDY #>NUTHIN ; dummy for JSR¢ LDX #<NUTHIN¢ BNE SETON¢;¢;¢;Autostart addr.¢ ORG $2E2 ; "init" vector¢ DW WINDIT¢;¢*** .END¢