Skip to content

Commit

Permalink
os2/SDL_systimer.c: removed the watcom-only asm
Browse files Browse the repository at this point in the history
  • Loading branch information
sezero committed Oct 20, 2020
1 parent 4b48e76 commit b8be06e
Showing 1 changed file with 25 additions and 59 deletions.
84 changes: 25 additions & 59 deletions src/timer/os2/SDL_systimer.c
Expand Up @@ -53,41 +53,9 @@ void SDL_StartTicks(void)
DECLSPEC Uint32 SDLCALL SDL_GetTicks(void)
{
long long hires_now;
ULONG ticks = ticks;

DosTmrQueryTime((PQWORD)&hires_now);
/*
hires_now -= hires_start_ticks;
hires_now *= 1000;
hires_now /= hires_ticks_per_second;
*/
/* inline asm to avoid runtime inclusion */
_asm {
push edx
push eax
mov eax, dword ptr hires_now
mov edx, dword ptr hires_now+4
sub eax, dword ptr hires_start_ticks
sbb edx, dword ptr hires_start_ticks+4
mov ebx,1000
mov ecx,edx
mul ebx
push eax
push edx
mov eax,ecx
mul ebx
pop eax
add edx,eax
pop eax
mov ebx, dword ptr hires_ticks_per_second
div ebx
mov dword ptr ticks, eax
pop edx
pop eax
}

return ticks;

return (hires_now - hires_start_ticks) * 1000 / hires_ticks_per_second;
}

/* High resolution sleep, originally made by Ilya Zakharevich */
Expand All @@ -102,7 +70,7 @@ DECLSPEC void SDLCALL SDL_Delay(Uint32 ms)
ULONG priority = 0, nesting; /* Shut down the warnings */
PPIB pib;
PTIB tib;
char *e = NULL;
const char *e = NULL;
APIRET badrc;
int switch_priority = 50;

Expand All @@ -119,21 +87,21 @@ DECLSPEC void SDLCALL SDL_Delay(Uint32 ms)
switch_priority = 0;
else
{
/* In Warp3, to switch scheduling to 8ms step, one needs to do
DosAsyncTimer() in time-critical thread. On laters versions,
more and more cases of wait-for-something are covered.
It turns out that on Warp3fp42 it is the priority at the time
of DosAsyncTimer() which matters. Let's hope that this works
with later versions too... XXXX
*/
/* In Warp3, to switch scheduling to 8ms step, one needs to do
DosAsyncTimer() in time-critical thread. On laters versions,
more and more cases of wait-for-something are covered.
It turns out that on Warp3fp42 it is the priority at the time
of DosAsyncTimer() which matters. Let's hope that this works
with later versions too... XXXX
*/
priority = (tib->tib_ptib2->tib2_ulpri);
if ((priority & 0xFF00) == 0x0300) /* already time-critical */
switch_priority = 0;
/* Make us time-critical. Just modifying TIB is not enough... */
/* tib->tib_ptib2->tib2_ulpri = 0x0300;*/
/* We do not want to run at high priority if a signal causes us
to longjmp() out of this section... */
/* Make us time-critical. Just modifying TIB is not enough... */
/* tib->tib_ptib2->tib2_ulpri = 0x0300;*/
/* We do not want to run at high priority if a signal causes us
to longjmp() out of this section... */
else if (DosEnterMustComplete(&nesting))
switch_priority = 0;
else
Expand All @@ -148,8 +116,8 @@ DECLSPEC void SDLCALL SDL_Delay(Uint32 ms)

if (switch_priority && tib->tib_ptib2->tib2_ulpri == 0x0300)
{
/* Nobody switched priority while we slept... Ignore errors... */
/* tib->tib_ptib2->tib2_ulpri = priority; */ /* Get back... */
/* Nobody switched priority while we slept... Ignore errors... */
/* tib->tib_ptib2->tib2_ulpri = priority; */ /* Get back... */
if (!(rc = DosSetPriority(PRTYS_THREAD, (priority>>8) & 0xFF, 0, 0)))
rc = DosSetPriority(PRTYS_THREAD, 0, priority & 0xFF, 0);
}
Expand All @@ -172,8 +140,7 @@ DECLSPEC void SDLCALL SDL_Delay(Uint32 ms)
e = "DosCloseEventSem";
badrc = rc;
}
if (e)
{
if (e) {
SDL_SetError("[SDL_Delay] : Had error in %s(), rc is 0x%x\n", e, badrc);
}
}
Expand All @@ -185,29 +152,29 @@ static SDL_Thread *timer = NULL;
static int SDLCALL RunTimer(void *unused)
{
DosSetPriority(PRTYS_THREAD, PRTYC_TIMECRITICAL, 0, 0);
while ( timer_alive ) {
if ( SDL_timer_running ) {
while (timer_alive) {
if (SDL_timer_running) {
SDL_ThreadedTimerCheck();
}
SDL_Delay(10);
}
return(0);
return 0;
}

/* This is only called if the event thread is not running */
int SDL_SYS_TimerInit(void)
{
timer_alive = 1;
timer = SDL_CreateThread(RunTimer, NULL);
if ( timer == NULL )
return(-1);
return(SDL_SetTimerThreaded(1));
if (timer == NULL)
return -1;
return SDL_SetTimerThreaded(1);
}

void SDL_SYS_TimerQuit(void)
{
timer_alive = 0;
if ( timer ) {
if (timer) {
SDL_WaitThread(timer, NULL);
timer = NULL;
}
Expand All @@ -216,12 +183,11 @@ void SDL_SYS_TimerQuit(void)
int SDL_SYS_StartTimer(void)
{
SDL_SetError("Internal logic error: OS/2 uses threaded timer");
return(-1);
return -1;
}

void SDL_SYS_StopTimer(void)
{
return;
}

#endif /* SDL_TIMER_OS2 */

0 comments on commit b8be06e

Please sign in to comment.