# HG changeset patch # User Patrice Mandin # Date 1406540679 -7200 # Node ID 4a9c67d11c9f688b9c47fb6ee46d3c903ec35f22 # Parent 7f4407040fbd31079fbab9264076450bdd20b1ec atari: Do not use system interrupt for handling timer. Do it from userspace, like RISCOS backend. diff -r 7f4407040fbd -r 4a9c67d11c9f configure.in --- a/configure.in Sun Jul 27 19:19:47 2014 +0200 +++ b/configure.in Mon Jul 28 11:44:39 2014 +0200 @@ -2865,7 +2865,6 @@ else AC_DEFINE(SDL_TIMER_MINT) SOURCES="$SOURCES $srcdir/src/timer/mint/*.c" - SOURCES="$SOURCES $srcdir/src/timer/mint/*.S" fi have_timers=yes fi diff -r 7f4407040fbd -r 4a9c67d11c9f src/timer/mint/SDL_systimer.c --- a/src/timer/mint/SDL_systimer.c Sun Jul 27 19:19:47 2014 +0200 +++ b/src/timer/mint/SDL_systimer.c Mon Jul 28 11:44:39 2014 +0200 @@ -25,7 +25,7 @@ /* * TOS/MiNT timer driver - * based on vbl vector + * based on RISCOS backend * * Patrice Mandin */ @@ -44,106 +44,119 @@ #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 src/video/ataricommon/SDL_atarievents.c */ +void SDL_AtariMint_BackgroundTasks(void); -/* from audio/mint */ -void SDL_MintAudio_CheckFpu(void); +static Uint32 readHz200Timer(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() ? */ +/* Timer SDL_arraysize(Timer ),start/reset time */ +static Uint32 timerStart; + 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 */ + /* Set first ticks value, one _hz_200 tic is 5ms */ + start = readHz200Timer() * 5; mint_present = (Getcookie(C_MiNT, &dummy) == C_FOUND); } Uint32 SDL_GetTicks (void) { - Uint32 now = start; + Uint32 now = readHz200Timer() * 5; - 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); + return(now-start); } void SDL_Delay (Uint32 ms) { Uint32 now; + /* No need to loop for delay below resolution */ + if (ms<5) { + SDL_AtariMint_BackgroundTasks(); + if (mint_present) { + Syield(); + } + return; + } + now = SDL_GetTicks(); while ((SDL_GetTicks()-now)= SDL_alarm_interval) + { + Uint32 ms; + + ms = SDL_alarm_callback(SDL_alarm_interval); + if ( ms != SDL_alarm_interval ) + { + if ( ms ) + { + SDL_alarm_interval = ROUND_RESOLUTION(ms); + } else + { + SDL_alarm_interval = 0; + SDL_timer_running = 0; + } + } + if (SDL_alarm_interval) timerStart = SDL_GetTicks(); + } } #endif /* SDL_TIMER_MINT */ diff -r 7f4407040fbd -r 4a9c67d11c9f src/timer/mint/SDL_vbltimer.S --- a/src/timer/mint/SDL_vbltimer.S Sun Jul 27 19:19:47 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,228 +0,0 @@ -/* - 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 -r 7f4407040fbd -r 4a9c67d11c9f src/timer/mint/SDL_vbltimer_s.h --- a/src/timer/mint/SDL_vbltimer_s.h Sun Jul 27 19:19:47 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/* - 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); diff -r 7f4407040fbd -r 4a9c67d11c9f src/video/ataricommon/SDL_atarievents.c --- a/src/video/ataricommon/SDL_atarievents.c Sun Jul 27 19:19:47 2014 +0200 +++ b/src/video/ataricommon/SDL_atarievents.c Mon Jul 28 11:44:39 2014 +0200 @@ -34,6 +34,7 @@ #include "../../events/SDL_sysevents.h" #include "../../events/SDL_events_c.h" +#include "../../timer/SDL_timer_c.h" #include "SDL_atarikeys.h" #include "SDL_atarievents_c.h" @@ -41,6 +42,9 @@ #include "SDL_gemdosevents_c.h" #include "SDL_ikbdevents_c.h" +/* from src/timer/mint/SDL_systimer.c */ +void SDL_AtariMint_CheckTimer(void); + enum { MCH_ST=0, MCH_STE, @@ -232,3 +236,8 @@ return(keysym); } + +void SDL_AtariMint_BackgroundTasks(void) +{ + if (SDL_timer_running) SDL_AtariMint_CheckTimer(); +} diff -r 7f4407040fbd -r 4a9c67d11c9f src/video/ataricommon/SDL_atarievents_c.h --- a/src/video/ataricommon/SDL_atarievents_c.h Sun Jul 27 19:19:47 2014 +0200 +++ b/src/video/ataricommon/SDL_atarievents_c.h Mon Jul 28 11:44:39 2014 +0200 @@ -44,6 +44,8 @@ extern void SDL_Atari_InitInternalKeymap(_THIS); +extern void SDL_AtariMint_BackgroundTasks(void); + /* Atari to Unicode charset translation table */ extern Uint16 SDL_AtariToUnicodeTable[256]; SDL_keysym *SDL_Atari_TranslateKey(int scancode, SDL_keysym *keysym, diff -r 7f4407040fbd -r 4a9c67d11c9f src/video/ataricommon/SDL_biosevents.c --- a/src/video/ataricommon/SDL_biosevents.c Sun Jul 27 19:19:47 2014 +0200 +++ b/src/video/ataricommon/SDL_biosevents.c Mon Jul 28 11:44:39 2014 +0200 @@ -71,6 +71,8 @@ int i; SDL_keysym keysym; + SDL_AtariMint_BackgroundTasks(); + /* Update pressed keys */ SDL_memset(bios_currentkeyboard, 0, ATARIBIOS_MAXKEYS); diff -r 7f4407040fbd -r 4a9c67d11c9f src/video/ataricommon/SDL_gemdosevents.c --- a/src/video/ataricommon/SDL_gemdosevents.c Sun Jul 27 19:19:47 2014 +0200 +++ b/src/video/ataricommon/SDL_gemdosevents.c Mon Jul 28 11:44:39 2014 +0200 @@ -72,6 +72,8 @@ int i; SDL_keysym keysym; + SDL_AtariMint_BackgroundTasks(); + /* Update pressed keys */ SDL_memset(gemdos_currentkeyboard, 0, ATARIBIOS_MAXKEYS); diff -r 7f4407040fbd -r 4a9c67d11c9f src/video/ataricommon/SDL_ikbdevents.c --- a/src/video/ataricommon/SDL_ikbdevents.c Sun Jul 27 19:19:47 2014 +0200 +++ b/src/video/ataricommon/SDL_ikbdevents.c Mon Jul 28 11:44:39 2014 +0200 @@ -73,6 +73,8 @@ int i; SDL_keysym keysym; + SDL_AtariMint_BackgroundTasks(); + /*--- Send keyboard events ---*/ for (i=0; i