📄 newgfx.asm
字号:
add esi,4
jmp %%finwin
%%outside
; Process Outside window
cmp edx,ebx
jb %%completeclip
or ebx,ebx
jz %%skipclip
inc ebx
mov dword[esi],0
mov [esi+4],ebx
add esi,8
%%skipclip
sub edx,ebx
add edx,2
mov [esi],edx
mov dword[esi+4],0EE00h
add esi,8
jmp %%finwin
%%completeclip
mov dword[esi],0
mov dword[esi+4],0EE00h
add esi,8
%%finwin
%endmacro
NEWSYM BuildWindow2
jmp BuildWindow.ns2
NEWSYM BuildWindow
cmp byte[WindowRedraw],1
je .ns2
cmp byte[WindowDisables],0
je .nodisable
ret
.nodisable
mov dword[valtemp],0EE00h
push edx
push ecx
mov edx,[winlogicaval+eax*2]
shl edx,16
mov dl,[winbg1enval+ebx]
cmp edx,[pwinen]
jne .notsimilar
mov edx,[winboundary+eax*4]
cmp edx,[pwinbound]
jne .notsimilarb
mov ecx,ngwintable
.loopc
mov edx,[ecx+64]
mov [ecx],edx
add ecx,4
cmp edx,0D000h
ja .finloopc
cmp ecx,ngwintable+64
jne .loopc
.finloopc
mov edx,[pngwinen]
mov [ngwinen],edx
pop ecx
pop edx
ret
.ns2
mov byte[WindowRedraw],0
push edx
push ecx
jmp .ns
.notsimilar
mov [pwinen],edx
mov edx,[winboundary+eax*4]
.notsimilarb
mov [pwinbound],edx
.ns
push esi
mov cl,byte[winbg1enval+ebx]
xor edx,edx
mov ch,cl
and cl,0Ah
mov esi,ngwintable
cmp cl,0Ah
je near .dualwin
xor ebx,ebx
cmp cl,2
jne .winb
mov bl,[winboundary+eax*4]
mov dl,[winboundary+eax*4+1]
jmp .wina
.winb
mov bl,[winboundary+eax*4+2]
mov dl,[winboundary+eax*4+3]
shr ch,2
.wina
test ch,1
jnz .outside
inc ebx
cmp edx,ebx
jb .noclip
; Process Inside window
mov [esi],ebx
mov [esi+64],ebx
sub edx,ebx
add edx,2
mov [esi+4],edx
mov dword[esi+8],0EE00h
mov [esi+4+64],edx
mov dword[esi+8+64],0EE00h
mov dword[ngwinen],1
.noclip
pop esi
mov edx,[ngwinen]
mov [pngwinen],edx
pop ecx
pop edx
ret
.outside
; Process Outside window
cmp edx,ebx
jb .completeclip
or ebx,ebx
jz .skipclip
inc ebx
mov dword[esi],0
mov [esi+4],ebx
mov dword[esi+64],0
mov [esi+4+64],ebx
add esi,8
.skipclip
sub edx,ebx
add edx,2
mov [esi],edx
mov [esi+64],edx
mov dword[esi+4],0EE00h
mov dword[esi+4+64],0EE00h
mov dword[ngwinen],1
pop esi
mov edx,[ngwinen]
mov [pngwinen],edx
pop ecx
pop edx
ret
.completeclip
mov dword[esi],0
mov dword[esi+4],0EE00h
mov dword[esi+64],0
mov dword[esi+4+64],0EE00h
mov dword[ngwinen],1
pop esi
mov edx,[ngwinen]
mov [pngwinen],edx
pop ecx
pop edx
ret
.dualwin
push ebx
xor ebx,ebx
mov dl,[winboundary+eax*4+1]
mov bl,[winboundary+eax*4]
Process1DualWindow
pop ebx
mov dword[WinPtrAPos],esi
mov ch,byte[winbg1enval+ebx]
xor ebx,ebx
xor edx,edx
mov bl,[winboundary+eax*4+2]
mov dl,[winboundary+eax*4+3]
shr ch,2
Process1DualWindow
mov dword[WinPtrBPos],esi
; Convert displacement table to cumulative table
mov esi,ngwintable
xor ebx,ebx
.loopapos
add ebx,[esi]
mov [esi],ebx
add esi,4
cmp esi,[WinPtrAPos]
jne .loopapos
xor ebx,ebx
.loopbpos
add ebx,[esi]
mov [esi],ebx
add esi,4
cmp esi,[WinPtrBPos]
jne .loopbpos
; Combine both lists
push edi
mov ecx,0101h
mov edx,ngwintablec
mov esi,ngwintable
mov edi,[WinPtrAPos]
mov dword[edx],0
mov dword[edx+64],0
cmp dword[esi],0
jne .notzeroa
add esi,4
inc dword[edx+64]
neg cl
.notzeroa
cmp dword[edi],0
jne .notzerob
add edi,4
inc dword[edx+64]
neg ch
.notzerob
add edx,4
.loop
mov ebx,[esi]
cmp ebx,0EE00h
jae .edi
.noedi
cmp ebx,[edi]
je .equal
jb .esi
.edi
mov ebx,[edi]
cmp ebx,0EE00h
jae .esib
mov [edx],ebx
mov [edx+64],ch
add edx,4
add edi,4
neg ch
jmp .loop
.esib
mov ebx,[esi]
cmp ebx,0EE00h
jae .fin
.esi
mov [edx],ebx
mov [edx+64],cl
add edx,4
add esi,4
neg cl
jmp .loop
.equal
mov [edx],ebx
mov [edx+64],cl
add [edx+64],ch
neg cl
neg ch
add edx,4
add esi,4
add edi,4
cmp ebx,0EE00h
jb .loop
jmp .finb
.fin
mov dword[edx],0EE00h
add edx,4
.finb
mov dword[WinPtrAPos],edx
; jmp .c
; Convert list to proper on/off format
mov edi,[nglogicval]
and edi,3
shl edi,2
add edi,OrLogicTable
mov edx,ngwintablec
xor ecx,ecx
.loopp
add cl,[edx+64]
mov bl,[edi+ecx]
mov [edx+64],bl
add edx,4
cmp edx,[WinPtrAPos]
jne .loopp
; Shorten & Convert back to displacement format
mov edx,ngwintablec
mov esi,ngwintable
mov cl,1
xor ebx,ebx
.loops
cmp byte[edx+64],cl
jne .noadd
mov edi,[edx]
sub edi,ebx
add ebx,edi
mov [esi],edi
mov [esi+64],edi
add esi,4
xor cl,1
.noadd
add edx,4
cmp edx,[WinPtrAPos]
jne .loops
mov dword[esi],0EE00h
mov dword[esi+64],0EE00h
.c
pop edi
pop esi
mov dword[ngwinen],1
mov dword[pngwinen],1
pop ecx
pop edx
ret
NEWSYM firstdrawn, db 0
ALIGN32
NEWSYM bgusedng
dd 01010101h,00010101h,00000101h,00000101h,00000101h,00000101h
dd 00000001h,00000001h
NEWSYM bgcmsung, dd 0
NEWSYM modeused, dd 0,0
NEWSYM reslbyl, dd 0
NEWSYM sprprdrn, dd 0
NEWSYM csprival, dd 0
NEWSYM pesimpng2, dd 0
NEWSYM cfieldad, dd 0
NEWSYM ignor512, dd 0
NEWSYM ofsmcptr, dd 0
NEWSYM ofsmtptr, dd 0
NEWSYM ofsmmptr, dd 0
NEWSYM ofsmcyps, dd 0
NEWSYM ofsmady, dd 0
NEWSYM ofsmadx, dd 0
NEWSYM mosoldtab, times 15 dd 0
NEWSYM ngwintable, times 16 dd 0EE00h
NEWSYM ngwintableb, times 16 dd 0EE00h
NEWSYM ngwintablec, times 16 dd 0EE00h
NEWSYM ngwintabled, times 16 dd 0EE00h
NEWSYM valtemp, dd 0EE00h, 0EE00h
NEWSYM ngwinen, dd 0
NEWSYM ngcwinptr, dd ngwintable
NEWSYM ngcwinmode, dd 0
NEWSYM ngcpixleft, dd 0
NEWSYM Mode7BackA, dd 0
NEWSYM Mode7BackC, dd 0
NEWSYM Mode7BackX0, dd 0
NEWSYM Mode7BackSet, dd 0
NEWSYM ngextbg, dd 0
NEWSYM cbgval, dd 0
NEWSYM ofsmval, dd 0
NEWSYM ofsmvalh, dd 0
NEWSYM pwinen, dd 0FFFFh
NEWSYM pngwinen, dd 0FFFFh
NEWSYM pwinbound, dd 0
NEWSYM WinPtrAPos, dd 0
NEWSYM WinPtrBPos, dd 0
NEWSYM OrLogicTable, db 0,1,1,0
NEWSYM AndLogicTable, db 0,0,1,0
NEWSYM XorLogicTable, db 0,1,0,0
NEWSYM XNorLogicTable, db 1,0,1,0
NEWSYM nglogicval, dd 0
NEWSYM pnglogicval, dd 0
NEWSYM mosjmptab, times 15 dd 0
NEWSYM Mode7HiRes, dd 0
NEWSYM pesimpng, dd 0
NEWSYM bgtxadd2, dd 0
NEWSYM StartDrawNewGfx
mov byte[WindowRedraw],1
mov dword[ignor512],1
mov dword[cfieldad],0
cmp byte[res480],1
jne .scan2
cmp byte[scanlines],0
jne .scan2
mov al,[cfield]
mov [cfieldad],al
.scan2
mov ax,[resolutn]
sub ax,8
mov [reslbyl],ax
cmp byte[cbitmode],1
je near StartDrawNewGfx16b
push edx
push esi
push edi
push ebp
; Clear video memory
mov edi,[vidbuffer]
xor eax,eax
add edi,16
mov dl,[resolutn]
.loopa
mov ecx,64
rep stosd
add edi,32
dec dl
jnz .loopa
cmp dword[scfbl],0
jne near .dontdraw
; Sprite Layering :
; Mode 0/1 - BG4/BG3pr0 * BG4/BG3pr1 * BG2/BG1pr0 * BG2/BG1pr0 * BG3pr1
; Mode 2-6 - BG2pr0 * BG1pr0 * BG2pr1 * BG1pr1 *
; Mode 7 - * BG1pr0 * BG1pr1 * *
; Copy data to sprite table
mov ecx,256
mov eax,[spritetablea]
mov ebx,sprlefttot
mov edi,sprtbng
.loop
mov [edi],eax
add eax,512
inc ebx
add edi,4
dec ecx
jnz .loop
xor eax,eax
mov edi,sprtlng
mov ecx,64
rep stosd
mov byte[firstdrawn],1
mov dword[bg1totng],0
mov dword[bg2totng],0
mov dword[bg3totng],0
mov dword[bg4totng],0
mov dword[bg1drwng],0
mov dword[bg2drwng],0
mov dword[bg3drwng],0
mov dword[bg4drwng],0
; Draw SubScreens
test byte[scrndis],8h
jnz near .nodobg4s
test dword[bgcmsung],800h
jz near .nodobg4s
mov dword[mode0ads],60606060h
Procbgpr0 3, drawbg4line, drawbg4tile, 800h, 8h
.nodobg4s
test byte[scrndis],4h
jnz near .nodobg3s
test dword[bgcmsung],400h
jz near .nodobg3s
mov dword[mode0ads],40404040h
Procbg3pr0 2, drawbg3line, drawbg3tile, 400h, 4h
.nodobg3s
; draw sprites mode 0-1
test byte[scrndis],10h
jnz near .nosprpra
test dword[modeused],00000101h
jz near .nosprpra
test dword[bgcmsung],1000h
jz near .nosprpra
Procsprng01 1000h, 10h
.nosprpra
test byte[scrndis],8h
jnz near .nodobg4sb
test dword[bgcmsung],800h
jz near .nodobg4sb
mov eax,[bg4totng]
cmp eax,[bg4drwng]
je near .nodobg4sb
mov dword[mode0ads],60606060h
Procbgpr1 3, drawbg4linepr1, drawbg4tilepr1, prdata, 800h, 8h
.nodobg4sb
test byte[scrndis],4h
jnz near .nodobg3sb
test dword[bgcmsung],400h
jz near .nodobg3sb
mov eax,[bg3totng]
cmp eax,[bg3drwng]
je near .nodobg3sb
mov dword[mode0ads],40404040h
Procbg3pr1 2, drawbg3linepr1, drawbg3tilepr1, prdatc, 400h, 4h
.nodobg3sb
; draw sprites mode 0-1
test byte[scrndis],10h
jnz near .nosprprb
test dword[modeused],00000101h
jz near .nosprprb
test dword[bgcmsung],1000h
jz near .nosprprb
Procsprng01 1000h, 10h
.nosprprb
test byte[scrndis],2h
jnz near .nodobg2s
test dword[bgcmsung],200h
jz near .nodobg2s
mov dword[mode0ads],20202020h
Procbgpr0 1, drawbg2line, drawbg2tile, 200h, 2h
.nodobg2s
; draw mode 7 extbg pr 0
cmp byte[ngextbg],0
je near .noextbgsc
test dword[bgcmsung],300h
jz near .noextbgsc
ProcMode7ngextbg 300h, 3h
.noextbgsc
; draw sprites mode 2-7
test byte[scrndis],10h
jnz near .nosprprc
test dword[modeused],01010000h
jnz near .yessprprc
test dword[modeused+4],01010101h
jz near .nosprprc
.yessprprc
test dword[bgcmsung],1000h
jz near .nosprprc
Procsprng234567 1000h, 10h
.nosprprc
test byte[scrndis],1h
jnz near .nodobg1s
test dword[bgcmsung],100h
jz near .nodobg1s
mov dword[mode0ads],00000000h
Procbgpr0 0, drawbg1line, drawbg1tile, 100h, 1h
.nodobg1s
; draw mode 7, priority 0
cmp byte[modeused+7],0
je near .nomode7
test dword[bgcmsung],300h
jz near .nomode7
ProcMode7ng 100h, 1h
.nomode7
; draw sprites mode 0-7
test byte[scrndis],10h
jnz near .nosprprd
test dword[bgcmsung],1000h
jz near .nosprprd
Procsprng 1000h, 10h
.nosprprd
test byte[scrndis],2h
jnz near .nodobg2sb
test dword[bgcmsung],200h
jz near .nodobg2sb
mov eax,[bg2totng]
cmp eax,[bg2drwng]
je near .nodobg2sb
mov dword[mode0ads],20202020h
Procbgpr1 1, drawbg2linepr1, drawbg2tilepr1, prdata, 200h, 2h
.nodobg2sb
; draw mode 7 extbg pr 1
cmp byte[ngextbg],0
je near .noextbgscb
test dword[bgcmsung],300h
jz near .noextbgscb
ProcMode7ngextbg2 200h, 2h
.noextbgscb
; draw sprites mode 2-7
test byte[scrndis],10h
jnz near .nosprpre
test dword[modeused],01010000h
jnz near .yessprpre
test dword[modeused+4],01010101h
jz near .nosprpre
.yessprpre
test dword[bgcmsung],1000h
jz near .nosprpre
Procsprng234567 1000h, 10h
.nosprpre
test byte[scrndis],1h
jnz near .nodobg1sb
test dword[bgcmsung],100h
jz near .nodobg1sb
mov eax,[bg1totng]
cmp eax,[bg1drwng]
je near .nodobg1sb
mov dword[mode0ads],00000000h
Procbgpr1 0, drawbg1linepr1, drawbg1tilepr1, prdatb, 100h, 1h
.nodobg1sb
; draw sprites mode 0-7
test byte[scrndis],10h
jnz near .nosprprf
test dword[bgcmsung],1000h
jz near .nosprprf
Procsprng 1000h, 10h
.nosprprf
test byte[scrndis],4h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -