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