makev16t.asm
来自「十七种模拟器源代码 非常有用的作课程设计不可缺少的」· 汇编 代码 · 共 3,137 行 · 第 1/5 页
ASM
3,137 行
;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 cwinptr,dualstartprocess,dualwinbg,dualwinsp,dwinptrproc,pwinbgenab
EXTSYM pwinbgtype,pwinspenab,pwinsptype,winbgdata,winlogicb,winonbtype
EXTSYM winonstype,winspdata,interlval,FPUCopy
EXTSYM bg1scrolx,bg1scroly,curmosaicsz,curypos,drawmode716t,makewindow
EXTSYM mode7set,mosaicon,mosaicsz,scrnon,winbg1en,winenabm
EXTSYM drawmode716textbg,drawmode716textbg2
EXTSYM extbgdone
EXTSYM drawmode716tb,drawmode716b,drawmode716extbg,drawmode716extbg2
EXTSYM cursprloc,drawsprites16b,scrndis,sprprifix,winonsp,bgfixer,bgfixer2
EXTSYM scaddtype
EXTSYM alreadydrawn,bg1cachloc,bg1tdabloc,bg1tdatloc,bg1vbufloc,bg1xposloc
EXTSYM bg1yaddval,bgcoloradder,bgmode,bgtilesz,colormodeofs,curbgnum
EXTSYM draw16x1616b,draw8x816b,drawn,winenabs
EXTSYM curbgpr,draw16x1616tms,draw8x816tms
EXTSYM bg3high2,currentobjptr,curvidoffset,cwinenabm,makewindowsp
EXTSYM preparesprpr,procbackgrnd,setpalette16b,spritetablea
EXTSYM sprleftpr,sprlefttot
EXTSYM numwin,scaddset,wincolen,windowdata,winl1,winl2
EXTSYM winon,winr1,winr2
EXTSYM vidbuffer
EXTSYM FPUZero,coladdb,coladdg,coladdr,vesa2_bpos,vesa2_gpos,vesa2_rpos
EXTSYM vidbright
EXTSYM winptrref
EXTSYM fulladdtab,pal16b,vesa2_clbit
EXTSYM csprbit
EXTSYM sprclprio
EXTSYM csprprlft,sprsingle,sprpriodata
EXTSYM pal16bcl,pal16bxcl
EXTSYM bgofwptr,bgsubby,bshifter,domosaic16b,temp,tempcach,temptile
EXTSYM tileleft16b,xtravbuf,yadder
EXTSYM yrevadder,vcache2b,vcache4b,vcache8b
EXTSYM vcache2ba,vcache4ba,vcache8ba,draw8x816boffset
EXTSYM osm2dis,draw16x816
EXTSYM hirestiledat,res512switch
EXTSYM bg1objptr,bg1ptr,bg1ptrc,bg3ptr,bg3scrolx,bg3scroly,cachesingle
EXTSYM colormoded2,offsetenab,offsetmclr,offsetmcol,offsetmodeptr
EXTSYM offsetmptr,offsetmshl,offsetmtst,offsetptra,offsetptrb,posyscroll
EXTSYM prevoffsetdat,prevtempcache,tempoffset,vidmemch2,vidmemch4
EXTSYM vidmemch8,vram
EXTSYM ofsmcptr,ofsmady,ofsmadx,yposng,yposngom,flipyposng,flipyposngom
EXTSYM ofsmtptr,ofsmmptr,ofsmcyps,bgtxadd,bg1ptrx,bg1ptry
EXTSYM a16x16xinc,a16x16yinc
NEWSYM MakeV16TAsmStart
%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 contents
NEWSYM 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 dualstartprocess
NEWSYM 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]
test byte[mode7set],02h
jz .noflip
mov ax,261
sub ax,[curypos]
dec ax
.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
add ax,[bg1scroly]
mov dx,[bg1scrolx]
call drawmode716t
.noback1
ret
NEWSYM 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]
test byte[mode7set],02h
jz .noflip
mov ax,261
sub ax,[curypos]
dec ax
.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
add ax,[bg1scroly]
mov dx,[bg1scrolx]
mov byte[extbgdone],1
call drawmode716extbg
.noback1
ret
NEWSYM 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]
test byte[mode7set],02h
jz .noflip
mov ax,261
sub ax,[curypos]
dec ax
.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
add ax,[bg1scroly]
mov dx,[bg1scrolx]
mov byte[extbgdone],1
call drawmode716textbg
.noback1
ret
NEWSYM 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
ret
NEWSYM 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]
test byte[mode7set],02h
jz .noflip
mov ax,261
sub ax,[curypos]
dec ax
.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
add ax,[bg1scroly]
mov dx,[bg1scrolx]
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
ret
NEWSYM 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]
test byte[mode7set],02h
jz .noflip
mov ax,261
sub ax,[curypos]
dec ax
.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
add ax,[bg1scroly]
mov dx,[bg1scrolx]
test byte[scaddtype],01h
jz .notransp
mov byte[extbgdone],1
call drawmode716textbg
.noback1
ret
.notransp
mov byte[extbgdone],1
call drawmode716extbg
ret
NEWSYM 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]
test byte[mode7set],02h
jz .noflip
mov ax,261
sub ax,[curypos]
dec ax
.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
add ax,[bg1scroly]
mov dx,[bg1scrolx]
test byte[scaddtype],01h
jz .notransp
mov byte[extbgdone],1
call drawmode716textbg
.noback1
ret
.notransp
mov byte[extbgdone],1
call drawmode716extbg
ret
NEWSYM 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]
test byte[mode7set],02h
jz .noflip
mov ax,261
sub ax,[curypos]
dec ax
.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
add ax,[bg1scroly]
mov dx,[bg1scrolx]
test byte[scaddtype],01h
jz .notransp
call drawmode716textbg2
.noback1
ret
.notransp
call drawmode716extbg2
ret
NEWSYM 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
ret
NEWSYM 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
ret
NEWSYM 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 byte[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
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?