📄 c4proc.asm
字号:
.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 + -