From 13f277ef4428a0050282fc6208c3baeab2071db8 Mon Sep 17 00:00:00 2001 From: jonnosan Date: Sat, 28 Mar 2009 02:06:49 +0000 Subject: [PATCH] timer now uses 60hz IRQ handler, rather than CIA git-svn-id: http://svn.code.sf.net/p/netboot65/code@65 93682198-c243-4bdb-bd91-e943c89aac3b --- client/drivers/c64timer.s | 61 +++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/client/drivers/c64timer.s b/client/drivers/c64timer.s index 4fb2772..f13adcb 100644 --- a/client/drivers/c64timer.s +++ b/client/drivers/c64timer.s @@ -1,50 +1,47 @@ ; timer routines ; ; the timer should be a 16-bit counter that's incremented by about -; 1000 units per second. it doesn't have to be particularly accurate, -; if you're working with e.g. a 60 Hz VBLANK IRQ, adding 17 to the -; counter every frame would be just fine. - +; 1000 units per second. it doesn't have to be particularly accurate. +; this C64 implementation requires the routine timer_vbl_handler be called 60 times per second .include "../inc/common.i" .export timer_init .export timer_read - + .export timer_vbl_handler + + .code + .bss + current_time_value: .res 2 + .code -;initialize timers +;reset timer to 0 ;inputs: none ;outputs: none timer_init: - lda #$80 ; stop timers - sta $dd0e - sta $dd0f - - ldax #999 ; timer A to 1000 cycles - stax $dd04 - - ldax #$ffff ; timer B to max cycles - stax $dd06 - - lda #$81 ; timer A in continuous mode - sta $dd0e - - lda #$c1 ; timer B to count timer A underflows - sta $dd0f - + ldax #0 + stax current_time_value rts - -;initialize timers -;inputs: none -;outputs: AX = count in milliseconds sent last call to timer_init +;read the current timer value +; inputs: none +; outputs: AX = current timer value (roughly equal to number of milliseconds since the last call to 'timer_init') timer_read: - lda $dd07 ; cia counts backwards, return inverted value - eor #$ff - tax - lda $dd06 - eor #$ff - rts + ldax current_time_value + rts +; tick over the current timer value - should be called 60 times per second +; inputs: none +; outputs: none (all registers preserved, by carry flag can be modified) +timer_vbl_handler: + pha + lda #$11 + adc current_time_value + sta current_time_value + bcc :+ + inc current_time_value+1 +: + pla + rts \ No newline at end of file