# 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
