📄 c4.asm
字号:
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 ; C,F,0,3,6,9 -> 6800 (E1h bytes) ; 0,3 = screen scroll coordinates ; 6,9 = light source coordinates ; C,F = angle of both arrays mov esi,[C4Ram] xor ecx,ecx.loopline ; process position xor eax,eax mov al,[esi+1F8Ch] or ecx,ecx jz .secondlineb mov al,[esi+1F8Fh].secondlineb test al,80h jz .notua or ah,1.notua movsx ebx,word[CosTable+eax*2] mov ax,word[SinTable+eax*2] shl eax,16 cmp ebx,0 je near .finish xor edx,edx test eax,80000000h jz .notnegline mov edx,0FFFFFFFFh.notnegline idiv ebx mov [C4Temp],eax xor edx,edx mov bx,[esi+1F83h] sub bx,[esi+1F89h] dec bx movsx ebx,bx.nextline test ebx,80000000h jnz .none mov eax,[C4Temp] imul eax,ebx sar eax,16 sub ax,[esi+1F80h] add ax,[esi+1F86h] inc ax add ax,cx cmp ax,0 jge .not0line xor ax,ax or ecx,ecx jz .not0line mov byte[esi+edx+$800],1.not0line cmp ax,255 jl .not255line mov ax,255.not255line jmp .doneline.none mov al,1 sub al,cl.doneline or ecx,ecx jnz .secondline mov [esi+edx+$800],al jmp .firstline.secondline mov [esi+edx+$900],al.firstline inc ebx inc edx cmp edx,0E1h jne .nextline or ecx,ecx jnz .finish mov ecx,1 jmp .loopline.finish mov cx,[C4Temp]; mov [C4values],cx mov cx,[C4Temp+2]; mov [C4values+2],cx mov cx,[esi+1F8Ch]; mov [C4values+4],cx mov cx,[esi+1F8Fh]; mov [C4values+6],cx 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 word[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] xor ecx,ecx 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; mov byte[debstop3],0 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; mov byte[debstop3],0 ret.bitmap call C4BitPlaneWave pop eax ret.calcdistanceEXTSYM C41FXVal,C41FYVal,C41FAngleRes,C41FDist,C4Op1F,C4Op15 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; mov byte[debstop3],0 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,byte[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.equatevelocityEXTSYM C41FDistVal,C4Op0D 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 word[esi+$1F89],ax mov ax,[esi+$1F83]; imul cx shl ax,4 mov word[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] xor ecx,ecx 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 retNEWSYM C4RegFunction add ecx,[C4Ram] mov [ecx],al sub ecx,[C4Ram] cmp ecx,1F4Fh je near C4activate retNEWSYM 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.C4MemcpyEXTSYM C4LoaDMem pushad push dword C4Ram call C4LoaDMem popad retSECTION .dataSinTable:dw $00000,$00192,$00324,$004B6,$00647,$007D9,$0096A,$00AFB,$00C8B,$00E1B,$00FABdw $01139,$012C8,$01455,$015E2,$0176D,$018F8,$01A82,$01C0B,$01D93,$01F19,$0209Fdw $02223,$023A6,$02528,$026A8,$02826,$029A3,$02B1F,$02C98,$02E11,$02F87,$030FBdw $0326E,$033DE,$0354D,$036BA,$03824,$0398C,$03AF2,$03C56,$03DB8,$03F17,$04073dw $041CE,$04325,$0447A,$045CD,$0471C,$04869,$049B4,$04AFB,$04C3F,$04D81,$04EBFdw $04FFB,$05133,$05269,$0539B,$054CA,$055F5,$0571D,$05842,$05964,$05A82,$05B9Ddw $05CB4,$05DC7,$05ED7,$05FE3,$060EC,$061F1,$062F2,$063EF,$064E8,$065DD,$066CFdw $067BD,$068A6,$0698C,$06A6D,$06B4A,$06C24,$06CF9,$06DCA,$06E96,$06F5F,$07023dw $070E2,$0719E,$07255,$07307,$073B5,$0745F,$07504,$075A5,$07641,$076D9,$0776Cdw $077FA,$07884,$07909,$0798A,$07A05,$07A7D,$07AEF,$07B5D,$07BC5,$07C29,$07C89dw $07CE3,$07D39,$07D8A,$07DD6,$07E1D,$07E5F,$07E9D,$07ED5,$07F09,$07F38,$07F62dw $07F87,$07FA7,$07FC2,$07FD8,$07FE9,$07FF6,$07FFD,$07FFF,$07FFD,$07FF6,$07FE9dw $07FD8,$07FC2,$07FA7,$07F87,$07F62,$07F38,$07F09,$07ED5,$07E9D,$07E5F,$07E1Ddw $07DD6,$07D8A,$07D39,$07CE3,$07C89,$07C29,$07BC5,$07B5D,$07AEF,$07A7D,$07A05dw $0798A,$07909,$07884,$077FA,$0776C,$076D9,$07641,$075A5,$07504,$0745F,$073B5dw $07307,$07255,$0719E,$070E2,$07023,$06F5F,$06E96,$06DCA,$06CF9,$06C24,$06B4Adw $06A6D,$0698C,$068A6,$067BD,$066CF,$065DD,$064E8,$063EF,$062F2,$061F1,$060ECdw $05FE3,$05ED7,$05DC7,$05CB4,$05B9D,$05A82,$05964,$05842,$0571D,$055F5,$054CAdw $0539B,$05269,$05133,$04FFB,$04EBF,$04D81,$04C3F,$04AFB,$049B4,$04869,$0471Cdw $045CD,$0447A,$04325,$041CE,$04073,$03F17,$03DB8,$03C56,$03AF2,$0398C,$03824dw $036BA,$0354D,$033DE,$0326E,$030FB,$02F87,$02E11,$02C98,$02B1F,$029A3,$02826dw $026A8,$02528,$023A6,$02223,$0209F,$01F19,$01D93,$01C0B,$01A82,$018F8,$0176Ddw $015E2,$01455,$012C8,$01139,$00FAB,$00E1B,$00C8B,$00AFB,$0096A,$007D9,$00647dw $004B6,$00324,$00192dw $00000,$0FE6E,$0FCDC,$0FB4A,$0F9B9,$0F827,$0F696,$0F505,$0F375,$0F1E5,$0F055dw $0EEC7,$0ED38,$0EBAB,$0EA1E,$0E893,$0E708,$0E57E,$0E3F5,$0E26D,$0E0E7,$0DF61dw $0DDDD,$0DC5A,$0DAD8,$0D958,$0D7DA,$0D65D,$0D4E1,$0D368,$0D1EF,$0D079,$0CF05dw $0CD92,$0CC22,$0CAB3,$0C946,$0C7DC,$0C674,$0C50E,$0C3AA,$0C248,$0C0E9,$0BF8Ddw $0BE32,$0BCDB,$0BB86,$0BA33,$0B8E4,$0B797,$0B64C,$0B505,$0B3C1,$0B27F,$0B141dw $0B005,$0AECD,$0AD97,$0AC65,$0AB36,$0AA0B,$0A8E3,$0A7BE,$0A69C,$0A57E,$0A463dw $0A34C,$0A239,$0A129,$0A01D,$09F14,$09E0F,$09D0E,$09C11,$09B18,$09A23,$09931dw $09843,$0975A,$09674,$09593,$094B6,$093DC,$09307,$09236,$0916A,$090A1,$08FDDdw $08F1E,$08E62,$08DAB,$08CF9,$08C4B,$08BA1,$08AFC,$08A5B,$089BF,$08927,$08894dw $08806,$0877C,$086F7,$08676,$085FB,$08583,$08511,$084A3,$0843B,$083D7,$08377dw $0831D,$082C7,$08276,$0822A,$081E3,$081A1,$08163,$0812B,$080F7,$080C8,$0809Edw $08079,$08059,$0803E,$08028,$08017,$0800A,$08003,$08001,$08003,$0800A,$08017dw $08028,$0803E,$08059,$08079,$0809E,$080C8,$080F7,$0812B,$08163,$081A1,$081E3dw $0822A,$08276,$082C7,$0831D,$08377,$083D7,$0843B,$084A3,$08511,$08583,$085FBdw $08676,$086F7,$0877C,$08806,$08894,$08927,$089BF,$08A5B,$08AFC,$08BA1,$08C4Bdw $08CF9,$08DAB,$08E62,$08F1E,$08FDD,$090A1,$0916A,$09236,$09307,$093DC,$094B6dw $09593,$09674,$0975A,$09843,$09931,$09A23,$09B18,$09C11,$09D0E,$09E0F,$09F14dw $0A01D,$0A129,$0A239,$0A34C,$0A463,$0A57E,$0A69C,$0A7BE,$0A8E3,$0AA0B,$0AB36dw $0AC65,$0AD97,$0AECD,$0B005,$0B141,$0B27F,$0B3C1,$0B505,$0B64C,$0B797,$0B8E4dw $0BA33,$0BB86,$0BCDB,$0BE32,$0BF8D,$0C0E9,$0C248,$0C3AA,$0C50E,$0C674,$0C7DCdw $0C946,$0CAB3,$0CC22,$0CD92,$0CF05,$0D079,$0D1EF,$0D368,$0D4E1,$0D65D,$0D7DAdw $0D958,$0DAD8,$0DC5A,$0DDDD,$0DF61,$0E0E7,$0E26D,$0E3F5,$0E57E,$0E708,$0E893dw $0EA1E,$0EBAB,$0ED38,$0EEC7,$0F055,$0F1E5,$0F375,$0F505,$0F696,$0F827,$0F9B9dw $0FB4A,$0FCDC,$0FE6ECosTable:dw $07FFF,$07FFD,$07FF6,$07FE9,$07FD8,$07FC2,$07FA7,$07F87,$07F62,$07F38,$07F09dw $07ED5,$07E9D,$07E5F,$07E1D,$07DD6,$07D8A,$07D39,$07CE3,$07C89,$07C29,$07BC5dw $07B5D,$07AEF,$07A7D,$07A05,$0798A,$07909,$07884,$077FA,$0776C,$076D9,$07641dw $075A5,$07504,$0745F,$073B5,$07307,$07255,$0719E,$070E2,$07023,$06F5F,$06E96dw $06DCA,$06CF9,$06C24,$06B4A,$06A6D,$0698C,$068A6,$067BD,$066CF,$065DD,$064E8dw $063EF,$062F2,$061F1,$060EC,$05FE3,$05ED7,$05DC7,$05CB4,$05B9D,$05A82,$05964dw $05842,$0571D,$055F5,$054CA,$0539B,$05269,$05133,$04FFB,$04EBF,$04D81,$04C3Fdw $04AFB,$049B4,$04869,$0471C,$045CD,$0447A,$04325,$041CE,$04073,$03F17,$03DB8dw $03C56,$03AF2,$0398C,$03824,$036BA,$0354D,$033DE,$0326E,$030FB,$02F87,$02E11dw $02C98,$02B1F,$029A3,$02826,$026A8,$02528,$023A6,$02223,$0209F,$01F19,$01D93dw $01C0B,$01A82,$018F8,$0176D,$015E2,$01455,$012C8,$01139,$00FAB,$00E1B,$00C8Bdw $00AFB,$0096A,$007D9,$00647,$004B6,$00324,$00192,$00000,$0FE6E,$0FCDC,$0FB4Adw $0F9B9,$0F827,$0F696,$0F505,$0F375,$0F1E5,$0F055,$0EEC7,$0ED38,$0EBAB,$0EA1Edw $0E893,$0E708,$0E57E,$0E3F5,$0E26D,$0E0E7,$0DF61,$0DDDD,$0DC5A,$0DAD8,$0D958dw $0D7DA,$0D65D,$0D4E1,$0D368,$0D1EF,$0D079,$0CF05,$0CD92,$0CC22,$0CAB3,$0C946dw $0C7DC,$0C674,$0C50E,$0C3AA,$0C248,$0C0E9,$0BF8D,$0BE32,$0BCDB,$0BB86,$0BA33dw $0B8E4,$0B797,$0B64C,$0B505,$0B3C1,$0B27F,$0B141,$0B005,$0AECD,$0AD97,$0AC65dw $0AB36,$0AA0B,$0A8E3,$0A7BE,$0A69C,$0A57E,$0A463,$0A34C,$0A239,$0A129,$0A01Ddw $09F14,$09E0F,$09D0E,$09C11,$09B18,$09A23,$09931,$09843,$0975A,$09674,$09593dw $094B6,$093DC,$09307,$09236,$0916A,$090A1,$08FDD,$08F1E,$08E62,$08DAB,$08CF9dw $08C4B,$08BA1,$08AFC,$08A5B,$089BF,$08927,$08894,$08806,$0877C,$086F7,$08676dw $085FB,$08583,$08511,$084A3,$0843B,$083D7,$08377,$0831D,$082C7,$08276,$0822Adw $081E3,$081A1,$08163,$0812B,$080F7,$080C8,$0809E,$08079,$08059,$0803E,$08028dw $08017,$0800A,$08003dw $08001,$08003,$0800A,$08017,$08028,$0803E,$08059,$08079,$0809E,$080C8,$080F7,dw $0812B,$08163,$081A1,$081E3,$0822A,$08276,$082C7,$0831D,$08377,$083D7,$0843B,dw $084A3,$08511,$08583,$085FB,$08676,$086F7,$0877C,$08806,$08894,$08927,$089BF,dw $08A5B,$08AFC,$08BA1,$08C4B,$08CF9,$08DAB,$08E62,$08F1E,$08FDD,$090A1,$0916A,dw $09236,$09307,$093DC,$094B6,$09593,$09674,$0975A,$09843,$09931,$09A23,$09B18,dw $09C11,$09D0E,$09E0F,$09F14,$0A01D,$0A129,$0A239,$0A34C,$0A463,$0A57E,$0A69C,dw $0A7BE,$0A8E3,$0AA0B,$0AB36,$0AC65,$0AD97,$0AECD,$0B005,$0B141,$0B27F,$0B3C1,dw $0B505,$0B64C,$0B797,$0B8E4,$0BA33,$0BB86,$0BCDB,$0BE32,$0BF8D,$0C0E9,$0C248,dw $0C3AA,$0C50E,$0C674,$0C7DC,$0C946,$0CAB3,$0CC22,$0CD92,$0CF05,$0D079,$0D1EF,dw $0D368,$0D4E1,$0D65D,$0D7DA,$0D958,$0DAD8,$0DC5A,$0DDDD,$0DF61,$0E0E7,$0E26D,dw $0E3F5,$0E57E,$0E708,$0E893,$0EA1E,$0EBAB,$0ED38,$0EEC7,$0F055,$0F1E5,$0F375,dw $0F505,$0F696,$0F827,$0F9B9,$0FB4A,$0FCDC,$0FE6E,$00000,$00192,$00324,$004B6,dw $00647,$007D9,$0096A,$00AFB,$00C8B,$00E1B,$00FAB,$01139,$012C8,$01455,$015E2,dw $0176D,$018F8,$01A82,$01C0B,$01D93,$01F19,$0209F,$02223,$023A6,$02528,$026A8,dw $02826,$029A3,$02B1F,$02C98,$02E11,$02F87,$030FB,$0326E,$033DE,$0354D,$036BA,dw $03824,$0398C,$03AF2,$03C56,$03DB8,$03F17,$04073,$041CE,$04325,$0447A,$045CD,dw $0471C,$04869,$049B4,$04AFB,$04C3F,$04D81,$04EBF,$04FFB,$05133,$05269,$0539B,dw $054CA,$055F5,$0571D,$05842,$05964,$05A82,$05B9D,$05CB4,$05DC7,$05ED7,$05FE3,dw $060EC,$061F1,$062F2,$063EF,$064E8,$065DD,$066CF,$067BD,$068A6,$0698C,$06A6D,dw $06B4A,$06C24,$06CF9,$06DCA,$06E96,$06F5F,$07023,$070E2,$0719E,$07255,$07307,dw $073B5,$0745F,$07504,$075A5,$07641,$076D9,$0776C,$077FA,$07884,$07909,$0798A,dw $07A05,$07A7D,$07AEF,$07B5D,$07BC5,$07C29,$07C89,$07CE3,$07D39,$07D8A,$07DD6,dw $07E1D,$07E5F,$07E9D,$07ED5,$07F09,$07F38,$07F62,$07F87,$07FA7,$07FC2,$07FD8,dw $07FE9,$07FF6,$07FFDSECTION .text
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -