SDL-1.2.14
[sdl_omap.git] / src / audio / mint / SDL_mintaudio_it.S
1 /*
2     SDL - Simple DirectMedia Layer
3     Copyright (C) 1997-2009 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