Adapt timer code for Coldfire SDL-1.2
authorPatrice Mandin <patmandin@gmail.com>
Sat, 07 Nov 2009 20:56:09 +0000
branchSDL-1.2
changeset 4381 5425a6fbacf8
parent 4380 66aea42c3541
child 4382 6599c89de50c
Adapt timer code for Coldfire
src/timer/mint/SDL_vbltimer.S
--- a/src/timer/mint/SDL_vbltimer.S	Sat Nov 07 20:45:45 2009 +0000
+++ b/src/timer/mint/SDL_vbltimer.S	Sat Nov 07 20:56:09 2009 +0000
@@ -36,14 +36,61 @@
 
 	.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 */
 
@@ -58,7 +105,12 @@
 	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
@@ -100,7 +152,12 @@
 	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
@@ -110,25 +167,37 @@
 /*--- 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
-
-	moveml	d0-d7/a0-a6,sp@-
+#endif
 
 	/* Save FPU if needed */
 	tstw	_SDL_MintAudio_hasfpu
 	beqs	SDL_AtariVbl_nofpu1
-	.chip	68060
-	fsave	sp@-
-	fmoveml fpcr/fpsr/fpiar,sp@-
-	fmovemx	fp0-fp7,sp@-
-	.chip	68000
+	SAVE_FPU_CONTEXT
 SDL_AtariVbl_nofpu1:
 
 	movel	my_vector,a0
@@ -137,17 +206,17 @@
 	/* Restore FPU if needed */
 	tstw	_SDL_MintAudio_hasfpu
 	beqs	SDL_AtariVbl_Xbios_nofpu2
-	.chip	68060
-	fmovemx	sp@+,fp0-fp7
-	fmoveml	sp@+,fpcr/fpsr/fpiar
-	frestore	sp@+
-	.chip	68000
+	RESTORE_FPU_CONTEXT
 SDL_AtariVbl_Xbios_nofpu2:
 
-	moveml	sp@+,d0-d7/a0-a6
-
 	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