2003-07-07 19:16:03 +00:00
|
|
|
|
/*
|
|
|
|
|
SDL - Simple DirectMedia Layer
|
|
|
|
|
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 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
|
|
|
|
|
|
2004-10-29 09:56:53 +00:00
|
|
|
|
Patrice Mandin, Didier M<EFBFBD>quignon
|
2003-07-07 19:16:03 +00:00
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
.text
|
|
|
|
|
|
|
|
|
|
.globl _SDL_MintAudio_Callback
|
|
|
|
|
|
|
|
|
|
.globl _SDL_MintAudio_XbiosInterrupt
|
2004-10-29 09:56:53 +00:00
|
|
|
|
.globl _SDL_MintAudio_XbiosInterruptMeasureClock
|
2003-07-07 19:16:03 +00:00
|
|
|
|
.globl _SDL_MintAudio_Dma8Interrupt
|
|
|
|
|
.globl _SDL_MintAudio_StfaInterrupt
|
|
|
|
|
|
|
|
|
|
.globl _SDL_MintAudio_mutex
|
|
|
|
|
.globl _SDL_MintAudio_audiobuf
|
|
|
|
|
.globl _SDL_MintAudio_numbuf
|
|
|
|
|
.globl _SDL_MintAudio_audiosize
|
2004-10-29 09:56:53 +00:00
|
|
|
|
.globl _SDL_MintAudio_clocktics
|
2006-09-16 11:50:34 +00:00
|
|
|
|
.globl _SDL_MintAudio_hasfpu
|
2003-07-07 19:16:03 +00:00
|
|
|
|
|
|
|
|
|
.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
|
|
|
|
|
*/
|
|
|
|
|
|
2005-07-20 17:40:58 +00:00
|
|
|
|
#define savptr 0x4a2
|
|
|
|
|
#define savamt 0x46
|
|
|
|
|
|
2004-10-29 09:56:53 +00:00
|
|
|
|
/*--- Xbios interrupt vector to measure Falcon external clock ---*/
|
|
|
|
|
|
|
|
|
|
_SDL_MintAudio_XbiosInterruptMeasureClock: /* 1 mS */
|
|
|
|
|
|
|
|
|
|
btst #0,0xFFFF8901:w /* state DMA sound */
|
|
|
|
|
beqs SDL_MintAudio_EndIntMeasure
|
|
|
|
|
addql #1,_SDL_MintAudio_clocktics
|
|
|
|
|
SDL_MintAudio_EndIntMeasure:
|
|
|
|
|
bclr #5,0xFFFFFA0F:w /* Clear service bit */
|
|
|
|
|
rte
|
|
|
|
|
|
2003-07-07 19:16:03 +00:00
|
|
|
|
/*--- Xbios interrupt vector ---*/
|
|
|
|
|
|
|
|
|
|
_SDL_MintAudio_XbiosInterrupt:
|
|
|
|
|
|
|
|
|
|
/* Reenable interrupts, so other interrupts can work */
|
|
|
|
|
movew #0x2300,sr
|
|
|
|
|
|
|
|
|
|
/* Clear service bit, so other MFP interrupts can work */
|
|
|
|
|
bclr #5,0xfffffa0f:w
|
|
|
|
|
|
|
|
|
|
/* Check if we are not already running */
|
|
|
|
|
tstw _SDL_MintAudio_mutex
|
2006-09-16 11:50:34 +00:00
|
|
|
|
bne SDL_MintAudio_XbiosEnd
|
2003-07-07 19:16:03 +00:00
|
|
|
|
notw _SDL_MintAudio_mutex
|
|
|
|
|
|
|
|
|
|
/* Swap buffers */
|
2003-08-30 20:00:11 +00:00
|
|
|
|
eorw #1,_SDL_MintAudio_numbuf
|
2003-07-07 19:16:03 +00:00
|
|
|
|
|
2005-07-17 07:11:43 +00:00
|
|
|
|
moveml d0-d7/a0-a6,sp@-
|
2003-07-07 19:16:03 +00:00
|
|
|
|
|
2006-09-16 11:50:34 +00:00
|
|
|
|
/* Save FPU if needed */
|
|
|
|
|
tstw _SDL_MintAudio_hasfpu
|
|
|
|
|
beqs SDL_MintAudio_Xbios_nofpu1
|
2006-09-16 12:00:03 +00:00
|
|
|
|
.chip 68060
|
2006-09-16 11:50:34 +00:00
|
|
|
|
fsave sp@-
|
|
|
|
|
fmoveml fpcr/fpsr/fpiar,sp@-
|
|
|
|
|
fmovemx fp0-fp7,sp@-
|
2006-09-16 12:00:03 +00:00
|
|
|
|
.chip 68000
|
2006-09-16 11:50:34 +00:00
|
|
|
|
SDL_MintAudio_Xbios_nofpu1:
|
|
|
|
|
|
2003-07-07 19:16:03 +00:00
|
|
|
|
/* Callback */
|
|
|
|
|
jsr _SDL_MintAudio_Callback
|
|
|
|
|
|
2006-09-16 11:50:34 +00:00
|
|
|
|
/* Restore FPU if needed */
|
|
|
|
|
tstw _SDL_MintAudio_hasfpu
|
|
|
|
|
beqs SDL_MintAudio_Xbios_nofpu2
|
2006-09-16 12:00:03 +00:00
|
|
|
|
.chip 68060
|
2006-09-16 11:50:34 +00:00
|
|
|
|
fmovemx sp@+,fp0-fp7
|
|
|
|
|
fmoveml sp@+,fpcr/fpsr/fpiar
|
|
|
|
|
frestore sp@+
|
2006-09-16 12:00:03 +00:00
|
|
|
|
.chip 68000
|
2006-09-16 11:50:34 +00:00
|
|
|
|
SDL_MintAudio_Xbios_nofpu2:
|
|
|
|
|
|
2005-07-20 17:40:58 +00:00
|
|
|
|
/* Reserve space for registers */
|
|
|
|
|
subl #savamt,savptr
|
|
|
|
|
|
2003-08-30 20:00:11 +00:00
|
|
|
|
/* Set new buffer */
|
|
|
|
|
|
|
|
|
|
moveq #0,d0
|
2003-07-07 19:16:03 +00:00
|
|
|
|
movel _SDL_MintAudio_audiosize,d1
|
|
|
|
|
|
2003-08-30 20:00:11 +00:00
|
|
|
|
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@-
|
2003-07-07 19:16:03 +00:00
|
|
|
|
movel a1,sp@-
|
|
|
|
|
clrw sp@-
|
|
|
|
|
movew #131,sp@-
|
|
|
|
|
trap #14
|
|
|
|
|
lea sp@(12),sp
|
|
|
|
|
|
2005-07-20 17:40:58 +00:00
|
|
|
|
/* Restore registers space */
|
|
|
|
|
addl #savamt,savptr
|
|
|
|
|
|
2005-07-17 07:11:43 +00:00
|
|
|
|
moveml sp@+,d0-d7/a0-a6
|
2003-07-07 19:16:03 +00:00
|
|
|
|
|
|
|
|
|
clrw _SDL_MintAudio_mutex
|
|
|
|
|
SDL_MintAudio_XbiosEnd:
|
|
|
|
|
rte
|
|
|
|
|
|
|
|
|
|
/*--- DMA 8 bits interrupt vector ---*/
|
|
|
|
|
|
|
|
|
|
_SDL_MintAudio_Dma8Interrupt:
|
|
|
|
|
|
|
|
|
|
/* Reenable interrupts, so other interrupts can work */
|
|
|
|
|
movew #0x2300,sr
|
|
|
|
|
|
|
|
|
|
/* Clear service bit, so other MFP interrupts can work */
|
|
|
|
|
bclr #5,0xfffffa0f:w
|
|
|
|
|
|
|
|
|
|
/* Check if we are not already running */
|
|
|
|
|
tstw _SDL_MintAudio_mutex
|
2006-09-16 11:50:34 +00:00
|
|
|
|
bne SDL_MintAudio_Dma8End
|
2003-07-07 19:16:03 +00:00
|
|
|
|
notw _SDL_MintAudio_mutex
|
|
|
|
|
|
|
|
|
|
/* Swap buffers */
|
2003-08-30 20:00:11 +00:00
|
|
|
|
eorw #1,_SDL_MintAudio_numbuf
|
2003-07-07 19:16:03 +00:00
|
|
|
|
|
2006-09-16 09:15:11 +00:00
|
|
|
|
moveml d0-d1/a0-a1,sp@-
|
2003-07-07 19:16:03 +00:00
|
|
|
|
|
2006-09-16 11:50:34 +00:00
|
|
|
|
/* Save FPU if needed */
|
|
|
|
|
tstw _SDL_MintAudio_hasfpu
|
|
|
|
|
beqs SDL_MintAudio_Dma8_nofpu1
|
2006-09-16 12:00:03 +00:00
|
|
|
|
.chip 68060
|
2006-09-16 11:50:34 +00:00
|
|
|
|
fsave sp@-
|
|
|
|
|
fmoveml fpcr/fpsr/fpiar,sp@-
|
|
|
|
|
fmovemx fp0-fp7,sp@-
|
2006-09-16 12:00:03 +00:00
|
|
|
|
.chip 68000
|
2006-09-16 11:50:34 +00:00
|
|
|
|
SDL_MintAudio_Dma8_nofpu1:
|
|
|
|
|
|
2003-07-07 19:16:03 +00:00
|
|
|
|
/* Callback */
|
|
|
|
|
jsr _SDL_MintAudio_Callback
|
2003-08-30 20:00:11 +00:00
|
|
|
|
|
2006-09-16 11:50:34 +00:00
|
|
|
|
/* Restore FPU if needed */
|
|
|
|
|
tstw _SDL_MintAudio_hasfpu
|
|
|
|
|
beqs SDL_MintAudio_Dma8_nofpu2
|
2006-09-16 12:00:03 +00:00
|
|
|
|
.chip 68060
|
2006-09-16 11:50:34 +00:00
|
|
|
|
fmovemx sp@+,fp0-fp7
|
|
|
|
|
fmoveml sp@+,fpcr/fpsr/fpiar
|
|
|
|
|
frestore sp@+
|
2006-09-16 12:00:03 +00:00
|
|
|
|
.chip 68000
|
2006-09-16 11:50:34 +00:00
|
|
|
|
SDL_MintAudio_Dma8_nofpu2:
|
|
|
|
|
|
2003-08-30 20:00:11 +00:00
|
|
|
|
/* Set new buffer */
|
|
|
|
|
|
|
|
|
|
moveq #0,d0
|
|
|
|
|
|
|
|
|
|
movew _SDL_MintAudio_numbuf,d0
|
|
|
|
|
lslw #2,d0
|
|
|
|
|
lea _SDL_MintAudio_audiobuf,a0
|
|
|
|
|
movel a0@(d0:w),d1
|
2003-07-07 19:16:03 +00:00
|
|
|
|
|
|
|
|
|
/* 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
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
2006-09-16 09:15:11 +00:00
|
|
|
|
moveml sp@+,d0-d1/a0-a1
|
2003-07-07 19:16:03 +00:00
|
|
|
|
|
|
|
|
|
clrw _SDL_MintAudio_mutex
|
|
|
|
|
SDL_MintAudio_Dma8End:
|
|
|
|
|
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
|
|
|
|
|
bnes SDL_MintAudio_StfaEnd
|
|
|
|
|
notw _SDL_MintAudio_mutex
|
|
|
|
|
|
|
|
|
|
/* Swap buffers */
|
2003-08-30 20:00:11 +00:00
|
|
|
|
eorw #1,_SDL_MintAudio_numbuf
|
2003-07-07 19:16:03 +00:00
|
|
|
|
|
2005-07-17 07:11:43 +00:00
|
|
|
|
moveml d0-d7/a0-a6,sp@-
|
2003-07-07 19:16:03 +00:00
|
|
|
|
|
2006-09-16 11:50:34 +00:00
|
|
|
|
/* Save FPU if needed */
|
|
|
|
|
tstw _SDL_MintAudio_hasfpu
|
|
|
|
|
beqs SDL_MintAudio_Stfa_nofpu1
|
2006-09-16 12:00:03 +00:00
|
|
|
|
.chip 68060
|
2006-09-16 11:50:34 +00:00
|
|
|
|
fsave sp@-
|
|
|
|
|
fmoveml fpcr/fpsr/fpiar,sp@-
|
|
|
|
|
fmovemx fp0-fp7,sp@-
|
2006-09-16 12:00:03 +00:00
|
|
|
|
.chip 68000
|
2006-09-16 11:50:34 +00:00
|
|
|
|
SDL_MintAudio_Stfa_nofpu1:
|
|
|
|
|
|
2003-07-07 19:16:03 +00:00
|
|
|
|
/* Callback */
|
|
|
|
|
jsr _SDL_MintAudio_Callback
|
2003-08-30 20:00:11 +00:00
|
|
|
|
|
2006-09-16 11:50:34 +00:00
|
|
|
|
/* Restore FPU if needed */
|
|
|
|
|
tstw _SDL_MintAudio_hasfpu
|
|
|
|
|
beqs SDL_MintAudio_Stfa_nofpu2
|
2006-09-16 12:00:03 +00:00
|
|
|
|
.chip 68060
|
2006-09-16 11:50:34 +00:00
|
|
|
|
fmovemx sp@+,fp0-fp7
|
|
|
|
|
fmoveml sp@+,fpcr/fpsr/fpiar
|
|
|
|
|
frestore sp@+
|
2006-09-16 12:00:03 +00:00
|
|
|
|
.chip 68000
|
2006-09-16 11:50:34 +00:00
|
|
|
|
SDL_MintAudio_Stfa_nofpu2:
|
|
|
|
|
|
2003-08-30 20:00:11 +00:00
|
|
|
|
/* Set new buffer */
|
|
|
|
|
|
|
|
|
|
moveq #0,d0
|
|
|
|
|
movel _SDL_MintAudio_stfa,a1
|
|
|
|
|
|
|
|
|
|
movew _SDL_MintAudio_numbuf,d0
|
|
|
|
|
lslw #2,d0
|
|
|
|
|
lea _SDL_MintAudio_audiobuf,a0
|
|
|
|
|
movel a0@(d0:w),d1
|
2003-07-07 19:16:03 +00:00
|
|
|
|
|
|
|
|
|
/* Modify STFA replay buffers */
|
2003-08-30 20:00:11 +00:00
|
|
|
|
movel d1,a1@(STFA_SOUND_START)
|
2003-07-07 19:16:03 +00:00
|
|
|
|
addl _SDL_MintAudio_audiosize,d1
|
2003-08-30 20:00:11 +00:00
|
|
|
|
movel d1,a1@(STFA_SOUND_END)
|
2003-07-07 19:16:03 +00:00
|
|
|
|
|
2005-07-17 07:11:43 +00:00
|
|
|
|
moveml sp@+,d0-d7/a0-a6
|
2003-07-07 19:16:03 +00:00
|
|
|
|
|
|
|
|
|
clrw _SDL_MintAudio_mutex
|
|
|
|
|
SDL_MintAudio_StfaEnd:
|
|
|
|
|
rte
|