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