📄 newgfx.asm
字号:
;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com )
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;as published by the Free Software Foundation; either
;version 2 of the License, or (at your option) any later
;version.
;
;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
EXTSYM BG3SXl,BG3SYl,BG416x16t,BG4SXl,BG4SYl,BGFB,BGMA,BGMS1,BGOPT1,BGOPT2
EXTSYM BGOPT3,BGOPT4,BGPT1,BGPT1X,BGPT1Y,BGPT2,BGPT2X,BGPT2Y,BGPT3,BGPT3X
EXTSYM BGPT3Y,BGPT4,BGPT4X,BGPT4Y,StartDrawNewGfx16b,bg1objptr,bg1ptr
EXTSYM bg1ptrx,bg1ptry,bg1scrolx,bg1scroly,bg2objptr,bg2ptr,bg2ptrx
EXTSYM bg2ptry,bg2scrolx,bg2scroly,bg3highst,bg3objptr,bg3ptr,bg3ptrx
EXTSYM bg3ptry,bg3scrolx,bg3scroly,bg4objptr,bg4ptr,bg4ptrx,bg4ptry
EXTSYM bg4scrolx,bg4scroly,bgmode,bgtxad,cachesingle2bng
EXTSYM cachesingle8bng,cbitmode,cfield,colormodedef,csprbit,curmosaicsz
EXTSYM curvidoffset,curypos,drawmode716b,forceblnk,interlval,intrlng,mode7A
EXTSYM mode7C,mode7X0,mode7ab,mode7cd,mode7set,mode7st,mode7xy,mosaicon
EXTSYM mosaicsz,mosenng,mosszng,ngceax,ngcedi,ngpalcon2b,ngpalcon4b
EXTSYM ngpalcon8b,ngptrdat,prdata,prdatb,prdatc,res640,resolutn,scrndis
EXTSYM scrnon,spritetablea,sprleftpr,sprlefttot,sprpriodata,sprtbng,sprtlng
EXTSYM t16x161,t16x162,t16x163,t16x164,tltype2b,tltype4b,tltype8b,vcache2b
EXTSYM vcache4b,vcache8b,vidbuffer,vidmemch2,vidmemch4,vidmemch8,vram,vrama
EXTSYM winon,xtravbuf,ng16bbgval,ng16bprval,bgwinchange,res480
EXTSYM drawtileng2b,drawtileng4b,drawtileng8b,drawmode7win,hdmaearlstart
EXTSYM drawtileng16x162b,drawtileng16x164b,drawtileng16x168b,osm2dis
EXTSYM drawlineng2b,drawlineng4b,drawlineng8b,processmode7hires
EXTSYM drawlineng16x162b,drawlineng16x164b,drawlineng16x168b,mode7hr
EXTSYM winboundary,winbg1enval,winbg2enval,winbg3enval,winbg4enval
EXTSYM winbgobjenval,winlogicaval,disableeffects,winenabs,scanlines
EXTSYM winl1,winbg1en,winbg2en,winbg3en,winbg4en,winobjen,winlogica,winenabm
EXTSYM bgallchange,bg1change,bg2change,bg3change,bg4change,hiresstuff
EXTSYM drawlineng16x84b,drawlineng16x82b,drawlinengom4b,WindowDisables
EXTSYM winlogicb
EXTSYM ngwinptr,objwlrpos,objwen,objclineptr,CSprWinPtr
EXTSYM WindowRedraw
NEWSYM NewGfxAsmStart
%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
%endmacro
NEWSYM 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, db 0 ; window 1 left position
;NEWSYM winr1, db 0 ; window 1 right position
;NEWSYM winl2, db 0 ; window 2 left position
;NEWSYM winr2, db 0 ; window 2 right position
;NEWSYM winbg1en, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG1
;NEWSYM winbg2en, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG2
;NEWSYM winbg3en, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG3
;NEWSYM winbg4en, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG4
;NEWSYM winobjen, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on sprites
;NEWSYM wincolen, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on backarea
;NEWSYM winlogica, db 0 ; Window logic type for BG1 to 4
;NEWSYM winlogicb, db 0 ; Window logic type for Sprites and Backarea
;NEWSYM winenabm, db 0 ; Window logic enable for main screen
;NEWSYM winenabs, db 0 ; Window logic enable for sub screen
;NEWSYM winboundary, times 256 dd 0
;NEWSYM winbg1enval, times 256 db 0
;NEWSYM winbg2enval, times 256 db 0
;NEWSYM winbg3enval, times 256 db 0
;NEWSYM winbg4enval, times 256 db 0
;NEWSYM winbgobjenval, times 256 db 0
;NEWSYM winlogicaval, times 256 dw 0
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
;NEWSYM objwlrpos , times 256 dd 0
;NEWSYM objwen , times 256 dw 0 ; en,log
;NEWSYM objclineptr, times 256 dd 0 ; l1,r1,l2,r2,en,log,ptr
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,dword[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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -