grafX2/3rdparty/SDL-1.2.15-atari-timer.patch
Thomas Bernard 5d12292b43
3rdparty: Fix Atari build
- Lua
- Zlib
- SDL-1.2 atari timer patch
2019-02-09 12:16:02 +01:00

573 lines
13 KiB
Diff

# HG changeset patch
# User Patrice Mandin <patmandin@gmail.com>
# 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)<ms){
+ SDL_AtariMint_BackgroundTasks();
if (mint_present) {
Syield();
}
}
}
-/* Data to handle a single periodic alarm */
-static SDL_bool timer_installed=SDL_FALSE;
+static Uint32 readHz200Timer(void)
+{
+ void *old_stack;
+ Uint32 now;
-/* This is only called if the event thread is not running */
+ old_stack = (void *)Super(0);
+ now = *((volatile long *)_hz_200);
+ SuperToUser(old_stack);
+
+ return now;
+}
+
+/* Non-threaded version of timer */
+
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));
+ return(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;
+ SDL_SetTimer(0, NULL);
}
int SDL_SYS_StartTimer(void)
{
- SDL_SetError("Internal logic error: MiNT uses vbl timer");
- return(-1);
+ timerStart = SDL_GetTicks();
+
+ return(0);
}
void SDL_SYS_StopTimer(void)
{
- return;
+ /* Don't need to do anything as we use SDL_timer_running
+ to detect if we need to check the timer */
+}
+
+
+void SDL_AtariMint_CheckTimer(void)
+{
+ if (SDL_timer_running && SDL_GetTicks() - timerStart >= 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<ATARIBIOS_MAXKEYS; i++) {
diff -r 7f4407040fbd -r 4a9c67d11c9f src/video/gem/SDL_gemevents.c
--- a/src/video/gem/SDL_gemevents.c Sun Jul 27 19:19:47 2014 +0200
+++ b/src/video/gem/SDL_gemevents.c Mon Jul 28 11:44:39 2014 +0200
@@ -86,6 +86,8 @@
quit = 0;
+ SDL_AtariMint_BackgroundTasks();
+
resultat = evnt_multi(
MU_MESAG|MU_TIMER|MU_KEYBD,
0,0,0,
--- SDL-1.2.15/configure.orig 2019-02-09 05:22:11.106966000 +0100
+++ SDL-1.2.15/configure 2019-02-09 05:22:35.734516000 +0100
@@ -30122,7 +30122,6 @@
_ACEOF
SOURCES="$SOURCES $srcdir/src/timer/mint/*.c"
- SOURCES="$SOURCES $srcdir/src/timer/mint/*.S"
fi
have_timers=yes
fi