makevid.asm

来自「linux下的任天堂模拟器代码。供大家参考。」· 汇编 代码 · 共 3,364 行 · 第 1/5 页

ASM
3,364
字号
    mov [edi+ebx-6],ah.skipf2    shr eax,16    test al,0Fh    jz .skipg2    add al,ch    mov [edi+ebx-7],al.skipg2    test ah,0Fh    jz .skiph2    add ah,ch    mov [edi+ebx-8],ah.skiph2    add edx,8    mov esi,edx    dec cl    jnz near .loopobj    mov [currentobjptr],esi    retNEWSYM drawspriteswinon    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    cmp byte[winspdata+ebx-8+16],0    jne .skipa    add al,ch    mov [edi+ebx-8],al.skipa    test ah,0Fh    jz .skipb    cmp byte[winspdata+ebx-7+16],0    jne .skipb    add ah,ch    mov [edi+ebx-7],ah.skipb    shr eax,16    test al,0Fh    jz .skipc    cmp byte[winspdata+ebx-6+16],0    jne .skipc    add al,ch    mov [edi+ebx-6],al.skipc    test ah,0Fh    jz .skipd    cmp byte[winspdata+ebx-5+16],0    jne .skipd    add ah,ch    mov [edi+ebx-5],ah.skipd    mov eax,[esi+4]    test al,0Fh    jz .skipe    cmp byte[winspdata+ebx-4+16],0    jne .skipe    add al,ch    mov [edi+ebx-4],al.skipe    test ah,0Fh    jz .skipf    cmp byte[winspdata+ebx-3+16],0    jne .skipf    add ah,ch    mov [edi+ebx-3],ah.skipf    shr eax,16    test al,0Fh    jz .skipg    cmp byte[winspdata+ebx-2+16],0    jne .skipg    add al,ch    mov [edi+ebx-2],al.skipg    test ah,0Fh    jz .skiph    cmp byte[winspdata+ebx-1+16],0    jne .skiph    add ah,ch    mov [edi+ebx-1],ah.skiph    add edx,8    mov esi,edx    dec cl    jnz near .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    cmp byte[winspdata+ebx-1+16],0    jne .skipa2    add al,ch    mov [edi+ebx-1],al.skipa2    test ah,0Fh    jz .skipb2    cmp byte[winspdata+ebx-2+16],0    jne .skipb2    add ah,ch    mov [edi+ebx-2],ah.skipb2    shr eax,16    test al,0Fh    jz .skipc2    cmp byte[winspdata+ebx-3+16],0    jne .skipc2    add al,ch    mov [edi+ebx-3],al.skipc2    test ah,0Fh    jz .skipd2    cmp byte[winspdata+ebx-4+16],0    jne .skipd2    add ah,ch    mov [edi+ebx-4],ah.skipd2    mov eax,[esi+4]    test al,0Fh    jz .skipe2    cmp byte[winspdata+ebx-5+16],0    jne .skipe2    add al,ch    mov [edi+ebx-5],al.skipe2    test ah,0Fh    jz .skipf2    cmp byte[winspdata+ebx-6+16],0    jne .skipf2    add ah,ch    mov [edi+ebx-6],ah.skipf2    shr eax,16    test al,0Fh    jz .skipg2    cmp byte[winspdata+ebx-7+16],0    jne .skipg2    add al,ch    mov [edi+ebx-7],al.skipg2    test ah,0Fh    jz .skiph2    cmp byte[winspdata+ebx-8+16],0    jne .skiph2    add ah,ch    mov [edi+ebx-8],ah.skiph2    add edx,8    mov esi,edx    dec cl    jnz near .loopobj    mov [currentobjptr],esi    retNEWSYM drawspritesprio    cmp byte[sprclprio+ebp],0    je near .endobj    test byte[cwinenabm],10h    jz .drawnowin    cmp byte[winonsp],0    jne near drawspritespriowinon.drawnowin    cmp dword[sprsingle],1    je near .drawsingle    mov esi,[currentobjptr]    mov edi,[curvidoffset]    mov edx,esi    xor ebx,ebx.loopobj    test byte[esi+7],20h    jnz near .drawspriteflipx    mov bx,[esi]    push edx    mov ch,[esi+6]    mov dl,[esi+7]    and edx,03h    cmp edx,ebp    jne near .notprio    mov esi,[esi+2]    mov dl,[csprbit]    sprdrawa sprdrawpra    pop edx.nodrawspr    add edx,8    mov esi,edx    dec cl    jnz near .loopobj    rol byte[csprbit],1    cmp byte[csprbit],1    je near .clearcsprmem    ret.notprio    mov esi,[esi+2]    mov dl,[csprbit]    sprdrawa sprdrawpra2    pop edx    add edx,8    mov esi,edx    dec cl    jnz near .loopobj    rol byte[csprbit],1    cmp byte[csprbit],1    je near .clearcsprmem    ret.drawspriteflipx    mov bx,[esi]    push edx    mov ch,[esi+6]    mov dl,[esi+7]    and edx,03h    cmp edx,ebp    jne near .notpriof    mov esi,[esi+2]    mov dl,[csprbit]    sprdrawaf sprdrawpra    pop edx    add edx,8    mov esi,edx    dec cl    jnz near .loopobj    rol byte[csprbit],1    cmp byte[csprbit],1    je near .clearcsprmem.endobj    ret.notpriof    mov esi,[esi+2]    mov dl,[csprbit]    sprdrawaf sprdrawpra2    pop edx    add edx,8    mov esi,edx    dec cl    jnz near .loopobj    rol byte[csprbit],1    cmp byte[csprbit],1    je near .clearcsprmem    ret.clearcsprmem    xor eax,eax    mov ecx,64    mov edi,sprpriodata+16    rep stosd    ret.drawsingle    mov esi,[currentobjptr]    mov edi,[curvidoffset]    mov edx,ecx    and edx,0FFh    shl edx,3    sub edx,8    add edx,esi    mov esi,edx    xor ebx,ebx.loopobj2    test byte[esi+7],20h    jnz near .drawspriteflipx2    mov bx,[esi]    mov ch,[esi+6]    mov esi,[esi+2]    sprdrawa sprdrawprb    sub edx,8    mov esi,edx    dec cl    jnz near .loopobj2    ret.drawspriteflipx2    mov bx,[esi]    mov ch,[esi+6]    mov esi,[esi+2]    sprdrawaf sprdrawprb    sub edx,8    mov esi,edx    dec cl    jnz near .loopobj2    retNEWSYM drawspritespriowinon    cmp dword[sprsingle],1    je near .drawsingle    mov esi,[currentobjptr]    mov edi,[curvidoffset]    mov edx,esi    xor ebx,ebx.loopobj    test byte[esi+7],20h    jnz near .drawspriteflipx    mov bx,[esi]    push edx    mov ch,[esi+6]    mov dl,[esi+7]    and edx,03h    cmp edx,ebp    jne near .notprio    mov esi,[esi+2]    mov dl,[csprbit]    sprdrawa sprdrawpraw    pop edx.nodrawspr    add edx,8    mov esi,edx    dec cl    jnz near .loopobj    rol byte[csprbit],1    cmp byte[csprbit],1    je near .clearcsprmem    ret.notprio    mov esi,[esi+2]    mov dl,[csprbit]    sprdrawa sprdrawpra2    pop edx    add edx,8    mov esi,edx    dec cl    jnz near .loopobj    rol byte[csprbit],1    cmp byte[csprbit],1    je near .clearcsprmem    ret.drawspriteflipx    mov bx,[esi]    push edx    mov ch,[esi+6]    mov dl,[esi+7]    and edx,03h    cmp edx,ebp    jne near .notpriof    mov esi,[esi+2]    mov dl,[csprbit]    sprdrawaf sprdrawpraw    pop edx    add edx,8    mov esi,edx    dec cl    jnz near .loopobj    rol byte[csprbit],1    cmp byte[csprbit],1    je near .clearcsprmem.endobj    ret.notpriof    mov esi,[esi+2]    mov dl,[csprbit]    sprdrawaf sprdrawpra2    pop edx    add edx,8    mov esi,edx    dec cl    jnz near .loopobj    rol byte[csprbit],1    cmp byte[csprbit],1    je near .clearcsprmem    ret.clearcsprmem    xor eax,eax    mov ecx,64    mov edi,sprpriodata+16    rep stosd    ret.drawsingle    mov esi,[currentobjptr]    mov edi,[curvidoffset]    mov edx,ecx    and edx,0FFh    shl edx,3    sub edx,8    add edx,esi    mov esi,edx    xor ebx,ebx.loopobj2    test byte[esi+7],20h    jnz near .drawspriteflipx2    mov bx,[esi]    mov ch,[esi+6]    mov esi,[esi+2]    sprdrawa sprdrawprbw    sub edx,8    mov esi,edx    dec cl    jnz near .loopobj2    ret.drawspriteflipx2    mov bx,[esi]    mov ch,[esi+6]    mov esi,[esi+2]    sprdrawaf sprdrawprbw    sub edx,8    mov esi,edx    dec cl    jnz near .loopobj2    retSECTION .dataNEWSYM prfixobjl, db 0NEWSYM csprbit, db 1NEWSYM csprprlft, db 0SECTION .text;*******************************************************; Processes & Draws 8x8 tiles in 2, 4, & 8 bit mode;*******************************************************NEWSYM proc8x8    cmp byte[bgmode],5    je near proc16x8    ; ax = # of rows down    mov ebx,eax    shr eax,3    and eax,63    and ebx,07h    cmp byte[edi+eax],0    jne .nocachereq;.docache;    cmp byte[ccud],0;    jne .nocachereq    mov byte[edi+eax],1    cmp byte[curcolor],2    jne .no4b    ; cache 4-bit    call cachetile4b    jmp .nocachereq.no4b    cmp byte[curcolor],1    je .2b    ; cache 8-bit    call cachetile8b    jmp .nocachereq.2b    ; cache 2-bit    call cachetile2b.nocachereq    test edx,0100h    jz .tilexa    test al,20h    jz .tileya    ; bgptrd/bgptrc    mov ecx,[bgptrd]    mov [bgptrx1],ecx    mov ecx,[bgptrc]    mov [bgptrx2],ecx    jmp .skiptile.tileya    ; bgptrb/bgptra    mov ecx,[bgptrb]    mov [bgptrx1],ecx    mov ecx,[bgptr]    mov [bgptrx2],ecx    jmp .skiptile.tilexa    test al,20h    jz .tileya2    ; bgptrc/bgptrd    mov ecx,[bgptrc]    mov [bgptrx1],ecx    mov ecx,[bgptrd]    mov [bgptrx2],ecx    jmp .skiptile.tileya2    ; bgptra/bgptrb    mov ecx,[bgptr]    mov [bgptrx1],ecx    mov ecx,[bgptrb]    mov [bgptrx2],ecx.skiptile    ; set up edi & yadder to point to tile data    shl ebx,3    mov [yadder],ebx    and al,1Fh    mov edi,[vram]    mov ebx,eax    shl ebx,6    mov eax,[bgptrx1]    add edi,ebx    mov [temptile],edi    add edi,eax    ; dx = # of columns right    ; cx = bgxlim    mov eax,edx    shr edx,3    mov bl,[curypos]    and edx,1Fh    mov [temp],dl    and eax,07h    add dl,dl    add edi,edx    mov esi,eax    mov ebx,[tempcach]    mov edx,[temptile]    mov eax,[bgptrx2]    and eax,0FFFFh    add edx,eax    mov al,[temp]    mov ecx,[yadder]    mov ah,[bshifter]    ; fill up tempbuffer with pointer #s that point to cached video mem    ; to calculate pointer, get first byte    ; esi = pointer to video buffer    ; edi = pointer to tile data    ; ebx = cached memory    ; ecx = y adder    ; edx = secondary tile pointer    ; al = current x position    retNEWSYM proc16x8    ; ax = # of rows down    mov ebx,eax    shr eax,3    and ebx,07h    and eax,63    cmp byte[edi+eax],0    jne .nocachereq;    cmp byte[ccud],0;    jne .nocachereq    mov byte[edi+eax],1    cmp byte[curcolor],2    jne .no4b    ; cache 4-bit    call cachetile4b16x16    jmp .nocachereq.no4b    cmp byte[curcolor],1    je .2b    ; cache 8-bit    call cachetile8b16x16    jmp .nocachereq.2b    ; cache 2-bit    call cachetile2b16x16.nocachereq    test edx,0100h    jz .tilexa    test al,20h    jz .tileya    ; bgptrd/bgptrc    mov ecx,[bgptrd]    mov [bgptrx1],ecx    mov ecx,[bgptrc]    mov [bgptrx2],ecx    jmp .skiptile.tileya    ; bgptrb/bgptra    mov ecx,[bgptrb]    mov [bgptrx1],ecx    mov ecx,[bgptr]    mov [bgptrx2],ecx    jmp .skiptile.tilexa    test al,20h    jz .tileya2    ; bgptrc/bgptrd    mov ecx,[bgptrc]    mov [bgptrx1],ecx    mov ecx,[bgptrd]    mov [bgptrx2],ecx    jmp .skiptile.tileya2    ; bgptra/bgptrb    mov ecx,[bgptr]    mov [bgptrx1],ecx    mov ecx,[bgptrb]    mov [bgptrx2],ecx.skiptile    ; set up edi & yadder to point to tile data    shl ebx,3    mov [yadder],ebx    and al,1Fh    mov edi,[vram]    mov ebx,eax    shl ebx,6    mov eax,[bgptrx1]    add edi,ebx    mov [temptile],edi    add edi,eax    ; dx = # of columns right    ; cx = bgxlim    mov eax,edx    shr edx,3    mov bl,[curypos]    and edx,1Fh    mov [temp],dl    and eax,07h    add dl,dl    add edi,edx    mov esi,eax    mov ebx,[tempcach]    mov edx,[temptile]    mov eax,[bgptrx2]    and eax,0FFFFh    add edx,eax    mov al,[temp]    mov ecx,[yadder]    mov ah,[bshifter]    ; fill up tempbuffer with pointer #s that point to cached video mem    ; to calculate pointer, get first byte    ; esi = pointer to video buffer    ; edi = pointer to tile data    ; ebx = cached memory    ; ecx = y adder    ; edx = secondary tile pointer    ; al = current x position    retSECTION .bssNEWSYM drawn, resb 1NEWSYM curbgpr, resb 1    ; 00h = low priority, 20h = high prioritySECTION .text%macro drawpixel8b8x8 3    or %1,%1    jz %2    add %1,dh    mov [esi+%3],%1%2%endmacro%macro drawpixel8b8x8win 3    or %1,%1    jz %2    test byte[ebp+%3],0FFh    jnz %2    add %1,dh    mov [esi+%3],%1%2%endmacroSECTION .bssNEWSYM winptrref, resd 1SECTION .textNEWSYM draw8x8    cmp byte[osm2dis],1    je .osm2dis    cmp byte[bgmode],2    je near draw8x8offset.osm2dis    cmp byte[bgmode],5    jae near draw16x8    mov [temp],al    mov [bshifter],ah    mov eax,esi    mov [yadder],ecx    mov [tempcach],ebx    mov ebx,56    sub ebx,ecx    mov [yrevadder],ebx.retfromoffset    ; esi = pointer to video buffer    mov esi,[cwinptr]    sub esi,eax    mov [winptrref],esi    mov esi,[curvidoffset]    sub esi,eax           ; esi = [vidbuffer] + curypos * 288 + 16 - HOfs    cmp byte[curmosaicsz],1    je .nomosaic    mov esi,xtravbuf+16    mov ecx,64

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?