From 1e19e98ec1f806fdc3b3ca2e34cccd5d2769b3f3 Mon Sep 17 00:00:00 2001 From: Patrice Mandin Date: Sat, 7 Nov 2009 20:45:45 +0000 Subject: [PATCH] Adapt audio interrupts for Coldfire --- src/audio/mint/SDL_mintaudio_it.S | 231 ++++++++++++++++++++++-------- 1 file changed, 168 insertions(+), 63 deletions(-) diff --git a/src/audio/mint/SDL_mintaudio_it.S b/src/audio/mint/SDL_mintaudio_it.S index f2d36e80d..385aacfc0 100644 --- a/src/audio/mint/SDL_mintaudio_it.S +++ b/src/audio/mint/SDL_mintaudio_it.S @@ -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 @@ SDL_MintAudio_Xbios_nofpu1: /* 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 @@ SDL_MintAudio_Xbios_nofpu2: 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 @@ SDL_MintAudio_Dma8_nofpu1: /* 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 @@ SDL_MintAudio_Dma8_nofpu2: 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_START = 6 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 @@ SDL_MintAudio_Stfa_nofpu1: /* 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 @@ SDL_MintAudio_Stfa_nofpu2: 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