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

📄 c4proc.asm

📁 linux下的任天堂模拟器代码。供大家参考。
💻 ASM
📖 第 1 页 / 共 3 页
字号:
.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    mov dx,[C4Y1+1]    shr dx,3    movzx eax,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    movzx ebx,byte[esi+1F82h]    shl ebx,16    mov bx,[esi+1F80h]    add bx,bx    shr ebx,1    add ebx,[romdata]    mov edi,ebx    movzx ecx,byte[esi+295h].loop    movzx eax,byte[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]    movzx edx,byte[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]    movzx ebx,byte[eax+1]    mov bh,[eax]    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 .bssC4X1 resd 1C4Y1 resd 1C4Z1 resd 1C4X2 resd 1C4Y2 resd 1C4Z2 resd 1C4Col resd 1SECTION .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    dec ecx    jnz .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:    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)    movzx ecx,word[esi+1F80h].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    dec ecx    jnz .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    movzx ecx,word[esi+0B00h]    mov edi,esi    add edi,0B02h.lineloop    movzx eax,byte[edi]    shl eax,4    add eax,[C4Ram]    mov bx,[eax+1]    mov [C4WFXVal],bx    mov bx,[eax+5]    mov [C4WFYVal],bx    movzx eax,byte[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 [esi+$600],ax    mov ax,[C4WFXVal]    mov [esi+$602],ax    mov ax,[C4WFYVal]    mov [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,[esi+1F81h]    mov [C4WFXVal],ax    mov ax,[esi+1F84h]    mov [C4WFYVal],ax    mov ax,[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],al    call C4TransfWireFrame2    mov ax,[C4WFXVal]    mov [esi+1F80h],ax    mov ax,[C4WFYVal]    mov [esi+1F83h],ax    popad    retSECTION .bssC4SprPos resd 1C4SprScale resd 1C4SprScaleY resd 1C4SprScaler resd 1C4SprScalerY resd 1C4SprPtr resd 1C4SprPtrInc resd 1NEWSYM C4values, resd 3section .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    mov [esi+1F80h],al    pop esi    ret.befnoc4test    pop esi.noc4test    cmp al,00h    je near .dosprites    cmp al,01h    je near .dowireframe    cmp al,05h          ; ?    je near .propulsion    cmp al,0Dh          ; ?    je near .equatevelocity    cmp al,10h          ; supply angle+distance, return x/y displacement    je near .direction    cmp al,13h          ; Convert polar coordinates to rectangular 2 (similar to 10)    je near .polarcord2    cmp al,15h          ; ?    je near .calcdistance    cmp al,1Fh          ; supply x/y displacement, return angle (+distance?)    je near .calcangle    cmp al,22h          ; supply x/y displacement, return angle (+distance?)    je near .linearray    cmp al,25h    je near .multiply    cmp al,2Dh          ; ???    je near .transform    cmp al,40h    je near .sum    cmp al,54h    je near .square    cmp al,5Ch    je near .immediatereg    cmp al,89h    je near .immediaterom    ret.dowireframe    call WireFrameB    ret.linearray    pushad    call C4Op22    popad    ret.propulsion    pushad    ; 81 = 5B, 83 = 0x300    ; 0x300 = /1, 0x280 = /4    mov esi,[C4Ram]    mov cx,[esi+1F83h]    mov [C4values+2],cx    mov cx,[esi+1F81h]    mov [C4values],cx    xor bx,bx;    mov ax,256*256    xor ax,ax    mov dx,1    mov bx,[esi+1F83h]    or dx,dx    jz .done    idiv bx    mov [C4values+6],ax    mov bx,[esi+1F81h]    imul bx    shl edx,16    mov dx,ax    sar edx,8.done    mov [esi+1F80h],dx    mov [C4values+4],dx;    and eax,1FFh;    mov bx,[SinTable+eax*2];    mov ax,[esi+1F81h]          ; distance?;    imul bx;    mov ax,dx;    shl ax,1;    shl dx,3;    add dx,ax    popad    ret.polarcord2    pushad    mov esi,[C4Ram]    mov cx,[esi+1F80h]    and ecx,1FFh    movsx eax,word[esi+1F83h]    add eax,eax    movsx ebx,word[CosTable+ecx*2]    imul ebx,eax    sar ebx,8    adc ebx,0    mov [esi+1F86h],ebx    movsx ebx,word[SinTable+ecx*2]    imul ebx,eax    sar ebx,8    adc ebx,0    mov [esi+1F89h],bx    sar ebx,16    mov [esi+1F8Bh],bl    popad    ret.dosprites    push eax    mov eax,[C4Ram]    cmp byte[eax+1F4Dh],0    je near .sprites    cmp byte[eax+1F4Dh],3    je near .scaler    cmp byte[eax+1F4Dh],5    je near .lines    cmp byte[eax+1F4Dh],7    je near .rotater    cmp byte[eax+1F4Dh],8    je near .wireframeb    cmp byte[eax+1F4Dh],0Bh    je near .disintegrate    cmp byte[eax+1F4Dh],0Ch    je near .bitmap    pop eax    ret.wireframeb    pop eax    call WireFrameB2    ret.sprites    pop eax    call C4ProcessSprites    ret.disintegrate    call C4SprDisintegrate    pop eax    ret.dolines    ret.bitmap    call C4BitPlaneWave    pop eax    ret.calcdistance    pushad    mov esi,[C4Ram]    mov bx,[esi+1F80h]    mov [C41FXVal],bx    mov bx,[esi+1F83h]    mov [C41FYVal],bx;    mov eax,[C4Ram];    mov cx,[eax+1F80h];    mov [C4values+0],cx;    mov cx,[eax+1F83h];    mov [C4values+2],cx    call C4Op15    mov eax,[C4Ram]    mov bx,[C41FDist]    mov [eax+1F80h],bx;    mov word[eax+1F80h],50;    mov cx,[eax+1F80h];    mov [C4values+4],cx    popad    ret.calcangle    pushad    mov esi,[C4Ram]    mov bx,[esi+1F80h]    mov [C41FXVal],bx    mov bx,[esi+1F83h]    mov [C41FYVal],bx    call C4Op1F    mov eax,[C4Ram]    mov bx,[C41FAngleRes]    mov [eax+1F86h],bx;    mov esi,[C4Ram];    mov cx,[esi+1F86h];    mov [C4values],cx;    mov cx,[esi+1F80h];    mov [C4values+2],cx;    mov cx,[esi+1F83h];    mov [C4values+4],cx    popad    ret.transform    ; 7F81,4,7,9,A,B,0,1,D    pushad;    mov eax,[C4Ram]    call C4Transform;    mov word[eax+1F80h],0;    mov word[eax+1F83h],0    popad    ret.multiply    pushad    mov esi,[C4Ram]    mov eax,[esi+1F80h]    and eax,0FFFFFFh    mov ebx,[esi+1F83h]    and ebx,0FFFFFFh    imul eax,ebx    mov [esi+1F80h],eax    popad    ret.sum    pushad    xor eax,eax    xor ebx,ebx    mov esi,[C4Ram]    mov ecx,800h.sumloop    mov bl,[esi]    inc esi    add ax,bx    dec ecx    jnz .sumloop    mov [esi+1F80h-0800h],ax    popad    ret.square    pushad    xor edx,edx    mov esi,[C4Ram]    mov eax,[esi+1F80h]    shl eax,8    sar eax,8    imul eax    mov [esi+1F83h],eax    mov [esi+1F87h],dx    popad    ret.equatevelocity    pushad    mov esi,[C4Ram]    mov bx,[esi+1F80h]    mov [C41FXVal],bx    mov bx,[esi+1F83h]    mov [C41FYVal],bx    mov bx,[esi+1F86h]    mov [C41FDistVal],bx    call C4Op0D    mov bx,[C41FXVal]    mov [esi+1F89h],bx    mov bx,[C41FYVal]    mov [esi+1F8Ch],bx    popad    ret    pushad    mov esi,[C4Ram]    mov cx,[esi+$1F86]    cmp cx,40h    jb .nomult    shr cx,7.nomult    mov ax,[esi+$1F80];    imul cx    shl ax,4    mov [esi+$1F89],ax    mov ax,[esi+$1F83];    imul cx    shl ax,4    mov [esi+$1F8C],ax;    mov cx,[esi+$1F80];    mov [C4values],cx;    mov cx,[esi+$1F83];    mov [C4values+2],cx;    mov cx,[esi+$1F86];    mov [C4values+4],cx    popad    ret.lines    call C4WireFrame    pop eax    ret.scaler    push esi    push ecx    mov esi,[C4Ram];    mov cx,[esi+1F8Fh];    mov [C4values],cx;    mov cx,[esi+1F92h];    mov [C4values+2],cx;    mov cx,[esi+1F80h];    mov [C4values+4],cx    pop ecx    pop esi    call C4SprScaleR    pop eax    ret.rotater    push esi    push ecx    mov esi,[C4Ram];    mov cx,[esi+1F8Fh];    mov [C4values],cx;    mov cx,[esi+1F92h];    mov [C4values+2],cx;    mov cx,[esi+1F80h];    mov [C4values+4],cx    pop ecx    pop esi    call C4SprRotateR    pop eax    ret.direction    push eax    push ebx    push esi    push edx    push ecx    mov esi,[C4Ram]    mov ax,[esi+1F80h]    and eax,1FFh    mov bx,[CosTable+eax*2]    mov ax,[esi+1F83h]    imul bx    add ax,ax    adc dx,dx    mov ax,dx    movsx edx,dx    mov [esi+1F86h],edx    mov ax,[esi+1F80h]    and eax,1FFh    mov bx,[SinTable+eax*2]    mov ax,[esi+1F83h]    imul bx    add ax,ax    adc dx,dx    mov ax,dx    movsx edx,dx    mov eax,edx    sar eax,6    sub edx,eax    mov al,[esi+198Ch]    mov [esi+1F89h],edx    mov [esi+198Ch],al;    mov cx,[esi+1F80h];    mov [C4values],cx;    mov cx,[esi+1F83h];    mov [C4values+2],cx;    mov cx,[esi+1F86h];    mov [C4values+4],cx    pop ecx    pop edx    pop esi    pop ebx    pop eax    ret.immediaterom    push eax    mov eax,[C4Ram]    mov byte[eax+1F80h],36h    mov byte[eax+1F81h],43h    mov byte[eax+1F82h],05h    pop eax    ret.immediatereg    push eax    mov eax,[C4Ram]    mov dword[eax+0*4],0FF000000h    mov dword[eax+1*4],0FF00FFFFh    mov dword[eax+2*4],0FF000000h    mov dword[eax+3*4],00000FFFFh    mov dword[eax+4*4],00000FFFFh    mov dword[eax+5*4],07FFFFF80h    mov dword[eax+6*4],0FF008000h    mov dword[eax+7*4],07FFF007Fh    mov dword[eax+8*4],0FFFF7FFFh    mov dword[eax+9*4],0FF010000h    mov dword[eax+10*4],00100FEFFh    mov dword[eax+11*4],000FEFF00h    pop eax    retC4RegFunction:    add ecx,[C4Ram]    mov [ecx],al    sub ecx,[C4Ram]    cmp ecx,1F4Fh    je near C4activate    ret ;well, when 7f47 is written, copy the number of bytes specified in ;$7f43-4 from the address at $7f40-2 to the address at $7f45-6 ;(which is presumably in the $6000-$7fff range)NEWSYM C4ReadReg    add ecx,[C4Ram]    mov al,[ecx]    sub ecx,[C4Ram]    retNEWSYM C4WriteReg    add ecx,[C4Ram]    mov [ecx],al    sub ecx,[C4Ram]    cmp ecx,1F47h    je .C4Memcpy    ret.C4Memcpy    pushad    mov esi,[C4Ram]    movzx ecx,word[esi+1F43h] ;Num of bytes to copy    movzx eax,byte[esi+1F42h] ;Source bank    mov eax,[snesmmap+eax*4]    movzx edx,word[esi+1F40h]    add eax,edx    movzx edx,word[esi+1F45h] ;Destination    mov ebx,[C4Ram]    and edx,01FFFh    add ebx,edx.c4movloop    mov dl,[eax]    mov [ebx],dl    inc eax    inc ebx    dec ecx    jnz .c4movloop    popad    ret

⌨️ 快捷键说明

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