📄 c4.asm
字号:
C4Timer2 db 0SECTION .textNEWSYM C4VBlank retNEWSYM C4ProcessSprites push ecx push esi push edi push ebx push edx; call C4ProcessVectors; call C4Edit mov esi,[C4Ram] mov dword[C4count],8 mov cl,[esi+626h] mov byte[C4sprites],cl mov ecx,[C4sprites] shl ecx,2 mov dword[C4ObjDisp],ecx mov ecx,128; cmp byte[esi+65],50h; jne .noincdisp mov dword[C4count],32 sub ecx,[C4sprites].noincdisp add esi,[C4ObjDisp] ; Clear OAM to-be ram.next mov byte[esi+1],0E0h add esi,4 dec ecx jnz .next call C4ConvOAM pop edx pop ebx pop edi pop esi pop ecx retSECTION .dataNEWSYM SprValAdd, db 0C4Data dd 0C4sprites dd 0SECTION .textNEWSYM InitC4 pushad mov esi,[romdata] add esi,4096*1024 mov [C4Data],esi add dword[C4Data],128*1024 mov [C4RamR],esi mov [C4RamW],esi mov [C4Ram],esi add dword[C4RamW],8192*4 add dword[C4Ram],8192*8 mov ecx,8192.c4loop mov dword[esi],C4ReadReg mov dword[esi+8192*4],C4WriteReg mov dword[esi+8192*8],0 add esi,4 dec ecx jnz .c4loop mov esi,[C4RamW] mov dword[esi+1F4Fh*4],C4RegFunction mov esi,[C4Data] mov ecx,16*4096.c4loopb mov dword[esi],0 add esi,4 loop .c4loopb popad retC4ClearSpr: mov esi,ebx mov edi,eax; xor ecx,ecx; mov cx,[eax+1F44h]; sub cx,6000h; add eax,ecx shl ch,3.scloop2 mov cl,byte[C4SprPos] shl cl,2.scloop mov byte[edi],0 mov byte[edi+2000h],0 inc edi dec cl jnz .scloop dec ch jnz .scloop2 retC4SprBitPlane: mov edi,eax shl ebx,2.scloop3 mov ch,[C4SprPos] push esi.scloop4 push esi mov cl,8.loop mov dh,8 mov dl,80h mov eax,[esi].nextd test al,1 jz .not0 or byte[edi],dl.not0 test al,2 jz .not1 or byte[edi+1],dl.not1 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 .dataC4XXScale dw 0C4XYScale dw 0C4YXScale dw 0C4YYScale dw 0C4CXPos dw 0C4CYPos dw 0C4CXMPos dd 0C4CYMPos dd 0C4PCXMPos dd 0C4PCYMPos dd 0SECTION .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,byte[C4SprPos] shl cl,3 mov byte[C4SprPos+2],cl mov cl,byte[C4SprPos+1] shl cl,3 mov byte[C4SprPos+3],cl ; Calculate Positions ; (1-scale)*(pos/2) xor eax,eax mov al,[C4SprPos+2] shl eax,11 mov [C4PCXMPos],eax xor eax,eax mov al,[C4SprPos+3] shl eax,11 mov [C4PCYMPos],eax mov bx,[C4XXScale] xor eax,eax mov al,[C4SprPos+2] shr ax,1 imul bx shl edx,16 mov dx,ax sub [C4PCXMPos],edx mov bx,[C4YXScale] xor eax,eax mov al,[C4SprPos+3] shr ax,1 imul bx shl edx,16 mov dx,ax sub [C4PCXMPos],edx mov bx,[C4XYScale] xor eax,eax mov al,[C4SprPos+2] shr ax,1 imul bx shl edx,16 mov dx,ax sub [C4PCYMPos],edx mov bx,[C4YYScale] xor eax,eax mov al,[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 byte[C4CXPos],al.loop2 xor eax,eax mov al,[C4SprPos+2] mov ebx,[C4CXMPos] sar ebx,12 cmp ebx,eax jae near .blank xor eax,eax mov al,[C4SprPos+3] mov ebx,[C4CYMPos] sar ebx,12 cmp ebx,eax jae near .blank ; Get pixel value mov ebx,[C4CYMPos] xor eax,eax shr ebx,12 mov al,[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 xor ebx,ebx mov bx,[eax+1F8Fh] cmp bx,1000h ja .scaled mov bx,1000h.scaled mov [C4SprScale],ebx xor ebx,ebx mov bx,[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 xor eax,eax mov al,[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 xor ecx,ecx mov cl,[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 xor edx,edx mov dl,[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 xor ebx,ebx mov bl,[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 xor ebx,ebx mov bl,[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 xor ebx,ebx mov bl,[C4SprPos] add byte[C4SprPos+1],2 call C4SprBitPlane pop edi pop esi pop edx pop ebx pop ecx retC4SprDisintegrate: pushad mov dword[C4SprPtrInc],0 xor ebx,ebx mov bl,[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] xor ebx,ebx mov bx,[esi+1F86h] xor eax,eax mov al,[esi+1F89h] shr al,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -