diff options
Diffstat (limited to 'distrib/sdl-1.2.15/src/timer/mint')
-rw-r--r-- | distrib/sdl-1.2.15/src/timer/mint/SDL_systimer.c | 149 | ||||
-rw-r--r-- | distrib/sdl-1.2.15/src/timer/mint/SDL_vbltimer.S | 228 | ||||
-rw-r--r-- | distrib/sdl-1.2.15/src/timer/mint/SDL_vbltimer_s.h | 35 |
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); |