duke3d/buildengine/k.asm

550 lines
10 KiB
NASM
Executable File

; "Build Engine & Tools" Copyright (c) 1993-1997 Ken Silverman
; Ken Silverman's official web site: "http://www.advsys.net/ken"
; See the included license file "BUILDLIC.TXT" for license info.
; This file has been modified from Ken Silverman's original release
.386P
EXTRN _kdmasm1 : dword
EXTRN _kdmasm2 : dword
EXTRN _kdmasm3 : dword
EXTRN _kdmasm4 : dword
EXTRN _chainbackcnt : dword
EXTRN _chainbackstart : dword
EXTRN _pcsndptr : dword
EXTRN _samplecount : dword
EXTRN _pcsndbufsiz : dword
EXTRN _oldpctimerhandler : far
EXTRN _bufferside : byte
EXTRN _qualookup : near
EXTRN _pcsndlookup : near
EXTRN _chain_intr_ : near
EXTRN __GETDS : near
EXTRN preparesndbuf_ : near
_DATA SEGMENT BYTE PUBLIC USE32 'DATA'
_DATA ENDS
DGROUP GROUP _DATA
CODE SEGMENT BYTE PUBLIC USE32 'CODE'
ASSUME cs:CODE
PUBLIC monolocomb_
monolocomb_:
;eax=temp2,ebx=temp1,ecx=cnt,edx=dat,esi=dasplc,edi=stemp,ebp=dasoff
push ebp
mov dword ptr ds:[mach1lm+3], ebx ;voloffs1
mov ebx, _kdmasm4
mov dword ptr ds:[mach5lm+2], ebx
mov ebx, edx
shl ebx, 32-12
sar edx, 12
mov dword ptr ds:[mach3lm+2], ebx ;dasinc
mov dword ptr ds:[mach4lm+2], edx ;dasinc
mov ebp, esi
shl ebp, 32-12
sar esi, 12
xor edx, edx
jmp begitlm
prebegitlm:
cmp _kdmasm1, 0
jz enditlm
mov ebx, _kdmasm2
mov dword ptr ds:[mach5lm+2], ebx
mov _kdmasm4, ebx
mov ebx, _kdmasm3
mov eax, ebx
shl ebx, 32-12
sar eax, 12
sub ebp, ebx
sbb esi, eax
test ecx, ecx
jz enditlm
begitlm:
;dl = [(eax>>12)+dasoff]; (QUICK NO MULTIPLY METHOD)
mach5lm: mov dl, byte ptr [esi+88888888h] ;dasoff
mov ebx, dword ptr [edi]
add edi, 4
mach1lm: add ebx, dword ptr [edx*4+88888888h] ;voloffs1
mach3lm: add ebp, 88888888h ;dasinc
mach4lm: adc esi, 88888888h ;dasinc
mov dword ptr [edi-4], ebx
dec ecx
ja begitlm ;jump if (no carry (add)) and (not zero (dec))!
jc prebegitlm
enditlm:
shl esi, 12
shr ebp, 32-12
lea eax, [esi+ebp]
pop ebp
ret
PUBLIC monohicomb_
monohicomb_:
;eax=temp2,ebx=temp1,ecx=cnt,edx=dat,esi=dasplc,edi=stemp,ebp=dasoff
push ebp
mov ebp, ecx
mov dword ptr ds:[mach1hm+3], ebx ;voloffs1
mov ebx, _kdmasm4
mov dword ptr ds:[mach5hm+3], ebx
mov ebx, edx
shl ebx, 32-12
sar edx, 12
mov dword ptr ds:[mach4hm+2], edx ;dasinc
;mov edx, ebx ;Fake 4-bit counter to save shift
;shr edx, 20 ;
;mov bx, dx ;
mov dword ptr ds:[mach3hm+2], ebx ;dasinc
mov ecx, esi
shl ecx, 32-12
sar esi, 12
;mov edx, ecx ;Fake 4-bit counter to save shift
;shr edx, 20 ;
;mov cx, dx ;
xor edx, edx
sub edi, 4
jmp begithm
prebegithm:
cmp _kdmasm1, 0
jz endithm
mov ebx, _kdmasm2
mov dword ptr ds:[mach5hm+3], ebx
mov _kdmasm4, ebx
mov ebx, _kdmasm3
mov eax, ebx
shl ebx, 32-12
sar eax, 12
sub ecx, ebx
sbb esi, eax
test ebp, ebp
jz endithm
begithm:
;edx = _qualookup[((ebp>>19)&0x00001e00)+(bh-bl)]+bl
mach5hm: mov bx, word ptr [esi+88888888h]
mov eax, ecx
shr eax, 20
add edi, 4
mov dl, bl
mov al, bl
sub al, bh
adc ah, ah
add dl, byte ptr _qualookup[eax]
mov ebx, dword ptr [edi]
mach1hm: add ebx, dword ptr [edx*4+88888888h] ;voloffs1
mach3hm: add ecx, 88888888h ;dasinc
mach4hm: adc esi, 88888888h ;dasinc
dec ebp
mov dword ptr [edi], ebx
ja begithm ;jump if (no carry (add)) and (not zero (dec))!
jc prebegithm
endithm:
shl esi, 12
shr ecx, 32-12
lea eax, [esi+ecx]
pop ebp
ret
PUBLIC stereolocomb_
stereolocomb_:
;eax=temp2,ebx=temp1,ecx=cnt,edx=dat,esi=dasplc,edi=stemp,ebp=dasoff
push ebp
mov dword ptr ds:[mach1ls+3], ebx ;voloffs1
add ebx, 4
mov dword ptr ds:[mach2ls+3], ebx ;voloffs2
mov ebx, _kdmasm4
mov dword ptr ds:[mach5ls+2], ebx
mov ebx, edx
shl ebx, 32-12
sar edx, 12
mov dword ptr ds:[mach3ls+2], ebx ;dasinc
mov dword ptr ds:[mach4ls+2], edx ;dasinc
mov ebp, esi
shl ebp, 32-12
sar esi, 12
xor edx, edx
sub edi, 8
jmp begitls
prebegitls:
cmp _kdmasm1, 0
jz enditls
mov ebx, _kdmasm2
mov dword ptr ds:[mach5ls+2], ebx
mov _kdmasm4, ebx
mov ebx, _kdmasm3
mov eax, ebx
shl ebx, 32-12
sar eax, 12
sub ebp, ebx
sbb esi, eax
test ecx, ecx
jz enditls
jmp begitls
begitls:
add edi, 8
;dl = [(eax>>12)+dasoff]; (QUICK NO MULTIPLY METHOD)
mach5ls: mov dl, byte ptr [esi+88888888h] ;dasoff
mov ebx, dword ptr [edi]
mov eax, dword ptr [edi+4]
mach1ls: add ebx, dword ptr [edx*8+88888888h] ;voloffs1
mach2ls: add eax, dword ptr [edx*8+88888888h] ;voloffs2
mach3ls: add ebp, 88888888h ;dasinc
mov dword ptr [edi], ebx
mach4ls: adc esi, 88888888h ;dasinc
dec ecx
mov dword ptr [edi+4], eax
ja begitls ;jump if (no carry (add)) and (not zero (dec))!
jc prebegitls
enditls:
shl esi, 12
shr ebp, 32-12
lea eax, [esi+ebp]
pop ebp
ret
PUBLIC stereohicomb_
stereohicomb_:
;eax=temp2,ebx=temp1,ecx=cnt,edx=dat,esi=dasplc,edi=stemp,ebp=dasoff
push ebp
mov ebp, ecx
mov dword ptr ds:[mach1hs+3], ebx ;voloffs1
add ebx, 4
mov dword ptr ds:[mach2hs+3], ebx ;voloffs2
mov ebx, _kdmasm4
mov dword ptr ds:[mach5hs+3], ebx
mov ebx, edx
shl ebx, 32-12
sar edx, 12
mov dword ptr ds:[mach4hs+2], edx ;dasinc
;mov edx, ebx ;Fake 4-bit counter to save shift
;shr edx, 20 ;
;mov bx, dx ;
mov dword ptr ds:[mach3hs+2], ebx ;dasinc
mov ecx, esi
shl ecx, 32-12
sar esi, 12
;mov edx, ecx ;Fake 4-bit counter to save shift
;shr edx, 20 ;
;mov cx, dx ;
xor edx, edx
sub edi, 8
jmp begiths
prebegiths:
cmp _kdmasm1, 0
jz endiths
mov ebx, _kdmasm2
mov dword ptr ds:[mach5hs+3], ebx
mov _kdmasm4, ebx
mov ebx, _kdmasm3
mov eax, ebx
shl ebx, 32-12
sar eax, 12
sub ecx, ebx
sbb esi, eax
test ebp, ebp
jz endiths
begiths:
;edx = _qualookup[((ebp>>19)&0x00001e00)+(bh-bl)]+bl
mach5hs: mov bx, word ptr [esi+88888888h]
mov eax, ecx
shr eax, 20
add edi, 8
mov dl, bl
mov al, bl
sub al, bh
adc ah, ah
add dl, byte ptr _qualookup[eax]
mov eax, dword ptr [edi]
mach1hs: mov ebx, dword ptr [edx*8+88888888h] ;voloffs1
add ebx, eax
mov eax, dword ptr [edi+4]
mov dword ptr [edi], ebx
mach2hs: mov ebx, dword ptr [edx*8+88888888h] ;voloffs2
add eax, ebx
mach3hs: add ecx, 88888888h ;dasinc
mach4hs: adc esi, 88888888h ;dasinc
dec ebp
mov dword ptr [edi+4], eax
ja begiths ;jump if (no carry (add)) and (not zero (dec))!
jc prebegiths
endiths:
shl esi, 12
shr ecx, 32-12
lea eax, [esi+ecx]
pop ebp
ret
PUBLIC setuppctimerhandler_
setuppctimerhandler_:
mov dword ptr ds:[pcmach3+2], eax
cmp ebx, 65000d
jl short skipsetuppc1
mov word ptr ds:[pcmach1+0], 0c381h ;81c300000000 = add ebx, 00000000h
mov dword ptr ds:[pcmach1+2], 00000000h
mov word ptr ds:[pcmach2+0], 0c98bh ;8bc9 = mov ecx, ecx
skipsetuppc1:
ret
PUBLIC pctimerhandler_
pctimerhandler_:
push eax
mov ax, DGROUP
push ds
mov ds, ax
push edx
mov edx, dword ptr _pcsndptr
mov al, byte ptr [edx]
out 42h, al
inc edx
mov dword ptr _pcsndptr, edx
pcmach1: dec _chainbackcnt ;samplediv
pcmach2: jz short pc3
mov al, 20h
out 20h, al
pcmach3: cmp edx, 88888888h ;pcsndptrend
jge short pc1
pop edx
pop ds
pop eax
iretd
pc1: xor byte ptr _bufferside, 1
mov eax, _pcsndbufsiz
mov edx, _pcsndptr
jnz short pc2
sub edx, eax
sub edx, eax
mov _pcsndptr, edx
pc2: add eax, edx
mov dword ptr ds:[pcmach3+2], eax
sti
call preparesndbuf_
pop edx
pop ds
pop eax
iretd
pc3: sti
cmp edx, dword ptr ds:[pcmach3+2]
jl short pc5
xor byte ptr _bufferside, 1
mov eax, _pcsndbufsiz
mov edx, _pcsndptr
jnz short pc4
sub edx, eax
sub edx, eax
mov _pcsndptr, edx
pc4: add eax, edx
mov dword ptr ds:[pcmach3+2], eax
sti
call preparesndbuf_
pc5:
mov eax, _chainbackstart
mov _chainbackcnt, eax
pop edx
pop ds
pop eax
;Must start interrupt handler like watcom c
pushad
push ds
push es
push fs
push gs
mov ebp, esp
cld
call __GETDS
mov dx, word ptr [_oldpctimerhandler+4]
mov eax, dword ptr [_oldpctimerhandler]
call _chain_intr_
PUBLIC pcbound2char_
pcbound2char_:
push ebp
add ecx, ecx
lea eax, [ecx+edi]
mov dword ptr ds:[pcmachchar+3], eax
xor edi, edi
sub edi, ecx
xor ecx, ecx
xor edx, edx
mov ebp, 0ffff0000h
startpcbound2char:
mov ebx, dword ptr [esi]
mov eax, dword ptr [esi+4]
test ebx, ebp
jnz short pcboundit1
pcboundit1back:
mov dl, bh
mov dword ptr [esi], 32768
test eax, ebp
mov al, byte ptr _pcsndlookup[edx]
jnz short pcboundit2
pcboundit2back:
mov dl, ah
mov dword ptr [esi+4], 32768
mov ah, byte ptr _pcsndlookup[edx]
add esi, 8
pcmachchar: mov word ptr [edi+88888888h], ax
add edi, 2
jnc short startpcbound2char
pop ebp
ret
pcboundit1:
cmp ebx, 80000000h
sbb bh, bh
jmp short pcboundit1back
pcboundit2:
cmp eax, 80000000h
sbb ah, ah
jmp short pcboundit2back
;for(i=0;i<bytespertic;i++)
;{
; j = (stemp[i]>>8);
; if (j < 0) j = 0;
; if (j > 255) j = 255;
; *charptr++ = (char)j;
;}
PUBLIC bound2char_
bound2char_:
add ecx, ecx
lea eax, [ecx+edi]
mov dword ptr ds:[machchar+3], eax
xor edi, edi
sub edi, ecx
xor ecx, ecx
mov edx, 0ffff0000h
startbound2char:
mov ebx, dword ptr [esi]
mov eax, dword ptr [esi+4]
test ebx, edx
jnz short boundchar1
boundchar1back:
mov dword ptr [esi], 32768
test eax, edx
jnz short boundchar2
boundchar2back:
mov dword ptr [esi+4], 32768
mov al, bh
add esi, 8
machchar: mov word ptr [edi+88888888h], ax
add edi, 2
jnc short startbound2char
ret
boundchar1:
cmp ebx, 80000000h
sbb bh, bh
jmp short boundchar1back
boundchar2:
cmp eax, 80000000h
sbb ah, ah
jmp short boundchar2back
;for(i=0;i<bytespertic;i++)
;{
; j = stemp[i];
; if (j < 0) j = 0;
; if (j > 65535) j = 65535;
; *shortptr++ = (short)(j^8000h);
;}
PUBLIC bound2short_
bound2short_:
shl ecx, 2
lea eax, [ecx+edi]
mov dword ptr ds:[machshort+2], eax
xor edi, edi
sub edi, ecx
xor ecx, ecx
mov edx, 0ffff0000h
startbound2short:
mov ebx, dword ptr [esi]
mov eax, dword ptr [esi+4]
test ebx, edx
jnz short boundshort1
boundshort1back:
mov dword ptr [esi], 32768
test eax, edx
jnz short boundshort2
boundshort2back:
shl eax, 16
mov dword ptr [esi+4], 32768
mov ax, bx
add esi, 8
xor eax, 80008000h
machshort: mov dword ptr [edi+88888888h], eax
add edi, 4
jnc short startbound2short
ret
boundshort1:
cmp ebx, 80000000h
sbb ebx, ebx
jmp short boundshort1back
boundshort2:
cmp eax, 80000000h
sbb eax, eax
jmp short boundshort2back
CODE ENDS
END