aboutsummaryrefslogtreecommitdiffstats
path: root/distrib/sdl-1.2.15/src/audio/mint/SDL_mintaudio_it.S
diff options
context:
space:
mode:
Diffstat (limited to 'distrib/sdl-1.2.15/src/audio/mint/SDL_mintaudio_it.S')
-rw-r--r--distrib/sdl-1.2.15/src/audio/mint/SDL_mintaudio_it.S386
1 files changed, 386 insertions, 0 deletions
diff --git a/distrib/sdl-1.2.15/src/audio/mint/SDL_mintaudio_it.S b/distrib/sdl-1.2.15/src/audio/mint/SDL_mintaudio_it.S
new file mode 100644
index 0000000..a2ecac4
--- /dev/null
+++ b/distrib/sdl-1.2.15/src/audio/mint/SDL_mintaudio_it.S
@@ -0,0 +1,386 @@
+/*
+ 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 Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+
+/*
+ Audio interrupts
+
+ Patrice Mandin, Didier Méquignon
+ */
+
+ .text
+
+ .globl _SDL_MintAudio_Callback
+
+ .globl _SDL_MintAudio_XbiosInterrupt
+ .globl _SDL_MintAudio_XbiosInterruptMeasureClock
+ .globl _SDL_MintAudio_Dma8Interrupt
+ .globl _SDL_MintAudio_StfaInterrupt
+
+ .globl _SDL_MintAudio_mutex
+ .globl _SDL_MintAudio_audiobuf
+ .globl _SDL_MintAudio_numbuf
+ .globl _SDL_MintAudio_audiosize
+ .globl _SDL_MintAudio_clocktics
+ .globl _SDL_MintAudio_hasfpu
+
+ .globl _SDL_MintAudio_stfa
+
+/*
+ How it works:
+ - Audio is playing buffer #0 (resp. #1)
+ - We must calculate a sample in buffer #1 (resp. #0)
+ so we first call the callback to do it
+ - Then we swap the buffers
+*/
+
+#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
+#endif
+
+ /* Save FPU if needed */
+ tstw _SDL_MintAudio_hasfpu
+ beqs SDL_MintAudio_Xbios_nofpu1
+ SAVE_FPU_CONTEXT
+SDL_MintAudio_Xbios_nofpu1:
+
+ /* Callback */
+ jsr _SDL_MintAudio_Callback
+
+ /* Restore FPU if needed */
+ tstw _SDL_MintAudio_hasfpu
+ beqs SDL_MintAudio_Xbios_nofpu2
+ 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 */
+
+ moveq #0,d0
+ movel _SDL_MintAudio_audiosize,d1
+
+ movew _SDL_MintAudio_numbuf,d0
+ lsll #2,d0
+ lea _SDL_MintAudio_audiobuf,a0
+ movel a0@(d0:l),a1
+
+ lea a1@(d1:l),a2
+
+ movel a2,sp@-
+ movel a1,sp@-
+ clrw sp@-
+ movew #131,sp@-
+ trap #14
+ lea sp@(12),sp
+
+ /* Restore registers space */
+#if defined(__mcoldfire__)
+ movel #savamt,d0
+ addl d0,savptr
+#else
+ addl #savamt,savptr
+#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
+#endif
+
+ /* Save FPU if needed */
+ tstw _SDL_MintAudio_hasfpu
+ beqs SDL_MintAudio_Dma8_nofpu1
+ SAVE_FPU_CONTEXT
+SDL_MintAudio_Dma8_nofpu1:
+
+ /* Callback */
+ jsr _SDL_MintAudio_Callback
+
+ /* Restore FPU if needed */
+ tstw _SDL_MintAudio_hasfpu
+ beqs SDL_MintAudio_Dma8_nofpu2
+ RESTORE_FPU_CONTEXT
+SDL_MintAudio_Dma8_nofpu2:
+
+ /* Set new buffer */
+
+ moveq #0,d0
+
+ movew _SDL_MintAudio_numbuf,d0
+ lsll #2,d0
+ lea _SDL_MintAudio_audiobuf,a0
+ movel a0@(d0:l),d1
+
+ /* Modify DMA addresses */
+ lea 0xffff8900:w,a0
+
+ 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
+
+ movel d1,d0
+
+ 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 ---*/
+
+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
+
+ 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
+ SAVE_FPU_CONTEXT
+SDL_MintAudio_Stfa_nofpu1:
+
+ /* Callback */
+ jsr _SDL_MintAudio_Callback
+
+ /* Restore FPU if needed */
+ tstw _SDL_MintAudio_hasfpu
+ beqs SDL_MintAudio_Stfa_nofpu2
+ RESTORE_FPU_CONTEXT
+SDL_MintAudio_Stfa_nofpu2:
+
+ /* Set new buffer */
+
+ moveq #0,d0
+ movel _SDL_MintAudio_stfa,a1
+
+ movew _SDL_MintAudio_numbuf,d0
+ lsll #2,d0
+ lea _SDL_MintAudio_audiobuf,a0
+ 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