|
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@libsdl.org |
|
21 */ |
|
22 |
|
23 /* |
|
24 Audio interrupts |
|
25 |
|
26 Patrice Mandin, Didier Méquignon |
|
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 |