📄 memory.asm
字号:
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
ret
C4SprScaleR:
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
ret
C4SprRotateR:
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
ret
C4SprDisintegrate:
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
mul ebx
neg eax
xor ebx,ebx
mov bl,[esi+1F89h]
shr bl,1
shl ebx,8
add eax,ebx
push eax
xor ebx,ebx
mov bx,[esi+1F8Fh]
xor eax,eax
mov al,[esi+1F8Ch]
shr al,1
mul ebx
neg eax
xor ebx,ebx
mov bl,[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
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
ret
.scalex dd 0
.scaley dd 0
C4BitPlaneWave:
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
ret
.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
C4DrawLine:
;C4X1 dw 0
;C4Y1 dw 0
;C4Z1 dw 0
;C4X2 dw 0
;C4Y2 dw 0
;C4Z2 dw 0
;C4Col dw 0
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],al
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
ret
DrawWireFrame:
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
ret
C4X1 dd 0
C4Y1 dd 0
C4Z1 dd 0
C4X2 dd 0
C4Y2 dd 0
C4Z2 dd 0
C4Col dd 0
WireFrameB:
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
ret
WireFrameB2:
pushad
call DrawWireFrame
popad
ret
C4WireFrame:
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -