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 + -
显示快捷键?