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

📄 c4.asm

📁 SFC游戏模拟器 snes9x 1.43 的原代码
💻 ASM
📖 第 1 页 / 共 4 页
字号:
    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    loop .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    xor eax,eax    mov al,[C4SprPos+2]    xor ecx,ecx    mov cl,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 esi,[C4SprPtr]    mov eax,[C4Ram]    xor ebx,ebx    mov bl,[C4SprPos]    call C4SprBitPlane    popad    retSECTION .data.scalex dd 0.scaley dd 0SECTION .textC4BitPlaneWave:    pushad    mov esi,[C4Ram]    mov dword[.temp],10h    xor eax,eax    mov al,[esi+1F83h]    mov dword[.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,080Eh.temp dd 0,0.waveptr dd 0;C4X1 dw 0;C4Y1 dw 0;C4Z1 dw 0;C4X2 dw 0;C4Y2 dw 0;C4Z2 dw 0;C4Col dw 0SECTION .textC4DrawLine:    pushad    ; transform both coordinates    push esi    mov ax,word[C4X1]    mov [C4WFXVal],ax    mov ax,word[C4Y1]    mov [C4WFYVal],ax    mov ax,word[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],alEXTSYM C4TransfWireFrame2    call C4TransfWireFrame2    mov ax,[C4WFXVal]    mov word[C4X1],ax    mov ax,[C4WFYVal]    mov word[C4Y1],ax    mov ax,word[C4X2]    mov [C4WFXVal],ax    mov ax,word[C4Y2]    mov [C4WFYVal],ax    mov ax,word[C4Z2]    mov [C4WFZVal],ax    call C4TransfWireFrame2    mov ax,[C4WFXVal]    mov word[C4X2],ax    mov ax,[C4WFYVal]    mov word[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    xor ecx,ecx    mov cx,[C4WFDist]    or ecx,ecx    jnz .not0    mov ecx,1.not0    movsx eax,word[C4WFXVal]    mov [C4X2],eax    movsx eax,word[C4WFYVal]    mov [C4Y2],eax    pop esi    ; render line.loop    ; plot pixel    cmp word[C4X1+1],0    jl near .noplot    cmp word[C4Y1+1],0    jl near .noplot    cmp word[C4X1+1],95    jg near .noplot    cmp word[C4Y1+1],95    jg near .noplot    xor eax,eax    mov dx,[C4Y1+1]    shr dx,3    mov ax,dx    shl ax,6    shl dx,8    sub dx,ax    mov ax,[C4X1+1]    shr ax,3    shl ax,4    add ax,dx    mov dx,[C4Y1+1]    and dx,07h    add dx,dx    add ax,dx    mov dl,07Fh    push ecx    mov cl,[C4X1+1]    and cl,07h    ror dl,cl    pop ecx    and byte[esi+eax+300h],dl    and byte[esi+eax+301h],dl    xor dl,0FFh    test byte[C4Col],1    jz .nocolor0    or byte[esi+eax+300h],dl.nocolor0    test byte[C4Col],2    jz .nocolor1    or byte[esi+eax+301h],dl.nocolor1.noplot    mov eax,[C4X2]    add [C4X1],eax    mov eax,[C4Y2]    add [C4Y1],eax    dec ecx    jnz near .loop    popad    retDrawWireFrame:    mov esi,[C4Ram]    mov edi,esi    xor ebx,ebx    mov bl,[esi+1F82h]    shl ebx,16    mov bx,[esi+1F80h]    add bx,bx    shr ebx,1    add ebx,[romdata]    mov edi,ebx    xor ecx,ecx    mov cl,[esi+295h].loop    xor eax,eax    mov al,[esi+1F82h]    shl eax,16    mov al,[edi+1]    mov ah,[edi+0]    mov edx,edi.nextprev    cmp ax,0FFFFh    jne .notprev    sub edx,5    mov al,[edx+3]    mov ah,[edx+2]    jmp .nextprev.notprev    add ax,ax    shr eax,1    add eax,[romdata]    xor edx,edx    mov dl,[esi+1F82h]    shl edx,16    mov dl,[edi+3]    mov dh,[edi+2];    mov [C4values+6],dx    add dx,dx    shr edx,1    add edx,[romdata]    xor ebx,ebx    mov bh,[eax]    mov bl,[eax+1]    mov [C4X1],ebx    mov bh,[eax+2]    mov bl,[eax+3]    mov [C4Y1],ebx    mov bh,[eax+4]    mov bl,[eax+5]    mov [C4Z1],ebx    mov bh,[edx]    mov bl,[edx+1]    mov [C4X2],ebx    mov bh,[edx+2]    mov bl,[edx+3]    mov [C4Y2],ebx    mov bh,[edx+4]    mov bl,[edx+5]    mov [C4Z2],ebx    mov al,[edi+4]    mov [C4Col],al    add edi,5    call C4DrawLine    dec ecx    jnz near .loop    retSECTION .dataC4X1 dd 0C4Y1 dd 0C4Z1 dd 0C4X2 dd 0C4Y2 dd 0C4Z2 dd 0C4Col dd 0SECTION .textWireFrameB:    pushad    ; 28EECA    ; 7F80 (3bytes) = pointer to data    ; 7F86-7F88 = rotation, 7F90 = scale (/7A?)    ; 6295 = # of lines, 7FA5 = ???    mov esi,[C4Ram]    add esi,300h    mov ecx,16*12*3.loop    mov dword[esi],0    add esi,4    loop .loop    call DrawWireFrame    mov esi,[C4Ram]    mov cx,[esi+1FA5h];    mov [C4values],cx;    mov cx,[esi+1F86h];    mov [C4values],cx;    mov cx,[esi+1F88h];    mov [C4values+2],cx;    mov cx,[esi+1F90h];    mov [C4values+4],cx    popad    retWireFrameB2:    pushad    call DrawWireFrame    popad    retC4WireFrame:EXTSYM C4WFXVal,C4WFYVal,C4WFX2Val,C4WFY2Val,C4CalcWireFrameEXTSYM C4WFDist,C4WFScale,C4TransfWireFrame,C4WFZVal    pushad    mov esi,[C4Ram]    mov ax,[esi+1F83h]    and ax,0FFh    mov [C4WFX2Val],ax;    mov [C4values],ax    mov ax,[esi+1F86h]    and ax,0FFh    mov [C4WFY2Val],ax;    mov [C4values+2],ax    mov ax,[esi+1F89h]    and ax,0FFh    mov [C4WFDist],ax;    mov [C4values+4],ax    mov ax,[esi+1F8Ch]    and ax,0FFh    mov [C4WFScale],ax;    mov [C4values+6],ax    ; transform vertices (MMX2 - 36 vertices, 54 lines)    xor ecx,ecx    mov cx,[esi+1F80h]    xor al,al.loop    mov ax,[esi+1]    mov [C4WFXVal],ax    mov ax,[esi+5]    mov [C4WFYVal],ax    mov ax,[esi+9]    mov [C4WFZVal],ax    push esi    push ecx    call C4TransfWireFrame    pop ecx    pop esi    ; Displace    mov ax,[C4WFXVal]    add ax,80h    mov [esi+1],ax    mov ax,[C4WFYVal]    add ax,50h    mov [esi+5],ax    add esi,10h    loop .loop    ; Uses 6001,6005,6600,6602,6605    mov esi,[C4Ram]    mov word[esi+$600],23    mov word[esi+$602],60h    mov word[esi+$605],40h    mov word[esi+$600+8],23    mov word[esi+$602+8],60h    mov word[esi+$605+8],40h    xor ecx,ecx    mov cx,[esi+0B00h]    mov edi,esi    add edi,0B02h.lineloop    xor eax,eax    mov al,[edi]    shl eax,4    add eax,[C4Ram]    mov bx,[eax+1]    mov [C4WFXVal],bx    mov bx,[eax+5]    mov [C4WFYVal],bx    xor eax,eax    mov al,[edi+1]    shl eax,4    add eax,[C4Ram]    mov bx,[eax+1]    mov [C4WFX2Val],bx    mov bx,[eax+5]    mov [C4WFY2Val],bx    push esi    push edi    push ecx    call C4CalcWireFrame    pop ecx    pop edi    pop esi    mov ax,[C4WFDist]    or ax,ax    jnz .yeswire    mov ax,1.yeswire    mov word[esi+$600],ax    mov ax,[C4WFXVal]    mov word[esi+$602],ax    mov ax,[C4WFYVal]    mov word[esi+$605],ax    add edi,2    add esi,8    dec ecx    jnz near .lineloop.done    popad    retC4Transform:    ; 7F81,4,7,9,A,B,0,1,D    pushad    mov esi,[C4Ram]    mov ax,word[esi+1F81h]    mov [C4WFXVal],ax    mov ax,word[esi+1F84h]    mov [C4WFYVal],ax    mov ax,word[esi+1F87h]    mov [C4WFZVal],ax    mov al,[esi+1F90h]    mov [C4WFScale],al    mov al,[esi+1F89h]    mov [C4WFX2Val],al    mov al,[esi+1F8Ah]    mov [C4WFY2Val],al    mov al,[esi+1F8Bh]    mov [C4WFDist],alEXTSYM C4TransfWireFrame2    call C4TransfWireFrame2    mov ax,[C4WFXVal]    mov word[esi+1F80h],ax    mov ax,[C4WFYVal]    mov word[esi+1F83h],ax    popad    retSECTION .dataC4SprPos dd 0C4SprScale dd 0C4SprScaleY dd 0C4SprScaler dd 0C4SprScalerY dd 0C4SprPtr dd 0C4SprPtrInc dd 0NEWSYM C4values, dd 0,0,0SECTION .textC4activate:    cmp ecx,1F4Fh    jne .noc4test    push esi    mov esi,[C4Ram]    cmp byte[esi+1F4Dh],0Eh    jne .befnoc4test    test al,0C3h    jnz .befnoc4test    shr al,2

⌨️ 快捷键说明

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