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

📄 newgfx.asm

📁 linux下的任天堂模拟器代码。供大家参考。
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;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 BG116x16t,BG1SXl,BG1SYl,BG216x16t,BG2SXl,BG2SYl,BG316x16t,BG3PRI,BG3SXlEXTSYM BG3SYl,BG416x16t,BG4SXl,BG4SYl,BGFB,BGMA,BGMS1,BGOPT1,BGOPT2,BGOPT3EXTSYM BGOPT4,BGPT1,BGPT1X,BGPT1Y,BGPT2,BGPT2X,BGPT2Y,BGPT3,BGPT3X,BGPT3Y,BGPT4EXTSYM BGPT4X,BGPT4Y,StartDrawNewGfx16b,bg1objptr,bg1ptr,bg1ptrx,bg1ptryEXTSYM bg1scrolx,bg1scroly,bg2objptr,bg2ptr,bg2ptrx,bg2ptry,bg2scrolx,bg2scrolyEXTSYM bg3highst,bg3objptr,bg3ptr,bg3ptrx,bg3ptry,bg3scrolx,bg3scroly,bg4objptrEXTSYM bg4ptr,bg4ptrx,bg4ptry,bg4scrolx,bg4scroly,bgmode,bgtxad,cachesingle2bngEXTSYM cachesingle8bng,cbitmode,cfield,colormodedef,csprbit,curmosaicszEXTSYM curvidoffset,curypos,forceblnk,interlval,intrlng,mode7A,m7startyEXTSYM mode7C,mode7X0,mode7ab,mode7cd,mode7set,mode7st,mode7xy,mosaicon,mosaicszEXTSYM mosenng,mosszng,ngceax,ngcedi,ngpalcon2b,ngpalcon8b,ngptrdat,prdataEXTSYM prdatb,prdatc,res640,resolutn,scrndis,scrnon,spritetablea,sprleftprEXTSYM sprlefttot,sprpriodata,sprtbng,sprtlng,t16x161,t16x162,t16x163,t16x164EXTSYM tltype2b,tltype8b,vcache2b,vcache8b,vidbuffer,vidmemch2,ngptrdat2EXTSYM vidmemch8,vram,vrama,winon,xtravbuf,ng16bbgval,ng16bprval,ofshvaladdEXTSYM bgwinchange,res480,drawtileng2b,drawtileng4b,drawtileng8b,drawmode7winEXTSYM drawtileng16x162b,drawtileng16x164b,drawtileng16x168bEXTSYM osm2dis,drawlineng2b,drawlineng4b,drawlineng8b,processmode7hiresEXTSYM drawlineng16x162b,drawlineng16x164b,drawlineng16x168b,winboundaryEXTSYM winbg1enval,winbg2enval,winbg3enval,winbg4enval,winbgobjenvalEXTSYM winlogicaval,disableeffects,winenabs,scanlines,winl1,winbg1en,winobjenEXTSYM winlogica,winenabm,bgallchange,bg1change,bg2change,bg3change,bg4changeEXTSYM hiresstuff,drawlineng16x84b,drawlineng16x82b,drawlinengom4b,WindowRedrawEXTSYM winlogicb,ngwinptr,objwlrpos,objwen,objclineptr,CSprWinPtrEXTSYM ofsmtptrs,ofsmcptr2,drawmode7ngextbg,drawmode7ngextbg2%include "video/vidmacro.mac"%include "video/newgfx2.mac"%include "video/newgfx.mac"; vidbufferofsmos pointer to mosaic buffer%macro WinBGCheck 1    mov bl,[winbg1en+%1]    test bl,0Ah    jz %%disable    test byte[scrnon],1 << %1    jnz %%nbgen    test byte[winenabs],1 << %1    jnz %%bg    jmp %%disable%%nbgen    test byte[winenabm],1 << %1    jnz %%bg%%disable    xor bl,bl    jmp %%skip%%bg    mov cl,bl    and cl,0Ah    cmp cl,0Ah    je %%skip;    jne %%notskip;    and bl,03h;    and cl,03h;%%notskip    mov ch,bl    mov edx,[winl1]    cmp cl,02h    je %%bg1    shr ch,2    shr edx,16%%bg1    test ch,01h    jnz %%outside    cmp dl,dh    jbe %%skip    xor bl,bl    jmp %%skip%%outside    cmp dl,0    ja %%skip    cmp dh,255    jb %%skip    xor bl,bl%%skip    mov [winbg1enval+eax+%1*256],bl%endmacroSECTION .textNEWSYM newengine8b    ; store line by line data    ; BGMode, BGxScrollX, BGxScrollY, both BGPtrs    mov eax,[curypos]    and eax,0FFh    mov byte[bgallchange+eax],0    mov byte[bg1change+eax],0    mov byte[bg2change+eax],0    mov byte[bg3change+eax],0    mov byte[bg4change+eax],0    ; BG3 Priority    mov ebx,[bg3highst]    mov [BG3PRI+eax],ebx    ; Main/Sub Screen    mov ebx,[scrnon]    or [bgcmsung],ebx    mov [BGMS1+eax*2],ebx    cmp [BGMS1+eax*2-2],bx    je .nosbgms1    mov byte[bgallchange+eax],1.nosbgms1    ; Scroll Values    mov ebx,[bg1scrolx]    mov [BG1SXl+eax*2],ebx    cmp [BG1SXl+eax*2-2],bx    je .nosbgx1    mov byte[bg1change+eax],1.nosbgx1    mov ebx,[bg2scrolx]    mov [BG2SXl+eax*2],ebx    cmp [BG2SXl+eax*2-2],bx    je .nosbgx2    mov byte[bg2change+eax],1.nosbgx2    mov ebx,[bg3scrolx]    mov [BG3SXl+eax*2],ebx    cmp [BG3SXl+eax*2-2],bx    je .nosbgx3    mov byte[bg3change+eax],1.nosbgx3    mov ebx,[bg4scrolx]    mov [BG4SXl+eax*2],ebx    cmp [BG4SXl+eax*2-2],bx    je .nosbgx4    mov byte[bg4change+eax],1.nosbgx4    mov ebx,[bg1scroly]    mov [BG1SYl+eax*2],ebx    cmp [BG1SYl+eax*2-2],bx    je .nosbgy1    mov byte[bg1change+eax],1.nosbgy1    mov ebx,[bg2scroly]    mov [BG2SYl+eax*2],ebx    cmp [BG2SYl+eax*2-2],bx    je .nosbgy2    mov byte[bg2change+eax],1.nosbgy2    mov ebx,[bg3scroly]    mov [BG3SYl+eax*2],ebx    cmp [BG3SYl+eax*2-2],bx    je .nosbgy3    mov byte[bg3change+eax],1.nosbgy3    mov ebx,[bg4scroly]    mov [BG4SYl+eax*2],ebx    cmp [BG4SYl+eax*2-2],bx    je .nosbgy4    mov byte[bg1change+eax],1.nosbgy4    ; Background Mode    mov bl,[bgmode]    and ebx,07h    mov [BGMA+eax],bl    cmp bl,4    je .changedmode4    cmp [BGMA+eax-1],bl    je .nobgma.changedmode4    mov byte[bgallchange+eax],1.nobgma    ; new graphics fix, thanks to TRAC    and ebx,07h    mov byte[modeused+ebx],1    ; Pointer to OBJ tile data    mov ebx,[bg1objptr]    mov [BGOPT1+eax*2],ebx    cmp [BGOPT1+eax*2-2],bx    je .nosbgo1    mov byte[bg1change+eax],1.nosbgo1    mov ebx,[bg2objptr]    mov [BGOPT2+eax*2],ebx    cmp [BGOPT2+eax*2-2],bx    je .nosbgo2    mov byte[bg2change+eax],1.nosbgo2    mov ebx,[bg3objptr]    mov [BGOPT3+eax*2],ebx    cmp [BGOPT3+eax*2-2],bx    je .nosbgo3    mov byte[bg3change+eax],1.nosbgo3    mov ebx,[bg4objptr]    mov [BGOPT4+eax*2],ebx    cmp [BGOPT4+eax*2-2],bx    je .nosbgo4    mov byte[bg4change+eax],1.nosbgo4    ; Pointer to tile status data    mov ebx,[bg1ptr]    mov [BGPT1+eax*2],ebx    cmp [BGPT1+eax*2-2],bx    je .nosbgp1    mov byte[bg1change+eax],1.nosbgp1    mov ebx,[bg2ptr]    mov [BGPT2+eax*2],ebx    cmp [BGPT2+eax*2-2],bx    je .nosbgp2    mov byte[bg2change+eax],1.nosbgp2    mov ebx,[bg3ptr]    mov [BGPT3+eax*2],ebx    cmp [BGPT3+eax*2-2],bx    je .nosbgp3    mov byte[bg3change+eax],1.nosbgp3    mov ebx,[bg4ptr]    mov [BGPT4+eax*2],ebx    cmp [BGPT4+eax*2-2],bx    je .nosbgp4    mov byte[bg4change+eax],1.nosbgp4    mov ebx,[bg1ptrx]    mov [BGPT1X+eax*2],ebx    cmp [BGPT1X+eax*2-2],bx    je .nosbgpx1    mov byte[bg1change+eax],1.nosbgpx1    mov ebx,[bg2ptrx]    mov [BGPT2X+eax*2],ebx    cmp [BGPT2X+eax*2-2],bx    je .nosbgpx2    mov byte[bg2change+eax],1.nosbgpx2    mov ebx,[bg3ptrx]    mov [BGPT3X+eax*2],ebx    cmp [BGPT3X+eax*2-2],bx    je .nosbgpx3    mov byte[bg3change+eax],1.nosbgpx3    mov ebx,[bg4ptrx]    mov [BGPT4X+eax*2],ebx    cmp [BGPT4X+eax*2-2],bx    je .nosbgpx4    mov byte[bg4change+eax],1.nosbgpx4    mov ebx,[bg1ptry]    mov [BGPT1Y+eax*2],ebx    cmp [BGPT1Y+eax*2-2],bx    je .nosbgpy1    mov byte[bg1change+eax],1.nosbgpy1    mov ebx,[bg2ptry]    mov [BGPT2Y+eax*2],ebx    cmp [BGPT2Y+eax*2-2],bx    je .nosbgpy2    mov byte[bg2change+eax],1.nosbgpy2    mov ebx,[bg3ptry]    mov [BGPT3Y+eax*2],ebx    cmp [BGPT3Y+eax*2-2],bx    je .nosbgpy3    mov byte[bg3change+eax],1.nosbgpy3    mov ebx,[bg4ptry]    mov [BGPT4Y+eax*2],ebx    cmp [BGPT4Y+eax*2-2],bx    je .nosbgpy4    mov byte[bg4change+eax],1.nosbgpy4    mov ebx,[forceblnk]    or bl,bl    jne .dontdraw    mov dword[scfbl],0.dontdraw    ; Variable size write error fix [TRAC]    mov [BGFB+eax],bl    cmp [BGFB+eax-1],bl    je .nosbgfb    mov byte[bgallchange+eax],1.nosbgfb    mov ebx,[mode7A]    mov [mode7ab+eax*4],ebx    mov ebx,[mode7C]    mov [mode7cd+eax*4],ebx    mov ebx,[mode7X0]    mov [mode7xy+eax*4],ebx    mov ebx,[mode7set]    mov [mode7st+eax],ebx    ; 16x16 tiles    mov ebx,[BG116x16t]    mov [t16x161+eax],ebx    cmp [t16x161+eax-1],bl    je .not16x161    mov byte[bg1change+eax],1.not16x161    mov ebx,[BG216x16t]    mov [t16x162+eax],ebx    cmp [t16x162+eax-1],bl    je .not16x162    mov byte[bg2change+eax],1.not16x162    mov ebx,[BG316x16t]    mov [t16x163+eax],ebx    cmp [t16x163+eax-1],bl    je .not16x163    mov byte[bg3change+eax],1.not16x163    mov ebx,[BG416x16t]    mov [t16x164+eax],ebx    cmp [t16x164+eax-1],bl    je .not16x164    mov byte[bg4change+eax],1.not16x164;    mov byte[mode7hr+eax],0    cmp byte[bgmode],7    jne .noextbg;    cmp byte[res640],0;    je .nomode7512;    mov byte[mode7hr+eax],1;.nomode7512    test byte[interlval],40h    jz .noextbg    mov byte[ngextbg],1.noextbg    ; mosaic    mov ebx,[mosaicon]    mov [mosenng+eax],ebx    mov ebx,[mosaicsz]    mov [mosszng+eax],ebx    ; Interlaced    mov ebx,[interlval]    mov [intrlng+eax],ebx; Windowing Stuff;NEWSYM winl1,      0             ; window 1 left position;NEWSYM winr1,      0             ; window 1 right position;NEWSYM winl2,      0             ; window 2 left position;NEWSYM winr2,      0             ; window 2 right position;NEWSYM winbg1en,   0             ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG1;NEWSYM winbg2en,   0             ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG2;NEWSYM winbg3en,   0             ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG3;NEWSYM winbg4en,   0             ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG4;NEWSYM winobjen,   0             ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on sprites;NEWSYM wincolen,   0             ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on backarea;NEWSYM winlogica,  0             ; Window logic type for BG1 to 4;NEWSYM winlogicb,  0             ; Window logic type for Sprites and Backarea;NEWSYM winenabm,   0             ; Window logic enable for main screen;NEWSYM winenabs,   0             ; Window logic enable for sub screen    mov byte[bgwinchange+eax],0    cmp byte[disableeffects],1    je near .finishwin    push ecx    push edx    WinBGCheck 0    WinBGCheck 1    WinBGCheck 2    WinBGCheck 3    WinBGCheck 4    mov ebx,[winlogica]    mov [winlogicaval+eax*2],ebx    cmp [winlogicaval+eax*2-2],bx    je .winnchangedb    mov byte[bgwinchange+eax],1.winnchangedb    mov ebx,[winl1]    mov [winboundary+eax*4],ebx    cmp [winboundary+eax*4-4],ebx    je .winnchanged    mov byte[bgwinchange+eax],1.winnchanged    ; generate sprite window    cmp byte[winbg1enval+eax+4*256],0    je near .skipobjw    mov ebx,[winl1]    mov dl,[winobjen]    mov dh,[winlogicb]    and dh,03h    ; Same as previous line?    cmp dword[objwlrpos+eax*4-4],0FFFFFFFFh    je .changed    cmp [objwlrpos+eax*4-4],ebx    jne .changedb    cmp [objwen+eax*2-2],dx    je near .notchanged.changedb    cmp [objwlrpos+eax*4],ebx    jne .changed    cmp [objwen+eax*2],dx    jne .changed    mov ecx,[CSprWinPtr]    cmp [objclineptr+eax*4],ecx    ja near .usecurrent.changed    mov [objwlrpos+eax*4],ebx    mov [objwen+eax*2],dx    mov bl,[winlogicb]    and bl,03h    mov [nglogicval],bl    mov ebx,4*256    add ebx,eax    call BuildWindow    mov ecx,[CSprWinPtr]    add ecx,260    mov [CSprWinPtr],ecx    mov [objclineptr+eax*4],ecx    add ecx,[ngwinptr]    ; Construct Window in ecx    push eax    mov ebx,ngwintable    dec ecx    mov eax,256.procnotempty    mov edx,[ebx]    add ebx,4    or edx,edx    jz .procempty    dec edx.swloop    mov dword[ecx],0    add ecx,4    sub eax,4    jc .done    sub edx,4    jnc .swloop    sub eax,edx    add ecx,edx    dec eax    inc ecx.procempty    mov edx,[ebx]    dec edx    add ebx,4.swloop2    mov dword[ecx],01010101h    add ecx,4    sub eax,4    jc .done    sub edx,4    jnc .swloop2    sub eax,edx    add ecx,edx    dec eax    inc ecx    jmp .procnotempty.done    pop eax    jmp .skipobjw.usecurrent    mov ecx,[objclineptr+eax*4]    mov [CSprWinPtr],ecx    jmp .skipobjw    ; copy over if it's the same.notchanged    mov [objwlrpos+eax*4],ebx    mov [objwen+eax*2],dx    mov ebx,[objclineptr+eax*4-4]    mov [objclineptr+eax*4],ebx.skipobjw    pop edx    pop ecx    jmp .okaywin.finishwin    mov byte[winbg1enval+eax],0    mov byte[winbg2enval+eax],0    mov byte[winbg3enval+eax],0    mov byte[winbg4enval+eax],0    mov byte[winbgobjenval+eax],0.okaywin;    cmp byte[Mode7HiRes],1;    jne .nomode7hires;    cmp byte[bgmode],7;    je .hires.nomode7hires    cmp byte[res640],0    je near .no512    cmp byte[bgmode],5    jb .no512    cmp byte[Mode7HiRes],1    je .hires    cmp byte[bgmode],7    je .no512.hires    mov byte[hiresstuff],1    push edi    push eax    push ecx    mov ebx,eax    mov edi,[vidbuffer]    mov eax,ebx    add edi,16+75036    shl eax,8    add edi,eax    mov eax,ebx    shl eax,5    add edi,eax    xor eax,eax    mov ecx,64    rep stosd    pop ecx    pop eax    pop edi.no512    mov ebx,[sprleftpr+eax*4]    cmp ebx,00000001h    je .single    cmp ebx,00000100h    je .single    cmp ebx,00010000h    je .single    cmp ebx,01000000h    je .single    or [sprprdrn],ebx    xor ebx,ebx    ret.single    or [sprprdrn],ebx    or dword[sprleftpr+eax*4],80000000h    xor ebx,ebx    ret%macro Process1DualWindow 0    test ch,1    jnz %%outside    inc ebx    cmp edx,ebx    jb %%noclip    ; Process Inside window    mov [esi],ebx    sub edx,ebx    add edx,2    mov [esi+4],edx    mov dword[esi+8],0EE00h    add esi,12    jmp %%finwin%%noclip    mov dword[esi],0EE00h    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

⌨️ 快捷键说明

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