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