makevid.asm
来自「linux下的任天堂模拟器代码。供大家参考。」· 汇编 代码 · 共 3,364 行 · 第 1/5 页
ASM
3,364 行
.clip mov edi,[dwinptrproc] xor eax,eax ; start drawing 1's from 0 to left cmp dl,0 je .nextdot2 mov al,dl inc al.nextdot2 xor byte[edi+eax],1 inc al cmp al,dh jb .nextdot2 xor byte[edi+eax],1 jmp .donextwin.outside cmp dl,dh jb .clip2 mov edi,[dwinptrproc] mov ecx,64.loopxor xor dword[edi],01010101h add edi,4 dec ecx jnz .loopxor jmp .donextwin.clip2 cmp dl,1 ja .nooutclip cmp dh,254 jae near .clipped.nooutclip mov edi,[dwinptrproc] xor eax,eax ; start drawing 1's from 0 to left.nextdoti xor byte[edi+eax],1 inc al cmp al,dl jb .nextdoti mov al,dh cmp al,255 je .nextdot4i inc al ; start drawing 1's from right to 255.nextdot3i xor byte[edi+eax],1 inc al jnz .nextdot3i.nextdot4i.donextwin mov edi,[dwinptrproc] mov ecx,64.loopxor2 xor dword[edi],01010101h add edi,4 dec ecx jnz .loopxor2 retSECTION .bssNEWSYM winonsp, resb 1SECTION .textNEWSYM makewindowsp mov al,[winobjen] mov byte[winonsp],0 test dword[winenabm],1010h jz near .finishwin ; upon entry, al = win enable bits cmp byte[disableeffects],1 je near .finishwin mov bl,al and bl,00001010b cmp bl,00001010b je near makedualwinsp cmp bl,0 je near .finishwin mov byte[winonsp],1 ; check if data matches previous data cmp al,[pwinspenab] jne .skipenab mov ebx,[winl1] cmp ebx,[pwinsptype] jne .skipenab2 mov dword[cwinptr],winspdata+16 mov al,[winonstype] mov [winonsp],al ret.skipenab mov [pwinspenab],al mov ebx,[winl1].skipenab2 mov [pwinsptype],ebx mov dl,[winl1] mov dh,[winr1] test al,00000010b jnz .win1 mov dl,[winl2] mov dh,[winr2] shr al,2.win1 test al,01h jnz near .outside cmp dl,254 je .clipped cmp dl,dh jb .clip.clipped mov byte[winonsp],0 mov byte[winonstype],0 ret.clip mov edi,winspdata+16 xor eax,eax ; start drawing 1's from 0 to left cmp dl,0 je .nextdot2.nextdot mov byte[edi+eax],0 inc al cmp al,dl jbe .nextdot.nextdot2 mov byte[edi+eax],1 inc al cmp al,dh jb .nextdot2 mov byte[edi+eax],1 cmp dh,255 je .nextdot4 ; start drawing 1's from right to 255.nextdot3 mov byte[edi+eax],0 inc al jnz .nextdot3.nextdot4 mov byte[winonsp],1 mov byte[winonstype],1 mov dword[cwinptr],winspdata+16 ret.outside cmp dl,dh jb .clip2 mov byte[winonsp],0FFh mov byte[winonstype],0FFh mov dword[cwinptr],winspdata+16 ret.clip2 cmp dl,1 ja .nooutclip cmp dh,254 jae near .clipped.nooutclip mov edi,winspdata+16 xor eax,eax ; start drawing 1's from 0 to left.nextdoti mov byte[edi+eax],1 inc al cmp al,dl jb .nextdoti.nextdot2i mov byte[edi+eax],0 inc al cmp al,dh jb .nextdot2i mov byte[edi+eax],0 cmp al,255 je .nextdot4i inc al ; start drawing 1's from right to 255.nextdot3i mov byte[edi+eax],1 inc al jnz .nextdot3i.nextdot4i mov byte[winonsp],1 mov byte[winonstype],1 mov dword[cwinptr],winspdata+16 ret.finishwin retNEWSYM makedualwinsp mov ecx,ebp shl cl,1 mov dl,[winlogicb] and dl,03h mov cl,dl mov byte[winonsp],1 ; check if data matches previous data cmp cl,[dualwinsp] jne .skipenab3 cmp al,[pwinspenab] jne .skipenab mov ebx,[winl1] cmp ebx,[pwinsptype] jne .skipenab2 mov dword[cwinptr],winspdata+16 mov al,[winonstype] mov [winonsp],al ret.skipenab3 mov [dualwinsp],cl.skipenab mov [pwinspenab],al mov ebx,[winl1].skipenab2 mov [pwinsptype],ebx mov dword[dwinptrproc],winspdata+16 mov dword[cwinptr],winspdata+16 mov byte[winonsp],1 mov byte[winonstype],1 jmp dualstartprocess; window logic dataSECTION .bssNEWSYM windowdata, resb 16NEWSYM numwin, resb 1NEWSYM multiwin, resb 1NEWSYM multiclip, resb 1NEWSYM multitype, resb 1SECTION .text; jmp .finishwin%macro procwindow 1 cmp byte[disableeffects],1 je near .finishwin mov al,%1 test al,00001010b jz near .finishwin mov esi,windowdata mov bl,al mov byte[winon],1 and bl,00001010b and al,00000101b mov byte[numwin],0 cmp bl,00001010b je near .multiwin mov byte[multiwin],0 test bl,00000010b jnz .win1 mov cl,[winl2] mov ch,[winr2] shr al,2 jmp .okaywin.win1 mov cl,[winl1] mov ch,[winr1] and al,01h.okaywin cmp ch,255 je .noinc inc ch.noinc test al,01h jnz .wininside cmp cl,ch jae .noinsidemask mov [esi],cl mov byte[esi+1],01h mov [esi+2],ch mov byte[esi+3],0FFh mov byte[numwin],2 jmp .finishwin.noinsidemask mov byte[winon],0 jmp .finishwin.wininside cmp cl,ch ja .nooutsidemask.nonotoutside cmp ch,254 jb .skipnodraw cmp cl,1 jbe .noinsidemask.skipnodraw mov byte[esi],0 mov byte[esi+1],01h mov [esi+2],cl mov byte[esi+3],0FFh mov [esi+4],ch mov byte[esi+5],01h mov byte[numwin],3 jmp .finishwin.nooutsidemask mov byte[esi],0 mov byte[esi+1],01h mov byte[numwin],1 jmp .finishwin ; ************** ; *Multiwindows* ; **************.multiwin mov byte[winon],0 mov byte[multiwin],0 mov [multiclip],al mov al,[winlogica] mov ecx,ebp shl ecx,1 shr al,cl and al,3h mov [multitype],al mov cl,[winl1] mov ch,[winr1] mov esi,windowdata cmp ch,255 je .noinc2 inc ch.noinc2 test byte[multiclip],01h jnz .wininside2 cmp cl,ch jae .nowina mov [esi],cl mov byte[esi+1],01h mov [esi+2],ch mov byte[esi+3],0FFh add esi,4 mov byte[numwin],2 jmp .secondwin.nowina mov cl,[winl2] mov ch,[winr2] mov al,[multiclip] shr al,2 jmp .okaywin.wininside2 cmp cl,ch ja .nooutsidemask2 cmp ch,254 jb .skipnodraw2 cmp cl,1 jbe .nooutsidemask2.skipnodraw2 mov byte[esi],0 mov byte[esi+1],01h mov [esi+2],cl mov byte[esi+3],0FFh mov [esi+4],ch mov byte[esi+5],01h mov byte[numwin],3 jmp .secondwin.nooutsidemask2 mov byte[esi],0 mov byte[esi+1],01h mov byte[numwin],1.secondwin mov byte[multiwin],1 mov byte[winon],1.finishwin%endmacroNEWSYM procspritessub 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 or cl,cl jz .nosprites call drawsprites.nosprites retNEWSYM procspritesmain 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 or cl,cl jz .nosprites call drawsprites.nosprites retSECTION .bssNEWSYM curbgnum, resb 1SECTION .textNEWSYM drawbackgrndsub 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 shl eax,5 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 draw8x8 cmp byte[drawn],33 jne .notalldrawn mov al,[curbgnum] or [alreadydrawn],al.notalldrawn jmp .noback.16x16 mov ecx,[bg1yaddval+ebp*4] call draw16x16 cmp byte[drawn],33 jne .notalldrawnb mov al,[curbgnum] or [alreadydrawn],al.notalldrawnb.noback retNEWSYM drawbackgrndmain 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 shl eax,5 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 draw8x8 cmp byte[drawn],33 jne .notalldrawn mov al,[curbgnum] or [alreadydrawn],al.notalldrawn jmp .noback.16x16 mov ecx,[bg1yaddval+ebp*4] call draw16x16 cmp byte[drawn],33 jne .notalldrawnb mov al,[curbgnum] or [alreadydrawn],al.notalldrawnb.noback retNEWSYM procbackgrnd mov esi,[colormodeofs] mov bl,[esi+ebp] cmp bl,0 je near .noback mov al,[curbgnum] mov ah,al test byte[scrndis],al jnz near .noback test [scrnon],ax jz near .noback push ebp shl ebp,6 mov edi,cachebg1 add edi,ebp pop ebp cmp bl,[curcolbg1+ebp] je .skipclearcache mov [curcolbg1+ebp],bl mov ax,[bg1ptr+ebp*2] mov [curbgofs1+ebp*2],ax call fillwithnothing.skipclearcache xor eax,eax mov [curcolor],bl mov ax,[bg1objptr+ebp*2] decideonmode add edx,eax xor eax,eax mov [tempcach],edx xor edx,edx mov ax,[bg1objptr+ebp*2] mov [curtileptr],ax mov ax,[bg1ptr+ebp*2] mov [bgptr],ax cmp ax,[curbgofs1+ebp*2] je .skipclearcacheb mov [curbgofs1+ebp*2],ax call fillwithnothing.skipclearcacheb mov ax,[bg1ptrb+ebp*2] mov [bgptrb],ax mov ax,[bg1ptrc+ebp*2] mov [bgptrc],ax mov ax,[bg1ptrd+ebp*2] mov [bgptrd],ax mov bl,[curbgnum] mov ax,[curypos] mov byte[curmosaicsz],1 test byte[mosaicon],bl jz .nomos mov bl,[mosaicsz] cmp bl,0 je .nomos inc bl mov [curmosaicsz],bl xor edx,edx xor bh,bh div bx xor edx,edx mul bx xor edx,edx mov dl,[mosaicsz] add ax,[MosaicYAdder+edx*2].nomos add ax,[bg1scroly+ebp*2] mov dx,[bg1scrolx+ebp*2] mov cl,[curbgnum] test byte[bgtilesz],cl jnz .16x16 call proc8x8 mov [bg1vbufloc+ebp*4],esi mov [bg1tdatloc+ebp*4],edi mov [bg1tdabloc+ebp*4],edx mov [bg1cachloc+ebp*4],ebx mov [bg1yaddval+ebp*4],ecx mov [bg1xposloc+ebp*4],eax ret.16x16 call proc16x16 mov [bg1vbufloc+ebp*4],esi mov [bg1tdatloc+ebp*4],edi mov [bg1tdabloc+ebp*4],edx mov [bg1cachloc+ebp*4],ebx mov [bg1yaddval+ebp*4],ecx mov [bg1xposloc+ebp*4],eax.noback retSECTION .bssNEWSYM nextprimode, resb 1NEWSYM cursprloc, resd 1NEWSYM curcolor, resb 1NEWSYM curtileptr, resw 1; esi = pointer to video buffer; edi = pointer to tile data; ebx = cached memory; al = current x positionNEWSYM bg1vbufloc, resd 1NEWSYM bg2vbufloc, resd 1NEWSYM bg3vbufloc, resd 1NEWSYM bg4vbufloc, resd 1NEWSYM bg1tdatloc, resd 1NEWSYM bg2tdatloc, resd 1NEWSYM bg3tdatloc, resd 1NEWSYM bg4tdatloc, resd 1NEWSYM bg1tdabloc, resd 1NEWSYM bg2tdabloc, resd 1NEWSYM bg3tdabloc, resd 1NEWSYM bg4tdabloc, resd 1NEWSYM bg1cachloc, resd 1NEWSYM bg2cachloc, resd 1NEWSYM bg3cachloc, resd 1NEWSYM bg4cachloc, resd 1NEWSYM bg1yaddval, resd 1NEWSYM bg2yaddval, resd 1NEWSYM bg3yaddval, resd 1NEWSYM bg4yaddval, resd 1NEWSYM bg1xposloc, resd 1NEWSYM bg2xposloc, resd 1NEWSYM bg3xposloc, resd 1NEWSYM bg4xposloc, resd 1NEWSYM alreadydrawn, resb 1SECTION .textNEWSYM fillwithnothing push edi xor eax,eax mov ecx,16.loop mov [edi],eax add edi,4 dec ecx jnz .loop pop edi ret
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?