📄 newgfx16.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
EXTSYM BGOPT2,BGOPT3,BGOPT4,BGPT1,BGPT1X,BGPT1Y,BGPT2,BGPT2X,BGPT2Y,BGPT3
EXTSYM BGPT3X,BGPT3Y,BGPT4,BGPT4X,BGPT4Y,bg1drwng,bg1objptr,bg1ptr,bg1ptrx
EXTSYM bg1ptry,bg1scrolx,bg1scroly,bg1totng,bg2drwng,bg2objptr,bg2ptr
EXTSYM bg2ptrx,bg2ptry,bg2scrolx,bg2scroly,bg2totng,bg3drwng,bg3highst
EXTSYM bg3objptr,bg3ptr,bg3ptrx,bg3ptry,bg3scrolx,bg3scroly,bg3totng
EXTSYM bg4drwng,bg4objptr,bg4ptr,bg4ptrx,bg4ptry,bg4scrolx,bg4scroly
EXTSYM bg4totng,bgcmsung,bgmode,bgtxad,bgtxadd,cachesingle2bng
EXTSYM cachesingle8bng,cfieldad,cgfxmod,cgmod,cgram,coladdb
EXTSYM coladdg,coladdr,colleft16b,colormodedef,cpalval,csprbit,csprival
EXTSYM curmosaicsz,curvidoffset,curypos,firstdrawn
EXTSYM flipyposng,forceblnk,interlval,intrlng,maxbr,mode0add,mode0ads,mode7A
EXTSYM mode7C,mode7X0,mode7ab,mode7cd,mode7set,mode7st,mode7xy,modeused
EXTSYM mosaicon,mosaicsz,mosenng,mosszng,ngceax,ngcedi,ngpalcon2b,ngpalcon4b
EXTSYM ngpalcon8b,ngptrdat,pesimpng,prdata,prdatb,prdatc,prevbright
;EXTSYM ngpalcon8b,pesimpng,prdata,prdatb,prdatc,prevbright
EXTSYM prevpal,reslbyl,resolutn,scaddset,scaddtype,scadsng,scadtng,scbcong
EXTSYM scfbl,scrndis,scrnon,spritetablea,sprleftpr,sprlefttot,sprprdrn
EXTSYM sprpriodata,sprtbng,sprtlng,switch16x16,t16x161,t16x162,t16x163
EXTSYM t16x164,taddfy16x16,taddnfy16x16,tleftn,tleftnb,tltype2b,tltype4b
EXTSYM tltype8b,vcache2b,vcache4b,vcache8b,vesa2_bposng,vesa2_clbitng,vesa2_gposng
EXTSYM vesa2_rposng,vidbright,vidbuffer,vidmemch2,vidmemch4,drawsprng
EXTSYM vidmemch8,vrama,winon,xtravbuf,yposng,vbufdptr,preparesprpr
EXTSYM drawtileng2b16b,drawtileng4b16b,drawtileng8b16b
EXTSYM drawtileng16x162b16b,drawtileng16x164b16b,drawtileng16x168b16b
EXTSYM drawlineng2b16b,drawlineng4b16b,drawlineng8b16b,BuildWindow
EXTSYM drawlineng16x162b16b,drawlineng16x164b16b,drawlineng16x168b16b
EXTSYM ngextbg,bgwinchange,disableeffects,winbg1en,winenabs,winenabm
EXTSYM winl1,winbg1enval,winbg1envalm
EXTSYM winlogica,winlogicaval,winboundary,winobjen,winlogicb,nglogicval
EXTSYM ngwintable,winbg2enval,winbg3enval,winbg4enval,winbgobjenval
EXTSYM Mode7HiRes16b,res640,hiresstuff,Mode7BackA,Mode7BackC,Mode7BackX0
EXTSYM Mode7BackSet,drawmode7win16b,processmode7hires,ngwinen
EXTSYM drawlineng16x84b16b,drawlineng16x82b16b,ofsmcyps,vram,ofsmcptr
EXTSYM ofsmady,ofsmadx,ofsmtptr,yposngom,flipyposngom,ofsmmptr
EXTSYM ofsmval,ofsmvalh,hdmaearlstart,ofsmvalh,cbgval,drawlinengom4b16b
EXTSYM drawsprngw,ignor512,winbg1envals,FillSubScr,scanlines
EXTSYM drawmode7win16bd,SpecialLine,vidmemch2s
EXTSYM smallscreenon,ScreenScale,SA1Enable,drawlinengom16x164b16b
EXTSYM doveg,V8Mode,dovegrest
EXTSYM bgallchange,bg1change,bg2change,bg3change,bg4change
EXTSYM ngwinptr,objwlrpos,objwen,objclineptr,CSprWinPtr
EXTSYM BuildWindow2
EXTSYM NGNumSpr
EXTSYM fulladdtab
EXTSYM FPUCopy,bgtxadd2
NEWSYM NewGfx16AsmStart
%include "video/vidmacro.mac"
%include "video/newgfx16.mac"
%include "video/newg162.mac"
; mov ebp,[cpalval+ebx*4]
; 75036*2
; Different routines for:
; Normal (just one screen)
; Transparency
; No Transparency
; Sub+Main:
; Different Window Modes for each:
; SubWin+MainWin
; Sub+MainWin
; SubWin+Main
; cgfxmod :
; 0 = No addition whatsoever
; 1 = Addition in the back area only
; 2 = All of subscreen added to all of mainscreen
; 3 = All of subscreen added to specific mainscreens
; 4 = Add+Sub enabled
NEWSYM setpalallng
mov dword[palchanged],1
mov byte[cgmod],0
push esi
push eax
push edx
push ebp
mov esi,[cpalptrng]
mov byte[colleft16b],0
add esi,1024
xor ebp,ebp
and esi,255*1024
mov dword[cpalptrng],esi
add esi,[vbufdptr]
.loopa
mov dx,[cgram+ebp]
mov [prevpal2+ebp],dx
mov ax,dx
and al,01Fh
mov cl,[vidbright]
mul cl
mov cl,15
div cl
xor ah,ah
mov cl,[ngrposng]
xor ebx,ebx
shl ax,cl
add bx,ax
mov ax,dx
shr ax,5
and al,01Fh
mov cl,[vidbright]
mul cl
mov cl,15
div cl
xor ah,ah
mov cl,[nggposng]
shl ax,cl
add bx,ax
mov ax,dx
shr ax,10
and al,01Fh
mov cl,[vidbright]
mul cl
mov cl,15
div cl
xor ah,ah
mov cl,[ngbposng]
shl ax,cl
add bx,ax
mov ax,bx
mov [esi],bx ; standard
or bx,[UnusedBit]
mov [esi+512],bx ; standard
add esi,2
add ebp,2
inc byte[colleft16b]
jnz near .loopa
mov al,[vidbright]
mov [prevbright],al
pop ebp
pop edx
pop eax
pop esi
xor ecx,ecx
cmp byte[V8Mode],1
jne .noveg2
call dovegrest
.noveg2
ret
NEWSYM setpalette16bng
cmp byte[V8Mode],1
jne .noveg
call doveg
.noveg
mov bl,[vidbright]
cmp bl,[prevbright]
jne near setpalallng
cmp byte[cgmod],0
je near .skipall
push esi
push edi
push eax
push edx
push ebp
mov byte[cgmod],0
xor ebp,ebp
mov esi,[cpalptrng]
mov edi,esi
add esi,1024
and esi,255*1024
mov dword[cpalptrng],esi
add esi,[vbufdptr]
add edi,[vbufdptr]
mov byte[colleft16b],0
jmp .loopa
.skipa
mov bx,[edi]
mov [esi],bx
mov bx,[edi+512]
mov [esi+512],bx
add edi,2
add esi,2
add ebp,2
inc byte[colleft16b]
jz near .endpal
.loopa
mov dx,[cgram+ebp]
cmp [prevpal2+ebp],dx
je .skipa
mov [prevpal2+ebp],dx
cmp byte[colleft16b],0
je .notchanged
mov dword[palchanged],1
.notchanged
mov ax,dx
and al,01Fh
mov cl,[vidbright]
mul cl
mov cl,15
div cl
xor ah,ah
mov cl,[ngrposng]
xor ebx,ebx
shl ax,cl
add bx,ax
mov ax,dx
shr ax,5
and al,01Fh
mov cl,[vidbright]
mul cl
mov cl,15
div cl
xor ah,ah
mov cl,[nggposng]
shl ax,cl
add bx,ax
mov ax,dx
shr ax,10
and al,01Fh
mov cl,[vidbright]
mul cl
mov cl,15
div cl
xor ah,ah
mov cl,[ngbposng]
shl ax,cl
add bx,ax
mov [esi],bx ; standard
or bx,[UnusedBit]
mov [esi+512],bx ; standard
add edi,2
add esi,2
add ebp,2
inc byte[colleft16b]
jnz near .loopa
.endpal
pop ebp
pop edx
pop eax
pop edi
pop esi
xor ecx,ecx
.skipall
cmp byte[V8Mode],1
jne .noveg2
call dovegrest
.noveg2
ret
prevpal2 times 256 dw 0F00Fh
%macro WinBGCheck 1
mov bl,[winbg1en+%1]
mov bh,bl
test bl,0Ah
jz %%disable
test byte[scrnon],1 << %1
jz %%nomainbg
test byte[scrnon+1],1 << %1
jnz %%bg
xor bh,bh
jmp %%bg
%%nomainbg
xor bl,bl
test byte[scrnon+1],1 << %1
jnz %%bg
xor bh,bh
jmp %%skip
%%disable
xor bl,bl
xor bh,bh
jmp %%skip
%%bg
test byte[winenabs],1 << %1
jnz %%nbgs
xor bh,bh
%%nbgs
test byte[winenabm],1 << %1
jnz %%nbgm
xor bl,bl
%%nbgm
jmp %%skip
mov cl,bl
or cl,bh
and cl,0Ah
cmp cl,0Ah
je %%skip
mov ch,bl
or ch,bh
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
xor bh,bh
jmp %%skip
%%outside
cmp dl,0
ja %%skip
cmp dh,255
jb %%skip
xor bl,bl
xor bh,bh
%%skip
mov [winbg1envalm+eax+%1*256],bl
mov [winbg1envals+eax+%1*256],bh
or bl,bh
mov [winbg1enval+eax+%1*256],bl
%endmacro
%macro WinBGCheckb 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
mov [winbg1envalm+eax+%1*256],bl
mov [winbg1envals+eax+%1*256],bl
%endmacro
%macro WinBGCheck2 1
mov bl,[winbg1en+%1]
test bl,0Ah
jnz %%nodisable
xor bl,bl
jmp %%skip
%%nodisable
mov cl,bl
or cl,bh
and cl,0Ah
cmp cl,0Ah
je %%skip
mov ch,bl
or ch,bh
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
BackAreaAdd dd 0
BackAreaUnFillCol dd 0
BackAreaFillCol dd 0
clinemainsub dd 0
BackAreaFill:
cmp byte[winbg1enval+eax+5*256],0
je near .nowindowb
mov ebx,[BackAreaFillCol]
cmp ebx,[BackAreaUnFillCol]
je near .nowindowb
push ecx
push edx
push eax
push edi
mov ebx,eax
mov ecx,[vidbuffer]
add ecx,16*2
shl eax,9
add ecx,eax
mov eax,ebx
shl eax,6
add ecx,eax
add ecx,[BackAreaAdd]
; Construct Window in ecx
mov edi,ngwintable
sub ecx,2
mov eax,256
.procnotemptyb
mov edx,[edi]
add edi,4
or edx,edx
jz .procemptyb
dec edx
mov ebx,[BackAreaUnFillCol]
.swloopb
mov dword[ecx],ebx
mov dword[ecx+4],ebx
add ecx,8
sub eax,4
jc .doneb
sub edx,4
jnc .swloopb
sub eax,edx
add ecx,edx
add ecx,edx
dec eax
add ecx,2
.procemptyb
mov edx,[edi]
dec edx
add edi,4
mov ebx,[BackAreaFillCol]
.swloop2b
mov dword[ecx],ebx
mov dword[ecx+4],ebx
add ecx,8
sub eax,4
jc .doneb
sub edx,4
jnc .swloop2b
sub eax,edx
add ecx,edx
add ecx,edx
dec eax
add ecx,2
jmp .procnotemptyb
.doneb
pop edi
pop eax
pop edx
pop ecx
jmp .yeswindowb
.nowindowb
push eax
push ecx
mov ebx,eax
mov ecx,[vidbuffer]
mov eax,ebx
add ecx,16*2
shl eax,9
add ecx,eax
mov eax,ebx
shl eax,6
add ecx,eax
add ecx,[BackAreaAdd]
mov ebx,[BackAreaUnFillCol]
mov eax,128
.nowinloop
mov [ecx],ebx
add ecx,4
dec eax
jnz .nowinloop
pop ecx
pop eax
.yeswindowb
ret
NEWSYM newengine16b
; store line by line data
; BGMode, BGxScrollX, BGxScrollY, both BGPtrs
mov eax,[curypos]
and eax,0FFh
cmp eax,1
jne .noclearcache
push eax
push ecx
mov ebx,vidmemch2s
mov ecx,1024+512+256
mov eax,0FFFFFFFFh
.loopcc
mov dword[ebx],eax
add ebx,4
loop .loopcc
pop ecx
pop eax
mov dword[startlinet],0
mov dword[endlinet],255
xor ebx,ebx
.noclearcache
mov byte[bgallchange+eax],0
mov byte[bgallchange+eax+1],0FFh
mov byte[bg1change+eax],0
mov byte[bg2change+eax],0
mov byte[bg3change+eax],0
mov byte[bg4change+eax],0
mov dword[palchanged],0
; BG3 Priority
mov bl,[bg3highst]
mov [BG3PRI+eax],bl
cmp [BG3PRI+eax-1],bl
je .nosbg3pr
mov byte[bgallchange+eax],1
.nosbg3pr
; Main/Sub Screen
cmp byte[SA1Enable],0
je .noscrnona
cmp word[scrnon],1317h
jne .noscrnona
cmp byte[scaddtype],0
jne .noscrnona
mov word[scrnon],1317h
mov byte[scaddtype],44h
mov byte[scaddset],02h
.noscrnona
mov ebx,[scrnon]
; clear
push ecx
mov cl,[scrnon]
and cl,1Fh
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -