📄 a.asm
字号:
; "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.
.586P
.8087
;include mmx.inc ;Include this if using < WATCOM 11.0 WASM
;Warning: IN THIS FILE, ALL SEGMENTS ARE REMOVED. THIS MEANS THAT DS:[]
;MUST BE ADDED FOR ALL SELF-MODIFIES FOR MASM TO WORK.
;
;WASM PROBLEMS:
; 1. Requires all scaled registers (*1,*2,*4,*8) to be last thing on line
; 2. Using 'DATA' is nice for self-mod. code, but WDIS only works with 'CODE'
;
;MASM PROBLEMS:
; 1. Requires DS: to be written out for self-modifying code to work
; 2. Doesn't encode short jumps automatically like WASM
; 3. Stupidly adds wait prefix to ffree's
EXTRN _asm1 : dword
EXTRN _asm2 : dword
EXTRN _asm3 : dword
EXTRN _asm4 : dword
EXTRN _reciptable : near
EXTRN _fpuasm : dword
EXTRN _globalx3 : dword
EXTRN _globaly3 : dword
EXTRN _ylookup : near
EXTRN _vplce : near
EXTRN _vince : near
EXTRN _palookupoffse : near
EXTRN _bufplce : near
EXTRN _ebpbak : dword
EXTRN _espbak : dword
EXTRN _pow2char : near
EXTRN _pow2long : near
CODE SEGMENT PUBLIC USE32 'DATA'
ASSUME cs:CODE,ds:CODE
ALIGN 16
PUBLIC is_vmware_running_
is_vmware_running_:
mov eax,564d5868h
mov ecx,0000000ah
mov dx,5658h
in eax,dx
cmp ebx,564d5868h
jz vmware_y
xor eax,eax
ret
vmware_y:
mov eax,1h
ret
ALIGN 16
PUBLIC sethlinesizes_
sethlinesizes_:
mov byte ptr [machxbits1+2], al
mov byte ptr [machxbits2+2], al
mov byte ptr [machxbits3+2], al
neg al
mov byte ptr [hxsiz1+2], al
mov byte ptr [hxsiz2+2], al
mov byte ptr [hxsiz3+2], al
mov byte ptr [hxsiz4+2], al
mov byte ptr [machnegxbits1+2], al
mov byte ptr [hysiz1+3], bl
mov byte ptr [hysiz2+3], bl
mov byte ptr [hysiz3+3], bl
mov byte ptr [hysiz4+3], bl
mov byte ptr [hmach3a+2], bl
mov byte ptr [hmach3b+2], bl
mov byte ptr [hmach3c+2], bl
mov byte ptr [hmach3d+2], bl
mov dword ptr [hoffs1+2], ecx
mov dword ptr [hoffs2+2], ecx
mov dword ptr [hoffs3+2], ecx
mov dword ptr [hoffs4+2], ecx
mov dword ptr [hoffs5+2], ecx
mov dword ptr [hoffs6+2], ecx
mov dword ptr [hoffs7+2], ecx
mov dword ptr [hoffs8+2], ecx
mov edx, -1
mov cl, al
sub cl, bl
shr edx, cl
mov dword ptr [hmach2a+1], edx
mov dword ptr [hmach2b+1], edx
mov dword ptr [hmach2c+1], edx
mov dword ptr [hmach2d+1], edx
ret
ALIGN 16
PUBLIC prosethlinesizes_
prosethlinesizes_:
mov dword ptr [prohbuf-4], ecx
neg eax
mov ecx, eax
sub eax, ebx
mov byte ptr [prohshru-1], al ;bl = 32-al-bl
mov eax, -1
shr eax, cl
mov ecx, ebx
shl eax, cl
mov dword ptr [prohand-4], eax ;((-1>>(-oal))<<obl)
neg ebx
mov byte ptr [prohshrv-1], bl ;bl = 32-bl
ret
ALIGN 16
PUBLIC setvlinebpl_
setvlinebpl_:
mov dword ptr [fixchain1a+2], eax
mov dword ptr [fixchain1b+2], eax
mov dword ptr [fixchain1m+2], eax
mov dword ptr [fixchain1t+2], eax
mov dword ptr [fixchain1s+2], eax
mov dword ptr [mfixchain1s+2], eax
mov dword ptr [tfixchain1s+2], eax
mov dword ptr [fixchain2a+2], eax
mov dword ptr [profixchain2a+2], eax
mov dword ptr [fixchain2ma+2], eax
mov dword ptr [fixchain2mb+2], eax
mov dword ptr [fixchaint2a+1], eax
mov dword ptr [fixchaint2b+2], eax
mov dword ptr [fixchaint2c+2], eax
mov dword ptr [fixchaint2d+2], eax
mov dword ptr [fixchaint2e+2], eax
ret
ALIGN 16
PUBLIC setpalookupaddress_
setpalookupaddress_:
mov dword ptr [pal1+2], eax
mov dword ptr [pal2+2], eax
mov dword ptr [pal3+2], eax
mov dword ptr [pal4+2], eax
mov dword ptr [pal5+2], eax
mov dword ptr [pal6+2], eax
mov dword ptr [pal7+2], eax
mov dword ptr [pal8+2], eax
ret
ALIGN 16
PUBLIC prosetpalookupaddress_
prosetpalookupaddress_:
mov dword ptr [prohpala-4], eax
ret
ALIGN 16
PUBLIC setuphlineasm4_
setuphlineasm4_:
machxbits3: rol eax, 6 ;xbits
mov dword ptr [hmach4a+2], eax
mov dword ptr [hmach4b+2], eax
mov bl, al
mov dword ptr [hmach4c+2], eax
mov dword ptr [hmach4d+2], eax
mov dword ptr [hmach1a+2], ebx
mov dword ptr [hmach1b+2], ebx
mov dword ptr [hmach1c+2], ebx
mov dword ptr [hmach1d+2], ebx
ret
;Non-256-stuffed ceiling&floor method with NO SHLD!:
;yinc&0xffffff00 lea eax, [edx+88888800h] 1 1/2
;ybits...xbits and edx, 88000088h 1 1/2
;ybits rol edx, 6 2 1/2
;xinc<<xbits add esi, 88888888h 1 1/2
;xinc>>(32-xbits) adc al, 88h 1 1/2
;bufplc mov cl, byte ptr [edx+88888888h] 1 1/2
;paloffs&255 mov bl, byte ptr [ecx+88888888h] 1 1/2
ALIGN 16
PUBLIC hlineasm4_
hlineasm4_:
push ebp
lea ebp, [eax+1]
cmp ebp, 8
jle shorthline
test edi, 1
jnz short skipthe1byte
mov eax, esi
hxsiz1: shr eax, 26
hysiz1: shld eax, edx, 6
hoffs1: mov cl, byte ptr [eax+88888888h]
pal1: mov bl, byte ptr [ecx+88888888h]
sub esi, _asm1
sub edx, _asm2
mov byte ptr [edi], bl
dec edi
dec ebp
skipthe1byte:
test edi, 2
jnz short skipthe2byte
mov eax, esi
hxsiz2: shr eax, 26
hysiz2: shld eax, edx, 6
hoffs2: mov cl, byte ptr [eax+88888888h]
pal2: mov bh, byte ptr [ecx+88888888h]
sub esi, _asm1
sub edx, _asm2
mov eax, esi
hxsiz3: shr eax, 26
hysiz3: shld eax, edx, 6
hoffs3: mov cl, byte ptr [eax+88888888h]
pal3: mov bl, byte ptr [ecx+88888888h]
sub esi, _asm1
sub edx, _asm2
mov word ptr [edi-1], bx
sub edi, 2
sub ebp, 2
skipthe2byte:
mov eax, esi
machxbits1: shl esi, 6 ;xbits
machnegxbits1: shr eax, 32-6 ;32-xbits
mov dl, al
inc edi
add ebx, ebx
mov eax, edx
jc beginhline64
mov eax, _asm1
machxbits2: rol eax, 6 ;xbits
mov dword ptr [hmach4a+2], eax
mov dword ptr [hmach4b+2], eax
mov dword ptr [hmach4c+2], eax
mov dword ptr [hmach4d+2], eax
mov ebx, eax
mov eax, _asm2
mov al, bl
mov dword ptr [hmach1a+2], eax
mov dword ptr [hmach1b+2], eax
mov dword ptr [hmach1c+2], eax
mov dword ptr [hmach1d+2], eax
mov eax, edx
jmp beginhline64
ALIGN 16
prebeginhline64:
mov dword ptr [edi], ebx
beginhline64:
hmach3a: rol eax, 6
hmach2a: and eax, 00008888h
hmach4a: sub esi, 88888888h
hmach1a: sbb edx, 88888888h
sub edi, 4
hoffs4: mov cl, byte ptr [eax+88888888h]
mov eax, edx
hmach3b: rol eax, 6
hmach2b: and eax, 00008888h
hmach4b: sub esi, 88888888h
hmach1b: sbb edx, 88888888h
pal4: mov bh, byte ptr [ecx+88888888h]
hoffs5: mov cl, byte ptr [eax+88888888h]
mov eax, edx
hmach3c: rol eax, 6
pal5: mov bl, byte ptr [ecx+88888888h]
hmach2c: and eax, 00008888h
shl ebx, 16
hmach4c: sub esi, 88888888h
hmach1c: sbb edx, 88888888h
hoffs6: mov cl, byte ptr [eax+88888888h]
mov eax, edx
;(
hmach3d: rol eax, 6
hmach2d: and eax, 00008888h
hmach4d: sub esi, 88888888h
hmach1d: sbb edx, 88888888h
pal6: mov bh, byte ptr [ecx+88888888h]
hoffs7: mov cl, byte ptr [eax+88888888h]
mov eax, edx
sub ebp, 4
nop
pal7: mov bl, byte ptr [ecx+88888888h]
jnc prebeginhline64
skipthe4byte:
test ebp, 2
jz skipdrawthe2
rol ebx, 16
mov word ptr [edi+2], bx
sub edi, 2
skipdrawthe2:
test ebp, 1
jz skipdrawthe1
shr ebx, 24
mov byte ptr [edi+3], bl
skipdrawthe1:
pop ebp
ret
shorthline:
test ebp, ebp
jz endshorthline
begshorthline:
mov eax, esi
hxsiz4: shr eax, 26
hysiz4: shld eax, edx, 6
hoffs8: mov cl, byte ptr [eax+88888888h]
pal8: mov bl, byte ptr [ecx+88888888h]
sub esi, _asm1
sub edx, _asm2
mov byte ptr [edi], bl
dec edi
dec ebp
jnz begshorthline
endshorthline:
pop ebp
ret
;eax: 00000000 00000000 00000000 temp----
;ebx: 00000000 00000000 00000000 temp----
;ecx: UUUUUUuu uuuuuuuu uuuuuuuu uuuuuuuu
;edx: VVVVVVvv vvvvvvvv vvvvvvvv vvvvvvvv
;esi: cnt----- -------- -------- --------
;edi: vid----- -------- -------- --------
;ebp: paloffs- -------- -------- --------
;esp: ???????? ???????? ???????? ????????
ALIGN 16
PUBLIC prohlineasm4_
prohlineasm4_:
push ebp
lea ebp, [ecx+88888888h]
prohpala:
mov ecx, esi
lea esi, [eax+1]
sub edi, esi
prohbeg:
mov eax, ecx
shr eax, 20
prohshru:
mov ebx, edx
shr ebx, 26
prohshrv:
and eax, 88888888h
prohand:
movzx eax, byte ptr [eax+ebx+88888888h]
prohbuf:
mov al, [eax+ebp]
sub ecx, _asm1
sub edx, _asm2
mov [edi+esi], al
dec esi
jnz prohbeg
pop ebp
ret
ALIGN 16
PUBLIC setupvlineasm_
setupvlineasm_:
;First 2 lines for VLINEASM1, rest for VLINEASM4
mov byte ptr [premach3a+2], al
mov byte ptr [mach3a+2], al
push ecx
mov byte ptr [machvsh1+2], al ;32-shy
mov byte ptr [machvsh3+2], al ;32-shy
mov byte ptr [machvsh5+2], al ;32-shy
mov byte ptr [machvsh6+2], al ;32-shy
mov ah, al
sub ah, 16
mov byte ptr [machvsh8+2], ah ;16-shy
neg al
mov byte ptr [machvsh7+2], al ;shy
mov byte ptr [machvsh9+2], al ;shy
mov byte ptr [machvsh10+2], al ;shy
mov byte ptr [machvsh11+2], al ;shy
mov byte ptr [machvsh12+2], al ;shy
mov cl, al
mov eax, 1
shl eax, cl
dec eax
mov dword ptr [machvsh2+2], eax ;(1<<shy)-1
mov dword ptr [machvsh4+2], eax ;(1<<shy)-1
pop ecx
ret
ALIGN 16
PUBLIC prosetupvlineasm_
prosetupvlineasm_:
;First 2 lines for VLINEASM1, rest for VLINEASM4
mov byte ptr [premach3a+2], al
mov byte ptr [mach3a+2], al
push ecx
mov byte ptr [promachvsh1+2], al ;32-shy
mov byte ptr [promachvsh3+2], al ;32-shy
mov byte ptr [promachvsh5+2], al ;32-shy
mov byte ptr [promachvsh6+2], al ;32-shy
mov ah, al
sub ah, 16
mov byte ptr [promachvsh8+2], ah ;16-shy
neg al
mov byte ptr [promachvsh7+2], al ;shy
mov byte ptr [promachvsh9+2], al ;shy
mov byte ptr [promachvsh10+2], al ;shy
mov byte ptr [promachvsh11+2], al ;shy
mov byte ptr [promachvsh12+2], al ;shy
mov cl, al
mov eax, 1
shl eax, cl
dec eax
mov dword ptr [promachvsh2+2], eax ;(1<<shy)-1
mov dword ptr [promachvsh4+2], eax ;(1<<shy)-1
pop ecx
ret
ALIGN 16
PUBLIC setupmvlineasm_
setupmvlineasm_:
mov byte ptr [maskmach3a+2], al
mov byte ptr [machmv13+2], al
mov byte ptr [machmv14+2], al
mov byte ptr [machmv15+2], al
mov byte ptr [machmv16+2], al
ret
ALIGN 16
PUBLIC setuptvlineasm_
setuptvlineasm_:
mov byte ptr [transmach3a+2], al
ret
ALIGN 16
PUBLIC prevlineasm1_
prevlineasm1_:
test ecx, ecx
jnz vlineasm1_
add eax, edx
premach3a: shr edx, 32
mov dl, byte ptr [esi+edx]
mov cl, byte ptr [ebx+edx]
mov byte ptr [edi], cl
ret
ALIGN 16
PUBLIC vlineasm1_
vlineasm1_:
push ebp
mov ebp, ebx
inc ecx
fixchain1a: sub edi, 320
beginvline:
mov ebx, edx
mach3a: shr ebx, 32
fixchain1b: add edi, 320
mov bl, byte ptr [esi+ebx]
add edx, eax
dec ecx
mov bl, byte ptr [ebp+ebx]
mov byte ptr [edi], bl
jnz short beginvline
pop ebp
mov eax, edx
ret
ALIGN 16
PUBLIC mvlineasm1_ ;Masked vline
mvlineasm1_:
push ebp
mov ebp, ebx
beginmvline:
mov ebx, edx
maskmach3a: shr ebx, 32
mov bl, byte ptr [esi+ebx]
cmp bl, 255
je short skipmask1
maskmach3c: mov bl, [ebp+ebx]
mov byte ptr [edi], bl
skipmask1:
add edx, eax
fixchain1m: add edi, 320
sub ecx, 1
jnc short beginmvline
pop ebp
mov eax, edx
ret
ALIGN 16
PUBLIC fixtransluscence_
fixtransluscence_:
mov dword ptr [transmach4+2], eax
mov dword ptr [tmach1+2], eax
mov dword ptr [tmach2+2], eax
mov dword ptr [tmach3+2], eax
mov dword ptr [tmach4+2], eax
mov dword ptr [tran2traa+2], eax
mov dword ptr [tran2trab+2], eax
mov dword ptr [tran2trac+2], eax
mov dword ptr [tran2trad+2], eax
ret
ALIGN 16
PUBLIC settransnormal_
settransnormal_:
mov byte ptr [transrev0+1], 83h
mov byte ptr [transrev1+1], 27h
mov byte ptr [transrev2+1], 3fh
mov byte ptr [transrev3+1], 98h
mov byte ptr [transrev4+1], 90h
mov byte ptr [transrev5+1], 37h
mov byte ptr [transrev6+1], 90h
mov word ptr [transrev7+0], 0f38ah
mov byte ptr [transrev8+1], 90h
mov word ptr [transrev9+0], 0f78ah
mov byte ptr [transrev10+1], 0a7h
mov byte ptr [transrev11+1], 81h
mov byte ptr [transrev12+2], 9fh
mov word ptr [transrev13+0], 0dc88h
mov byte ptr [transrev14+1], 81h
mov byte ptr [transrev15+1], 9ah
mov byte ptr [transrev16+1], 0a7h
mov byte ptr [transrev17+1], 82h
ret
ALIGN 16
PUBLIC settransreverse_
settransreverse_:
mov byte ptr [transrev0+1], 0a3h
mov byte ptr [transrev1+1], 7h
mov byte ptr [transrev2+1], 1fh
mov byte ptr [transrev3+1], 0b8h
mov byte ptr [transrev4+1], 0b0h
mov byte ptr [transrev5+1], 17h
mov byte ptr [transrev6+1], 0b0h
mov word ptr [transrev7+0], 0d38ah
mov byte ptr [transrev8+1], 0b0h
mov word ptr [transrev9+0], 0d78ah
mov byte ptr [transrev10+1], 87h
mov byte ptr [transrev11+1], 0a1h
mov byte ptr [transrev12+2], 87h
mov word ptr [transrev13+0], 0e388h
mov byte ptr [transrev14+1], 0a1h
mov byte ptr [transrev15+1], 0bah
mov byte ptr [transrev16+1], 87h
mov byte ptr [transrev17+1], 0a2h
ret
ALIGN 16
PUBLIC tvlineasm1_ ;Masked & transluscent vline
tvlineasm1_:
push ebp
mov ebp, eax
xor eax, eax
inc ecx
mov dword ptr [transmach3c+2], ebx
jmp short begintvline
ALIGN 16
begintvline:
mov ebx, edx
transmach3a: shr ebx, 32
mov bl, byte ptr [esi+ebx]
cmp bl, 255
je short skiptrans1
transrev0:
transmach3c: mov al, [ebx+88888888h]
transrev1:
mov ah, byte ptr [edi]
transmach4: mov al, byte ptr [eax+88888888h] ;_transluc[eax]
mov byte ptr [edi], al
skiptrans1:
add edx, ebp
fixchain1t: add edi, 320
dec ecx
jnz short begintvline
pop ebp
mov eax, edx
ret
;eax: -------temp1-------
;ebx: -------temp2-------
;ecx: dat dat dat dat
;edx: ylo2 ylo4
;esi: yhi1 yhi2
;edi: ---videoplc/cnt----
;ebp: yhi3 yhi4
;esp:
ALIGN 16
PUBLIC vlineasm4_
vlineasm4_:
push ebp
mov eax, dword ptr _ylookup[ecx*4]
add eax, edi
mov dword ptr [machvline4end+2], eax
sub edi, eax
mov eax, dword ptr _bufplce[0]
mov ebx, dword ptr _bufplce[4]
mov ecx, dword ptr _bufplce[8]
mov edx, dword ptr _bufplce[12]
mov dword ptr [machvbuf1+2], ecx
mov dword ptr [machvbuf2+2], edx
mov dword ptr [machvbuf3+2], eax
mov dword ptr [machvbuf4+2], ebx
mov eax, dword ptr _palookupoffse[0]
mov ebx, dword ptr _palookupoffse[4]
mov ecx, dword ptr _palookupoffse[8]
mov edx, dword ptr _palookupoffse[12]
mov dword ptr [machvpal1+2], ecx
mov dword ptr [machvpal2+2], edx
mov dword ptr [machvpal3+2], eax
mov dword ptr [machvpal4+2], ebx
; 谀哪哪哪哪哪哪哪履哪哪哪哪哪哪哪
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -