📄 newgfx.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 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 + -