⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c4proc.asm

📁 linux下的任天堂模拟器代码。供大家参考。
💻 ASM
📖 第 1 页 / 共 3 页
字号:
    test al,4    jz .not2    or byte[edi+16],dl.not2    test al,8    jz .not3    or byte[edi+17],dl.not3    shr eax,4    shr dl,1    dec dh    jnz .nextd    add esi,ebx    add edi,2    dec cl    jnz .loop    add edi,16    pop esi    add esi,4    dec ch    jnz .scloop4    pop esi    shl ebx,3    add esi,ebx    add edi,dword[C4SprPtrInc]    shr ebx,3    dec byte[C4SprPos+1]    jnz .scloop3.end    retSECTION .bssC4XXScale resw 1C4XYScale resw 1C4YXScale resw 1C4YYScale resw 1C4CXPos resw 1C4CYPos resw 1C4CXMPos resd 1C4CYMPos resd 1C4PCXMPos resd 1C4PCYMPos resd 1SECTION .textDoScaleRotate:    pushad    mov esi,eax    ; Calculate X scaler    mov ax,[esi+1F80h]    and eax,01FFh    mov ax,[CosTable+eax*2]    mov bx,[esi+1F8Fh]    test bx,8000h    jz .notover    mov bx,7FFFh.notover    imul bx    add ax,ax    adc dx,dx    mov [C4XXScale],dx    mov ax,[esi+1F80h]    and eax,01FFh    mov ax,[SinTable+eax*2]    imul bx    add ax,ax    adc dx,dx    mov [C4XYScale],dx    ; Calculate Y scaler    mov ax,[esi+1F80h]    and eax,01FFh    mov ax,[CosTable+eax*2]    mov bx,[esi+1F92h]    test bx,8000h    jz .notoverb    mov bx,7FFFh.notoverb    imul bx    add ax,ax    add dx,dx    mov [C4YYScale],dx    mov ax,[esi+1F80h]    and eax,01FFh    mov ax,[SinTable+eax*2]    imul bx    add ax,ax    adc dx,dx    neg dx    mov [C4YXScale],dx    cmp word[esi+1F80h],0    jne .effect    cmp word[esi+1F92h],1000h    jne .effect    mov word[C4YYScale],1000h    mov word[C4YXScale],0.effect    ; Calculate Pixel Resolution    mov cl,[C4SprPos]    shl cl,3    mov [C4SprPos+2],cl    mov cl,[C4SprPos+1]    shl cl,3    mov [C4SprPos+3],cl    ; Calculate Positions    ; (1-scale)*(pos/2)    movzx eax,byte[C4SprPos+2]    shl eax,11    mov [C4PCXMPos],eax    movzx eax,byte[C4SprPos+3]    shl eax,11    mov [C4PCYMPos],eax    mov bx,[C4XXScale]    movzx eax,byte[C4SprPos+2]    shr ax,1    imul bx    shl edx,16    mov dx,ax    sub [C4PCXMPos],edx    mov bx,[C4YXScale]    movzx eax,byte[C4SprPos+3]    shr ax,1    imul bx    shl edx,16    mov dx,ax    sub [C4PCXMPos],edx    mov bx,[C4XYScale]    movzx eax,byte[C4SprPos+2]    shr ax,1    imul bx    shl edx,16    mov dx,ax    sub [C4PCYMPos],edx    mov bx,[C4YYScale]    movzx eax,byte[C4SprPos+3]    shr ax,1    imul bx    shl edx,16    mov dx,ax    sub [C4PCYMPos],edx    ; Start loop    mov word[C4CYPos],0    xor edi,edi.loop    mov ecx,[C4PCXMPos]    mov [C4CXMPos],ecx    mov ecx,[C4PCYMPos]    mov [C4CYMPos],ecx    mov al,[C4SprPos+2]    mov [C4CXPos],al.loop2    movzx eax,byte[C4SprPos+2]    mov ebx,[C4CXMPos]    sar ebx,12    cmp ebx,eax    jae near .blank    movzx eax,byte[C4SprPos+3]    mov ebx,[C4CYMPos]    sar ebx,12    cmp ebx,eax    jae near .blank    ; Get pixel value    mov ebx,[C4CYMPos]    shr ebx,12    movzx eax,byte[C4SprPos+2]    mul ebx    mov ebx,[C4CXMPos]    shr ebx,12    add eax,ebx    mov ebx,[C4SprPtr]    test al,1    jnz .upperb    shr eax,1    add ebx,eax    mov al,[ebx]    jmp .lowerb.upperb    shr eax,1    add ebx,eax    mov al,[ebx]    shr al,4.lowerb    mov ebx,edi    shr ebx,1    add ebx,esi    test edi,1    jnz .upperb2    and al,0Fh    and byte[ebx+2000h],0F0h    or byte[ebx+2000h],al    jmp .done.upperb2    shl al,4    and byte[ebx+2000h],0Fh    or byte[ebx+2000h],al    jmp .done.blank    mov eax,edi    shr eax,1    add eax,esi    test edi,1    jnz .upper    and byte[eax+2000h],0F0h    jmp .done.upper    and byte[eax+2000h],0Fh.done    movsx eax,word[C4XXScale]    add [C4CXMPos],eax    movsx eax,word[C4XYScale]    add [C4CYMPos],eax    inc edi    dec byte[C4CXPos]    jne near .loop2    movsx eax,word[C4YXScale]    add [C4PCXMPos],eax    movsx eax,word[C4YYScale]    add [C4PCYMPos],eax    inc word[C4CYPos]    mov al,[C4SprPos+3]    cmp byte[C4CYPos],al    jne near .loop.noimage    popad    retDoScaleRotate2:    pushad    movzx ebx,word[eax+1F8Fh]    cmp bx,1000h    ja .scaled    mov bx,1000h.scaled    mov [C4SprScale],ebx    movzx ebx,word[eax+1F92h]    cmp bx,1000h    ja .scaledb    mov bx,1000h.scaledb    mov [C4SprScaleY],ebx    mov cl,[C4SprPos]    shl cl,3    mov ch,cl    xor ebx,ebx.leftovercheck    dec ch    add ebx,[C4SprScale].leftovercheckb    cmp ebx,1000h    jb .leftovercheck    sub ebx,1000h    dec cl    jz .donecheck    jmp .leftovercheckb.donecheck    shr ch,1    mov cl,ch    and ecx,0FFh    mov esi,ecx    mov cl,[C4SprPos+1]    shl cl,3    mov ch,cl    xor ebx,ebx.leftovercheckc    dec ch    add ebx,[C4SprScaleY].leftovercheckd    cmp ebx,1000h    jb .leftovercheckc    sub ebx,1000h    dec cl    jz .donecheckc    jmp .leftovercheckd.donecheckc    shr ch,1    mov cl,ch    and ecx,0FFh    push eax    movzx eax,byte[C4SprPos]    shl al,3    mul ecx    add esi,eax    pop eax    mov dword[C4SprScalerY],0    xor edi,edi    mov cl,[C4SprPos+1]    shl cl,3    mov [C4SprPos+3],cl.next    push esi    push edi    movzx ecx,byte[C4SprPos]    shl cl,3    mov ch,cl    mov dword[C4SprScaler],0    xor edx,edx.loop    mov edx,edi    shr edx,1    add edx,[C4SprPtr]    mov bl,[edx]    test esi,1    jz .notupper    shr bl,4.notupper    and bl,0Fh    mov edx,esi    shr edx,1    test esi,1    jz .notupperb    shl bl,4    or byte[eax+edx+2000h],bl    jmp .notlowerb.notupperb    or byte[eax+edx+2000h],bl.notlowerb    inc esi    mov ebx,[C4SprScale]    add dword[C4SprScaler],ebx    dec ch.nextcheck    cmp dword[C4SprScaler],1000h    jb near .loop    sub dword[C4SprScaler],1000h    inc edi    dec cl    jz .done    jmp .nextcheck.done    pop edi    pop esi    movzx edx,byte[C4SprPos]    shl dl,3    add esi,edx    mov ebx,[C4SprScaleY]    add dword[C4SprScalerY],ebx.nextcheckb    cmp dword[C4SprScalerY],1000h    jb near .next    sub dword[C4SprScalerY],1000h    add edi,edx    dec byte[C4SprPos+3]    jz .doneb    jmp .nextcheckb.doneb    popad    retC4SprScaleR:    push ecx    push ebx    push edx    push esi    push edi    mov dword[C4SprPtrInc],0    movzx ebx,byte[eax+1F42h]    shl ebx,16    mov bx,[eax+1F40h]    add bx,bx    shr ebx,1    add ebx,[romdata]    mov ch,[eax+1F8Ch]    shr ch,3    mov cl,[eax+1F89h]    shr cl,3    mov [C4SprPos],cx    mov [C4SprPtr],ebx    call C4ClearSpr    call DoScaleRotate    mov esi,eax    add esi,2000h    movzx ebx,byte[C4SprPos]    call C4SprBitPlane    pop edi    pop esi    pop edx    pop ebx    pop ecx    retC4SprRotateR:    push ecx    push ebx    push edx    push esi    push edi    xor ebx,ebx    mov ebx,600h    add ebx,[C4Ram]    mov [C4SprPtr],esi    mov ch,[eax+1F8Ch]    shr ch,3    mov cl,[eax+1F89h]    shr cl,3    add ch,2    mov [C4SprPos],cx    mov dword[C4SprPtrInc],64    mov [C4SprPtr],ebx    sub byte[C4SprPos+1],2    call C4ClearSpr    call DoScaleRotate    mov esi,eax    add esi,2000h    movzx ebx,byte[C4SprPos]    add byte[C4SprPos+1],2    call C4SprBitPlane    pop edi    pop esi    pop edx    pop ebx    pop ecx    retC4SprDisintegrate:    pushad    mov dword[C4SprPtrInc],0    movzx ebx,byte[eax+1F42h]    shl ebx,16    mov bx,[eax+1F40h]    add bx,bx    shr ebx,1    add ebx,[romdata]    mov ch,[eax+1F8Ch]    shr ch,3    mov cl,[eax+1F89h]    shr cl,3    mov [C4SprPos],cx    mov [C4SprPtr],ebx    call C4ClearSpr    mov esi,[C4Ram]    movzx ebx,word[esi+1F86h]    movzx eax,byte[esi+1F89h]    shr al,1    mul ebx    neg eax    movzx ebx,byte[esi+1F89h]    shr bl,1    shl ebx,8    add eax,ebx    push eax    movzx ebx,word[esi+1F8Fh]    movzx eax,byte[esi+1F8Ch]    shr al,1    mul ebx    neg eax    movzx ebx,byte[esi+1F8Ch]    shr bl,1    shl ebx,8    add ebx,eax    mov edx,ebx    pop ebx    mov esi,[C4Ram]    mov cl,[esi+1F89h]    mov ch,[esi+1F8Ch]    mov [C4SprPos+2],cx    movsx eax,word[esi+1F86h]    mov [.scalex],eax    movsx eax,word[esi+1F8Fh]    mov [.scaley],eax    mov esi,[C4SprPtr]    mov edi,[C4Ram]    add edi,2000h    ; convert to 8-bit bitmap    mov cx,[C4SprPos+2]    shr cl,1.loop2    mov al,[esi]    mov [edi],al    mov al,[esi]    shr al,4    mov [edi+1],al    inc esi    add edi,2    dec cl    jnz .loop2    dec ch    jnz .loop2    mov edi,[C4Ram]    add edi,4000h    mov ecx,2000h.lp    mov byte[edi],0    inc edi    dec ecx    jnz .lp    mov esi,[C4Ram]    add esi,2000h    mov edi,[C4Ram]    add edi,4000h    mov cx,[C4SprPos+2].next2    push ebx.next    xor eax,eax    mov ah,[C4SprPos+2]    cmp ebx,eax    jae .fail    xor eax,eax    mov ah,[C4SprPos+3]    cmp edx,eax    jae .fail    push ecx    push edx    movzx eax,byte[C4SprPos+2]    movzx ecx,dh    mul ecx    mov ecx,ebx    shr ecx,8    add eax,ecx    mov dl,[esi]    cmp eax,2000h    jae .skipdisi    mov [edi+eax],dl.skipdisi    pop edx    pop ecx.fail    inc esi    add ebx,[.scalex]    dec cl    jnz near .next    pop ebx    add edx,[.scaley]    mov cl,[C4SprPos+2]    dec ch    jnz near .next2.skipall    ; convert to 4-bit bitmap    mov esi,[C4Ram]    add esi,4000h    mov edi,[C4Ram]    add edi,6000h    mov cx,[C4SprPos+2]    shr cl,1.loop    mov al,[esi]    mov [edi],al    mov al,[esi+1]    shl al,4    or [edi],al    inc edi    add esi,2    dec cl    jnz .loop    dec ch    jnz .loop    mov esi,[C4Ram]    add esi,6000h    mov eax,[C4Ram]    movzx ebx,byte[C4SprPos]    call C4SprBitPlane    popad    retSECTION .bss.scalex resd 1.scaley resd 1SECTION .textC4BitPlaneWave:    pushad    mov esi,[C4Ram]    mov dword[.temp],10h    movzx eax,byte[esi+1F83h]    mov [.waveptr],eax    mov word[.temp+4],0C0C0h    mov word[.temp+6],03F3Fh.bmloopb    mov edi,[C4Ram]    add edi,[.waveptr]    xor eax,eax    movsx ax,byte[edi+$0B00]    neg ax    sub ax,16    mov edi,[C4Ram]    add edi,0A00h    xor ecx,ecx.bmloopa    mov ebx,[.bmptr+ecx*4]    mov dx,[.temp+6]    and [esi+ebx],dx    xor dx,dx    cmp ax,0    jl .less    mov dx,0FF00h    cmp ax,8    jae .less    mov dx,[edi+eax*2].less    and dx,[.temp+4]    or [esi+ebx],dx    inc ax    inc ecx    cmp ecx,28h    jne .bmloopa    add dword[.waveptr],1    and dword[.waveptr],07Fh    ror word[.temp+4],2    ror word[.temp+6],2    cmp word[.temp+4],0C0C0h    jne near .bmloopb    add esi,16.bmloopa2b    mov edi,[C4Ram]    add edi,[.waveptr]    xor eax,eax    movsx ax,byte[edi+$0B00]    neg ax    sub ax,16    mov edi,[C4Ram]    add edi,0A00h    xor ecx,ecx.bmloopa2    mov ebx,[.bmptr+ecx*4]    mov dx,[.temp+6]    and [esi+ebx],dx    xor dx,dx    cmp ax,0    jl .less2    mov dx,0FF00h    cmp ax,8    jae .less2    mov dx,[edi+eax*2+16].less2    and dx,[.temp+4]    or [esi+ebx],dx    inc ax    inc ecx    cmp ecx,28h    jne .bmloopa2    add dword[.waveptr],1    and dword[.waveptr],07Fh    ror word[.temp+4],2    ror word[.temp+6],2    cmp word[.temp+4],0C0C0h    jne near .bmloopa2b    add esi,16    dec dword[.temp]    jnz near .bmloopb    mov esi,[C4Ram];    mov cx,[esi+1F80h];    mov [C4values],cx;    mov cx,[esi+1F83h];    mov [C4values+2],cx    popad    retSECTION .data.bmptr dd 0000h,0002h,0004h,0006h,0008h,000Ah,000Ch,000Eh       dd 0200h,0202h,0204h,0206h,0208h,020Ah,020Ch,020Eh       dd 0400h,0402h,0404h,0406h,0408h,040Ah,040Ch,040Eh       dd 0600h,0602h,0604h,0606h,0608h,060Ah,060Ch,060Eh       dd 0800h,0802h,0804h,0806h,0808h,080Ah,080Ch,080EhSECTION .bss.temp resd 2.waveptr resd 1SECTION .textC4DrawLine:    pushad    ; transform both coordinates    push esi    mov ax,[C4X1]    mov [C4WFXVal],ax    mov ax,[C4Y1]    mov [C4WFYVal],ax    mov ax,[C4Z1]    mov [C4WFZVal],ax    mov al,[esi+1F90h]    mov [C4WFScale],al    mov al,[esi+1F86h]    mov [C4WFX2Val],al    mov al,[esi+1F87h]    mov [C4WFY2Val],al    mov al,[esi+1F88h]    mov [C4WFDist],al    call C4TransfWireFrame2    mov ax,[C4WFXVal]    mov [C4X1],ax    mov ax,[C4WFYVal]    mov [C4Y1],ax    mov ax,[C4X2]    mov [C4WFXVal],ax    mov ax,[C4Y2]    mov [C4WFYVal],ax    mov ax,[C4Z2]    mov [C4WFZVal],ax    call C4TransfWireFrame2    mov ax,[C4WFXVal]    mov [C4X2],ax    mov ax,[C4WFYVal]    mov [C4Y2],ax    add word[C4X1],48    add word[C4Y1],48    add word[C4X2],48    add word[C4Y2],48    shl dword[C4X1],8    shl dword[C4X2],8    shl dword[C4Y1],8    shl dword[C4Y2],8    ; get line info    mov ax,[C4X1+1]    mov [C4WFXVal],ax    mov ax,[C4Y1+1]    mov [C4WFYVal],ax    mov ax,[C4X2+1]    mov [C4WFX2Val],ax    mov ax,[C4Y2+1]    mov [C4WFY2Val],ax    call C4CalcWireFrame    movzx ecx,word[C4WFDist]    or ecx,ecx    jnz .not0    mov ecx,1

⌨️ 快捷键说明

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