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