Adapt audio interrupts for Coldfire SDL-1.2
authorPatrice Mandin <patmandin@gmail.com>
Sat, 07 Nov 2009 20:45:45 +0000
branchSDL-1.2
changeset 4380 66aea42c3541
parent 4379 2da8b4494ceb
child 4381 5425a6fbacf8
Adapt audio interrupts for Coldfire
src/audio/mint/SDL_mintaudio_it.S
--- a/src/audio/mint/SDL_mintaudio_it.S	Sat Nov 07 12:20:01 2009 +0000
+++ b/src/audio/mint/SDL_mintaudio_it.S	Sat Nov 07 20:45:45 2009 +0000
@@ -55,45 +55,110 @@
 #define	savptr	0x4a2
 #define	savamt	0x46
 
+/*--- 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
+
 /*--- Xbios interrupt vector to measure Falcon external clock ---*/
 
 _SDL_MintAudio_XbiosInterruptMeasureClock:          /* 1 mS */
-
+#if defined(__mcoldfire__)
+	movel	d0,sp@-
+	
+	moveql	#0,d0
+	btst	d0,0xFFFF8901:w	/* state DMA sound */
+#else
 	btst	#0,0xFFFF8901:w	/* state DMA sound */
+#endif
 	beqs	SDL_MintAudio_EndIntMeasure
 	addql	#1,_SDL_MintAudio_clocktics
 SDL_MintAudio_EndIntMeasure:
+#if defined(__mcoldfire__)
+	moveql	#5,d0
+	bclr	d0,0xFFFFFA0F:w	/* Clear service bit */
+
+	movel	sp@+,d0
+#else
 	bclr	#5,0xFFFFFA0F:w	/* Clear service bit */
+#endif
 	rte
 
 /*--- Xbios interrupt vector ---*/
 
 _SDL_MintAudio_XbiosInterrupt:
+#if defined(__mcoldfire__)
+	lea	sp@(-60),sp
+	moveml	d0-d7/a0-a6,sp@
+#else
+	moveml	d0-d7/a0-a6,sp@-
+#endif
 
 	/* Reenable interrupts, so other interrupts can work */
 	movew	#0x2300,sr
 
 	/* Clear service bit, so other MFP interrupts can work */
+#if defined(__mcoldfire__)
+	moveql	#5,d0
+	bclr	d0,0xfffffa0f:w
+#else
 	bclr	#5,0xfffffa0f:w
+#endif
 
 	/* Check if we are not already running */
 	tstw	_SDL_MintAudio_mutex
 	bne	SDL_MintAudio_XbiosEnd
+
+#if defined(__mcoldfire__)
+	movew	_SDL_MintAudio_mutex,d0
+	notl	d0
+	movew	d0,_SDL_MintAudio_mutex
+
+	movew	_SDL_MintAudio_numbuf,d1
+	eorl	#1,d1
+	movew	d1,_SDL_MintAudio_numbuf
+#else
 	notw	_SDL_MintAudio_mutex
-	
+
 	/* Swap buffers */
 	eorw	#1,_SDL_MintAudio_numbuf
-
-	moveml	d0-d7/a0-a6,sp@-
-
+#endif
+	
 	/* Save FPU if needed */
 	tstw	_SDL_MintAudio_hasfpu
 	beqs	SDL_MintAudio_Xbios_nofpu1
-	.chip	68060
-	fsave	sp@-
-	fmoveml fpcr/fpsr/fpiar,sp@-
-	fmovemx	fp0-fp7,sp@-
-	.chip	68000
+	SAVE_FPU_CONTEXT
 SDL_MintAudio_Xbios_nofpu1:
 
 	/* Callback */
@@ -102,15 +167,16 @@
 	/* Restore FPU if needed */
 	tstw	_SDL_MintAudio_hasfpu
 	beqs	SDL_MintAudio_Xbios_nofpu2
-	.chip	68060
-	fmovemx	sp@+,fp0-fp7
-	fmoveml	sp@+,fpcr/fpsr/fpiar
-	frestore	sp@+
-	.chip	68000
+	RESTORE_FPU_CONTEXT
 SDL_MintAudio_Xbios_nofpu2:
 
 	/* Reserve space for registers */
+#if defined(__mcoldfire__)
+	movel	#savamt,d0
+	subl	d0,savptr
+#else
 	subl	#savamt,savptr
+#endif
 
 	/* Set new buffer */
 
@@ -132,42 +198,66 @@
 	lea	sp@(12),sp
 
 	/* Restore registers space */
+#if defined(__mcoldfire__)
+	movel	#savamt,d0
+	addl	d0,savptr
+#else
 	addl	#savamt,savptr
-
-	moveml	sp@+,d0-d7/a0-a6
+#endif
 
 	clrw	_SDL_MintAudio_mutex
 SDL_MintAudio_XbiosEnd:
+#if defined(__mcoldfire__)
+	moveml	sp@,d0-d7/a0-a6
+	lea	sp@(60),sp
+#else
+	moveml	sp@+,d0-d7/a0-a6
+#endif
 	rte
 
 /*--- DMA 8 bits interrupt vector ---*/
 
 _SDL_MintAudio_Dma8Interrupt:
+#if defined(__mcoldfire__)
+	lea	sp@(-16),sp
+	moveml	d0-d1/a0-a1,sp@
+#else
+	moveml	d0-d1/a0-a1,sp@-
+#endif
 
 	/* Reenable interrupts, so other interrupts can work */
 	movew	#0x2300,sr
 
 	/* Clear service bit, so other MFP interrupts can work */
+#if defined(__mcoldfire__)
+	moveql	#5,d0
+	bclr	d0,0xfffffa0f:w
+#else
 	bclr	#5,0xfffffa0f:w
-
+#endif
 	/* Check if we are not already running */
 	tstw	_SDL_MintAudio_mutex
 	bne	SDL_MintAudio_Dma8End
+
+#if defined(__mcoldfire__)
+	movew	_SDL_MintAudio_mutex,d0
+	notl	d0
+	movew	d0,_SDL_MintAudio_mutex
+
+	movew	_SDL_MintAudio_numbuf,d1
+	eorl	#1,d1
+	movew	d1,_SDL_MintAudio_numbuf
+#else
 	notw	_SDL_MintAudio_mutex
-	
+
 	/* Swap buffers */
 	eorw	#1,_SDL_MintAudio_numbuf
-
-	moveml	d0-d1/a0-a1,sp@-
+#endif
 
 	/* Save FPU if needed */
 	tstw	_SDL_MintAudio_hasfpu
 	beqs	SDL_MintAudio_Dma8_nofpu1
-	.chip	68060
-	fsave	sp@-
-	fmoveml fpcr/fpsr/fpiar,sp@-
-	fmovemx	fp0-fp7,sp@-
-	.chip	68000
+	SAVE_FPU_CONTEXT
 SDL_MintAudio_Dma8_nofpu1:
 
 	/* Callback */
@@ -176,11 +266,7 @@
 	/* Restore FPU if needed */
 	tstw	_SDL_MintAudio_hasfpu
 	beqs	SDL_MintAudio_Dma8_nofpu2
-	.chip	68060
-	fmovemx	sp@+,fp0-fp7
-	fmoveml	sp@+,fpcr/fpsr/fpiar
-	frestore	sp@+
-	.chip	68000
+	RESTORE_FPU_CONTEXT
 SDL_MintAudio_Dma8_nofpu2:
 
 	/* Set new buffer */
@@ -188,32 +274,39 @@
 	moveq	#0,d0
 
 	movew	_SDL_MintAudio_numbuf,d0
-	lslw	#2,d0
+	lsll	#2,d0
 	lea	_SDL_MintAudio_audiobuf,a0
-	movel	a0@(d0:w),d1
+	movel	a0@(d0:l),d1
 
 	/* Modify DMA addresses */
 	lea	0xffff8900:w,a0
 
-	moveb	d1,a0@(0x07)	/* Start address */
-	rorl	#8,d1
-	moveb	d1,a0@(0x05)
-	rorl	#8,d1
-	moveb	d1,a0@(0x03)
-	swap	d1
+	movel	d1,d0
+
+	moveb	d0,a0@(0x07)	/* Start address */
+	lsrl	#8,d0
+	moveb	d0,a0@(0x05)
+	lsrl	#8,d0
+	moveb	d0,a0@(0x03)
 
 	addl	_SDL_MintAudio_audiosize,d1
 
