diff playercode/resample.asm @ 6:d14fd386d182

Initial entry of mikmod into the CVS tree.
author darius
date Fri, 23 Jan 1998 16:05:09 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/playercode/resample.asm	Fri Jan 23 16:05:09 1998 +0000
@@ -0,0 +1,455 @@
+.386p
+.model flat
+.data ; self-modifying code... keep in data segment
+
+        NAME    resample
+        EXTRN   _rvoltab :DWORD
+        EXTRN   _lvoltab :DWORD
+        EXTRN   _bitshift :BYTE
+
+        PUBLIC  _AsmStereoNormal
+        PUBLIC  _AsmStereoSurround
+        PUBLIC  _AsmMonoNormal
+IFDEF __ASMSTUFF__
+        PUBLIC  _AsmMix32To16_Normal
+        PUBLIC  _AsmMix32To8_Normal
+ENDIF
+
+
+STUBSTART macro
+  push eax
+  push ebx
+  push ecx
+  push edx
+  push esi
+  push edi
+  push ebp
+  endm
+
+
+STUBEND macro
+  pop ebp
+  pop edi
+  pop esi
+  pop edx
+  pop ecx
+  pop ebx
+  pop eax
+  endm
+
+
+SS2F MACRO index,lab1,lab2,lab3,lab4 ; 486+
+ mov al,[edx]
+ db 081h,0c3h
+lab1 dd 0 ; add ebx,lo
+ db 081h,0d2h
+lab2 dd 0 ; adc edx,hi
+ mov esi,(index*8)[edi]
+ db 08bh,0ch,085h
+lab3 dd 0 ; mov ecx,[eax*4+table1]
+ mov ebp,(index*8+4)[edi]
+ add esi,ecx
+ db 08bh,0ch,085h
+lab4 dd 0 ; mov ecx,[eax*4+table2]
+ mov (index*8)[edi],esi
+ add ebp,ecx
+ ENDM
+
+SS2M MACRO index,lab1,lab2,lab3,lab4 ; 486+
+ mov al,[edx]
+ mov (index*8-4)[edi],ebp
+ db 081h,0c3h
+lab1 dd 0 ; add ebx,lo
+ db 081h,0d2h
+lab2 dd 0 ; adc edx,hi
+ mov esi,(index*8)[edi]
+ db 08bh,0ch,085h
+lab3 dd 0 ; mov ecx,[eax*4+table1]
+ mov ebp,(index*8+4)[edi]
+ add esi,ecx
+ db 08bh,0ch,085h
+lab4 dd 0 ; mov ecx,[eax*4+table2]
+ mov (index*8)[edi],esi
+ add ebp,ecx
+ ENDM
+
+SS3F MACRO index,lab1,lab2,lab3 ; 486+
+ mov al,[edx]
+ db 081h,0c3h
+lab1 dd 0 ; add ebx,lo
+ db 081h,0d2h
+lab2 dd 0 ; adc edx,hi
+ mov esi,(index*8)[edi]
+ db 08bh,0ch,085h
+lab3 dd 0 ; mov ecx,[eax*4+table1]
+ mov ebp,(index*8+4)[edi]
+ add esi,ecx
+ sub ebp,ecx
+ mov (index*8)[edi],esi
+ ENDM
+
+SS3M MACRO index,lab1,lab2,lab3 ; 486+
+ mov al,[edx]
+ mov (index*8-4)[edi],ebp
+ db 081h,0c3h
+lab1 dd 0 ; add ebx,lo
+ db 081h,0d2h
+lab2 dd 0 ; adc edx,hi
+ mov esi,(index*8)[edi]
+ db 08bh,0ch,085h
+lab3 dd 0 ; mov ecx,[eax*4+table1]
+ mov ebp,(index*8+4)[edi]
+ add esi,ecx
+ sub ebp,ecx
+ mov (index*8)[edi],esi
+ ENDM
+
+SS2L MACRO index ; 486+
+ mov (index*8-4)[edi],ebp
+ ENDM
+
+SM2F MACRO index,lab1,lab2,lab3 ; 486+
+ mov al,[edx] ; AGI-3
+ db 081h,0c3h
+lab1 dd 0 ; add ebx,lo
+ db 081h,0d2h
+lab2 dd 0 ; adc edx,hi
+ mov esi,(index*4)[edi]
+ db 08bh,0ch,085h
+lab3 dd 0 ; mov ecx,[eax*4+table1]
+ ENDM
+
+SM2M MACRO index,lab1,lab2,lab3 ; 486+
+ mov al,[edx] ; AGI-3
+ add esi,ecx
+ db 081h,0c3h
+lab1 dd 0 ; add ebx,lo
+ mov (index*4-4)[edi],esi
+ db 081h,0d2h
+lab2 dd 0 ; adc edx,hi
+ mov esi,(index*4)[edi]
+ db 08bh,0ch,085h
+lab3 dd 0 ; mov ecx,[eax*4+table1]
+ ENDM
+
+SM2L MACRO index ; 486+
+ add esi,ecx
+ mov (index*4-4)[edi],esi
+ ENDM
+
+;SS2 ; 386
+;mov al,[edx+source]
+;add ebx,lo
+;adc edx,hi
+;mov ecx,[eax*4+table1]
+;mov ebp,[eax*4+table2]
+;add [edi],ecx
+;add [edi+4],ebp
+;ENDM
+
+;SS2M ; 486+
+;mov al,[edx+source]
+;mov [edi-8+4],ebp
+;add ebx,lo
+;adc edx,hi
+;mov esi,[edi]
+;mov ecx,[eax*4+table1]
+;mov ebp,[edi+4]
+;add esi,ecx
+;mov ecx,[eax*4+table2]
+;mov [edi],esi
+;add ebp,ecx
+;ENDM
+
+;SM2M ; 386
+;add ebx,lo
+;adc edx,hi
+;mov ecx,[eax*4+table1]
+;mov al,[edx+source]
+;add [edi],ecx
+;ENDM
+
+;SM2M ; 486+
+;add ebx,lo
+;mov [edi-4],esi
+;adc edx,hi
+;mov esi,[edi]
+;mov ecx,[eax*4+table1]
+;mov al,[edx+source] ; AGI-3
+;add esi,ecx
+;ENDM
+
+
+_AsmStereoNormal:
+        STUBSTART
+        mov    esi,[esp+32] ; get src
+        mov    edi,[esp+36] ; get dst
+        mov    ebx,[esp+40] ; get index
+        mov    ecx,[esp+44] ; get increment
+        mov    ebp,[esp+48] ; get todo
+        mov    eax,ecx
+        mov    edx,ebx
+        sar    eax,31
+        sar    edx,31
+        shld   eax,ecx,21 ; convert to 32:32
+        shl    ecx,21
+        shld   edx,ebx,21 ; convert to 32:32
+        shl    ebx,21
+        add    edx,esi
+        mov    shi1,eax
+        mov    shi2,eax
+        mov    shi3,eax
+        mov    shi4,eax
+        mov    shi5,eax
+        mov    eax,_lvoltab
+        mov    slo1,ecx
+        mov    slo2,ecx
+        mov    slo3,ecx
+        mov    slo4,ecx
+        mov    slo5,ecx
+        mov    sltab1,eax
+        mov    sltab2,eax
+        mov    sltab3,eax
+        mov    sltab4,eax
+        mov    sltab5,eax
+        mov    eax,_rvoltab
+        push   ebp
+        mov    srtab1,eax
+        mov    srtab2,eax
+        mov    srtab3,eax
+        mov    srtab4,eax
+        mov    srtab5,eax
+        xor    eax,eax
+        jmp    s1 ; flush code cache
+s1:
+        shr    ebp,2
+        jz     sskip16
+        push   ebp
+sagain16:
+        SS2F   0,slo1,shi1,sltab1,srtab1
+        SS2M   1,slo2,shi2,sltab2,srtab2
+        SS2M   2,slo3,shi3,sltab3,srtab3
+        SS2M   3,slo4,shi4,sltab4,srtab4
+        SS2L   4
+        add    edi,(4*8)
+        dec    dword ptr [esp]
+        jnz    sagain16
+        pop    ebp
+sskip16:
+        pop    ebp
+        and    ebp,3
+        jz     sskip1
+        push   ebp
+sagain1:
+        SS2F   0,slo5,shi5,sltab5,srtab5
+        SS2L   1
+        add    edi,8
+        dec    dword ptr [esp]
+        jnz    sagain1
+        pop    ebp
+sskip1:
+        STUBEND
+        ret
+
+
+_AsmStereoSurround:
+        STUBSTART
+        mov    esi,[esp+32] ; get src
+        mov    edi,[esp+36] ; get dst
+        mov    ebx,[esp+40] ; get index
+        mov    ecx,[esp+44] ; get increment
+        mov    ebp,[esp+48] ; get todo
+        mov    eax,ecx
+        mov    edx,ebx
+        sar    eax,31
+        sar    edx,31
+        shld   eax,ecx,21 ; convert to 32:32
+        shl    ecx,21
+        shld   edx,ebx,21 ; convert to 32:32
+        shl    ebx,21
+        add    edx,esi
+        mov    s2hi1,eax
+        mov    s2hi2,eax
+        mov    s2hi3,eax
+        mov    s2hi4,eax
+        mov    s2hi5,eax
+        mov    eax,_lvoltab
+        mov    s2lo1,ecx
+        mov    s2lo2,ecx
+        mov    s2lo3,ecx
+        mov    s2lo4,ecx
+        mov    s2lo5,ecx
+        mov    s2ltab1,eax
+        mov    s2ltab2,eax
+        mov    s2ltab3,eax
+        mov    s2ltab4,eax
+        mov    s2ltab5,eax
+        ;mov    eax,_rvoltab
+        push   ebp
+        ;mov    s2rtab1,eax
+        ;mov    s2rtab2,eax
+        ;mov    s2rtab3,eax
+        ;mov    s2rtab4,eax
+        ;mov    s2rtab5,eax
+        xor    eax,eax
+        jmp    s3 ; flush code cache
+s3:
+        shr    ebp,2
+        jz     s2skip16
+        push   ebp
+s2again16:
+        SS3F   0,s2lo1,s2hi1,s2ltab1  ;,s2rtab1
+        SS3M   1,s2lo2,s2hi2,s2ltab2  ;,s2rtab2
+        SS3M   2,s2lo3,s2hi3,s2ltab3  ;,s2rtab3
+        SS3M   3,s2lo4,s2hi4,s2ltab4  ;,s2rtab4
+        SS2L   4
+        add    edi,(4*8)
+        dec    dword ptr [esp]
+        jnz    s2again16
+        pop    ebp
+s2skip16:
+        pop    ebp
+        and    ebp,3
+        jz     s2skip1
+        push   ebp
+s2again1:
+        SS3F   0,s2lo5,s2hi5,s2ltab5  ;,s2rtab5
+        SS2L   1
+        add    edi,8
+        dec    dword ptr [esp]
+        jnz    s2again1
+        pop    ebp
+s2skip1:
+        STUBEND
+        ret
+
+
+_AsmMonoNormal:
+        STUBSTART
+        mov    esi,[esp+32] ; get src
+        mov    edi,[esp+36] ; get dst
+        mov    ebx,[esp+40] ; get index
+        mov    ecx,[esp+44] ; get increment
+        mov    ebp,[esp+48] ; get todo
+        mov    eax,ecx
+        mov    edx,ebx
+        sar    eax,31
+        sar    edx,31
+        shld   eax,ecx,21 ; convert to 32:32
+        shl    ecx,21
+        shld   edx,ebx,21 ; convert to 32:32
+        shl    ebx,21
+        add    edx,esi
+        mov    mhi1,eax
+        mov    mhi2,eax
+        mov    mhi3,eax
+        mov    mhi4,eax
+        mov    mhi5,eax
+        mov    eax,_lvoltab
+        mov    mlo1,ecx
+        mov    mlo2,ecx
+        mov    mlo3,ecx
+        mov    mlo4,ecx
+        mov    mlo5,ecx
+        mov    mltab1,eax
+        mov    mltab2,eax
+        mov    mltab3,eax
+        mov    mltab4,eax
+        mov    mltab5,eax
+        xor    eax,eax
+
+        jmp    m1 ; flush code cache
+m1:
+        push   ebp
+        shr    ebp,2
+        jz     mskip16
+magain16:
+        SM2F   0,mlo1,mhi1,mltab1
+        SM2M   1,mlo2,mhi2,mltab2
+        SM2M   2,mlo3,mhi3,mltab3
+        SM2M   3,mlo4,mhi4,mltab4
+        SM2L   4
+        add    edi,(4*4)
+        dec    ebp
+        jnz    magain16
+mskip16:
+        pop    ebp
+        and    ebp,3
+        jz     mskip1
+magain1:
+        SM2F   0,mlo5,mhi5,mltab5
+        SM2L   1
+        add    edi,4
+        dec    ebp
+        jnz    magain1
+mskip1:
+        STUBEND
+        ret
+
+
+
+IFDEF __ASMSTUFF__
+_AsmMix32To16_Normal:
+        STUBSTART
+        mov   edi,[esp+32] ; get dest
+        mov   esi,[esp+36] ; get src
+        mov   edx,[esp+40] ; get count
+        mov    cl,[_bitshift]
+again:
+        mov   eax,[esi]
+        sar   eax,cl
+        cmp   eax,32767
+        jg    toobig
+        cmp   eax,-32768
+        jl    toosmall
+write:
+        mov   [edi],ax
+        add   esi,4
+        add   edi,2
+        dec   edx
+        jnz   again
+        jmp   ready
+toobig:
+        mov   eax,32767
+        jmp   write
+toosmall:
+        mov   eax,-32768
+        jmp   write
+ready:
+        STUBEND
+        ret
+
+
+_AsmMix32To8_Normal:
+        STUBSTART
+        mov   edi,[esp+32] ; get dest
+        mov   esi,[esp+36] ; get src
+        mov   edx,[esp+40] ; get count
+        mov    cl,[_bitshift]
+cagain:
+        mov   eax,[esi]
+        sar   eax,cl
+        cmp   eax,127
+        jg    ctoobig
+        cmp   eax,-128
+        jl    ctoosmall
+cwrite:
+        add   al,080h
+        add   esi,4
+        mov   [edi],al
+        inc   edi
+        dec   edx
+        jnz   cagain
+        jmp   cready
+ctoobig:
+        mov   eax,127
+        jmp   cwrite
+ctoosmall:
+        mov   eax,-128
+        jmp   cwrite
+cready:
+        STUBEND
+        ret
+ENDIF
+
+        END