From f9a7a999ea0c6a9ec7aee1c0f84e73a797a065f2 Mon Sep 17 00:00:00 2001 From: Patrice Mandin Date: Sat, 9 Jun 2007 19:52:05 +0000 Subject: [PATCH] Avoid switch to supervisor mode in SDL_GetTicks, by updating system counter from vbl interrupt --- src/timer/mint/SDL_systimer.c | 63 +++++++++++++-------------------- src/timer/mint/SDL_vbltimer.S | 7 ++++ src/timer/mint/SDL_vbltimer_s.h | 2 ++ 3 files changed, 33 insertions(+), 39 deletions(-) diff --git a/src/timer/mint/SDL_systimer.c b/src/timer/mint/SDL_systimer.c index 3d2228545..f9560c48d 100644 --- a/src/timer/mint/SDL_systimer.c +++ b/src/timer/mint/SDL_systimer.c @@ -53,18 +53,18 @@ void SDL_MintAudio_CheckFpu(void); /* The first ticks value of the application */ static Uint32 start; -static volatile SDL_bool supervisor; +static SDL_bool read_hz200_from_vbl = SDL_FALSE; static int mint_present; /* can we use Syield() ? */ void SDL_StartTicks(void) { - void *oldpile; + void *old_stack; unsigned long dummy; /* Set first ticks value */ - oldpile=(void *)Super(0); - start=*((volatile long *)_hz_200); - Super(oldpile); + old_stack = (void *)Super(0); + start = *((volatile long *)_hz_200); + Super(old_stack); start *= 5; /* One _hz_200 tic is 5ms */ @@ -73,21 +73,14 @@ void SDL_StartTicks(void) Uint32 SDL_GetTicks (void) { - Uint32 now; - void *oldpile=NULL; - - /* Check if we are in supervisor mode - (this is the case when called from SDL_ThreadedTimerCheck, - which is called from RunTimer, running in the vbl vector) - */ - if (!supervisor) { - oldpile=(void *)Super(0); - } - - now=*((volatile long *)_hz_200); - - if (!supervisor) { - Super(oldpile); + Uint32 now = start; + + if (read_hz200_from_vbl) { + now = SDL_Atari_hz200; + } else { + void *old_stack = (void *)Super(0); + now = *((volatile long *)_hz_200); + Super(old_stack); } return((now*5)-start); @@ -108,44 +101,36 @@ void SDL_Delay (Uint32 ms) /* Data to handle a single periodic alarm */ static SDL_bool timer_installed=SDL_FALSE; -static void RunTimer(void) -{ - supervisor=SDL_TRUE; - SDL_ThreadedTimerCheck(); - supervisor=SDL_FALSE; -} - /* This is only called if the event thread is not running */ int SDL_SYS_TimerInit(void) { - void *oldpile; - - supervisor=SDL_FALSE; + void *old_stack; SDL_MintAudio_CheckFpu(); /* Install RunTimer in vbl vector */ - oldpile=(void *)Super(0); - timer_installed = !SDL_AtariVblInstall(RunTimer); - Super(oldpile); + old_stack = (void *)Super(0); + timer_installed = !SDL_AtariVblInstall(SDL_ThreadedTimerCheck); + Super(old_stack); if (!timer_installed) { return(-1); } + + read_hz200_from_vbl = SDL_TRUE; return(SDL_SetTimerThreaded(0)); } void SDL_SYS_TimerQuit(void) { - void *oldpile; - + /* Uninstall RunTimer vbl vector */ if (timer_installed) { - /* Uninstall RunTimer vbl vector */ - oldpile=(void *)Super(0); - SDL_AtariVblUninstall(RunTimer); - Super(oldpile); + void *old_stack = (void *)Super(0); + SDL_AtariVblUninstall(SDL_ThreadedTimerCheck); + Super(old_stack); timer_installed = SDL_FALSE; } + read_hz200_from_vbl = SDL_FALSE; } int SDL_SYS_StartTimer(void) diff --git a/src/timer/mint/SDL_vbltimer.S b/src/timer/mint/SDL_vbltimer.S index 6dfd49970..f9c4be96d 100644 --- a/src/timer/mint/SDL_vbltimer.S +++ b/src/timer/mint/SDL_vbltimer.S @@ -27,6 +27,7 @@ */ #define _vbl_queue 0x456 +#define _hz_200 0x4ba .text @@ -42,6 +43,7 @@ _SDL_AtariVblInstall: lea _my_vbl,a0 clrw vbl_mutex + movel _hz_200.w, _SDL_Atari_hz200 /* Stop interrupts */ @@ -108,6 +110,9 @@ badvector: /*--- Our vbl ---*/ _my_vbl: + /* Update _hz_200 */ + movel _hz_200.w, _SDL_Atari_hz200 + /* Verify if this is not already running */ tstw vbl_mutex @@ -147,6 +152,8 @@ vbl_end: .data .even + .comm _SDL_Atari_hz200,4*1 + .even .comm vbl_mutex,2*1 .even .comm my_vector,4*1 diff --git a/src/timer/mint/SDL_vbltimer_s.h b/src/timer/mint/SDL_vbltimer_s.h index 6d1f4f5ce..f893ef58b 100644 --- a/src/timer/mint/SDL_vbltimer_s.h +++ b/src/timer/mint/SDL_vbltimer_s.h @@ -28,6 +28,8 @@ * Patrice Mandin */ +extern volatile long SDL_Atari_hz200; + /* Functions prototypes */ extern int SDL_AtariVblInstall(void *newvector); extern void SDL_AtariVblUninstall(void *newvector);