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

Latest commit

 

History

History
268 lines (214 loc) · 5.77 KB

SDL_systimer.c

File metadata and controls

268 lines (214 loc) · 5.77 KB
 
Apr 26, 2001
Apr 26, 2001
1
2
/*
SDL - Simple DirectMedia Layer
Feb 1, 2006
Feb 1, 2006
3
Copyright (C) 1997-2006 Sam Lantinga
Apr 26, 2001
Apr 26, 2001
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
Apr 26, 2001
Apr 26, 2001
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.
Apr 26, 2001
Apr 26, 2001
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.
Apr 26, 2001
Apr 26, 2001
14
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
Apr 26, 2001
Apr 26, 2001
18
19
Sam Lantinga
Dec 14, 2001
Dec 14, 2001
20
slouken@libsdl.org
Apr 26, 2001
Apr 26, 2001
21
*/
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
Apr 26, 2001
Apr 26, 2001
23
Apr 14, 2006
Apr 14, 2006
24
25
#ifdef SDL_TIMER_AMIGA
Apr 26, 2001
Apr 26, 2001
26
#include <stdio.h>
May 10, 2001
May 10, 2001
27
#include <time.h>
Apr 26, 2001
Apr 26, 2001
28
29
30
31
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
May 10, 2001
May 10, 2001
32
33
34
35
36
37
38
#include <exec/types.h>
#ifdef __SASC
#include <proto/dos.h>
#include <clib/graphics_protos.h>
#include <pragmas/graphics.h>
#include <clib/exec_protos.h>
#include <pragmas/exec.h>
Dec 16, 2001
Dec 16, 2001
39
40
41
42
#elif defined(STORMC4_WOS)
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/graphics.h>
May 10, 2001
May 10, 2001
43
44
45
46
47
48
49
50
51
52
#else
#include <inline/dos.h>
#include <inline/exec.h>
#include <inline/graphics.h>
#endif
#include "mydebug.h"
extern struct DosLibrary *DOSBase;
extern struct ExecBase *SysBase;
static struct GfxBase *GfxBase;
Apr 26, 2001
Apr 26, 2001
53
54
#include "SDL_timer.h"
Feb 16, 2006
Feb 16, 2006
55
#include "../SDL_timer_c.h"
May 10, 2001
May 10, 2001
56
Apr 26, 2001
Apr 26, 2001
57
/* The first ticks value of the application */
May 10, 2001
May 10, 2001
58
Dec 16, 2001
Dec 16, 2001
59
#if !defined(__PPC__) || defined(STORMC4_WOS) || defined(MORPHOS)
May 10, 2001
May 10, 2001
60
static clock_t start;
Apr 26, 2001
Apr 26, 2001
61
Jul 10, 2006
Jul 10, 2006
62
63
void
SDL_StartTicks(void)
Apr 26, 2001
Apr 26, 2001
64
{
Jul 10, 2006
Jul 10, 2006
65
66
/* Set first ticks value */
start = clock();
Apr 26, 2001
Apr 26, 2001
67
68
}
Jul 10, 2006
Jul 10, 2006
69
70
Uint32
SDL_GetTicks(void)
Apr 26, 2001
Apr 26, 2001
71
{
Jul 10, 2006
Jul 10, 2006
72
clock_t ticks;
May 10, 2001
May 10, 2001
73
Jul 10, 2006
Jul 10, 2006
74
ticks = clock() - start;
May 10, 2001
May 10, 2001
75
76
77
#ifdef __SASC
// CLOCKS_PER_SEC == 1000 !
Apr 26, 2001
Apr 26, 2001
78
Jul 10, 2006
Jul 10, 2006
79
return (ticks);
May 10, 2001
May 10, 2001
80
81
82
#else
// CLOCKS_PER_SEC != 1000 !
Jul 10, 2006
Jul 10, 2006
83
return ticks * (1000 / CLOCKS_PER_SEC);
May 10, 2001
May 10, 2001
84
#endif
Apr 26, 2001
Apr 26, 2001
85
86
}
Jul 10, 2006
Jul 10, 2006
87
88
void
SDL_Delay(Uint32 ms)
Apr 26, 2001
Apr 26, 2001
89
{
May 10, 2001
May 10, 2001
90
91
// Do a busy wait if time is less than 50ms
Jul 10, 2006
Jul 10, 2006
92
93
if (ms < 50) {
clock_t to_wait = clock();
May 10, 2001
May 10, 2001
94
95
#ifndef __SASC
Jul 10, 2006
Jul 10, 2006
96
ms *= (CLOCKS_PER_SEC / 1000);
Apr 26, 2001
Apr 26, 2001
97
#endif
Jul 10, 2006
Jul 10, 2006
98
99
100
101
102
103
to_wait += ms;
while (clock() < to_wait);
} else {
Delay(ms / 20);
}
May 10, 2001
May 10, 2001
104
}
Apr 26, 2001
Apr 26, 2001
105
106
#else
May 10, 2001
May 10, 2001
107
108
109
110
111
112
113
114
ULONG MY_CLOCKS_PER_SEC;
void PPC_TimerInit(void);
APTR MyTimer;
ULONG start[2];
Jul 10, 2006
Jul 10, 2006
115
116
void
SDL_StartTicks(void)
May 10, 2001
May 10, 2001
117
{
Jul 10, 2006
Jul 10, 2006
118
119
120
121
122
123
124
125
/* Set first ticks value */
if (!MyTimer)
PPC_TimerInit();
PPCGetTimerObject(MyTimer, PPCTIMERTAG_CURRENTTICKS, start);
start[1] >>= 10;
start[1] |= ((result[0] & 0x3ff) << 22);
start[0] >>= 10;
May 10, 2001
May 10, 2001
126
127
}
Jul 10, 2006
Jul 10, 2006
128
129
Uint32
SDL_GetTicks(void)
May 10, 2001
May 10, 2001
130
{
Jul 10, 2006
Jul 10, 2006
131
132
ULONG result[2];
PPCGetTimerObject(MyTimer, PPCTIMERTAG_CURRENTTICKS, result);
May 10, 2001
May 10, 2001
133
Jul 10, 2006
Jul 10, 2006
134
// PPCAsr64p(result,10);
May 10, 2001
May 10, 2001
135
// Non va, la emulo:
Dec 16, 2001
Dec 16, 2001
136
Jul 10, 2006
Jul 10, 2006
137
138
result[1] >>= 10;
result[1] |= ((result[0] & 0x3ff) << 22);
May 10, 2001
May 10, 2001
139
140
141
// Non mi interessa piu' result[0]
Jul 10, 2006
Jul 10, 2006
142
return result[1] * 1000 / MY_CLOCKS_PER_SEC;
May 10, 2001
May 10, 2001
143
144
}
Jul 10, 2006
Jul 10, 2006
145
146
void
SDL_Delay(Uint32 ms)
May 10, 2001
May 10, 2001
147
148
149
{
// Do a busy wait if time is less than 50ms
Jul 10, 2006
Jul 10, 2006
150
151
152
153
154
155
156
157
158
159
160
161
if (ms < 50) {
ULONG to_wait[2], actual[2];
PPCGetTimerObject(MyTimer, PPCTIMERTAG_CURRENTTICKS, result);
actual[1] = 0;
to_wait[1] += ms * 1000 / MY_CLOCKS_PER_SEC;
while (actual[1] < to_wait[1]) {
PPCGetTimerObject(MyTimer, PPCTIMERTAG_CURRENTTICKS, actual);
}
} else {
Delay(ms / 50);
}
May 10, 2001
May 10, 2001
162
163
}
Jul 10, 2006
Jul 10, 2006
164
165
void
PPC_TimerInit(void)
May 10, 2001
May 10, 2001
166
{
Jul 10, 2006
Jul 10, 2006
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
struct TagItem tags[] = {
PPCTIMERTAG_CPU, TRUE,
TAG_DONE, 0
};
if (MyTimer = PPCCreateTimerObject(tags)) {
ULONG result[2];
PPCGetTimerObject(MyTimer, PPCTIMERTAG_TICKSPERSEC, result);
D(bug("Timer inizializzato, TPS: %lu - %lu\n", result[0], result[1]));
// PPCAsr64p(result,10);
result[1] >>= 10;
result[1] |= ((result[0] & 0x3ff) << 22);
result[0] >>= 10;
D(bug("Shiftato TPS: %lu - %lu\n", result[0], result[1]));
MY_CLOCKS_PER_SEC = result[1];
PPCGetTimerObject(MyTimer, PPCTIMERTAG_CURRENTTICKS, result);
D(bug("Current ticks: %lu - %lu\n", result[0], result[1]));
result[1] >>= 10;
result[1] |= ((result[0] & 0x3ff) << 22);
result[0] >>= 10;
// PPCAsr64p(result,10);
D(bug("Shiftato: %lu - %lu\n", result[0], result[1]));
} else {
D(bug("Errore nell'inizializzazione del timer!\n"));
}
Apr 26, 2001
Apr 26, 2001
197
198
}
May 10, 2001
May 10, 2001
199
200
#endif
Apr 26, 2001
Apr 26, 2001
201
202
203
204
#include "SDL_thread.h"
/* Data to handle a single periodic alarm */
static int timer_alive = 0;
May 10, 2001
May 10, 2001
205
static SDL_Thread *timer_thread = NULL;
Apr 26, 2001
Apr 26, 2001
206
Jul 10, 2006
Jul 10, 2006
207
208
static int
RunTimer(void *unused)
Apr 26, 2001
Apr 26, 2001
209
{
Jul 10, 2006
Jul 10, 2006
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
D(bug("SYSTimer: Entering RunTimer loop..."));
if (GfxBase == NULL)
GfxBase = (struct GfxBase *) OpenLibrary("graphics.library", 37);
while (timer_alive) {
if (SDL_timer_running) {
SDL_ThreadedTimerCheck();
}
if (GfxBase)
WaitTOF(); // Check the timer every fifth of seconds. Was SDL_Delay(1)->BusyWait!
else
Delay(1);
}
D(bug("SYSTimer: EXITING RunTimer loop..."));
return (0);
Apr 26, 2001
Apr 26, 2001
226
227
228
}
/* This is only called if the event thread is not running */
Jul 10, 2006
Jul 10, 2006
229
230
int
SDL_SYS_TimerInit(void)
Apr 26, 2001
Apr 26, 2001
231
{
Jul 10, 2006
Jul 10, 2006
232
D(bug("Creating thread for the timer (NOITIMER)...\n"));
May 10, 2001
May 10, 2001
233
Jul 10, 2006
Jul 10, 2006
234
235
236
237
timer_alive = 1;
timer_thread = SDL_CreateThread(RunTimer, NULL);
if (timer_thread == NULL) {
D(bug("Creazione del thread fallita...\n"));
Apr 26, 2001
Apr 26, 2001
238
Jul 10, 2006
Jul 10, 2006
239
240
241
return (-1);
}
return (SDL_SetTimerThreaded(1));
Apr 26, 2001
Apr 26, 2001
242
243
}
Jul 10, 2006
Jul 10, 2006
244
245
void
SDL_SYS_TimerQuit(void)
Apr 26, 2001
Apr 26, 2001
246
{
Jul 10, 2006
Jul 10, 2006
247
248
249
250
251
timer_alive = 0;
if (timer_thread) {
SDL_WaitThread(timer_thread, NULL);
timer_thread = NULL;
}
Apr 26, 2001
Apr 26, 2001
252
253
}
Jul 10, 2006
Jul 10, 2006
254
255
int
SDL_SYS_StartTimer(void)
Apr 26, 2001
Apr 26, 2001
256
{
Jul 10, 2006
Jul 10, 2006
257
258
SDL_SetError("Internal logic error: AmigaOS uses threaded timer");
return (-1);
Apr 26, 2001
Apr 26, 2001
259
260
}
Jul 10, 2006
Jul 10, 2006
261
262
void
SDL_SYS_StopTimer(void)
Apr 26, 2001
Apr 26, 2001
263
{
Jul 10, 2006
Jul 10, 2006
264
return;
Apr 26, 2001
Apr 26, 2001
265
}
Apr 14, 2006
Apr 14, 2006
266
267
#endif /* SDL_TIMER_AMIGA */
Jul 10, 2006
Jul 10, 2006
268
/* vi: set ts=4 sw=4 expandtab: */