6
|
1 .386p
|
|
2 .model flat
|
|
3 .data ; self-modifying code... keep in data segment
|
|
4
|
|
5 NAME resample
|
|
6 EXTRN _rvoltab :DWORD
|
|
7 EXTRN _lvoltab :DWORD
|
|
8 EXTRN _bitshift :BYTE
|
|
9
|
|
10 PUBLIC _AsmStereoNormal
|
|
11 PUBLIC _AsmStereoSurround
|
|
12 PUBLIC _AsmMonoNormal
|
|
13 IFDEF __ASMSTUFF__
|
|
14 PUBLIC _AsmMix32To16_Normal
|
|
15 PUBLIC _AsmMix32To8_Normal
|
|
16 ENDIF
|
|
17
|
|
18
|
|
19 STUBSTART macro
|
|
20 push eax
|
|
21 push ebx
|
|
22 push ecx
|
|
23 push edx
|
|
24 push esi
|
|
25 push edi
|
|
26 push ebp
|
|
27 endm
|
|
28
|
|
29
|
|
30 STUBEND macro
|
|
31 pop ebp
|
|
32 pop edi
|
|
33 pop esi
|
|
34 pop edx
|
|
35 pop ecx
|
|
36 pop ebx
|
|
37 pop eax
|
|
38 endm
|
|
39
|
|
40
|
|
41 SS2F MACRO index,lab1,lab2,lab3,lab4 ; 486+
|
|
42 mov al,[edx]
|
|
43 db 081h,0c3h
|
|
44 lab1 dd 0 ; add ebx,lo
|
|
45 db 081h,0d2h
|
|
46 lab2 dd 0 ; adc edx,hi
|
|
47 mov esi,(index*8)[edi]
|
|
48 db 08bh,0ch,085h
|
|
49 lab3 dd 0 ; mov ecx,[eax*4+table1]
|
|
50 mov ebp,(index*8+4)[edi]
|
|
51 add esi,ecx
|
|
52 db 08bh,0ch,085h
|
|
53 lab4 dd 0 ; mov ecx,[eax*4+table2]
|
|
54 mov (index*8)[edi],esi
|
|
55 add ebp,ecx
|
|
56 ENDM
|
|
57
|
|
58 SS2M MACRO index,lab1,lab2,lab3,lab4 ; 486+
|
|
59 mov al,[edx]
|
|
60 mov (index*8-4)[edi],ebp
|
|
61 db 081h,0c3h
|
|
62 lab1 dd 0 ; add ebx,lo
|
|
63 db 081h,0d2h
|
|
64 lab2 dd 0 ; adc edx,hi
|
|
65 mov esi,(index*8)[edi]
|
|
66 db 08bh,0ch,085h
|
|
67 lab3 dd 0 ; mov ecx,[eax*4+table1]
|
|
68 mov ebp,(index*8+4)[edi]
|
|
69 add esi,ecx
|
|
70 db 08bh,0ch,085h
|
|
71 lab4 dd 0 ; mov ecx,[eax*4+table2]
|
|
72 mov (index*8)[edi],esi
|
|
73 add ebp,ecx
|
|
74 ENDM
|
|
75
|
|
76 SS3F MACRO index,lab1,lab2,lab3 ; 486+
|
|
77 mov al,[edx]
|
|
78 db 081h,0c3h
|
|
79 lab1 dd 0 ; add ebx,lo
|
|
80 db 081h,0d2h
|
|
81 lab2 dd 0 ; adc edx,hi
|
|
82 mov esi,(index*8)[edi]
|
|
83 db 08bh,0ch,085h
|
|
84 lab3 dd 0 ; mov ecx,[eax*4+table1]
|
|
85 mov ebp,(index*8+4)[edi]
|
|
86 add esi,ecx
|
|
87 sub ebp,ecx
|
|
88 mov (index*8)[edi],esi
|
|
89 ENDM
|
|
90
|
|
91 SS3M MACRO index,lab1,lab2,lab3 ; 486+
|
|
92 mov al,[edx]
|
|
93 mov (index*8-4)[edi],ebp
|
|
94 db 081h,0c3h
|
|
95 lab1 dd 0 ; add ebx,lo
|
|
96 db 081h,0d2h
|
|
97 lab2 dd 0 ; adc edx,hi
|
|
98 mov esi,(index*8)[edi]
|
|
99 db 08bh,0ch,085h
|
|
100 lab3 dd 0 ; mov ecx,[eax*4+table1]
|
|
101 mov ebp,(index*8+4)[edi]
|
|
102 add esi,ecx
|
|
103 sub ebp,ecx
|
|
104 mov (index*8)[edi],esi
|
|
105 ENDM
|
|
106
|
|
107 SS2L MACRO index ; 486+
|
|
108 mov (index*8-4)[edi],ebp
|
|
109 ENDM
|
|
110
|
|
111 SM2F MACRO index,lab1,lab2,lab3 ; 486+
|
|
112 mov al,[edx] ; AGI-3
|
|
113 db 081h,0c3h
|
|
114 lab1 dd 0 ; add ebx,lo
|
|
115 db 081h,0d2h
|
|
116 lab2 dd 0 ; adc edx,hi
|
|
117 mov esi,(index*4)[edi]
|
|
118 db 08bh,0ch,085h
|
|
119 lab3 dd 0 ; mov ecx,[eax*4+table1]
|
|
120 ENDM
|
|
121
|
|
122 SM2M MACRO index,lab1,lab2,lab3 ; 486+
|
|
123 mov al,[edx] ; AGI-3
|
|
124 add esi,ecx
|
|
125 db 081h,0c3h
|
|
126 lab1 dd 0 ; add ebx,lo
|
|
127 mov (index*4-4)[edi],esi
|
|
128 db 081h,0d2h
|
|
129 lab2 dd 0 ; adc edx,hi
|
|
130 mov esi,(index*4)[edi]
|
|
131 db 08bh,0ch,085h
|
|
132 lab3 dd 0 ; mov ecx,[eax*4+table1]
|
|
133 ENDM
|
|
134
|
|
135 SM2L MACRO index ; 486+
|
|
136 add esi,ecx
|
|
137 mov (index*4-4)[edi],esi
|
|
138 ENDM
|
|
139
|
|
140 ;SS2 ; 386
|
|
141 ;mov al,[edx+source]
|
|
142 ;add ebx,lo
|
|
143 ;adc edx,hi
|
|
144 ;mov ecx,[eax*4+table1]
|
|
145 ;mov ebp,[eax*4+table2]
|
|
146 ;add [edi],ecx
|
|
147 ;add [edi+4],ebp
|
|
148 ;ENDM
|
|
149
|
|
150 ;SS2M ; 486+
|
|
151 ;mov al,[edx+source]
|
|
152 ;mov [edi-8+4],ebp
|
|
153 ;add ebx,lo
|
|
154 ;adc edx,hi
|
|
155 ;mov esi,[edi]
|
|
156 ;mov ecx,[eax*4+table1]
|
|
157 ;mov ebp,[edi+4]
|
|
158 ;add esi,ecx
|
|
159 ;mov ecx,[eax*4+table2]
|
|
160 ;mov [edi],esi
|
|
161 ;add ebp,ecx
|
|
162 ;ENDM
|
|
163
|
|
164 ;SM2M ; 386
|
|
165 ;add ebx,lo
|
|
166 ;adc edx,hi
|
|
167 ;mov ecx,[eax*4+table1]
|
|
168 ;mov al,[edx+source]
|
|
169 ;add [edi],ecx
|
|
170 ;ENDM
|
|
171
|
|
172 ;SM2M ; 486+
|
|
173 ;add ebx,lo
|
|
174 ;mov [edi-4],esi
|
|
175 ;adc edx,hi
|
|
176 ;mov esi,[edi]
|
|
177 ;mov ecx,[eax*4+table1]
|
|
178 ;mov al,[edx+source] ; AGI-3
|
|
179 ;add esi,ecx
|
|
180 ;ENDM
|
|
181
|
|
182
|
|
183 _AsmStereoNormal:
|
|
184 STUBSTART
|
|
185 mov esi,[esp+32] ; get src
|
|
186 mov edi,[esp+36] ; get dst
|
|
187 mov ebx,[esp+40] ; get index
|
|
188 mov ecx,[esp+44] ; get increment
|
|
189 mov ebp,[esp+48] ; get todo
|
|
190 mov eax,ecx
|
|
191 mov edx,ebx
|
|
192 sar eax,31
|
|
193 sar edx,31
|
|
194 shld eax,ecx,21 ; convert to 32:32
|
|
195 shl ecx,21
|
|
196 shld edx,ebx,21 ; convert to 32:32
|
|
197 shl ebx,21
|
|
198 add edx,esi
|
|
199 mov shi1,eax
|
|
200 mov shi2,eax
|
|
201 mov shi3,eax
|
|
202 mov shi4,eax
|
|
203 mov shi5,eax
|
|
204 mov eax,_lvoltab
|
|
205 mov slo1,ecx
|
|
206 mov slo2,ecx
|
|
207 mov slo3,ecx
|
|
208 mov slo4,ecx
|
|
209 mov slo5,ecx
|
|
210 mov sltab1,eax
|
|
211 mov sltab2,eax
|
|
212 mov sltab3,eax
|
|
213 mov sltab4,eax
|
|
214 mov sltab5,eax
|
|
215 mov eax,_rvoltab
|
|
216 push ebp
|
|
217 mov srtab1,eax
|
|
218 mov srtab2,eax
|
|
219 mov srtab3,eax
|
|
220 mov srtab4,eax
|
|
221 mov srtab5,eax
|
|
222 xor eax,eax
|
|
223 jmp s1 ; flush code cache
|
|
224 s1:
|
|
225 shr ebp,2
|
|
226 jz sskip16
|
|
227 push ebp
|
|
228 sagain16:
|
|
229 SS2F 0,slo1,shi1,sltab1,srtab1
|
|
230 SS2M 1,slo2,shi2,sltab2,srtab2
|
|
231 SS2M 2,slo3,shi3,sltab3,srtab3
|
|
232 SS2M 3,slo4,shi4,sltab4,srtab4
|
|
233 SS2L 4
|
|
234 add edi,(4*8)
|
|
235 dec dword ptr [esp]
|
|
236 jnz sagain16
|
|
237 pop ebp
|
|
238 sskip16:
|
|
239 pop ebp
|
|
240 and ebp,3
|
|
241 jz sskip1
|
|
242 push ebp
|
|
243 sagain1:
|
|
244 SS2F 0,slo5,shi5,sltab5,srtab5
|
|
245 SS2L 1
|
|
246 add edi,8
|
|
247 dec dword ptr [esp]
|
|
248 jnz sagain1
|
|
249 pop ebp
|
|
250 sskip1:
|
|
251 STUBEND
|
|
252 ret
|
|
253
|
|
254
|
|
255 _AsmStereoSurround:
|
|
256 STUBSTART
|
|
257 mov esi,[esp+32] ; get src
|
|
258 mov edi,[esp+36] ; get dst
|
|
259 mov ebx,[esp+40] ; get index
|
|
260 mov ecx,[esp+44] ; get increment
|
|
261 mov ebp,[esp+48] ; get todo
|
|
262 mov eax,ecx
|
|
263 mov edx,ebx
|
|
264 sar eax,31
|
|
265 sar edx,31
|
|
266 shld eax,ecx,21 ; convert to 32:32
|
|
267 shl ecx,21
|
|
268 shld edx,ebx,21 ; convert to 32:32
|
|
269 shl ebx,21
|
|
270 add edx,esi
|
|
271 mov s2hi1,eax
|
|
272 mov s2hi2,eax
|
|
273 mov s2hi3,eax
|
|
274 mov s2hi4,eax
|
|
275 mov s2hi5,eax
|
|
276 mov eax,_lvoltab
|
|
277 mov s2lo1,ecx
|
|
278 mov s2lo2,ecx
|
|
279 mov s2lo3,ecx
|
|
280 mov s2lo4,ecx
|
|
281 mov s2lo5,ecx
|
|
282 mov s2ltab1,eax
|
|
283 mov s2ltab2,eax
|
|
284 mov s2ltab3,eax
|
|
285 mov s2ltab4,eax
|
|
286 mov s2ltab5,eax
|
|
287 ;mov eax,_rvoltab
|
|
288 push ebp
|
|
289 ;mov s2rtab1,eax
|
|
290 ;mov s2rtab2,eax
|
|
291 ;mov s2rtab3,eax
|
|
292 ;mov s2rtab4,eax
|
|
293 ;mov s2rtab5,eax
|
|
294 xor eax,eax
|
|
295 jmp s3 ; flush code cache
|
|
296 s3:
|
|
297 shr ebp,2
|
|
298 jz s2skip16
|
|
299 push ebp
|
|
300 s2again16:
|
|
301 SS3F 0,s2lo1,s2hi1,s2ltab1 ;,s2rtab1
|
|
302 SS3M 1,s2lo2,s2hi2,s2ltab2 ;,s2rtab2
|
|
303 SS3M 2,s2lo3,s2hi3,s2ltab3 ;,s2rtab3
|
|
304 SS3M 3,s2lo4,s2hi4,s2ltab4 ;,s2rtab4
|
|
305 SS2L 4
|
|
306 add edi,(4*8)
|
|
307 dec dword ptr [esp]
|
|
308 jnz s2again16
|
|
309 pop ebp
|
|
310 s2skip16:
|
|
311 pop ebp
|
|
312 and ebp,3
|
|
313 jz s2skip1
|
|
314 push ebp
|
|
315 s2again1:
|
|
316 SS3F 0,s2lo5,s2hi5,s2ltab5 ;,s2rtab5
|
|
317 SS2L 1
|
|
318 add edi,8
|
|
319 dec dword ptr [esp]
|
|
320 jnz s2again1
|
|
321 pop ebp
|
|
322 s2skip1:
|
|
323 STUBEND
|
|
324 ret
|
|
325
|
|
326
|
|
327 _AsmMonoNormal:
|
|
328 STUBSTART
|
|
329 mov esi,[esp+32] ; get src
|
|
330 mov edi,[esp+36] ; get dst
|
|
331 mov ebx,[esp+40] ; get index
|
|
332 mov ecx,[esp+44] ; get increment
|
|
333 mov ebp,[esp+48] ; get todo
|
|
334 mov eax,ecx
|
|
335 mov edx,ebx
|
|
336 sar eax,31
|
|
337 sar edx,31
|
|
338 shld eax,ecx,21 ; convert to 32:32
|
|
339 shl ecx,21
|
|
340 shld edx,ebx,21 ; convert to 32:32
|
|
341 shl ebx,21
|
|
342 add edx,esi
|
|
343 mov mhi1,eax
|
|
344 mov mhi2,eax
|
|
345 mov mhi3,eax
|
|
346 mov mhi4,eax
|
|
347 mov mhi5,eax
|
|
348 mov eax,_lvoltab
|
|
349 mov mlo1,ecx
|
|
350 mov mlo2,ecx
|
|
351 mov mlo3,ecx
|
|
352 mov mlo4,ecx
|
|
353 mov mlo5,ecx
|
|
354 mov mltab1,eax
|
|
355 mov mltab2,eax
|
|
356 mov mltab3,eax
|
|
357 mov mltab4,eax
|
|
358 mov mltab5,eax
|
|
359 xor eax,eax
|
|
360
|
|
361 jmp m1 ; flush code cache
|
|
362 m1:
|
|
363 push ebp
|
|
364 shr ebp,2
|
|
365 jz mskip16
|
|
366 magain16:
|
|
367 SM2F 0,mlo1,mhi1,mltab1
|
|
368 SM2M 1,mlo2,mhi2,mltab2
|
|
369 SM2M 2,mlo3,mhi3,mltab3
|
|
370 SM2M 3,mlo4,mhi4,mltab4
|
|
371 SM2L 4
|
|
372 add edi,(4*4)
|
|
373 dec ebp
|
|
374 jnz magain16
|
|
375 mskip16:
|
|
376 pop ebp
|
|
377 and ebp,3
|
|
378 jz mskip1
|
|
379 magain1:
|
|
380 SM2F 0,mlo5,mhi5,mltab5
|
|
381 SM2L 1
|
|
382 add edi,4
|
|
383 dec ebp
|
|
384 jnz magain1
|
|
385 mskip1:
|
|
386 STUBEND
|
|
387 ret
|
|
388
|
|
389
|
|
390
|
|
391 IFDEF __ASMSTUFF__
|
|
392 _AsmMix32To16_Normal:
|
|
393 STUBSTART
|
|
394 mov edi,[esp+32] ; get dest
|
|
395 mov esi,[esp+36] ; get src
|
|
396 mov edx,[esp+40] ; get count
|
|
397 mov cl,[_bitshift]
|
|
398 again:
|
|
399 mov eax,[esi]
|
|
400 sar eax,cl
|
|
401 cmp eax,32767
|
|
402 jg toobig
|
|
403 cmp eax,-32768
|
|
404 jl toosmall
|
|
405 write:
|
|
406 mov [edi],ax
|
|
407 add esi,4
|
|
408 add edi,2
|
|
409 dec edx
|
|
410 jnz again
|
|
411 jmp ready
|
|
412 toobig:
|
|
413 mov eax,32767
|
|
414 jmp write
|
|
415 toosmall:
|
|
416 mov eax,-32768
|
|
417 jmp write
|
|
418 ready:
|
|
419 STUBEND
|
|
420 ret
|
|
421
|
|
422
|
|
423 _AsmMix32To8_Normal:
|
|
424 STUBSTART
|
|
425 mov edi,[esp+32] ; get dest
|
|
426 mov esi,[esp+36] ; get src
|
|
427 mov edx,[esp+40] ; get count
|
|
428 mov cl,[_bitshift]
|
|
429 cagain:
|
|
430 mov eax,[esi]
|
|
431 sar eax,cl
|
|
432 cmp eax,127
|
|
433 jg ctoobig
|
|
434 cmp eax,-128
|
|
435 jl ctoosmall
|
|
436 cwrite:
|
|
437 add al,080h
|
|
438 add esi,4
|
|
439 mov [edi],al
|
|
440 inc edi
|
|
441 dec edx
|
|
442 jnz cagain
|
|
443 jmp cready
|
|
444 ctoobig:
|
|
445 mov eax,127
|
|
446 jmp cwrite
|
|
447 ctoosmall:
|
|
448 mov eax,-128
|
|
449 jmp cwrite
|
|
450 cready:
|
|
451 STUBEND
|
|
452 ret
|
|
453 ENDIF
|
|
454
|
|
455 END
|