Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
155 lines (124 loc) · 3.33 KB

SDL_systimer.c

File metadata and controls

155 lines (124 loc) · 3.33 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Feb 1, 2006
Feb 1, 2006
3
Copyright (C) 1997-2006 Sam Lantinga
4
5
This library is free software; you can redistribute it and/or
Feb 1, 2006
Feb 1, 2006
6
modify it under the terms of the GNU Lesser General Public
7
License as published by the Free Software Foundation; either
Feb 1, 2006
Feb 1, 2006
8
version 2.1 of the License, or (at your option) any later version.
9
10
11
12
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Feb 1, 2006
Feb 1, 2006
13
Lesser General Public License for more details.
Feb 1, 2006
Feb 1, 2006
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19
20
21
Sam Lantinga
slouken@libsdl.org
*/
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
Apr 14, 2006
Apr 14, 2006
24
25
#ifdef SDL_TIMER_MINT
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/*
* TOS/MiNT timer driver
* based on vbl vector
*
* Patrice Mandin
*/
#include <stdio.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
Apr 1, 2005
Apr 1, 2005
40
#include <mint/cookie.h>
Dec 7, 2002
Dec 7, 2002
41
#include <mint/sysvars.h>
Apr 1, 2005
Apr 1, 2005
42
43
#include <mint/osbind.h>
#include <mint/mintbind.h>
44
45
#include "SDL_timer.h"
Feb 16, 2006
Feb 16, 2006
46
#include "../SDL_timer_c.h"
47
48
#include "SDL_thread.h"
Feb 20, 2006
Feb 20, 2006
49
#include "SDL_vbltimer_s.h"
Oct 21, 2006
Oct 21, 2006
51
52
53
/* from audio/mint */
void SDL_MintAudio_CheckFpu(void);
54
55
/* The first ticks value of the application */
static Uint32 start;
Jun 9, 2007
Jun 9, 2007
56
static SDL_bool read_hz200_from_vbl = SDL_FALSE;
Jul 10, 2006
Jul 10, 2006
57
static int mint_present; /* can we use Syield() ? */
Jul 10, 2006
Jul 10, 2006
59
60
void
SDL_StartTicks(void)
Jul 10, 2006
Jul 10, 2006
62
63
void *oldpile;
unsigned long dummy;
Jul 10, 2006
Jul 10, 2006
65
66
67
68
/* Set first ticks value */
oldpile = (void *) Super(0);
start = *((volatile long *) _hz_200);
Super(oldpile);
Jul 10, 2006
Jul 10, 2006
70
start *= 5; /* One _hz_200 tic is 5ms */
Apr 1, 2005
Apr 1, 2005
71
Jul 10, 2006
Jul 10, 2006
72
mint_present = (Getcookie(C_MiNT, &dummy) == C_FOUND);
Jul 10, 2006
Jul 10, 2006
75
76
Uint32
SDL_GetTicks(void)
Jun 9, 2007
Jun 9, 2007
78
79
80
81
82
Uint32 now = start;
if (read_hz200_from_vbl) {
now = SDL_Atari_hz200;
} else {
Jun 14, 2007
Jun 14, 2007
83
84
void *old_stack = (void *) Super(0);
now = *((volatile long *) _hz_200);
Jun 9, 2007
Jun 9, 2007
85
Super(old_stack);
Jul 10, 2006
Jul 10, 2006
86
}
Jul 10, 2006
Jul 10, 2006
88
return ((now * 5) - start);
Jul 10, 2006
Jul 10, 2006
91
92
void
SDL_Delay(Uint32 ms)
Jul 10, 2006
Jul 10, 2006
94
95
96
97
98
99
100
101
Uint32 now;
now = SDL_GetTicks();
while ((SDL_GetTicks() - now) < ms) {
if (mint_present) {
Syield();
}
}
102
103
104
}
/* Data to handle a single periodic alarm */
Jul 10, 2006
Jul 10, 2006
105
static SDL_bool timer_installed = SDL_FALSE;
106
107
/* This is only called if the event thread is not running */
Jul 10, 2006
Jul 10, 2006
108
109
int
SDL_SYS_TimerInit(void)
Jun 9, 2007
Jun 9, 2007
111
void *old_stack;
Oct 21, 2006
Oct 21, 2006
113
114
SDL_MintAudio_CheckFpu();
Jul 10, 2006
Jul 10, 2006
115
/* Install RunTimer in vbl vector */
Jun 9, 2007
Jun 9, 2007
116
117
118
old_stack = (void *) Super(0);
timer_installed = !SDL_AtariVblInstall(SDL_ThreadedTimerCheck);
Super(old_stack);
Jul 10, 2006
Jul 10, 2006
120
121
122
if (!timer_installed) {
return (-1);
}
Jun 9, 2007
Jun 9, 2007
123
124
read_hz200_from_vbl = SDL_TRUE;
Jul 10, 2006
Jul 10, 2006
125
return (SDL_SetTimerThreaded(0));
Jul 10, 2006
Jul 10, 2006
128
129
void
SDL_SYS_TimerQuit(void)
Jul 10, 2006
Jul 10, 2006
131
132
if (timer_installed) {
/* Uninstall RunTimer vbl vector */
Jun 9, 2007
Jun 9, 2007
133
void *old_stack = (void *) Super(0);
Jul 10, 2006
Jul 10, 2006
134
SDL_AtariVblUninstall(RunTimer);
Jun 9, 2007
Jun 9, 2007
135
Super(old_stack);
Jul 10, 2006
Jul 10, 2006
136
137
timer_installed = SDL_FALSE;
}
Jun 9, 2007
Jun 9, 2007
138
read_hz200_from_vbl = SDL_FALSE;
Jul 10, 2006
Jul 10, 2006
141
142
int
SDL_SYS_StartTimer(void)
Jul 10, 2006
Jul 10, 2006
144
145
SDL_SetError("Internal logic error: MiNT uses vbl timer");
return (-1);
Jul 10, 2006
Jul 10, 2006
148
149
void
SDL_SYS_StopTimer(void)
Jul 10, 2006
Jul 10, 2006
151
return;
Apr 14, 2006
Apr 14, 2006
153
154
#endif /* SDL_TIMER_MINT */
Jul 10, 2006
Jul 10, 2006
155
/* vi: set ts=4 sw=4 expandtab: */