1 /* 2 SDL - Simple DirectMedia Layer 3 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga 4 5 This library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Library General Public 7 License as published by the Free Software Foundation; either 8 version 2 of the License, or (at your option) any later version. 9 10 This library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Library General Public License for more details. 14 15 You should have received a copy of the GNU Library General Public 16 License along with this library; if not, write to the Free 17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 19 Sam Lantinga 20 slouken (at) libsdl.org 21 */ 22 23 /* 24 Audio interrupts 25 26 Patrice Mandin, Didier Mquignon 27 */ 28 29 .text 30 31 .globl _SDL_MintAudio_Callback 32 33 .globl _SDL_MintAudio_XbiosInterrupt 34 .globl _SDL_MintAudio_XbiosInterruptMeasureClock 35 .globl _SDL_MintAudio_Dma8Interrupt 36 .globl _SDL_MintAudio_StfaInterrupt 37 38 .globl _SDL_MintAudio_mutex 39 .globl _SDL_MintAudio_audiobuf 40 .globl _SDL_MintAudio_numbuf 41 .globl _SDL_MintAudio_audiosize 42 .globl _SDL_MintAudio_clocktics 43 .globl _SDL_MintAudio_hasfpu 44 45 .globl _SDL_MintAudio_stfa 46 47 /* 48 How it works: 49 - Audio is playing buffer #0 (resp. #1) 50 - We must calculate a sample in buffer #1 (resp. #0) 51 so we first call the callback to do it 52 - Then we swap the buffers 53 */ 54 55 #define savptr 0x4a2 56 #define savamt 0x46 57 58 /*--- Xbios interrupt vector to measure Falcon external clock ---*/ 59 60 _SDL_MintAudio_XbiosInterruptMeasureClock: /* 1 mS */ 61 62 btst #0,0xFFFF8901:w /* state DMA sound */ 63 beqs SDL_MintAudio_EndIntMeasure 64 addql #1,_SDL_MintAudio_clocktics 65 SDL_MintAudio_EndIntMeasure: 66 bclr #5,0xFFFFFA0F:w /* Clear service bit */ 67 rte 68 69 /*--- Xbios interrupt vector ---*/ 70 71 _SDL_MintAudio_XbiosInterrupt: 72 73 /* Reenable interrupts, so other interrupts can work */ 74 movew #0x2300,sr 75 76 /* Clear service bit, so other MFP interrupts can work */ 77 bclr #5,0xfffffa0f:w 78 79 /* Check if we are not already running */ 80 tstw _SDL_MintAudio_mutex 81 bne SDL_MintAudio_XbiosEnd 82 notw _SDL_MintAudio_mutex 83 84 /* Swap buffers */ 85 eorw #1,_SDL_MintAudio_numbuf 86 87 moveml d0-d7/a0-a6,sp@- 88 89 /* Save FPU if needed */ 90 tstw _SDL_MintAudio_hasfpu 91 beqs SDL_MintAudio_Xbios_nofpu1 92 .chip 68060 93 fsave sp@- 94 fmoveml fpcr/fpsr/fpiar,sp@- 95 fmovemx fp0-fp7,sp@- 96 .chip 68000 97 SDL_MintAudio_Xbios_nofpu1: 98 99 /* Callback */ 100 jsr _SDL_MintAudio_Callback 101 102 /* Restore FPU if needed */ 103 tstw _SDL_MintAudio_hasfpu 104 beqs SDL_MintAudio_Xbios_nofpu2 105 .chip 68060 106 fmovemx sp@+,fp0-fp7 107 fmoveml sp@+,fpcr/fpsr/fpiar 108 frestore sp@+ 109 .chip 68000 110 SDL_MintAudio_Xbios_nofpu2: 111 112 /* Reserve space for registers */ 113 subl #savamt,savptr 114 115 /* Set new buffer */ 116 117 moveq #0,d0 118 movel _SDL_MintAudio_audiosize,d1 119 120 movew _SDL_MintAudio_numbuf,d0 121 lsll #2,d0 122 lea _SDL_MintAudio_audiobuf,a0 123 movel a0@(d0:l),a1 124 125 lea a1@(d1:l),a2 126 127 movel a2,sp@- 128 movel a1,sp@- 129 clrw sp@- 130 movew #131,sp@- 131 trap #14 132 lea sp@(12),sp 133 134 /* Restore registers space */ 135 addl #savamt,savptr 136 137 moveml sp@+,d0-d7/a0-a6 138 139 clrw _SDL_MintAudio_mutex 140 SDL_MintAudio_XbiosEnd: 141 rte 142 143 /*--- DMA 8 bits interrupt vector ---*/ 144 145 _SDL_MintAudio_Dma8Interrupt: 146 147 /* Reenable interrupts, so other interrupts can work */ 148 movew #0x2300,sr 149 150 /* Clear service bit, so other MFP interrupts can work */ 151 bclr #5,0xfffffa0f:w 152 153 /* Check if we are not already running */ 154 tstw _SDL_MintAudio_mutex 155 bne SDL_MintAudio_Dma8End 156 notw _SDL_MintAudio_mutex 157 158 /* Swap buffers */ 159 eorw #1,_SDL_MintAudio_numbuf 160 161 moveml d0-d1/a0-a1,sp@- 162 163 /* Save FPU if needed */ 164 tstw _SDL_MintAudio_hasfpu 165 beqs SDL_MintAudio_Dma8_nofpu1 166 .chip 68060 167 fsave sp@- 168 fmoveml fpcr/fpsr/fpiar,sp@- 169 fmovemx fp0-fp7,sp@- 170 .chip 68000 171 SDL_MintAudio_Dma8_nofpu1: 172 173 /* Callback */ 174 jsr _SDL_MintAudio_Callback 175 176 /* Restore FPU if needed */ 177 tstw _SDL_MintAudio_hasfpu 178 beqs SDL_MintAudio_Dma8_nofpu2 179 .chip 68060 180 fmovemx sp@+,fp0-fp7 181 fmoveml sp@+,fpcr/fpsr/fpiar 182 frestore sp@+ 183 .chip 68000 184 SDL_MintAudio_Dma8_nofpu2: 185 186 /* Set new buffer */ 187 188 moveq #0,d0 189 190 movew _SDL_MintAudio_numbuf,d0 191 lslw #2,d0 192 lea _SDL_MintAudio_audiobuf,a0 193 movel a0@(d0:w),d1 194 195 /* Modify DMA addresses */ 196 lea 0xffff8900:w,a0 197 198 moveb d1,a0@(0x07) /* Start address */ 199 rorl #8,d1 200 moveb d1,a0@(0x05) 201 rorl #8,d1 202 moveb d1,a0@(0x03) 203 swap d1 204 205 addl _SDL_MintAudio_audiosize,d1 206 207 moveb d1,a0@(0x13) /* End address */ 208 rorl #8,d1 209 moveb d1,a0@(0x11) 210 rorl #8,d1 211 moveb d1,a0@(0x0f) 212 213 moveml sp@+,d0-d1/a0-a1 214 215 clrw _SDL_MintAudio_mutex 216 SDL_MintAudio_Dma8End: 217 rte 218 219 /*--- STFA interrupt vector ---*/ 220 221 STFA_SOUND_START = 6 222 STFA_SOUND_END = STFA_SOUND_START+8 223 224 _SDL_MintAudio_StfaInterrupt: 225 226 /* Reenable interrupts, so other interrupts can work */ 227 movew #0x2300,sr 228 229 /* Check if we are not already running */ 230 tstw _SDL_MintAudio_mutex 231 bnes SDL_MintAudio_StfaEnd 232 notw _SDL_MintAudio_mutex 233 234 /* Swap buffers */ 235 eorw #1,_SDL_MintAudio_numbuf 236 237 moveml d0-d7/a0-a6,sp@- 238 239 /* Save FPU if needed */ 240 tstw _SDL_MintAudio_hasfpu 241 beqs SDL_MintAudio_Stfa_nofpu1 242 .chip 68060 243 fsave sp@- 244 fmoveml fpcr/fpsr/fpiar,sp@- 245 fmovemx fp0-fp7,sp@- 246 .chip 68000 247 SDL_MintAudio_Stfa_nofpu1: 248 249 /* Callback */ 250 jsr _SDL_MintAudio_Callback 251 252 /* Restore FPU if needed */ 253 tstw _SDL_MintAudio_hasfpu 254 beqs SDL_MintAudio_Stfa_nofpu2 255 .chip 68060 256 fmovemx sp@+,fp0-fp7 257 fmoveml sp@+,fpcr/fpsr/fpiar 258 frestore sp@+ 259 .chip 68000 260 SDL_MintAudio_Stfa_nofpu2: 261 262 /* Set new buffer */ 263 264 moveq #0,d0 265 movel _SDL_MintAudio_stfa,a1 266 267 movew _SDL_MintAudio_numbuf,d0 268 lslw #2,d0 269 lea _SDL_MintAudio_audiobuf,a0 270 movel a0@(d0:w),d1 271 272 /* Modify STFA replay buffers */ 273 movel d1,a1@(STFA_SOUND_START) 274 addl _SDL_MintAudio_audiosize,d1 275 movel d1,a1@(STFA_SOUND_END) 276 277 moveml sp@+,d0-d7/a0-a6 278 279 clrw _SDL_MintAudio_mutex 280 SDL_MintAudio_StfaEnd: 281 rte 282