📄 makev16t.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 cwinptr,dualstartprocess,dualwinbg,dualwinsp,dwinptrproc,pwinbgenabEXTSYM pwinbgtype,pwinspenab,pwinsptype,winbgdata,winlogicb,winonbtypeEXTSYM winonstype,winspdata,interlval,MMXSupport,bg1scrolx,bg1scroly,curmosaicszEXTSYM curypos,drawmode716t,makewindow,mode7set,mosaicon,mosaicsz,scrnonEXTSYM winbg1en,winenabm,drawmode716textbg,drawmode716textbg2,extbgdoneEXTSYM drawmode716tb,drawmode716b,drawmode716extbg,drawmode716extbg2,cursprlocEXTSYM drawsprites16b,scrndis,sprprifix,winonsp,bgfixer,bgfixer2,scaddtypeEXTSYM alreadydrawn,bg1cachloc,bg1tdabloc,bg1tdatloc,bg1vbufloc,bg1xposlocEXTSYM bg1yaddval,bgcoloradder,bgmode,bgtilesz,colormodeofs,curbgnumEXTSYM draw16x1616b,draw8x816b,drawn,winenabs,curbgpr,draw16x1616tms,ngptrdat2EXTSYM draw8x816tms,bg3high2,currentobjptr,curvidoffset,cwinenabm,makewindowspEXTSYM preparesprpr,procbackgrnd,setpalette16b,spritetablea,sprleftpr,sprlefttotEXTSYM numwin,scaddset,wincolen,windowdata,winl1,winl2,winon,winr1,winr2EXTSYM vidbuffer,coladdb,coladdg,coladdr,vesa2_bpos,vesa2_gpos,vesa2_rposEXTSYM vidbright,winptrref,fulladdtab,pal16b,vesa2_clbit,csprbit,sprclprioEXTSYM csprprlft,sprsingle,sprpriodata,pal16bcl,pal16bxcl,bgofwptr,bgsubbyEXTSYM bshifter,domosaic16b,temp,tempcach,temptile,tileleft16b,xtravbuf,yadderEXTSYM yrevadder,vcache2b,vcache4b,vcache8b,draw8x816boffset,osm2disEXTSYM hirestiledat,res512switch,bg1objptr,bg1ptr,bg3ptr,bg3scrolx,bg3scrolyEXTSYM vidmemch4,vram,ofsmcptr,ofsmady,ofsmadx,yposngom,flipyposngom,ofsmtptrEXTSYM ofsmmptr,ofsmcyps,bgtxadd,bg1ptrx,bg1ptry,a16x16xinc,a16x16yincEXTSYM bg1scrolx_m7,bg1scroly_m7,OMBGTestVal,Testval,cachesingle4bng,m7startyEXTSYM ofsmtptrs,ofsmcptr2,ofshvaladd%include "video/vidmacro.mac"; clearback16bts clearback16bdual;*******************************************************; DrawLine 16bit Transparent Draws the current line;*******************************************************; use curypos+bg1scroly for y location and bg1scrolx for x location; use bg1ptr(b,c,d) for the pointer to the tile number contents; use bg1objptr for the pointer to the object tile contentsSECTION .textNEWSYM makedualwincol mov dl,[winlogicb] shr dl,2 and dl,03h mov cl,dl mov byte[winon],1 mov ebx,[winl1] ; check if data matches previous sprite data cmp cl,[dualwinsp] jne .skipsprcheck cmp al,[pwinspenab] jne .skipsprcheck cmp ebx,[pwinsptype] jne .skipsprcheck mov dword[cwinptr],winspdata+16 mov al,[winonstype] mov [winon],al ret.skipsprcheck ; check if data matches previous data cmp cl,[dualwinbg] jne .skipenab3 cmp al,[pwinbgenab] jne .skipenab cmp ebx,[pwinbgtype] jne .skipenab2 mov dword[cwinptr],winbgdata+16 mov al,[winonbtype] mov [winon],al ret.skipenab3 mov [dualwinbg],cl.skipenab mov [pwinbgenab],al mov ebx,[winl1].skipenab2 mov [pwinbgtype],ebx mov dword[dwinptrproc],winbgdata+16 mov dword[cwinptr],winbgdata+16 mov byte[winon],1 mov byte[winonbtype],1 jmp dualstartprocessNEWSYM procmode716tsub test word[scrnon+1],01h jz near .noback1 test word[scrnon],01h jnz near .noback1 mov byte[winon],0 test word[winenabm],0001h jz near .nobackwin1 test word[winenabm],0100h jnz near .nobackwin1; procwindow [winbg1en] mov al,[winbg1en] mov ebp,0 call makewindow cmp byte[winon],0FFh je near .noback1.nobackwin1 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],1 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,[bg1scroly_m7] mov dx,[bg1scrolx_m7] call drawmode716t.noback1 retNEWSYM procmode716tsubextbg test word[scrnon+1],02h jz near .noback1 test word[scrnon],02h jnz near .noback1 mov byte[winon],0 test word[winenabm],0001h jz near .nobackwin1 test word[winenabm],0100h jnz near .nobackwin1; procwindow [winbg1en] mov al,[winbg1en] mov ebp,0 call makewindow cmp byte[winon],0FFh je near .noback1.nobackwin1 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],1 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,[bg1scroly_m7] mov dx,[bg1scrolx_m7] mov byte[extbgdone],1 call drawmode716extbg.noback1 retNEWSYM procmode716tsubextbgb cmp byte[extbgdone],0 jne near .noback1 test word[scrnon+1],01h jz near .noback1 test word[scrnon],01h jnz near .noback1 mov byte[winon],0 test word[winenabm],0001h jz near .nobackwin1 test word[winenabm],0100h jnz near .nobackwin1; procwindow [winbg1en] mov al,[winbg1en] mov ebp,0 call makewindow cmp byte[winon],0FFh je near .noback1.nobackwin1 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],1 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,[bg1scroly_m7] mov dx,[bg1scrolx_m7] mov byte[extbgdone],1 call drawmode716textbg.noback1 retNEWSYM procmode716tsubextbg2 cmp byte[extbgdone],0 je near .noback1 mov byte[winon],0 test word[winenabm],0001h jz near .nobackwin1 test word[winenabm],0100h jnz near .nobackwin1 mov al,[winbg1en] mov ebp,0 call makewindow cmp byte[winon],0FFh je near .noback1.nobackwin1 xor eax,eax xor edx,edx mov ax,[curypos] mov byte[curmosaicsz],1 test byte[mosaicon],1 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.noback1 retNEWSYM procmode716tmain test word[scrnon],01h jz near .noback1 mov byte[winon],0 test word[winenabm],0001h jz near .nobackwin1 test word[winenabm],0100h jnz near .nobackwin1; procwindow [winbg1en] mov al,[winbg1en] mov ebp,0 call makewindow cmp byte[winon],0FFh je near .noback1.nobackwin1 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],1 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,[bg1scroly_m7] mov dx,[bg1scrolx_m7] test byte[scaddset],02h jz .noscrnadd test word[scrnon+1],01h jnz near .mode7b.noscrnadd test byte[scaddtype],01h jz .notransp call drawmode716t.noback1 ret.notransp call drawmode716b ret.mode7b call drawmode716tb retNEWSYM procmode716tmainextbg test word[scrnon],02h jz near .noback1 mov byte[winon],0 test word[winenabm],0001h jz near .nobackwin1 test word[winenabm],0100h jnz near .nobackwin1; procwindow [winbg1en] mov al,[winbg1en] mov ebp,0 call makewindow cmp byte[winon],0FFh je near .noback1.nobackwin1 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],1 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,[bg1scroly_m7] mov dx,[bg1scrolx_m7] test byte[scaddtype],01h jz .notransp mov byte[extbgdone],1 call drawmode716textbg.noback1 ret.notransp mov byte[extbgdone],1 call drawmode716extbg retNEWSYM procmode716tmainextbgb cmp byte[extbgdone],0 jne near .noback1 test word[scrnon],01h jz near .noback1 mov byte[winon],0 test word[winenabm],0001h jz near .nobackwin1 test word[winenabm],0100h jnz near .nobackwin1; procwindow [winbg1en] mov al,[winbg1en] mov ebp,0 call makewindow cmp byte[winon],0FFh je near .noback1.nobackwin1 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],1 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,[bg1scroly_m7] mov dx,[bg1scrolx_m7] test byte[scaddtype],01h jz .notransp mov byte[extbgdone],1 call drawmode716textbg.noback1 ret.notransp mov byte[extbgdone],1 call drawmode716extbg retNEWSYM procmode716tmainextbg2 cmp byte[extbgdone],0 je near .noback1 mov byte[winon],0 test word[winenabm],0001h jz near .nobackwin1 test word[winenabm],0100h jnz near .nobackwin1; procwindow [winbg1en] mov al,[winbg1en] mov ebp,0 call makewindow cmp byte[winon],0FFh je near .noback1.nobackwin1 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],1 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,[bg1scroly_m7] mov dx,[bg1scrolx_m7] test byte[scaddtype],01h jz .notransp call drawmode716textbg2.noback1 ret.notransp call drawmode716extbg2 retNEWSYM procspritessub16t cmp byte[bgfixer],1 je near procspritessub16tfix cmp byte[bgfixer2],1 je near procspritessub16tfix 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 procspritesmain16t cmp byte[bgfixer],1 je near procspritesmain16tfix cmp byte[bgfixer2],1 je near procspritesmain16tfix 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 test byte[scrnon+1],10h jnz .spritesubmain test byte[scaddtype],10h jz .nospriteadd call drawsprites16t.nosprites ret.nospriteadd call drawsprites16b xor eax,eax ret.spritesubmain call drawsprites16bt retNEWSYM drawbackgrndsub16t cmp byte[bgfixer],1 je near drawbackgrndsub16tfix cmp byte[bgfixer2],1 je near drawbackgrndsub16tfix 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.noback ret.16x16 mov ecx,[bg1yaddval+ebp*4] call draw16x1616b cmp byte[drawn],33 jne .notalldrawnb mov al,[curbgnum] or [alreadydrawn],al.notalldrawnb retNEWSYM drawbackgrndmain16t cmp byte[bgfixer],1 je near drawbackgrndmain16tfix cmp byte[bgfixer2],1 je near drawbackgrndmain16tfix 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -