⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 a.asm

📁 小型游戏引擎
💻 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 + -