📄 newgfx16.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,bg1drwng,bg1objptr,bg1ptr,bg1ptrx,bg1ptry,bg1scrolxEXTSYM bg1scroly,bg1totng,bg2drwng,bg2objptr,bg2ptr,bg2ptrx,bg2ptry,bg2scrolxEXTSYM bg2scroly,bg2totng,bg3drwng,bg3highst,bg3objptr,bg3ptr,bg3ptrx,bg3ptryEXTSYM bg3scrolx,bg3scroly,bg3totng,bg4drwng,bg4objptr,bg4ptr,bg4ptrx,bg4ptryEXTSYM bg4scrolx,bg4scroly,bg4totng,bgcmsung,bgmode,bgtxad,bgtxadd,ngextbgEXTSYM cachesingle2bng,cachesingle8bng,cfieldad,cgmod,cgram,coladdb,coladdgEXTSYM coladdr,colleft16b,colormodedef,cpalval,csprbit,csprival,curmosaicszEXTSYM curvidoffset,curypos,firstdrawn,flipyposng,forceblnk,interlval,intrlngEXTSYM mode0add,mode0ads,mode7A,mode7C,mode7X0,mode7ab,mode7cd,mode7set,mode7stEXTSYM mode7xy,modeused,mosaicon,mosaicsz,mosenng,mosszng,ngceax,ngcediEXTSYM ngpalcon2b,ngpalcon8b,ngptrdat,pesimpng,prdata,prdatb,prdatc,prevbrightEXTSYM reslbyl,resolutn,scaddset,scaddtype,scadsng,scadtng,scfbl,scrndis,scrnonEXTSYM spritetablea,sprleftpr,sprlefttot,sprprdrn,sprpriodata,sprtbng,sprtlngEXTSYM t16x161,t16x162,t16x163,t16x164,taddfy16x16,taddnfy16x16,ngptrdat2EXTSYM tleftn,tltype2b,tltype8b,vcache2b,vcache8b,vidbright,ofshvaladdEXTSYM vidbuffer,vidmemch2,vidmemch8,vrama,winon,xtravbuf,yposngEXTSYM vbufdptr,drawtileng2b16b,drawtileng4b16b,drawtileng8b16b,bgwinchangeEXTSYM drawtileng16x162b16b,drawtileng16x164b16b,drawtileng16x168b16b,winbg1enEXTSYM drawlineng2b16b,drawlineng4b16b,drawlineng8b16b,BuildWindow,winenabsEXTSYM drawlineng16x162b16b,drawlineng16x164b16b,drawlineng16x168b16b,winenabmEXTSYM disableeffects,winl1,winbg1enval,winbg1envalm,winlogica,winlogicavalEXTSYM winboundary,winobjen,winlogicb,nglogicval,ngwintable,winbg2enval,dovegEXTSYM winbg3enval,winbg4enval,winbgobjenval,Mode7HiRes16b,res640,hiresstuffEXTSYM Mode7BackA,Mode7BackC,Mode7BackX0,Mode7BackSet,drawmode7win16b,ngwinenEXTSYM drawlineng16x84b16b,drawlineng16x82b16b,ofsmcyps,vram,ofsmcptr,ofsmadyEXTSYM ofsmadx,ofsmtptr,yposngom,flipyposngom,ofsmmptr,ofsmval,ofsmvalh,V8ModeEXTSYM cbgval,drawlinengom4b16b,ignor512,winbg1envals,m7startyEXTSYM FillSubScr,scanlines,drawmode7win16bd,SpecialLine,vidmemch2s,dovegrestEXTSYM drawlinengom16x164b16b,bgallchangeEXTSYM bg1change,bg2change,bg3change,bg4change,ngwinptr,objwlrpos,objwenEXTSYM objclineptr,CSprWinPtr,BuildWindow2,NGNumSpr,fulladdtab,MMXSupportEXTSYM bgtxadd2,gammalevel16b,drawmode7ngextbg16b,processmode7hires16bEXTSYM processmode7hires16bd,drawmode7ngextbg216b,osm2dis,ofsmtptrs,ofsmcptr2%ifdef __MSDOS__EXTSYM smallscreenon,ScreenScale%endif%include "video/vidmacro.mac"%include "video/newgfx16.mac"%include "video/newg162.mac"; 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 enabledSECTION .textNEWSYM 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 [cpalptrng],esi add esi,[vbufdptr].loopa mov dx,[cgram+ebp] mov [prevpal2+ebp],dx mov ax,dx and al,01Fh add al,[gammalevel16b] cmp al,31 jbe .nogr mov al,31.nogr 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 add al,[gammalevel16b] cmp al,31 jbe .nogg mov al,31.nogg 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 add al,[gammalevel16b] cmp al,31 jbe .nogb mov al,31.nogb 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 retNEWSYM 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 [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 add al,[gammalevel16b] cmp al,31 jbe .norr mov al,31.norr 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 add al,[gammalevel16b] cmp al,31 jbe .norg mov al,31.norg 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 add al,[gammalevel16b] cmp al,31 jbe .norb mov al,31.norb 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 retsection .dataprevpal2 times 256 dw 0F00Fhsection .text%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%endmacrosection .dataBackAreaAdd dd 0BackAreaUnFillCol dd 0BackAreaFillCol dd 0clinemainsub dd 0section .textBackAreaFill: 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 [ecx],ebx mov [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 [ecx],ebx mov [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,64.nowinloop mov [ecx],ebx mov [ecx+4],ebx add ecx,8 dec eax jnz .nowinloop pop ecx pop eax.yeswindowb retNEWSYM 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 [ebx],eax add ebx,4 dec ecx jnz .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 test byte[scaddset],2 jz .noscaddset or [bgcmsung],ebx.noscaddset mov bl,[bg3highst] ;cmp byte[bgmode],7 ;mov bl,1 ;je .notmode7;.notmode7 mov [BG3PRI+eax],bl cmp [BG3PRI+eax-1],bl je .nosbg3pr mov byte[bgallchange+eax],1.nosbg3pr mov ebx,[scrnon] ; clear push ecx mov cl,[scrnon] and cl,1Fh or cl,20h and cl,[scaddtype] and cl,3Fh mov byte[FillSubScr+eax],1 or cl,cl jnz .yessub xor bh,bh mov byte[FillSubScr+eax],0.yessub pop ecx test byte[scaddset],2 jnz .subscrnon xor bh,bh.subscrnon
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -