Mercurial > sdl-ios-xcode
diff src/audio/mint/SDL_mintaudio_it.S @ 644:594422ab8f9f
Atari MiNT: added more audio drivers
author | Patrice Mandin <patmandin@gmail.com> |
---|---|
date | Mon, 07 Jul 2003 19:16:03 +0000 |
parents | |
children | c4803992e09c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/audio/mint/SDL_mintaudio_it.S Mon Jul 07 19:16:03 2003 +0000 @@ -0,0 +1,242 @@ +/* + 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 + + Patrice Mandin + */ + + .text + + .globl _SDL_MintAudio_Callback + + .globl _SDL_MintAudio_GsxbInterrupt + .globl _SDL_MintAudio_EmptyGsxbInterrupt + .globl _SDL_MintAudio_XbiosInterrupt + .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_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 +*/ + +/*--- GSXB interrupt vector ---*/ + + .text +_SDL_MintAudio_GsxbInterrupt: + + /* Check if we are not already running */ + tstw _SDL_MintAudio_mutex + bnes _SDL_MintAudio_EmptyGsxbInterrupt + notw _SDL_MintAudio_mutex + + /* Swap buffers */ + moveml d0-d2/a0-a2,sp@- + + movel _SDL_MintAudio_numbuf,d0 + movel _SDL_MintAudio_audiobuf,a0 + eorl #1,d0 + beqs SDL_MintAudio_GsxbBuffer0 + movel _SDL_MintAudio_audiobuf+4,a0 +SDL_MintAudio_GsxbBuffer0: + movel d0,_SDL_MintAudio_numbuf + + /* Callback */ + movel a0,sp@- + jsr _SDL_MintAudio_Callback + movel sp@+,a0 + + /* Setbuffer xbios function */ + movel _SDL_MintAudio_audiosize,d1 + lea a0@(0,d1:l),a1 + + movel a1,sp@- + movel a0,sp@- + clrw sp@- + movew #131,sp@- + trap #14 + lea sp@(12),sp + + moveml sp@+,d0-d2/a0-a2 + + clrw _SDL_MintAudio_mutex +_SDL_MintAudio_EmptyGsxbInterrupt: + rts + +/*--- 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 + bnes SDL_MintAudio_XbiosEnd + notw _SDL_MintAudio_mutex + + /* Swap buffers */ + moveml d0-d2/a0-a2,sp@- + + movel _SDL_MintAudio_numbuf,d0 + movel _SDL_MintAudio_audiobuf,a0 + eorl #1,d0 + beqs SDL_MintAudio_XbiosBuffer0 + movel _SDL_MintAudio_audiobuf+4,a0 +SDL_MintAudio_XbiosBuffer0: + movel d0,_SDL_MintAudio_numbuf + + /* Callback */ + movel a0,sp@- + jsr _SDL_MintAudio_Callback + movel sp@+,a0 + + /* Setbuffer xbios function */ + movel _SDL_MintAudio_audiosize,d1 + lea a0@(0,d1:l),a1 + + movel a1,sp@- + movel a0,sp@- + clrw sp@- + movew #131,sp@- + trap #14 + lea sp@(12),sp + + moveml sp@+,d0-d2/a0-a2 + + 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 + bnes SDL_MintAudio_Dma8End + notw _SDL_MintAudio_mutex + + /* Swap buffers */ + moveml d0-d1/a0-a1,sp@- + + movel _SDL_MintAudio_numbuf,d0 + movel _SDL_MintAudio_audiobuf,d1 + eorl #1,d0 + beqs SDL_MintAudio_Dma8Buffer0 + movel _SDL_MintAudio_audiobuf+4,d1 +SDL_MintAudio_Dma8Buffer0: + movel d0,_SDL_MintAudio_numbuf + + /* Callback */ + movel d1,sp@- + jsr _SDL_MintAudio_Callback + movel sp@+,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 + + 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) + + moveml sp@+,d0-d1/a0-a1 + + 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 */ + moveml d0-d1/a0-a1,sp@- + + movel _SDL_MintAudio_numbuf,d0 + movel _SDL_MintAudio_audiobuf,d1 + eorl #1,d0 + beqs SDL_MintAudio_StfaBuffer0 + movel _SDL_MintAudio_audiobuf+4,d1 +SDL_MintAudio_StfaBuffer0: + movel d0,_SDL_MintAudio_numbuf + + /* Callback */ + movel d1,sp@- + jsr _SDL_MintAudio_Callback + movel sp@+,d1 + + /* Modify STFA replay buffers */ + movel _SDL_MintAudio_stfa,a0 + movel d1,a0@(STFA_SOUND_START) + addl _SDL_MintAudio_audiosize,d1 + movel d1,a0@(STFA_SOUND_END) + + moveml sp@+,d0-d1/a0-a1 + + clrw _SDL_MintAudio_mutex +SDL_MintAudio_StfaEnd: + rte +