aboutsummaryrefslogtreecommitdiffstats
path: root/distrib/sdl-1.2.15/src/timer/mint
diff options
context:
space:
mode:
Diffstat (limited to 'distrib/sdl-1.2.15/src/timer/mint')
-rw-r--r--distrib/sdl-1.2.15/src/timer/mint/SDL_systimer.c149
-rw-r--r--distrib/sdl-1.2.15/src/timer/mint/SDL_vbltimer.S228
-rw-r--r--distrib/sdl-1.2.15/src/timer/mint/SDL_vbltimer_s.h35
3 files changed, 412 insertions, 0 deletions
diff --git a/distrib/sdl-1.2.15/src/timer/mint/SDL_systimer.c b/distrib/sdl-1.2.15/src/timer/mint/SDL_systimer.c
new file mode 100644
index 0000000..01e7a41
--- /dev/null
+++ b/distrib/sdl-1.2.15/src/timer/mint/SDL_systimer.c
@@ -0,0 +1,149 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2012 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ 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
+ Lesser General Public License for more details.
+
+ 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
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+#ifdef SDL_TIMER_MINT
+
+/*
+ * 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>
+
+#include <mint/cookie.h>
+#include <mint/sysvars.h>
+#include <mint/osbind.h>
+#include <mint/mintbind.h>
+
+#include "SDL_timer.h"
+#include "../SDL_timer_c.h"
+#include "SDL_thread.h"
+
+#include "../../video/ataricommon/SDL_atarisuper.h"
+
+#include "SDL_vbltimer_s.h"
+
+/* from audio/mint */
+void SDL_MintAudio_CheckFpu(void);
+
+/* The first ticks value of the application */
+static Uint32 start;
+static SDL_bool read_hz200_from_vbl = SDL_FALSE;
+static int mint_present; /* can we use Syield() ? */
+
+void SDL_StartTicks(void)
+{
+ void *old_stack;
+ long dummy;
+
+ /* Set first ticks value */
+ old_stack = (void *)Super(0);
+ start = *((volatile long *)_hz_200);
+ SuperToUser(old_stack);
+
+ start *= 5; /* One _hz_200 tic is 5ms */
+
+ mint_present = (Getcookie(C_MiNT, &dummy) == C_FOUND);
+}
+
+Uint32 SDL_GetTicks (void)
+{
+ Uint32 now = start;
+
+ if (read_hz200_from_vbl) {
+ now = SDL_Atari_hz200;
+ } else {
+ void *old_stack = (void *)Super(0);
+ now = *((volatile long *)_hz_200);
+ SuperToUser(old_stack);
+ }
+
+ return((now*5)-start);
+}
+
+void SDL_Delay (Uint32 ms)
+{
+ Uint32 now;
+
+ now = SDL_GetTicks();
+ while ((SDL_GetTicks()-now)<ms){
+ if (mint_present) {
+ Syield();
+ }
+ }
+}
+
+/* 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)
+{
+ void *old_stack;
+
+ SDL_MintAudio_CheckFpu();
+
+ /* Install RunTimer in vbl vector */
+ old_stack = (void *)Super(0);
+ timer_installed = !SDL_AtariVblInstall(SDL_ThreadedTimerCheck);
+ SuperToUser(old_stack);
+
+ if (!timer_installed) {
+ return(-1);
+ }
+
+ read_hz200_from_vbl = SDL_TRUE;
+ return(SDL_SetTimerThreaded(0));
+}
+
+void SDL_SYS_TimerQuit(void)
+{
+ /* Uninstall RunTimer vbl vector */
+ if (timer_installed) {
+ void *old_stack = (void *)Super(0);
+ SDL_AtariVblUninstall(SDL_ThreadedTimerCheck);
+ SuperToUser(old_stack);
+ timer_installed = SDL_FALSE;
+ }
+ read_hz200_from_vbl = SDL_FALSE;
+}
+
+int SDL_SYS_StartTimer(void)
+{
+ SDL_SetError("Internal logic error: MiNT uses vbl timer");
+ return(-1);
+}
+
+void SDL_SYS_StopTimer(void)
+{
+ return;
+}
+
+#endif /* SDL_TIMER_MINT */
diff --git a/distrib/sdl-1.2.15/src/timer/mint/SDL_vbltimer.S b/distrib/sdl-1.2.15/src/timer/mint/SDL_vbltimer.S
new file mode 100644
index 0000000..7837afc
--- /dev/null
+++ b/distrib/sdl-1.2.15/src/timer/mint/SDL_vbltimer.S
@@ -0,0 +1,228 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2012 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ 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
+ Lesser General Public License for more details.
+
+ 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
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+
+/*
+ * VBL queue routine
+ *
+ * Patrice Mandin
+ */
+
+#define _vbl_queue 0x456
+#define _hz_200 0x4ba
+
+ .text
+
+ .globl _SDL_AtariVblInstall
+ .globl _SDL_AtariVblUninstall
+
+ .globl _SDL_MintAudio_hasfpu
+
+/*--- Save/restore FPU context ---*/
+
+#if defined(__mcoldfire__)
+
+#define SAVE_FPU_CONTEXT \
+ lea sp@(-216),sp; \
+ fsave sp@; \
+ fmovel fpiar,sp@-; \
+ lea sp@(-64),sp; \
+ fmovemd fp0-fp7,sp@
+
+#define RESTORE_FPU_CONTEXT \
+ fmovemd sp@,fp0-fp7; \
+ lea sp@(64),sp; \
+ fmovel sp@+,fpiar; \
+ frestore sp@; \
+ lea sp@(216),sp
+
+#else
+
+#define SAVE_FPU_CONTEXT \
+ .chip 68k/68881; \
+ fsave sp@-; \
+ fmoveml fpcr/fpsr/fpiar,sp@-; \
+ fmovemx fp0-fp7,sp@-; \
+ .chip 68k
+
+#define RESTORE_FPU_CONTEXT \
+ .chip 68k/68881; \
+ fmovemx sp@+,fp0-fp7; \
+ fmoveml sp@+,fpcr/fpsr/fpiar; \
+ frestore sp@+; \
+ .chip 68k
+
+#endif
+
+/*--- Vector installer ---*/
+
+_SDL_AtariVblInstall:
+#if defined(__mcoldfire__)
+ movel sp@(4),d0
+ movel d0,my_vector
+#else
+ movel sp@(4),my_vector
+#endif
+
+ lea _my_vbl,a0
+
+ clrw vbl_mutex
+#if defined(__mcoldfire__)
+ movel _hz_200.w,d0
+ movel d0, _SDL_Atari_hz200
+#else
+ movel _hz_200.w, _SDL_Atari_hz200
+#endif
+
+ /* Stop interrupts */
+
+ movew #0x2700,sr
+
+ /* Read vbl_queue pointer */
+ movel _vbl_queue.w,a1
+
+ /* Search a free place */
+ moveq #7,d0
+bcl_search_place:
+ movel (a1),d1
+ beqs place_found
+ addql #4,a1
+#if defined(__mcoldfire__)
+ subql #1,d0
+ bpls bcl_search_place
+#else
+ dbra d0,bcl_search_place
+#endif
+
+ /* Not found */
+ moveq #1,d0
+ bras exit_vbl_queue
+
+ /* Then install ourselves */
+place_found:
+ movel a0,(a1)
+ moveq #0,d0
+
+exit_vbl_queue:
+ /* Restart interrupts */
+ movew #0x2300,sr
+
+ rts
+
+/*--- Vector uninstaller ---*/
+
+_SDL_AtariVblUninstall:
+ movel sp@(4),d0
+ cmpl my_vector,d0
+ bnes badvector
+
+ movel #_my_vbl,d0
+
+ /* Stop interrupts */
+
+ movew #0x2700,sr
+
+ /* Read vbl_queue pointer */
+ movel _vbl_queue.w,a1
+
+ /* Search where we are */
+ moveq #7,d1
+bcl2_search_place:
+ cmpl (a1),d0
+ bnes next_place
+ clrl (a1)
+ moveq #0,d1
+next_place:
+ addql #4,a1
+#if defined(__mcoldfire__)
+ subql #1,d1
+ bpls bcl_search_place
+#else
+ dbra d1,bcl2_search_place
+#endif
+
+ /* Restart interrupts */
+ movew #0x2300,sr
+badvector:
+ rts
+
+/*--- Our vbl ---*/
+
+_my_vbl:
+#if defined(__mcoldfire__)
+ lea sp@(-60),sp
+ moveml d0-d7/a0-a6,sp@
+#else
+ moveml d0-d7/a0-a6,sp@-
+#endif
+
+ /* Update _hz_200 */
+#if defined(__mcoldfire__)
+ movel _hz_200.w,d0
+ movel d0, _SDL_Atari_hz200
+#else
+ movel _hz_200.w, _SDL_Atari_hz200
+#endif
+
+ /* Verify if this is not already running */
+
+ tstw vbl_mutex
+ bnes vbl_end
+#if defined(__mcoldfire__)
+ movew vbl_mutex,d0
+ notl d0
+ movew d0,vbl_mutex
+#else
+ notw vbl_mutex
+#endif
+
+ /* Save FPU if needed */
+ tstw _SDL_MintAudio_hasfpu
+ beqs SDL_AtariVbl_nofpu1
+ SAVE_FPU_CONTEXT
+SDL_AtariVbl_nofpu1:
+
+ movel my_vector,a0
+ jsr a0@
+
+ /* Restore FPU if needed */
+ tstw _SDL_MintAudio_hasfpu
+ beqs SDL_AtariVbl_Xbios_nofpu2
+ RESTORE_FPU_CONTEXT
+SDL_AtariVbl_Xbios_nofpu2:
+
+ clrw vbl_mutex
+vbl_end:
+#if defined(__mcoldfire__)
+ moveml sp@,d0-d7/a0-a6
+ lea sp@(60),sp
+#else
+ moveml sp@+,d0-d7/a0-a6
+#endif
+ rts
+
+ .data
+ .even
+ .comm _SDL_Atari_hz200,4*1
+ .even
+ .comm vbl_mutex,2*1
+ .even
+ .comm my_vector,4*1
diff --git a/distrib/sdl-1.2.15/src/timer/mint/SDL_vbltimer_s.h b/distrib/sdl-1.2.15/src/timer/mint/SDL_vbltimer_s.h
new file mode 100644
index 0000000..011c138
--- /dev/null
+++ b/distrib/sdl-1.2.15/src/timer/mint/SDL_vbltimer_s.h
@@ -0,0 +1,35 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2012 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ 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
+ Lesser General Public License for more details.
+
+ 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
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+/*
+ * TOS/MiNT timer driver
+ * based on vbl vector
+ *
+ * Patrice Mandin
+ */
+
+extern volatile long SDL_Atari_hz200;
+
+/* Functions prototypes */
+extern int SDL_AtariVblInstall(void *newvector);
+extern void SDL_AtariVblUninstall(void *newvector);