⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 makev16b.asm

📁 linux下的任天堂模拟器代码。供大家参考。
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;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 + -