Skip to content

Latest commit

 

History

History
149 lines (117 loc) · 3.16 KB

SDL_systimer.c

File metadata and controls

149 lines (117 loc) · 3.16 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Dec 31, 2011
Dec 31, 2011
3
Copyright (C) 1997-2012 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"
Jan 10, 2012
Jan 10, 2012
49
50
#include "../../video/ataricommon/SDL_atarisuper.h"
Feb 20, 2006
Feb 20, 2006
51
#include "SDL_vbltimer_s.h"
Oct 21, 2006
Oct 21, 2006
53
54
55
/* from audio/mint */
void SDL_MintAudio_CheckFpu(void);
56
57
/* The first ticks value of the application */
static Uint32 start;
Jun 9, 2007
Jun 9, 2007
58
static SDL_bool read_hz200_from_vbl = SDL_FALSE;
Apr 1, 2005
Apr 1, 2005
59
static int mint_present; /* can we use Syield() ? */
60
61
62
void SDL_StartTicks(void)
{
Jun 9, 2007
Jun 9, 2007
63
void *old_stack;
Aug 28, 2011
Aug 28, 2011
64
long dummy;
65
66
/* Set first ticks value */
Jun 9, 2007
Jun 9, 2007
67
68
old_stack = (void *)Super(0);
start = *((volatile long *)_hz_200);
Jan 10, 2012
Jan 10, 2012
69
SuperToUser(old_stack);
70
71
start *= 5; /* One _hz_200 tic is 5ms */
Apr 1, 2005
Apr 1, 2005
72
73
mint_present = (Getcookie(C_MiNT, &dummy) == C_FOUND);
74
75
76
77
}
Uint32 SDL_GetTicks (void)
{
Jun 9, 2007
Jun 9, 2007
78
79
80
81
82
83
84
Uint32 now = start;
if (read_hz200_from_vbl) {
now = SDL_Atari_hz200;
} else {
void *old_stack = (void *)Super(0);
now = *((volatile long *)_hz_200);
Jan 10, 2012
Jan 10, 2012
85
SuperToUser(old_stack);
86
87
88
89
90
91
92
93
94
95
96
}
return((now*5)-start);
}
void SDL_Delay (Uint32 ms)
{
Uint32 now;
now = SDL_GetTicks();
while ((SDL_GetTicks()-now)<ms){
Apr 1, 2005
Apr 1, 2005
97
98
99
if (mint_present) {
Syield();
}
100
101
102
103
104
105
106
107
108
}
}
/* Data to handle a single periodic alarm */
static SDL_bool timer_installed=SDL_FALSE;
/* This is only called if the event thread is not running */
int SDL_SYS_TimerInit(void)
{
Jun 9, 2007
Jun 9, 2007
109
void *old_stack;
Oct 21, 2006
Oct 21, 2006
111
112
SDL_MintAudio_CheckFpu();
113
/* Install RunTimer in vbl vector */
Jun 9, 2007
Jun 9, 2007
114
115
old_stack = (void *)Super(0);
timer_installed = !SDL_AtariVblInstall(SDL_ThreadedTimerCheck);
Jan 10, 2012
Jan 10, 2012
116
SuperToUser(old_stack);
117
118
119
120
if (!timer_installed) {
return(-1);
}
Jun 9, 2007
Jun 9, 2007
121
122
read_hz200_from_vbl = SDL_TRUE;
123
124
125
126
127
return(SDL_SetTimerThreaded(0));
}
void SDL_SYS_TimerQuit(void)
{
Jun 9, 2007
Jun 9, 2007
128
/* Uninstall RunTimer vbl vector */
129
if (timer_installed) {
Jun 9, 2007
Jun 9, 2007
130
131
void *old_stack = (void *)Super(0);
SDL_AtariVblUninstall(SDL_ThreadedTimerCheck);
Jan 10, 2012
Jan 10, 2012
132
SuperToUser(old_stack);
133
134
timer_installed = SDL_FALSE;
}
Jun 9, 2007
Jun 9, 2007
135
read_hz200_from_vbl = SDL_FALSE;
136
137
138
139
140
141
142
143
144
145
146
147
}
int SDL_SYS_StartTimer(void)
{
SDL_SetError("Internal logic error: MiNT uses vbl timer");
return(-1);
}
void SDL_SYS_StopTimer(void)
{
return;
}
Apr 14, 2006
Apr 14, 2006
148
149
#endif /* SDL_TIMER_MINT */