;
-; Ullrich von Bassewitz, 25.07.2000
-;
-; Implemented using information from Sidney Cadot <sidney@janis.pds.twi.tudelft.nl
+; Piotr Fusik, 04.11.2001
+; originally by Ullrich von Bassewitz and Sidney Cadot
;
; clock_t clock (void);
; unsigned _clocks_per_sec (void);
;
- .export _clock, __clocks_per_sec
- .importzp sreg
+ .export _clock, __clocks_per_sec
+ .importzp sreg
- .include "atari.inc"
+ .include "atari.inc"
-.proc _clock
+.proc _clock
- lda #0 ; Byte 3 is always zero
- sta sreg+1
- php ; Save current I flag value
- cli ; Disable interrupts
- lda RTCLOK ; Read clock
- ldx RTCLOK+1
- ldy RTCLOK+2
- plp ; Restore old I bit
- rts
+ ldx #5 ; Synchronize with Antic, so the interrupt won't change RTCLOK
+ stx WSYNC ; while we're reading it. The synchronization is done same as
+@L1: dex ; in SETVBLV function in Atari OS.
+ bne @L1
+ stx sreg+1 ; Byte 3 is always zero
+ lda RTCLOK+2
+ ldx RTCLOK+1
+ ldy RTCLOK
+ sty sreg
+ rts
.endproc
-.proc __clocks_per_sec
+.proc __clocks_per_sec
- lda #50 ; Assume PAL
- ldx PAL
- beq @L1
- ldx #0
- lda #60
-@L1: rts
+ ldx #$00 ; Clear high byte of return value
+ lda PAL ; use hw register, PALNTS is only supported on XL/XE ROM
+ and #$0e
+ bne @NTSC
+ lda #50
+ rts
+@NTSC: lda #60
+ rts
.endproc
-
-