|
1 /* |
|
2 SDL - Simple DirectMedia Layer |
|
3 Copyright (C) 1997-2004 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 #include "SDL_config.h" |
|
23 |
|
24 /* |
|
25 m68k assembly mix routines |
|
26 |
|
27 Patrice Mandin |
|
28 */ |
|
29 |
|
30 #if defined(__M68000__) && defined(__GNUC__) |
|
31 void SDL_MixAudio_m68k_U8(char* dst, char* src, long len, long volume, char* mix8) |
|
32 { |
|
33 __asm__ __volatile__ ( |
|
34 |
|
35 "tstl %2\n" |
|
36 " beqs stoploop_u8\n" |
|
37 "mixloop_u8:\n" |
|
38 |
|
39 /* Mix a sample */ |
|
40 |
|
41 " moveq #0,%%d0\n" |
|
42 " moveq #0,%%d1\n" |
|
43 |
|
44 " moveb %1@+,%%d0\n" /* d0 = *src++ */ |
|
45 " sub #128,%%d0\n" /* d0 -= 128 */ |
|
46 " muls %3,%%d0\n" /* d0 *= volume (0<=volume<=128) */ |
|
47 " moveb %0@,%%d1\n" /* d1 = *dst */ |
|
48 " asr #7,%%d0\n" /* d0 /= 128 (SDL_MIX_MAXVOLUME) */ |
|
49 " add #128,%%d0\n" /* d0 += 128 */ |
|
50 |
|
51 " add %%d1,%%d0\n" |
|
52 |
|
53 " moveb %4@(%%d0:w),%0@+\n" |
|
54 |
|
55 /* Loop till done */ |
|
56 |
|
57 " subql #1,%2\n" |
|
58 " bhis mixloop_u8\n" |
|
59 "stoploop_u8:\n" |
|
60 |
|
61 : /* no return value */ |
|
62 : /* input */ |
|
63 "a"(dst), "a"(src), "d"(len), "d"(volume), "a"(mix8) |
|
64 : /* clobbered registers */ |
|
65 "d0", "d1", "cc", "memory" |
|
66 ); |
|
67 } |
|
68 |
|
69 void SDL_MixAudio_m68k_S8(char* dst, char* src, long len, long volume) |
|
70 { |
|
71 __asm__ __volatile__ ( |
|
72 |
|
73 "tstl %2\n" |
|
74 " beqs stoploop_s8\n" |
|
75 " moveq #-128,%%d2\n" |
|
76 " moveq #127,%%d3\n" |
|
77 "mixloop_s8:\n" |
|
78 |
|
79 /* Mix a sample */ |
|
80 |
|
81 " moveq #0,%%d0\n" |
|
82 " moveq #0,%%d1\n" |
|
83 |
|
84 " moveb %1@+,%%d0\n" /* d0 = *src++ */ |
|
85 " muls %3,%%d0\n" /* d0 *= volume (0<=volume<=128) */ |
|
86 " moveb %0@,%%d1\n" /* d1 = *dst */ |
|
87 " asr #7,%%d0\n" /* d0 /= 128 (SDL_MIX_MAXVOLUME) */ |
|
88 |
|
89 " add %%d1,%%d0\n" |
|
90 |
|
91 " cmp %%d2,%%d0\n" |
|
92 " bges lower_limit_s8\n" |
|
93 " move %%d2,%%d0\n" |
|
94 "lower_limit_s8:\n" |
|
95 |
|
96 " cmp %%d3,%%d0\n" |
|
97 " bles upper_limit_s8\n" |
|
98 " move %%d3,%%d0\n" |
|
99 "upper_limit_s8:\n" |
|
100 " moveb %%d0,%0@+\n" |
|
101 |
|
102 /* Loop till done */ |
|
103 |
|
104 " subql #1,%2\n" |
|
105 " bhis mixloop_s8\n" |
|
106 "stoploop_s8:\n" |
|
107 |
|
108 : /* no return value */ |
|
109 : /* input */ |
|
110 "a"(dst), "a"(src), "d"(len), "d"(volume) |
|
111 : /* clobbered registers */ |
|
112 "d0", "d1", "d2", "d3", "cc", "memory" |
|
113 ); |
|
114 } |
|
115 |
|
116 void SDL_MixAudio_m68k_S16MSB(short* dst, short* src, long len, long volume) |
|
117 { |
|
118 __asm__ __volatile__ ( |
|
119 |
|
120 "tstl %2\n" |
|
121 " beqs stoploop_s16msb\n" |
|
122 " movel #-32768,%%d2\n" |
|
123 " movel #32767,%%d3\n" |
|
124 " lsrl #1,%2\n" |
|
125 "mixloop_s16msb:\n" |
|
126 |
|
127 /* Mix a sample */ |
|
128 |
|
129 " move %1@+,%%d0\n" /* d0 = *src++ */ |
|
130 " muls %3,%%d0\n" /* d0 *= volume (0<=volume<=128) */ |
|
131 " move %0@,%%d1\n" /* d1 = *dst */ |
|
132 " extl %%d1\n" /* extend d1 to 32 bits */ |
|
133 " asrl #7,%%d0\n" /* d0 /= 128 (SDL_MIX_MAXVOLUME) */ |
|
134 |
|
135 " addl %%d1,%%d0\n" |
|
136 |
|
137 " cmpl %%d2,%%d0\n" |
|
138 " bges lower_limit_s16msb\n" |
|
139 " move %%d2,%%d0\n" |
|
140 "lower_limit_s16msb:\n" |
|
141 |
|
142 " cmpl %%d3,%%d0\n" |
|
143 " bles upper_limit_s16msb\n" |
|
144 " move %%d3,%%d0\n" |
|
145 "upper_limit_s16msb:\n" |
|
146 " move %%d0,%0@+\n" |
|
147 |
|
148 /* Loop till done */ |
|
149 |
|
150 " subql #1,%2\n" |
|
151 " bhis mixloop_s16msb\n" |
|
152 "stoploop_s16msb:\n" |
|
153 |
|
154 : /* no return value */ |
|
155 : /* input */ |
|
156 "a"(dst), "a"(src), "d"(len), "d"(volume) |
|
157 : /* clobbered registers */ |
|
158 "d0", "d1", "d2", "d3", "cc", "memory" |
|
159 ); |
|
160 } |
|
161 |
|
162 void SDL_MixAudio_m68k_S16LSB(short* dst, short* src, long len, long volume) |
|
163 { |
|
164 __asm__ __volatile__ ( |
|
165 |
|
166 "tstl %2\n" |
|
167 " beqs stoploop_s16lsb\n" |
|
168 " movel #-32768,%%d2\n" |
|
169 " movel #32767,%%d3\n" |
|
170 " lsrl #1,%2\n" |
|
171 "mixloop_s16lsb:\n" |
|
172 |
|
173 /* Mix a sample */ |
|
174 |
|
175 " move %1@+,%%d0\n" /* d0 = *src++ */ |
|
176 " rorw #8,%%d0\n" |
|
177 " muls %3,%%d0\n" /* d0 *= volume (0<=volume<=128) */ |
|
178 " move %0@,%%d1\n" /* d1 = *dst */ |
|
179 " rorw #8,%%d1\n" |
|
180 " extl %%d1\n" /* extend d1 to 32 bits */ |
|
181 " asrl #7,%%d0\n" /* d0 /= 128 (SDL_MIX_MAXVOLUME) */ |
|
182 |
|
183 " addl %%d1,%%d0\n" |
|
184 |
|
185 " cmpl %%d2,%%d0\n" |
|
186 " bges lower_limit_s16lsb\n" |
|
187 " move %%d2,%%d0\n" |
|
188 "lower_limit_s16lsb:\n" |
|
189 |
|
190 " cmpl %%d3,%%d0\n" |
|
191 " bles upper_limit_s16lsb\n" |
|
192 " move %%d3,%%d0\n" |
|
193 "upper_limit_s16lsb:\n" |
|
194 " rorw #8,%%d0\n" |
|
195 " move %%d0,%0@+\n" |
|
196 |
|
197 /* Loop till done */ |
|
198 |
|
199 " subql #1,%2\n" |
|
200 " bhis mixloop_s16lsb\n" |
|
201 "stoploop_s16lsb:\n" |
|
202 |
|
203 : /* no return value */ |
|
204 : /* input */ |
|
205 "a"(dst), "a"(src), "d"(len), "d"(volume) |
|
206 : /* clobbered registers */ |
|
207 "d0", "d1", "d2", "d3", "cc", "memory" |
|
208 ); |
|
209 } |
|
210 #endif |
|
211 |