makevid.asm
来自「linux下的任天堂模拟器代码。供大家参考。」· 汇编 代码 · 共 3,364 行 · 第 1/5 页
ASM
3,364 行
SECTION .bssNEWSYM bg3draw, resb 1NEWSYM maxbr, resb 1SECTION .textNEWSYM blanker ; calculate current video offset push ebx push esi xor ebx,ebx mov bx,[curypos] mov esi,ebx shl esi,8 shl ebx,5 add esi,ebx add esi,16 add esi,[vidbuffer] mov bl,64.next mov dword[esi],0 add esi,4 dec bl jnz .next pop esi pop ebx retALIGN32SECTION .bssNEWSYM bg3high2, resd 1NEWSYM cwinenabm, resd 1SECTION .textNEWSYM drawline mov al,[winenabs] mov [cwinenabm],al mov byte[bg3high2],0 cmp byte[bgmode],1 jne .nohigh mov al,[bg3highst] mov [bg3high2],al.nohigh cmp byte[cbitmode],1 je near drawline16b mov al,[vidbright] cmp al,[maxbr] jbe .nochange mov [maxbr],al.nochange cmp byte[ForceNewGfxOff],0 jne .nonewgfx cmp byte[newengen],1 je near newengine8b.nonewgfx cmp byte[forceblnk],0 jne near blanker mov byte[alreadydrawn],0; cmp byte[curypos],70; jne .no; push ebx; mov bl,[winlogica]; mov [bg1sx],bl; pop ebx;.no push ebx xor ebx,ebx mov bl,[bgmode] shl bl,2 add ebx,colormodedef mov [colormodeofs],ebx pop ebx cmp byte[bgmode],7 je near processmode7 mov al,[scrnon] test [scrnon+1],al jz .nomainsub test byte[scrnon],10h jnz .nomainsub test byte[scrnon+1],10h jz .nomainsub mov al,[scrnon+1] xor al,0FFh and [scrnon],al.nomainsub 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,8 shl ebx,5 add esi,ebx add esi,16 add esi,[vidbuffer] mov [curvidoffset],esi ; clear video buffer mov edi,esi mov ecx,64 xor eax,eax rep stosd ; do sprite windowing call makewindowsp ; 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 ; clear registers xor eax,eax xor ecx,ecx; 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 priority2 test byte[scaddset],02h jz near .nosubsc; draw backgrounds mov byte[curbgpr],0h; do background 4 mov byte[curbgnum],08h mov ebp,03h call drawbackgrndsub; do background 3 mov byte[curbgnum],04h mov ebp,02h call drawbackgrndsub mov ebp,0 call procspritessub mov byte[curbgpr],20h; do background 4 mov byte[curbgnum],08h mov ebp,03h call drawbackgrndsub; do background 3 cmp byte[bg3high2],1 je .bg3nothigh mov byte[curbgnum],04h mov ebp,02h call drawbackgrndsub.bg3nothigh mov ebp,1 call procspritessub; do background 2 mov byte[curbgpr],0h mov byte[curbgnum],02h mov ebp,01h call drawbackgrndsub; do background 1 mov byte[curbgnum],01h mov ebp,00h call drawbackgrndsub mov ebp,2 call procspritessub; do background 2 mov byte[curbgpr],20h mov byte[curbgnum],02h mov ebp,01h call drawbackgrndsub; do background 1 mov byte[curbgnum],01h mov ebp,00h call drawbackgrndsub mov ebp,3 call procspritessub cmp byte[bg3high2],1 jne .bg3high; do background 3 mov byte[curbgpr],20h mov byte[curbgnum],04h mov ebp,02h call drawbackgrndsub.bg3high.nosubsc mov al,[winenabm] mov [cwinenabm],al mov byte[curbgpr],0h; do background 4 mov byte[curbgnum],08h mov ebp,03h call drawbackgrndmain; do background 3 mov byte[curbgnum],04h mov ebp,02h call drawbackgrndmain mov ebp,0 call procspritesmain mov byte[curbgpr],20h; do background 4 mov byte[curbgnum],08h mov ebp,03h call drawbackgrndmain; do background 3 cmp byte[bg3high2],1 je .bg3nothighb mov byte[curbgnum],04h mov ebp,02h call drawbackgrndmain.bg3nothighb mov ebp,1 call procspritesmain; do background 2 mov byte[curbgpr],0h mov byte[curbgnum],02h mov ebp,01h call drawbackgrndmain; do background 1 mov byte[curbgnum],01h mov ebp,00h call drawbackgrndmain mov ebp,2 call procspritesmain; do background 2 mov byte[curbgpr],20h mov byte[curbgnum],02h mov ebp,01h call drawbackgrndmain; do background 1 mov byte[curbgnum],01h mov ebp,00h call drawbackgrndmain mov ebp,3 call procspritesmain cmp byte[bg3high2],1 jne .bg3highb; do background 3 mov byte[curbgpr],20h mov byte[curbgnum],04h mov ebp,02h call drawbackgrndmain.bg3highb pop ebp pop edx pop ebx pop edi pop esi xor eax,eax xor ecx,ecxNEWSYM nodrawline retNEWSYM priority2 test byte[scaddset],02h jz near .nosubsc; do background 2 mov byte[curbgpr],0h mov byte[curbgnum],02h mov ebp,01h call drawbackgrndsub mov ebp,0 call procspritessub; do background 1 mov byte[curbgnum],01h mov ebp,00h call drawbackgrndsub mov ebp,1 call procspritessub; do background 2 mov byte[curbgpr],20h mov byte[curbgnum],02h mov ebp,01h call drawbackgrndsub mov ebp,2 call procspritessub; do background 1 mov byte[curbgnum],01h mov ebp,00h call drawbackgrndsub mov ebp,3 call procspritessub.nosubsc mov al,[winenabm] mov [cwinenabm],al; do background 2 mov byte[curbgpr],0h mov byte[curbgnum],02h mov ebp,01h call drawbackgrndmain mov ebp,0 call procspritesmain; do background 1 mov byte[curbgnum],01h mov ebp,00h call drawbackgrndmain mov ebp,1 call procspritesmain; do background 2 mov byte[curbgpr],20h mov byte[curbgnum],02h mov ebp,01h call drawbackgrndmain mov ebp,2 call procspritesmain; do background 1 mov byte[curbgnum],01h mov ebp,00h call drawbackgrndmain mov ebp,3 call procspritesmain pop ebp pop edx pop ebx pop edi pop esi xor eax,eax xor ecx,ecx retALIGN32SECTION .bssNEWSYM tempbuffer, resd 33NEWSYM currentobjptr, resd 1NEWSYM curmosaicsz, resd 1NEWSYM extbgdone, resb 1SECTION .textNEWSYM processmode7 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,8 shl ebx,5 add esi,ebx add esi,16 add esi,[vidbuffer] mov [curvidoffset],esi ; clear video buffer mov edi,esi mov ecx,64 xor eax,eax rep stosd ; do sprite windowing call makewindowsp ; clear registers xor eax,eax xor ecx,ecx mov byte[extbgdone],0 test byte[interlval],40h jz near .noback0 test byte[scrndis],02h jnz near .noback0 ; do background 1, extbg pr 0 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 ebp,0 mov al,[winbg1en] call makewindow cmp byte[winon],0FFh je near .noback0.nobackwin0 mov byte[extbgdone],1 procmode7extbg [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 drawsprites.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 ebp,0 mov al,[winbg1en] call makewindow cmp byte[winon],0FFh je near .noback1.nobackwin1 procmode7 [bg1scroly_m7],[bg1scrolx_m7],1.noback1 ; do objects test byte[scrndis],10h jnz near .nosprites2 test word[scrnon],1010h jz near .nosprites2 cmp byte[winonsp],0FFh je .nosprites2 xor ebx,ebx mov bl,[curypos] mov cl,[sprleftpr1+ebx] cmp byte[sprprifix],0 je .nosprprio3 mov cl,[sprlefttot+ebx].nosprprio3 cmp cl,0 je .nosprites2 mov ebp,1 call drawsprites.nosprites2 test byte[interlval],40h jz near .noback0b cmp byte[extbgdone],0 jne near .noback0b test byte[scrndis],02h jnz near .noback0b ; do background 1, extbg pr 0 test word[scrnon],0101h jz near .noback0b mov byte[winon],0 test word[winenabm],0001h jz near .nobackwin0b test word[winenabm],0100h jnz near .nobackwin0b mov ebp,0 mov al,[winbg1en] call makewindow cmp byte[winon],0FFh je near .noback0b.nobackwin0b mov byte[extbgdone],1 procmode7extbg [bg1scroly_m7],[bg1scrolx_m7],1.noback0b test byte[interlval],40h jz near .noback2 cmp byte[extbgdone],1 jne near .noback2 mov byte[winon],0 test word[winenabm],0001h jz near .nobackwin2 test word[winenabm],0100h jnz near .nobackwin2 mov ebp,0 mov al,[winbg1en] call makewindow cmp byte[winon],0FFh je near .noback2.nobackwin2 procmode7extbg2 [bg1scroly_m7],[bg1scrolx_m7],1.noback2 ; do objects test byte[scrndis],10h jnz near .nosprites3 test word[scrnon],1010h jz near .nosprites3 cmp byte[winonsp],0FFh je .nosprites3 xor ebx,ebx mov bl,[curypos] mov cl,[sprleftpr2+ebx] cmp byte[sprprifix],0 je .nosprprio4 mov cl,[sprlefttot+ebx].nosprprio4 cmp cl,0 je .nosprites3 mov ebp,2 call drawsprites.nosprites3 ; do objects test byte[scrndis],10h jnz near .nosprites4 test word[scrnon],1010h jz near .nosprites4 cmp byte[winonsp],0FFh je .nosprites4 xor ebx,ebx mov bl,[curypos] mov cl,[sprleftpr3+ebx] cmp byte[sprprifix],0 je .nosprprio5 mov cl,[sprlefttot+ebx].nosprprio5 cmp cl,0 je .nosprites4 mov ebp,3 call drawsprites.nosprites4 pop ebp pop edx pop ebx pop edi pop esi ret;*******************************************************; Processes & Draws 4-bit sprites;*******************************************************NEWSYM drawsprites cmp byte[sprprifix],1 je near drawspritesprio.returnfrompr test byte[cwinenabm],10h jz .drawnowin cmp byte[winonsp],0 jne near drawspriteswinon.drawnowin mov esi,[currentobjptr] mov edi,[curvidoffset] mov edx,esi xor ebx,ebx.loopobj test byte[esi+7],20h jnz near .drawspriteflipx mov bx,[esi] mov ch,[esi+6] mov esi,[esi+2] mov eax,[esi] test al,0Fh jz .skipa add al,ch mov [edi+ebx-8],al.skipa test ah,0Fh jz .skipb add ah,ch mov [edi+ebx-7],ah.skipb shr eax,16 test al,0Fh jz .skipc add al,ch mov [edi+ebx-6],al.skipc test ah,0Fh jz .skipd add ah,ch mov [edi+ebx-5],ah.skipd mov eax,[esi+4] test al,0Fh jz .skipe add al,ch mov [edi+ebx-4],al.skipe test ah,0Fh jz .skipf add ah,ch mov [edi+ebx-3],ah.skipf shr eax,16 test al,0Fh jz .skipg add al,ch mov [edi+ebx-2],al.skipg test ah,0Fh jz .skiph add ah,ch mov [edi+ebx-1],ah.skiph add edx,8 mov esi,edx dec cl jnz .loopobj mov [currentobjptr],esi ret.drawspriteflipx mov bx,[esi] mov ch,[esi+6] mov esi,[esi+2] mov eax,[esi] test al,0Fh jz .skipa2 add al,ch mov [edi+ebx-1],al.skipa2 test ah,0Fh jz .skipb2 add ah,ch mov [edi+ebx-2],ah.skipb2 shr eax,16 test al,0Fh jz .skipc2 add al,ch mov [edi+ebx-3],al.skipc2 test ah,0Fh jz .skipd2 add ah,ch mov [edi+ebx-4],ah.skipd2 mov eax,[esi+4] test al,0Fh jz .skipe2 add al,ch mov [edi+ebx-5],al.skipe2 test ah,0Fh jz .skipf2 add ah,ch
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?