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

📄 newgfx.asm

📁 linux下的任天堂模拟器代码。供大家参考。
💻 ASM
📖 第 1 页 / 共 4 页
字号:
    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 + -