📄 makev16b.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 cursprloc,curypos,scrndis,scrnon,winon,winonsp,drawmode716extbgEXTSYM drawmode716extbg2,alreadydrawn,bg1cachloc,bg1tdabloc,bg1tdatlocEXTSYM bg1vbufloc,bg1xposloc,bg1yaddval,bgcoloradder,bgmode,bgtilesz,curbgnumEXTSYM drawn,makewindow,winbg1en,winenabs,mosaicon,winenabm,vidbuffer,bg3high2EXTSYM colormodedef,colormodeofs,curbgpr,curblank,currentobjptr,curvidoffsetEXTSYM cwinenabm,drawline16t,forceblnk,makewindowsp,maxbr,newengen,newengine16bEXTSYM preparesprpr,procbackgrnd,scaddset,scaddtype,spritetablea,sprleftprEXTSYM ForceNewGfxOff,bg1scrolx,bg1scroly,drawmode716b,mode7set,mosaicszEXTSYM sprleftpr1,sprleftpr2,sprleftpr3,sprlefttot,sprprifix,interlval,extbgdoneEXTSYM coladdb,coladdg,coladdr,pal16b,vesa2_bpos,V8Mode,doveg,pal16bcl,pal16bxclEXTSYM prevbright,prevpal,vesa2_clbit,vesa2_gpos,vesa2_rpos,vidbright,cgmodEXTSYM cgram,gammalevel16b,dovegrest,winspdata,csprbit,csprprlft,sprclprioEXTSYM sprsingle,sprpriodata,bgofwptr,bgsubby,bshifter,curmosaicsz,cwinptrEXTSYM osm2dis,temp,tempcach,temptile,winptrref,xtravbuf,yadder,yrevadderEXTSYM vcache2b,vcache4b,vcache8b,hirestiledat,res512switch,numwin,windowdataEXTSYM bg1objptr,bg1ptr,bg3ptr,bg3scrolx,bg3scroly,vidmemch4,vram,ofsmcptrEXTSYM ofsmady,ofsmadx,yposngom,flipyposngom,ofsmtptr,ofsmmptr,ofsmcyps,bgtxaddEXTSYM bg1ptrx,bg1ptry,a16x16xinc,a16x16yinc,bg1scrolx_m7,bg1scroly_m7,ngptrdat2EXTSYM OMBGTestVal,Testval,cachesingle4bng,m7starty,ofsmtptrs,ofsmcptr2EXTSYM ofshvaladd%include "video/vidmacro.mac";drawspritesprioSECTION .bssNEWSYM tempstuff, resd 1;ALIGN16.stuff resd 1.stuff2 resb 2SECTION .text%macro procmode716bextbg 3 xor eax,eax xor edx,edx mov ax,[curypos] inc ax test byte[mode7set],02h jz %%noflip neg ax add ax,255%%noflip mov byte[curmosaicsz],1 test byte[mosaicon],%3 jz %%nomos mov bl,[mosaicsz] cmp bl,0 je %%nomos inc bl mov [curmosaicsz],bl xor bh,bh div bx xor edx,edx mul bx%%nomos mov [m7starty],ax mov ax,%1 mov dx,%2 call drawmode716extbg%endmacro%macro procmode716bextbg2 3 xor eax,eax xor edx,edx mov ax,[curypos] mov byte[curmosaicsz],1 test byte[mosaicon],%3 jz %%nomos mov bl,[mosaicsz] cmp bl,0 je %%nomos inc bl mov [curmosaicsz],bl xor bh,bh div bx xor edx,edx mul bx%%nomos call drawmode716extbg2%endmacroNEWSYM procspritessub16b test byte[scrndis],10h jnz .nosprites test byte[scrnon+1],10h jz .nosprites test byte[scrnon],10h jnz .nosprites cmp byte[winonsp],0FFh je .nosprites xor ebx,ebx mov bl,[curypos] add ebx,[cursprloc] mov cl,[ebx] cmp byte[sprprifix],0 jne .sprprio add dword[cursprloc],256.sprprio cmp cl,0 je .nosprites call drawsprites16b.nosprites retNEWSYM procspritesmain16b test byte[scrndis],10h jnz .nosprites test byte[scrnon],10h jz .nosprites cmp byte[winonsp],0FFh je .nosprites xor ebx,ebx mov bl,[curypos] add ebx,[cursprloc] mov cl,[ebx] cmp byte[sprprifix],0 jne .sprprio add dword[cursprloc],256.sprprio cmp cl,0 je .nosprites call drawsprites16b.nosprites retNEWSYM drawbackgrndsub16b mov esi,[colormodeofs] mov bl,[esi+ebp] cmp bl,0 je near .noback mov al,[curbgnum] test byte[scrnon+1],al jz near .noback test byte[scrnon],al jnz near .noback test byte[alreadydrawn],al jnz near .noback test byte[scrndis],al jnz near .noback mov byte[winon],0 test byte[winenabs],al jz near .nobackwin; procwindow [winbg1en+ebp] mov al,[winbg1en+ebp] call makewindow cmp byte[winon],0FFh je near .noback.nobackwin mov bl,[curbgnum] mov byte[curmosaicsz],1 test byte[mosaicon],bl jz .nomos mov bl,[mosaicsz] cmp bl,0 je .nomos inc bl mov [curmosaicsz],bl.nomos mov byte[bgcoloradder],0 cmp byte[bgmode],0 jne .nomode0 mov eax,ebp mov bl,20h mul bl mov [bgcoloradder],al.nomode0 mov esi,[bg1vbufloc+ebp*4] mov edi,[bg1tdatloc+ebp*4] mov edx,[bg1tdabloc+ebp*4] mov ebx,[bg1cachloc+ebp*4] mov eax,[bg1xposloc+ebp*4] mov cl,[curbgnum] test byte[bgtilesz],cl jnz .16x16 mov ecx,[bg1yaddval+ebp*4] call draw8x816b cmp byte[drawn],33 jne .notalldrawn mov al,[curbgnum] or [alreadydrawn],al.notalldrawn jmp .noback.16x16 mov ecx,[bg1yaddval+ebp*4] call draw16x1616b cmp byte[drawn],33 jne .notalldrawnb mov al,[curbgnum] or [alreadydrawn],al.notalldrawnb.noback retNEWSYM drawbackgrndmain16b mov esi,[colormodeofs] mov bl,[esi+ebp] cmp bl,0 je near .noback mov al,[curbgnum] test byte[scrnon],al jz near .noback test byte[alreadydrawn],al jnz near .noback test byte[scrndis],al jnz near .noback mov byte[winon],0 test byte[winenabm],al jz near .nobackwin; procwindow [winbg1en+ebp] mov al,[winbg1en+ebp] call makewindow cmp byte[winon],0FFh je near .noback.nobackwin mov bl,[curbgnum] mov byte[curmosaicsz],1 test byte[mosaicon],bl jz .nomos mov bl,[mosaicsz] cmp bl,0 je .nomos inc bl mov [curmosaicsz],bl.nomos mov byte[bgcoloradder],0 cmp byte[bgmode],0 jne .nomode0 mov eax,ebp mov bl,20h mul bl mov [bgcoloradder],al.nomode0 mov esi,[bg1vbufloc+ebp*4] mov edi,[bg1tdatloc+ebp*4] mov edx,[bg1tdabloc+ebp*4] mov ebx,[bg1cachloc+ebp*4] mov eax,[bg1xposloc+ebp*4] mov cl,[curbgnum] test byte[bgtilesz],cl jnz .16x16 mov ecx,[bg1yaddval+ebp*4] call draw8x816b cmp byte[drawn],33 jne .notalldrawn mov al,[curbgnum] or [alreadydrawn],al.notalldrawn jmp .noback.16x16 mov ecx,[bg1yaddval+ebp*4] call draw16x1616b cmp byte[drawn],33 jne .notalldrawnb mov al,[curbgnum] or [alreadydrawn],al.notalldrawnb.noback retNEWSYM blanker16b ; calculate current video offset push ebx push esi xor ebx,ebx mov bx,[curypos] mov esi,ebx shl esi,9 shl ebx,6 add esi,ebx add esi,32 add esi,[vidbuffer] mov bl,128.next mov dword[esi],0 add esi,4 dec bl jnz .next pop esi pop ebx retNEWSYM drawline16b cmp byte[ForceNewGfxOff],0 jne .nonewgfx cmp byte[newengen],1 je near newengine16b.nonewgfx cmp byte[curblank],0 jne near nodrawline16b mov al,[vidbright] cmp al,[maxbr] jbe .nochange mov [maxbr],al.nochange cmp byte[forceblnk],0 jne blanker16b mov byte[alreadydrawn],0 push ebx xor ebx,ebx mov bl,[bgmode] shl bl,2 add ebx,colormodedef mov [colormodeofs],ebx pop ebx 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 cmp word[scrnon],0117h jne .notransph cmp word[scaddset],8202h jne .notransph mov word[scrnon],0116h.notransph test byte[scaddset],02h jnz near drawline16t cmp dword[coladdr],0 je .nocoladd test byte[scaddtype],3Fh jnz near drawline16t.nocoladd cmp byte[bgmode],7 je near processmode716b push esi push edi push ebx push edx push ebp ; calculate current video offset xor ebx,ebx mov bx,[curypos] mov esi,ebx shl esi,9 shl ebx,6 add esi,ebx add esi,32 add esi,[vidbuffer] mov [curvidoffset],esi ; do sprite windowing call makewindowsp ; set palette call setpalette16b ; clear back area w/ back color call clearback16b ; clear registers xor eax,eax xor ecx,ecx ; get current sprite table xor ebx,ebx mov bl,[curypos] shl ebx,9 add ebx,[spritetablea] mov [currentobjptr],ebx mov dword[cursprloc],sprleftpr ; setup priorities cmp byte[sprprifix],0 je .nosprprio mov dword[cursprloc],sprlefttot call preparesprpr.nosprprio; process backgrounds; do background 2 mov byte[curbgnum],02h mov ebp,01h call procbackgrnd; do background 1 mov byte[curbgnum],01h mov ebp,00h call procbackgrnd; do background 4 mov byte[curbgnum],08h mov ebp,03h call procbackgrnd; do background 3 mov byte[curbgnum],04h mov ebp,02h call procbackgrnd cmp byte[bgmode],1 ja near priority216b mov al,[winenabm] mov [cwinenabm],al mov byte[curbgpr],0h; do background 4 mov byte[curbgnum],08h mov ebp,03h call drawbackgrndmain16b; do background 3 mov byte[curbgnum],04h mov ebp,02h call drawbackgrndmain16b mov ebp,0 call procspritesmain16b mov byte[curbgpr],20h; do background 4 mov byte[curbgnum],08h mov ebp,03h call drawbackgrndmain16b; do background 3 cmp byte[bg3high2],1 je .bg3nothighb mov byte[curbgnum],04h mov ebp,02h call drawbackgrndmain16b.bg3nothighb mov ebp,1 call procspritesmain16b; do background 2 mov byte[curbgpr],0h mov byte[curbgnum],02h mov ebp,01h call drawbackgrndmain16b; do background 1 mov byte[curbgnum],01h mov ebp,00h call drawbackgrndmain16b mov ebp,2 call procspritesmain16b; do background 2 mov byte[curbgpr],20h mov byte[curbgnum],02h mov ebp,01h call drawbackgrndmain16b; do background 1 mov byte[curbgnum],01h mov ebp,00h call drawbackgrndmain16b mov ebp,3 call procspritesmain16b cmp byte[bg3high2],1 jne .bg3highb; do background 3 mov byte[curbgpr],20h mov byte[curbgnum],04h mov ebp,02h call drawbackgrndmain16b.bg3highb pop ebp pop edx pop ebx pop edi pop esi xor eax,eax xor ecx,ecxNEWSYM nodrawline16b retNEWSYM priority216b mov al,[winenabm] mov [cwinenabm],al; do background 2 mov byte[curbgpr],0h mov byte[curbgnum],02h mov ebp,01h call drawbackgrndmain16b mov ebp,0 call procspritesmain16b; do background 1 mov byte[curbgnum],01h mov ebp,00h call drawbackgrndmain16b mov ebp,1 call procspritesmain16b; do background 2 mov byte[curbgpr],20h mov byte[curbgnum],02h mov ebp,01h call drawbackgrndmain16b mov ebp,2 call procspritesmain16b; do background 1 mov byte[curbgnum],01h mov ebp,00h call drawbackgrndmain16b mov ebp,3 call procspritesmain16b cmp byte[bg3high2],1 pop ebp pop edx pop ebx pop edi pop esi xor eax,eax xor ecx,ecx retNEWSYM processmode716b mov al,[winenabm] mov [cwinenabm],al push esi push edi push ebx push edx push ebp ; get current sprite table xor ebx,ebx mov bl,[curypos] shl ebx,9 add ebx,[spritetablea] mov [currentobjptr],ebx ; setup priorities cmp byte[sprprifix],0 je .nosprprio mov dword[cursprloc],sprlefttot call preparesprpr.nosprprio ; calculate current video offset xor ebx,ebx mov bx,[curypos] mov esi,ebx shl esi,9 shl ebx,6 add esi,ebx add esi,32 add esi,[vidbuffer] mov [curvidoffset],esi ; do sprite windowing call makewindowsp ; set palette call setpalette16b ; clear back area w/ back color call clearback16b ; clear registers xor eax,eax xor ecx,ecx mov byte[extbgdone],0 ; mode 7 extbg test byte[interlval],40h jz near .noback0 test byte[scrndis],02h jnz near .noback0 ; do background 1 test word[scrnon],0202h jz near .noback0 mov byte[winon],0 test word[winenabm],0001h jz near .nobackwin0 test word[winenabm],0100h jnz near .nobackwin0 mov al,[winbg1en] call makewindow cmp byte[winon],0FFh je near .noback0.nobackwin0 mov byte[extbgdone],1 procmode716bextbg [bg1scroly_m7],[bg1scrolx_m7],1.noback0 ; do objects test byte[scrndis],10h jnz near .nosprites1 test word[scrnon],1010h jz near .nosprites1 cmp byte[winonsp],0FFh je .nosprites1 xor ebx,ebx mov bl,[curypos] mov cl,[sprleftpr+ebx] cmp byte[sprprifix],0 je .nosprprio2 mov cl,[sprlefttot+ebx].nosprprio2 cmp cl,0 je .nosprites1 mov ebp,0 call drawsprites16b.nosprites1 ; display mode7 test byte[interlval],40h jnz near .noback1 test byte[scrndis],01h jnz near .noback1 ; do background 1 test word[scrnon],0101h jz near .noback1 mov byte[winon],0 test word[winenabm],0001h jz near .nobackwin1 test word[winenabm],0100h jnz near .nobackwin1 mov al,[winbg1en] call makewindow cmp byte[winon],0FFh je near .noback1.nobackwin1 procmode716b [bg1scroly_m7],[bg1scrolx_m7],1.noback1 ; do objects
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -