| |
SIDWAVE Account closed
Registered: Apr 2002 Posts: 2238 |
C64 Clock/Time routine
Houston we have a problem!
About all clocks i have seen on C64, run too slow.
More specificly i am annoyed with SDI music tracker, and PSID64 clocks.
They run too slow!
If they play music for 4 minutes, they will claim they only played like 3:41 or so.
So my question is:
Are the coders on the wrong path, or is the C64 ? |
|
... 23 posts hidden. Click here to view all posts.... |
| |
Stryyker
Registered: Dec 2001 Posts: 468 |
No need to post a clock routine. PRG explains it well enough. What matters is the read and write orders. |
| |
Devia
Registered: Oct 2004 Posts: 401 |
Quote: The current SDI 2.0beta use the Time-Of-Day clock
to display the time. And the current settings for $dc0e look like this:
(50hz for pal)
lda #$81
sta $dc0e
(60hz for ntsc)
lda #$01
sta $dc0e
I'm not doing a proper system check, i'm only checking the value of $02a6 to determine wheter the machine is pal or ntsc. This will be fixed for the next release.
But you're not setting $dc0e in the player-demo code thingie, so if people use that, they'll get wrong time as default value is #$01
|
| |
yago
Registered: May 2002 Posts: 333 |
GRG: I also used TOD once, and believe me, there _are_ c64s (well, its more the power-structure itself in certain areas) which totally run TOD wrong.
Better rely on timer or frames.
|
| |
Frantic
Registered: Mar 2003 Posts: 1648 |
Yes... TOD is unreliable. |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
TOD is more than good enough to measure 4 minutes accuratly |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
I usually do a phase accumulator approach like this:
seg code
org $1000
start:
sei
; setup zeroes
ldx #4
lp1:
lda #"0"
sta $0400,x
lda 646
sta $d800,x
dex
bpl lp1
; wait for frame
lp2:
jsr clock
lp3:
lda $d011
bpl lp3
lp4:
lda $d011
bmi lp4
bpl lp2
; ( 2^24 / CPU_FREQ ) * CYCLES_PER_FRAME
; PAL: ( 2^24 / 985248 ) * 19656 = ~334711
; NTSC: ( 2^24 / 1022727 ) * 17095 = ~280433
FRAME_ADD equ 334711
frame_add:
dc.b FRAME_ADD >> 16
dc.b [FRAME_ADD >> 8] & $ff
dc.b FRAME_ADD & $ff
doffs:
dc.b 0,1,3,4
limit:
dc.b $30+10,$30+10,$30+6,$30+10
time_acc:
dc.b 0,0,0
clock:
; phase accumulator
clc
ldx #2
clk_lp1:
lda time_acc,x
adc frame_add,x
sta time_acc,x
dex
bpl clk_lp1
bcc clk_skp1 ; didn't wrap, skip increment
; increment time
ldy #4-1
clk_lp2:
ldx doffs,y
inc $0400,x
lda $0400,x
cmp limit,y
bne clk_skp1
lda #$30
sta $0400,x
dey
bpl clk_lp2
clk_skp1:
; flash ":" according to MSB in time_acc
lda #":"
bit time_acc
bpl clk_skp2
lda #" "
clk_skp2:
sta $0402
rts |
| |
6R6
Registered: Feb 2002 Posts: 245 |
Quote: But you're not setting $dc0e in the player-demo code thingie, so if people use that, they'll get wrong time as default value is #$01
Aha... Will fix that aswell. |
| |
Stainless Steel
Registered: Mar 2003 Posts: 966 |
Quoting GRGThis will be fixed for the next release.
Did i hear "next release" ? <3<3<3
|
| |
Devia
Registered: Oct 2004 Posts: 401 |
oh noes.. I just remembered that the SX-64 has 60Hz TOD ONLY!
This means that even if you detect a PAL SX-64 correctly as PAL, you still end up gaining roughtly 10 seconds every minute if you set $DC0E bit 7 to 1 (50Hz)
So how does one properly detect an SX-64 if its KERNAL got replaced?
Seems to me like you have to "measure" the time of the TOD to be sure if its 50 or 60Hz clocked :(
|
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
Quote: oh noes.. I just remembered that the SX-64 has 60Hz TOD ONLY!
This means that even if you detect a PAL SX-64 correctly as PAL, you still end up gaining roughtly 10 seconds every minute if you set $DC0E bit 7 to 1 (50Hz)
So how does one properly detect an SX-64 if its KERNAL got replaced?
Seems to me like you have to "measure" the time of the TOD to be sure if its 50 or 60Hz clocked :(
To detect PAL or NTSC couldn't one simply just poll $d011&$d012. PAL machines will be able to reach higher values than NTSC.
From the top of my head completely untested:
sei
bit $d011
bmi *-3
bit $d011
bpl *-3
; we're now on line 256.
; Check if we ever reach line 311 before VBL
ldx #0
lda #<311
:
cmp $d012
bne :+
inx
jmp :++
:
bit $d011
bmi :--
:
cli
txa
beq :+
; PAL
jmp :++
:
; NTSC
:
|
Previous - 1 | 2 | 3 | 4 - Next |