-	moveb	d1,a0@(0x13)	/* End address */
-	rorl	#8,d1
-	moveb	d1,a0@(0x11)
-	rorl	#8,d1
-	moveb	d1,a0@(0x0f)
+	movel	d1,d0
 
-	moveml	sp@+,d0-d1/a0-a1
+	moveb	d0,a0@(0x13)	/* End address */
+	lsrl	#8,d0
+	moveb	d0,a0@(0x11)
+	lsrl	#8,d0
+	moveb	d0,a0@(0x0f)
 
 	clrw	_SDL_MintAudio_mutex
 SDL_MintAudio_Dma8End:
+#if defined(__mcoldfire__)
+	moveml	sp@,d0-d1/a0-a1
+	lea	sp@(16),sp
+#else
+	moveml	sp@+,d0-d1/a0-a1
+#endif
 	rte
 
 /*--- STFA interrupt vector ---*/
@@ -222,28 +315,40 @@
 STFA_SOUND_END		=	STFA_SOUND_START+8
 
 _SDL_MintAudio_StfaInterrupt:
-
 	/* Reenable interrupts, so other interrupts can work */
 	movew	#0x2300,sr
 
 	/* Check if we are not already running */
 	tstw	_SDL_MintAudio_mutex
+
+#if defined(__mcoldfire__)
+	bne	SDL_MintAudio_StfaEnd
+
+	lea	sp@(-60),sp
+	moveml	d0-d7/a0-a6,sp@
+
+	movew	_SDL_MintAudio_mutex,d0
+	notl	d0
+	movew	d0,_SDL_MintAudio_mutex
+
+	movew	_SDL_MintAudio_numbuf,d1
+	eorl	#1,d1
+	movew	d1,_SDL_MintAudio_numbuf
+#else
 	bnes	SDL_MintAudio_StfaEnd
-	notw	_SDL_MintAudio_mutex
-	
-	/* Swap buffers */
-	eorw	#1,_SDL_MintAudio_numbuf
 
 	moveml	d0-d7/a0-a6,sp@-
 
+	notw	_SDL_MintAudio_mutex
+
+	/* Swap buffers */
+	eorw	#1,_SDL_MintAudio_numbuf
+#endif
+	
 	/* Save FPU if needed */
 	tstw	_SDL_MintAudio_hasfpu
 	beqs	SDL_MintAudio_Stfa_nofpu1
-	.chip	68060
-	fsave	sp@-
-	fmoveml fpcr/fpsr/fpiar,sp@-
-	fmovemx	fp0-fp7,sp@-
-	.chip	68000
+	SAVE_FPU_CONTEXT
 SDL_MintAudio_Stfa_nofpu1:
 
 	/* Callback */
@@ -252,11 +357,7 @@
 	/* Restore FPU if needed */
 	tstw	_SDL_MintAudio_hasfpu
 	beqs	SDL_MintAudio_Stfa_nofpu2
-	.chip	68060
-	fmovemx	sp@+,fp0-fp7
-	fmoveml	sp@+,fpcr/fpsr/fpiar
-	frestore	sp@+
-	.chip	68000
+	RESTORE_FPU_CONTEXT
 SDL_MintAudio_Stfa_nofpu2:
 
 	/* Set new buffer */
@@ -265,17 +366,21 @@
 	movel	_SDL_MintAudio_stfa,a1
 
 	movew	_SDL_MintAudio_numbuf,d0
-	lslw	#2,d0
+	lsll	#2,d0
 	lea	_SDL_MintAudio_audiobuf,a0
-	movel	a0@(d0:w),d1
+	movel	a0@(d0:l),d1
 
 	/* Modify STFA replay buffers */
 	movel	d1,a1@(STFA_SOUND_START)
 	addl	_SDL_MintAudio_audiosize,d1
 	movel	d1,a1@(STFA_SOUND_END)
 
+#if defined(__mcoldfire__)
+	moveml	sp@,d0-d7/a0-a6
+	lea	sp@(60),sp
+#else
 	moveml	sp@+,d0-d7/a0-a6
-
+#endif
 	clrw	_SDL_MintAudio_mutex
 SDL_MintAudio_StfaEnd:
 	rte