;"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
Back to previous page