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

📄 mode716.asm

📁 linux下的任天堂模拟器代码。供大家参考。
💻 ASM
字号:
;Copyright (C) 1997-2007 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach );;http://www.zsnes.com;http://sourceforge.net/projects/zsnes;https://zsnes.bountysource.com;;This program is free software; you can redistribute it and/or;modify it under the terms of the GNU General Public License;version 2 as published by the Free Software Foundation.;;This program is distributed in the hope that it will be useful,;but WITHOUT ANY WARRANTY; without even the implied warranty of;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the;GNU General Public License for more details.;;You should have received a copy of the GNU General Public License;along with this program; if not, write to the Free Software;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.%include "macros.mac"EXTSYM mode7tab,winptrref,nglogicval,winlogicaval,curmosaicsz,curvidoffsetEXTSYM cwinptr,mode7A,mode7B,mode7C,mode7D,mode7X0,mode7Y0,mode7set,vram,vramaEXTSYM xtravbuf,ngwleft,ngwleftb,mode7xpos,mode7ypos,mode7xrpos,mode7yrposEXTSYM mode7xadder,mode7yadder,mode7hr,dcolortab,UnusedBitXor,UnusedBit,scrndisEXTSYM vidbright,prevbrightdc,Gendcolortable,mode7ab,mode7cd,BGMA,BG1SXl,BG1SYl%include "video/mode716.mac";*******************************************************; Processes & Draws Mode 7;*******************************************************%macro Mode7Normal 0    or dl,dl    jz %%nodrawb    mov dx,[ebp+edx*2]    mov [esi],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7Normalnt 0    or dl,dl    jz %%nodrawb    mov dx,[ebp+edx*2]    mov [esi],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7Normalt 0    or dl,dl    jz %%nodrawb    mov dx,[ebp+edx*2+512]    mov [esi],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7Normalmsnt 0    or dl,dl    jz %%nodrawb    mov dx,[ebp+edx*2]    mov [esi],dx    mov [esi+75036*2],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7Normalmst 0    or dl,dl    jz %%nodrawb    mov dx,[ebp+edx*2+512]    mov [esi],dx    and dx,[UnusedBitXor]    mov [esi+75036*2],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7Normalsnt 0    or dl,dl    jz %%nodrawb    mov dx,[ebp+edx*2]    mov [esi+75036*2],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7Normalst 0    or dl,dl    jz %%nodrawb    mov dx,[ebp+edx*2]    mov [esi+75036*2],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7Direct 0    or dl,dl    jz %%nodrawb    mov dx,[dcolortab+edx*4]    mov [esi],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7Directnt 0    or dl,dl    jz %%nodrawb    mov dx,[dcolortab+edx*4]    mov [esi],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7Directt 0    or dl,dl    jz %%nodrawb    mov dx,[dcolortab+edx*4]    or dx,[UnusedBit]    mov [esi],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7Directmsnt 0    or dl,dl    jz %%nodrawb    mov dx,[dcolortab+edx*4]    mov [esi],dx    mov [esi+75036*2],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7Directmst 0    or dl,dl    jz %%nodrawb    mov dx,[dcolortab+edx*4]    mov [esi+75036*2],dx    or dx,[UnusedBit]    mov [esi],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7Directsnt 0    or dl,dl    jz %%nodrawb    mov dx,[dcolortab+edx*4]    mov [esi+75036*2],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7Directst 0    or dl,dl    jz %%nodrawb    mov dx,[dcolortab+edx*4]    mov [esi+75036*2],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7ExtBG 0    mov [esi+75036*8],dl    or dl,dl    jz %%nodrawb    test dl,80h    jnz %%nodrawb    mov dx,[ebp+edx*2]    mov [esi],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7ExtBGnt 0    mov [esi+75036*8],dl    or dl,dl    jz %%nodrawb    test dl,80h    jnz %%nodrawb    mov dx,[ebp+edx*2]    mov [esi],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7ExtBGt 0    mov [esi+75036*8],dl    or dl,dl    jz %%nodrawb    test dl,80h    jnz %%nodrawb    mov dx,[ebp+edx*2+512]    mov [esi],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7ExtBGmsnt 0    mov [esi+75036*8],dl    or dl,dl    jz %%nodrawb    test dl,80h    jnz %%nodrawb    mov dx,[ebp+edx*2]    mov [esi],dx    mov [esi+75036*2],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7ExtBGmst 0    mov [esi+75036*8],dl    or dl,dl    jz %%nodrawb    test dl,80h    jnz %%nodrawb    mov dx,[ebp+edx*2+512]    mov [esi+75036*2],dx    or dx,[UnusedBit]    mov [esi],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7ExtBGsnt 0    mov [esi+75036*8],dl    or dl,dl    jz %%nodrawb    test dl,80h    jnz %%nodrawb    mov dx,[ebp+edx*2]    mov [esi+75036*2],dx    xor edx,edx%%nodrawb    add esi,2%endmacro%macro Mode7ExtBGst 0    mov [esi+75036*8],dl    or dl,dl    jz %%nodrawb    test dl,80h    jnz %%nodrawb    mov dx,[ebp+edx*2]    mov [esi+75036*2],dx    xor edx,edx%%nodrawb    add esi,2%endmacroSECTION .textNEWSYM drawmode7win16b    test byte[scrndis],1    jz .notdisabled    ret.notdisabled    CheckTransparency 01h,drawmode7win16btnormal    Mode7NonMainSub Mode7Normaldrawmode7win16bt    test byte[scadtng+ebx],1h    jz near drawmode7win16bnt    test byte[BGMS1+ebx*2+1],1h    jnz near drawmode716bmst    Mode7NonMainSub Mode7Normaltdrawmode716bmst:    mov edi,[CMainWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bmt    mov edi,[CSubWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bstdrawmode7w16bmst    Mode7NonMainSub Mode7Normalmstdrawmode7w16bmt    mov edi,[CSubWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bmst    Mode7MainSub Mode7Normalmst,Mode7Normalstdrawmode7w16bst    Mode7MainSub Mode7Normalmst,Mode7Normaltdrawmode7win16bnt:    test byte[BGMS1+ebx*2+1],1h    jnz near drawsprngm716bmsnt    Mode7NonMainSub Mode7Normalntdrawsprngm716bmsnt:    cmp dword[ngwinen],0    je drawmode7w16bmsnt    mov edi,[CMainWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bmnt    mov edi,[CSubWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bsntdrawmode7w16bmsnt    Mode7NonMainSub Mode7Normalmsntdrawmode7w16bmnt    mov edi,[CSubWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bmsnt    Mode7MainSub Mode7Normalmsnt,Mode7Normalsntdrawmode7w16bsnt    Mode7MainSub Mode7Normalmsnt,Mode7NormalntNEWSYM drawmode7win16bd    test byte[scrndis],1    jz .notdisabled    ret.notdisabled    mov bl,[vidbright]    cmp bl,[prevbrightdc]    je .nodcchange    mov [prevbrightdc],bl    call Gendcolortable.nodcchange    CheckTransparency 01h,drawmode7win16btd    Mode7NonMainSub Mode7Directdrawmode7win16btd    test byte[scadtng+ebx],1h    jz near drawmode7win16bntd    test byte[BGMS1+ebx*2+1],1h    jnz near drawmode716bmstd    Mode7NonMainSub Mode7Directtdrawmode716bmstd:    mov edi,[CMainWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bmtd    mov edi,[CSubWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bstddrawmode7w16bmstd    Mode7NonMainSub Mode7Directmstdrawmode7w16bmtd    mov edi,[CSubWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bmstd    Mode7MainSub Mode7Directmst,Mode7Directstdrawmode7w16bstd    Mode7MainSub Mode7Directmst,Mode7Directtdrawmode7win16bntd:    test byte[BGMS1+ebx*2+1],1h    jnz near drawsprngm716bmsntd    Mode7NonMainSub Mode7Directntdrawsprngm716bmsntd:    cmp dword[ngwinen],0    je drawmode7w16bmsntd    mov edi,[CMainWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bmntd    mov edi,[CSubWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bsntddrawmode7w16bmsntd    Mode7NonMainSub Mode7Directmsntdrawmode7w16bmntd    mov edi,[CSubWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bmsntd    Mode7MainSub Mode7Directmsnt,Mode7Directsntdrawmode7w16bsntd    Mode7MainSub Mode7Directmsnt,Mode7DirectntNEWSYM drawmode7ngextbg16b    test byte[scrndis],1    jz .notdisabled    ret.notdisabled    mov byte[curmosaicsz],1    push ecx    mov esi,[curvidoffset]       ; esi = [vidbuffer] + curypos * 288 + 16    mov ecx,256.loop    mov byte[esi+75036*8],0    add esi,2    dec ecx    jnz .loop    pop ecx    cmp byte[mode7hr+ebx],1;    je near drawmode7winextbghr16e    CheckTransparency 02h,drawmode7win16bte    mov esi,[cwinptr]    mov [winptrref],esi    mov esi,[curvidoffset]    Mode7NonMainSube Mode7ExtBGdrawmode7win16bte    test byte[scadtng+ebx],1h    jz near drawmode7win16bnte    test byte[BGMS1+ebx*2+1],1h    jnz near drawmode716bmste    Mode7NonMainSube Mode7ExtBGtdrawmode716bmste:    mov edi,[CMainWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bmte    mov edi,[CSubWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bstedrawmode7w16bmste    Mode7NonMainSube Mode7ExtBGmstdrawmode7w16bmte    mov edi,[CSubWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bmste    Mode7MainSube Mode7ExtBGmst,Mode7ExtBGstdrawmode7w16bste    Mode7MainSube Mode7ExtBGmst,Mode7ExtBGtdrawmode7win16bnte:    test byte[BGMS1+ebx*2+1],1h    jnz near drawsprngm716bmsnte    Mode7NonMainSube Mode7ExtBGntdrawsprngm716bmsnte:    cmp dword[ngwinen],0    je drawmode7w16bmsnte    mov edi,[CMainWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bmnte    mov edi,[CSubWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bsntedrawmode7w16bmsnte    Mode7NonMainSube Mode7ExtBGmsntdrawmode7w16bmnte    mov edi,[CSubWinScr]    cmp byte[edi+ebx],0    jne near drawmode7w16bmsnte    Mode7MainSube Mode7ExtBGmsnt,Mode7ExtBGsntdrawmode7w16bsnte    Mode7MainSube Mode7ExtBGmsnt,Mode7ExtBGnt%macro ExtBG2 1    mov esi,[curvidoffset]       ; esi = [vidbuffer] + curypos * 288 + 16    mov ecx,256    xor eax,eax.loop    mov al,[esi+75036*8]    test al,80h    jz .nopr2    and al,7Fh    %1.nopr2    add esi,2    dec ecx    jnz .loop    xor eax,eax    ret%endmacro%macro ExtBGNormal 0    mov dx,[ebp+eax*2]    mov [esi],dx%endmacro%macro ExtBGNormalt 0    mov dx,[ebp+eax*2+512]    mov [esi],dx%endmacro%macro ExtBGNormalnt 0    mov dx,[ebp+eax*2]    mov [esi],dx%endmacro%macro ExtBGNormalst 0    mov dx,[ebp+eax*2]    mov [esi+75036*2],dx%endmacro%macro ExtBGNormalsnt 0    mov dx,[ebp+eax*2]    mov [esi+75036*2],dx%endmacro%macro ExtBGNormalmst 0    mov dx,[ebp+eax*2+512]    mov [esi],dx    and dx,[UnusedBitXor]    mov [esi+75036*2],dx%endmacro%macro ExtBGNormalmsnt 0    mov dx,[ebp+eax*2]    mov [esi],dx    mov [esi+75036*2],dx%endmacroNEWSYM drawmode7ngextbg216b    test byte[scrndis],1    jz .notdisabled    ret.notdisabled    cmp byte[mode7hr+ebx],1;    je near drawmode7winextbg2hr16b    ; esi = pointer to video buffer    CheckTransparency 01h,drawmode7ngextbg216bt    test byte[FillSubScr+ebx],1    jz .main    test byte[BGMS1+ebx*2],01h    jnz .main    add esi,75036*2.main    ExtBG2 ExtBGNormaldrawmode7ngextbg216bt:    test byte[scadtng+ebx],1h    jz near drawmode7ngextbg216bnt    test byte[BGMS1+ebx*2+1],1h    jnz near drawmode7ngextbg216bmst    ExtBG2 ExtBGNormaltdrawmode7ngextbg216bmst    test byte[BGMS1+ebx*2],1h    jz near drawmode7ngextbg216bst    ExtBG2 ExtBGNormalmstdrawmode7ngextbg216bst:    ExtBG2 ExtBGNormalstdrawmode7ngextbg216bnt:    test byte[BGMS1+ebx*2+1],1h    jnz near drawmode7ngextbg216bmsnt    ExtBG2 ExtBGNormalntdrawmode7ngextbg216bmsnt    test byte[BGMS1+ebx*2],1h    jz near drawmode7ngextbg216bsnt    ExtBG2 ExtBGNormalmsntdrawmode7ngextbg216bsnt:    ExtBG2 ExtBGNormalsntALIGN32SECTION .bssmtemp        resd 1       ; for byte move leftmmode7xpos   resd 1       ; x positionmtempa2      resd 1       ; keep this blank!mmode7xrpos  resd 1       ; x positionmtempa       resd 1       ; keep this blank!mmode7ypos   resd 1       ; y positionmtempb2      resd 1       ; keep this blank!mmode7yrpos  resd 1       ; y positionmtempb       resd 1       ; keep this blank!mmode7xadder resd 1       ; number to add for xmtempc2      resd 1       ; keep this blank!mmode7xadd2  resd 1       ; number to add for xmtempc       resd 1       ; keep this blank!mmode7yadder resd 1       ; number to add for ymtempd2      resd 1       ; keep this blank!mmode7yadd2  resd 1       ; number to add for ymtempd       resd 1       ; keep this blank!mmode7ptr    resd 1       ; pointer valuemmode7xinc   resd 1       ; number to add for xmmode7xincc  resd 1       ; range check for xmmode7yinc   resd 1       ; number to add for ymmode7xsloc  resd 1       ; which screen xmmode7ysloc  resd 1       ; which screen ymmode7xsrl   resd 1       ; which relative screen xmmode7ysrl   resd 1       ; which relative screen ymcxloc       resw 1       ; cx locationmcyloc       resw 1       ; cy locationM7HROn       resd 1       ; High Resolution Onswitchtorep3 resd 1m7xaddof resd 1m7xaddof2 resd 1m7yaddof resd 1m7yaddof2 resd 1pixelsleft resd 1mm7xaddof resd 1mm7xaddof2 resd 1mm7yaddof resd 1mm7yaddof2 resd 1SECTION .text%macro newvaluepred 2    mov dx,[%1+ebx*4+8]    cmp dx,word[%1+ebx*4]    je %%nodivide    cmp byte[BGMA+ebx+2],7    je %%mode7scaleb%%nodivide    movsx edx,word[%1+ebx*4+4]    movsx ecx,word[%1+ebx*4]    add ecx,edx    sar ecx,1    mov [%2],cx    jmp %%mode7scalend%%mode7scaleb    mov esi,ebx    movsx ebx,word[%1+esi*4+8]    movsx edx,word[%1+esi*4]    sub ebx,edx    movsx ecx,word[%1+esi*4+4]    sub ecx,edx    mov eax,ecx    imul ecx    idiv ebx    add ax,word[%1+esi*4]    mov ebx,esi    mov [%2],ax%%mode7scalend%endmacroCalculateNewValues:    ; predict new values    push eax    push edx    push ebx    push esi    newvaluepred mode7ab,mode7A    newvaluepred mode7ab+2,mode7B    newvaluepred mode7cd,mode7C    newvaluepred mode7cd+2,mode7D    pop esi    pop ebx    pop edx    pop eax    mov ecx,edx    xor edx,edx    mov dx,[BG1SXl+ebx*2+2]    add edx,ecx    shr edx,1    mov ecx,eax    mov eax,ebx    inc eax    test byte[mode7set],02h    jz .noflip    mov eax,255    sub eax,ebx.noflip    mov [m7starty],ax    mov ax,[BG1SYl+ebx*2+2]    add eax,ecx    retNEWSYM processmode7hires16b    cmp byte[BGMA+ebx+1],7    jne near .nogo    push esi    push ebx    call CalculateNewValues    add esi,75036*4    mov [curvidoffset],esi    mov dword[M7HROn],1    call drawmode7win16b    mov dword[M7HROn],0    pop ebx    pop esi.nogo    retNEWSYM processmode7hires16bd    cmp byte[BGMA+ebx+1],7    jne near .nogo    push esi    push ebx    call CalculateNewValues    add esi,75036*4    mov [curvidoffset],esi    mov dword[M7HROn],1    call drawmode7win16bd    mov dword[M7HROn],0    pop ebx    pop esi.nogo    ret

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -