mode716.mac

来自「linux下的任天堂模拟器代码。供大家参考。」· MAC 代码 · 共 1,921 行 · 第 1/3 页

MAC
1,921
字号
;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.EXTSYM BGMS1,FillSubScr,CMainWinScr,CSubWinScr,scadtngEXTSYM ngwinen,winbg1enval,BuildWindow,ngwintable,ngcwinptr,domosaicng16bEXTSYM pesimpng;Skip transparency if the bg is just a sub-screen or there are no sub-screens;for that line:%macro CheckTransparency 2    cmp byte[curmosaicsz],1    jne %%nosubmain    test byte[BGMS1+ebx*2],%1    jz %%nosubmain    test byte[FillSubScr+ebx],1    jnz near %2%%nosubmain%endmacro%macro Mode7NoTranspPreStartUp 0    mov esi,[cwinptr]    mov [winptrref],esi    mov esi,[curvidoffset]    test byte[FillSubScr+ebx],1    jz %%main    test byte[BGMS1+ebx*2],01h    jnz %%main    add esi,75036*2%%main%endmacro%macro Mode7NoTranspPreStartUp2 0    mov esi,[cwinptr]    mov [winptrref],esi    mov esi,[curvidoffset]%endmacro%macro WinEnCheck 0    mov esi,[CMainWinScr]    test byte[FillSubScr+ebx],1    jz %%main2    test byte[BGMS1+ebx*2],01h    jnz %%main2    mov esi,[CSubWinScr]%%main2%endmacro%macro WinEnCheckMS 0    mov esi,winbg1enval%endmacroSECTION .dataNEWSYM m7starty, dw 0SECTION .text%macro CLIP 1    test word[%1],2000h    jz %%zero    or word[%1],~3ffh    jmp %%notzero%%zero    and word[%1],3ffh%%notzero%endmacro%macro Convert13Bit 0    and bx,0001111111111111b    ; 13 -> 16 bit signed value    test bx,0001000000000000b    jz %%noneg    or bx,1110000000000000b%%noneg%endmacro%macro Mode7Calculate16b 0    ; mode 7, ax = curyposition, dx = curxposition (left side)    ; draw center map coordinates at (X0-bg1scrolx,Y0-bg1scroly) on screen    ; center map coordinates = (X0,Y0)    ; 1.) cx=X0-bg1scrolx, cy =Y0-ax    cmp byte[M7HROn],1    je near .calculateb    mov bx,dx    Convert13Bit    mov [mcxloc],bx    mov bx,[mode7X0]    Convert13Bit    sub [mcxloc],bx    CLIP mcxloc    mov bx,ax    Convert13Bit    mov [mcyloc],bx    mov bx,[mode7Y0]    Convert13Bit    sub word[mcyloc],bx    CLIP mcyloc    ; 2.) Find position at scaled y, centered x at SCX=X0-(cy*C),SCY=Y0-(cy*D)    movsx eax,word[mode7B]    movsx ebx,word[mcyloc]    imul eax,ebx    and eax,~63    mov [mmode7xpos],eax    mov bx,[mode7X0]    Convert13Bit    add [mmode7xpos+1],bx    movsx eax,word[mode7B]    movzx ebx,word[m7starty]    imul eax,ebx    and eax,~63    add [mmode7xpos],eax    movsx ebx,word[mcyloc]    movsx eax,word[mode7D]    imul eax,ebx    and eax,~63    mov [mmode7ypos],eax    mov bx,[mode7Y0]    Convert13Bit    add [mmode7ypos+1],bx    movsx eax,word[mode7D]    movzx ebx,word[m7starty]    imul eax,ebx    and eax,~63    add [mmode7ypos],eax    ; 3.) Find left scaled location : SCX=SCX-(cx*A),SCY=SCY-(cx*B)    movsx ebx,word[mcxloc]    movsx eax,word[mode7A]    mov [mmode7xadder],eax    imul eax,ebx    and eax,~63    add [mmode7xpos],eax    movsx eax,word[mode7C]    movsx ebx,word[mcxloc]    neg eax    mov [mmode7yadder],eax    neg eax    imul eax,ebx    and eax,~63    add [mmode7ypos],eax    test byte[mode7set],1    jz .nohflip    mov eax,[mmode7xadder]    shl eax,8    add [mmode7xpos],eax    neg dword[mmode7xadder]    mov eax,[mmode7yadder]    shl eax,8    sub [mmode7ypos],eax    neg dword[mmode7yadder].nohflip    jmp .calculatea.calculateb    ; mode 7, ax = curyposition, dx = curxposition (left side)    ; draw center map coordinates at (X0-bg1scrolx,Y0-bg1scroly) on screen    ; center map coordinates = (X0,Y0)    ; 1.) cx=X0-bg1scrolx, cy =Y0-ax    mov bx,dx    Convert13Bit    mov [mcxloc],bx    mov bx,[mode7X0]    Convert13Bit    sub [mcxloc],bx    CLIP mcxloc    mov bx,ax    and bx,0011111111111111b    ; 13 -> 16 bit signed value    test bx,0010000000000000b    jz .nonegccb    or bx,1100000000000000b.nonegccb    mov [mcyloc],bx    mov bx,[mode7Y0]    Convert13Bit    add bx,bx    sub word[mcyloc],bx    test word[mcyloc],4000h    jz %%zero    or word[mcyloc],~7ffh    jmp %%notzero%%zero    and word[mcyloc],7ffh%%notzero    ; 2.) Find position at scaled y, centered x at SCX=X0-(cy*C),SCY=Y0-(cy*D)    movsx eax,word[mode7B]    movsx ebx,word[mcyloc]    imul eax,ebx    sar eax,1    and eax,~63    mov [mmode7xpos],eax    mov bx,[mode7X0]    Convert13Bit    add [mmode7xpos+1],bx    movsx eax,word[mode7B]    movzx ebx,word[m7starty]    imul eax,ebx    and eax,~63    add [mmode7xpos],eax    movsx ebx,word[mcyloc]    movsx eax,word[mode7D]    imul eax,ebx    sar eax,1    and eax,~63    mov [mmode7ypos],eax    mov bx,[mode7Y0]    Convert13Bit    add [mmode7ypos+1],bx    movsx eax,word[mode7D]    movzx ebx,word[m7starty]    imul eax,ebx    and eax,~63    add [mmode7ypos],eax    ; 3.) Find left scaled location : SCX=SCX-(cx*A),SCY=SCY-(cx*B)    movsx ebx,word[mcxloc]    movsx eax,word[mode7A]    mov [mmode7xadder],eax    imul eax,ebx    and eax,~63    ;neg eax    add [mmode7xpos],eax    movsx eax,word[mode7C]    movsx ebx,word[mcxloc]    neg eax    mov [mmode7yadder],eax    neg eax    imul eax,ebx    and eax,~63    add [mmode7ypos],eax    test byte[mode7set],1    jz .nohflipcb    mov eax,[mmode7xadder]    shl eax,8    add [mmode7xpos],eax    neg dword[mmode7xadder]    mov eax,[mmode7yadder]    shl eax,8    sub [mmode7ypos],eax    neg dword[mmode7yadder].nohflipcb.calculatea%endmacroSECTION .textMode7Startup16b:    Mode7Calculate16b    ; esi = pointer to video buffer    mov [pesimpng],esi    cmp byte[curmosaicsz],1    je .nomosaic    mov esi,xtravbuf+32    mov ecx,128.clearnext    mov dword[esi],0    add esi,4    dec ecx    jnz .clearnext    mov esi,xtravbuf+32.nomosaic    ; esi = pointer to video buffer    ; edi = pointer to vram    ; [.mode7xadder] = dword value to add to x value (decimal between 7 & 8bit)    ; [.mode7yadder] = dword value to add to y value (decimal between 7 & 8bit)    ; [.mode7xpos]   = dword value of x position, decimal between 7 & 8bit    ; [.mode7xpos+1] = word value of x position    ; [.mode7ypos]   = dword value of y position, decimal between 7 & 8bit    ; [.mode7ypos+1] = word value of y position    xor ebx,ebx    xor edx,edx    xor ecx,ecx    mov dword[mmode7xadd2],800h    mov byte[mmode7xinc],2    mov byte[mmode7xincc],0    test dword[mmode7xadder],80000000h    jz .noneg    mov dword[mmode7xadd2],-800h    mov byte[mmode7xinc],-2    mov byte[mmode7xincc],0FEh.noneg    mov dword[mmode7yadd2],800h    mov byte[mmode7yinc],1    test dword[mmode7yadder],80000000h    jz .noneg2    mov dword[mmode7yadd2],-800h    mov byte[mmode7yinc],-1.noneg2    ret%macro Mode7Startup 0    call Mode7Startup16b    cmp byte[ngwinen],1    je near .drawmode7win    mov edi,[vram]    cmp dword[mmode7xadder],7F0h    jg near .nextval3    cmp dword[mmode7xadder],-7F0h    jl near .nextval3    cmp dword[mmode7yadder],7F0h    jg near .nextval3    cmp dword[mmode7yadder],-7F0h    jl near .nextval3%endmacro%macro Mode7MidRoutines 0.drawmode7win.domosaicw    mov ebx,[mmode7xrpos]    mov [mode7xrpos],ebx    mov ebx,[mmode7yrpos]    mov [mode7yrpos],ebx    mov ebx,[mmode7xadder]    mov [mode7xadder],ebx    mov ebx,[mmode7yadder]    mov [mode7yadder],ebx    mov ebx,[mmode7xpos]    mov [mode7xpos],ebx    mov ebx,[mmode7ypos]    mov [mode7ypos],ebx%endmacroNEWSYM ProcessMode7ngwin16b    mov ecx,[ngcwinptr]    mov ecx,[ecx]    or ecx,ecx    jz near .winb    cmp ecx,[ngwleft]    jae .alldisplay    sub [ngwleft],ecx    mov [ngwleftb],ecx    xor ecx,ecx    mov eax,[mode7xrpos]    ret.alldisplay    mov ecx,[ngwleft]    mov [ngwleftb],ecx    mov dword[ngwleft],0    xor ecx,ecx    mov eax,[mode7xrpos]    ret.winbNEWSYM ProcessMode7ngwinB16b    add dword[ngcwinptr],4    mov ecx,[ngcwinptr]    mov ecx,[ecx]    cmp ecx,[ngwleft]    jae near .finishmode7;    mov ecx,[ngwleft];    mov dword[ngwleftb],ecx;    mov dword[ngwleft],0;    xor ecx,ecx;    mov eax,[mode7xrpos];    ret    sub [ngwleft],ecx    or ecx,ecx    jz .noclip    mov [pixelsleft],ecx.nextvalngw    test byte[mode7xrpos+1],0F8h    jnz near .rposoffx.nextposx    test byte[mode7yrpos+1],0F8h    jnz near .rposoffy.nextposy    mov eax,[mode7xadder]    add [mode7xrpos],eax    mov eax,[mode7yadder]    sub [mode7yrpos],eax    add esi,2    dec dword[pixelsleft]    jnz near .nextvalngw.noclip    add dword[ngcwinptr],4    jmp ProcessMode7ngwin16b.finishmode7    mov dword[ngwleft],0    mov dword[ngwleftb],0    ret.rposoffx    mov eax,[m7xaddof]    sub [mode7xrpos],eax    add bl,[m7xaddof2]    test byte[mode7xrpos+1],0F8h    jz .noaddstuff    add bl,[mmode7xinc]    mov eax,[mmode7xadd2]    sub [mode7xrpos],eax.noaddstuff    xor ecx,ecx    mov cl,[vrama+ebx]    shl ecx,7    lea edi,[ecx+vrama]    jmp .nextposx.rposoffy    mov eax,[m7yaddof]    add dword[mode7yrpos],eax    sub bh,[m7yaddof2]    test byte[mode7yrpos+1],0F8h    jz .noaddstuff2    sub bh,[mmode7yinc]    mov eax,[mmode7yadd2]    add dword[mode7yrpos],eax.noaddstuff2    and ebx,07FFFh    xor ecx,ecx    mov cl,[vrama+ebx]    shl ecx,7    lea edi,[ecx+vrama]    jmp .nextposyNEWSYM ProcessMode7ngwinC16b    mov ecx,[ngcwinptr]    mov ecx,[ecx]    or ecx,ecx    jz near .winb    cmp ecx,[ngwleft]    jae .alldisplay    sub [ngwleft],ecx    mov [ngwleftb],ecx    xor ecx,ecx    mov eax,[mode7xpos]    ret.alldisplay    mov ecx,[ngwleft]    mov [ngwleftb],ecx    mov dword[ngwleft],0    xor ecx,ecx    mov eax,[mode7xpos]    ret.winbNEWSYM ProcessMode7ngwinD16b    add dword[ngcwinptr],4    mov ecx,[ngcwinptr]    mov ecx,[ecx]    cmp ecx,[ngwleft]    jae near .finishmode7    sub [ngwleft],ecx    or ecx,ecx    jz .noclip.nextvalngw.nextvalr;    cmp byte[switchtorep3],1;    je .nextposy;    test byte[mode7xpos+1],0F8h;    jnz near .rposoffx.nextposx;    test byte[mode7ypos+1],0F8h;    jnz near .rposoffy.nextposy    mov eax,[mode7xadder]    add [mode7xpos],eax    mov eax,[mode7yadder]    sub [mode7ypos],eax    add esi,2    dec ecx    jnz near .nextvalngw.noclip    add dword[ngcwinptr],4    jmp ProcessMode7ngwin16b.finishmode7    mov dword[ngwleft],0    mov dword[ngwleftb],0    ret.rposoffx    mov al,[mmode7xinc]    mov edi,[vram]    add [mmode7ptr],al    mov cl,[mmode7xincc]    cmp byte[mmode7ptr],cl    je .roffx.roffxretb    mov ebx,[mmode7ptr]    xor ecx,ecx    mov cl,[edi+ebx]    mov eax,[mmode7xadd2]    shl ecx,7    sub [mode7xrpos],eax    add edi,ecx    jmp .nextvalr.roffx    mov byte[switchtorep3],1    jmp .roffxretb.rposoffy    mov al,[mmode7yinc]    mov edi,[vram]    sub [mmode7ptr+1],al    js .roffy.roffyretb    mov ebx,[mmode7ptr]    xor ecx,ecx    mov cl,[edi+ebx]    mov eax,[mmode7yadd2]    shl ecx,7    add [mode7yrpos],eax    add edi,ecx    jmp .nextposx.roffy    mov byte[switchtorep3],1    jmp .roffyretb%macro ProcessBuildWindow16b 1    mov dword[ngwinen],0    test byte[esi+ebx+%1*256],0Ah    jz %%nowindowing    push eax    push ebx    mov al,[winlogicaval+ebx*2]    shr al,%1*2    and al,03h    mov [nglogicval],al    mov eax,ebx    add ebx,%1*256    call BuildWindow    cmp dword[ngwintable],0    je %%zero    dec dword[ngwintable]    jmp %%notzero%%zero    dec dword[ngwintable+4]%%notzero    pop ebx    pop eax    mov dword[ngcwinptr],ngwintable%%nowindowing%endmacro%macro Mode7Process 3    mov dword[mtemp],256    test byte[mode7set],80h    jnz near %%norep2    mov eax,[mmode7xpos]    and eax,7FFh    mov [mmode7xrpos],eax    mov eax,[mmode7ypos]    and eax,7FFh    mov [mmode7yrpos],eax    ; get tile data offset into edi    mov ebx,[mmode7ypos+1]    mov eax,[mmode7xpos+1]    shl ebx,5    shr eax,3    and ebx,07FF8h    shl al,1    mov bl,al    mov edi,[vram]    xor ch,ch    mov [mmode7ptr],ebx    mov cl,[edi+ebx]    shl ecx,7    add edi,ecx    mov eax,[mmode7xrpos]    mov ebx,[mmode7ptr]    jmp %%nextval    ALIGN16%%nextval    test ah,08h    jnz near %%rposoffx%%nextposx    test byte[mmode7yrpos+1],08h    jnz near %%rposoffy%%nextposy    mov ch,ah    mov edx,[mmode7yadder]    mov cl,[mmode7yrpos+1]    sub dword[mmode7yrpos],edx    xor edx,edx    mov dl,[mode7tab+ecx]    add eax,[mmode7xadder]    mov dl,[edi+edx]    %1    dec dword[mtemp]    jnz near %%nextval    jmp %%finishmode7%%rposoffx    add bl,[mmode7xinc]    xor ecx,ecx    mov cl,[vrama+ebx]    shl ecx,7    sub eax,[mmode7xadd2]    lea edi,[ecx+vrama]    jmp %%nextposx%%rposoffy    sub bh,[mmode7yinc]    and ebx,07FFFh    xor ecx,ecx    mov cl,[vrama+ebx]    mov edx,[mmode7yadd2]    shl ecx,7    add dword[mmode7yrpos],edx    lea edi,[ecx+vrama]    jmp %%nextposy%%finishmode7

⌨️ 快捷键说明

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