📄 newgfx.asm
字号:
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%endmacroNEWSYM BuildWindow2 jmp BuildWindow.ns2NEWSYM BuildWindow cmp byte[WindowRedraw],1 je .ns2 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,[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 [WinPtrAPos],esi mov ch,[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 [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 [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 retSECTION .dataNEWSYM firstdrawn, db 0NEWSYM bgusedng dd 01010101h,00010101h,00000101h,00000101h,00000101h,00000101h dd 00000001h,00000001hSECTION .bssNEWSYM bgcmsung, resd 1NEWSYM modeused, resd 2NEWSYM reslbyl, resd 1NEWSYM sprprdrn, resd 1NEWSYM csprival, resd 1NEWSYM pesimpng2, resd 1NEWSYM cfieldad, resd 1NEWSYM ignor512, resd 1NEWSYM ofsmcptr, resd 1NEWSYM ofsmtptr, resd 1NEWSYM ofsmmptr, resd 1NEWSYM ofsmcyps, resd 1NEWSYM ofsmady, resd 1NEWSYM ofsmadx, resd 1NEWSYM mosoldtab, resd 15SECTION .dataALIGN32NEWSYM ngwintable, times 16 dd 0EE00hNEWSYM ngwintableb, times 16 dd 0EE00hNEWSYM ngwintablec, times 16 dd 0EE00hNEWSYM ngwintabled, times 16 dd 0EE00hNEWSYM valtemp, dd 0EE00h, 0EE00hNEWSYM ngcwinptr, dd ngwintableSECTION .bssNEWSYM ngwinen, resd 1NEWSYM ngcwinmode, resd 1NEWSYM ngcpixleft, resd 1NEWSYM Mode7BackA, resd 1NEWSYM Mode7BackC, resd 1NEWSYM Mode7BackX0, resd 1NEWSYM Mode7BackSet, resd 1NEWSYM ngextbg, resd 1NEWSYM cbgval, resd 1NEWSYM ofsmval, resd 1NEWSYM ofsmvalh, resd 1SECTION .dataNEWSYM pwinen, dd 0FFFFhNEWSYM pngwinen, dd 0FFFFhSECTION .bssNEWSYM pwinbound, resd 1NEWSYM WinPtrAPos, resd 1NEWSYM WinPtrBPos, resd 1SECTION .dataNEWSYM OrLogicTable, db 0,1,1,0NEWSYM AndLogicTable, db 0,0,1,0NEWSYM XorLogicTable, db 0,1,0,0NEWSYM XNorLogicTable, db 1,0,1,0SECTION .bssNEWSYM nglogicval, resd 1NEWSYM pnglogicval, resd 1NEWSYM mosjmptab, resd 15NEWSYM Mode7HiRes, resd 1NEWSYM pesimpng, resd 1NEWSYM bgtxadd2, resd 1SECTION .textNEWSYM 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 + -