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