250 lines
3.5 KiB
NASM
250 lines
3.5 KiB
NASM
include clink.inc
|
|
code SEGMENT para public 'CODE'
|
|
ASSUME cs:code
|
|
|
|
.386
|
|
|
|
MAXDOTS equ 1024
|
|
|
|
BOTTOM equ 8000
|
|
|
|
public _gravitybottom
|
|
_gravitybottom dw BOTTOM
|
|
|
|
public _bpmin,_bpmax
|
|
_bpmin dw 30000
|
|
_bpmax dw -30000
|
|
|
|
public _gravity
|
|
_gravity dw 0
|
|
|
|
public _dotnum
|
|
_dotnum dw 0
|
|
|
|
public _gravityd
|
|
_gravityd dw 16
|
|
|
|
dw -1280
|
|
dw -960
|
|
dw -640
|
|
dw -320
|
|
public _rows
|
|
_rows dw 200 dup(0)
|
|
|
|
public _dot
|
|
_dot LABEL WORD
|
|
dot dw MAXDOTS dup(0,0,0,0,0,0,0,0) ;x,y,z,oldposshadow,oldpos,-,-,-
|
|
|
|
public _rotsin,_rotcos
|
|
_rotsin dw 0
|
|
_rotcos dw 0
|
|
|
|
public _bgpic
|
|
_bgpic dw 0,0
|
|
|
|
public _depthtable1,_depthtable2,_depthtable3,_depthtable4
|
|
_depthtable1 dd 128 dup(0)
|
|
_depthtable2 dd 128 dup(0)
|
|
_depthtable3 dd 128 dup(0)
|
|
_depthtable4 dd 128 dup(0)
|
|
|
|
public _drawdots
|
|
_drawdots PROC FAR
|
|
CBEG
|
|
mov ax,0a000h
|
|
mov es,ax
|
|
mov ax,cs
|
|
mov ds,ax
|
|
mov fs,cs:_bgpic[2]
|
|
mov cx,cs:_dotnum
|
|
mov si,OFFSET dot
|
|
@@1: push cx
|
|
|
|
mov ax,ds:[si+0] ;X
|
|
imul ds:_rotsin
|
|
mov ax,ax
|
|
mov cx,dx
|
|
mov ax,ds:[si+4] ;Z
|
|
imul ds:_rotcos
|
|
sub ax,bx
|
|
sub dx,cx
|
|
mov bp,dx
|
|
add bp,9000
|
|
|
|
mov ax,ds:[si+0] ;X
|
|
imul ds:_rotcos
|
|
mov bx,ax
|
|
mov cx,dx
|
|
mov ax,ds:[si+4] ;Z
|
|
imul ds:_rotsin
|
|
add ax,bx
|
|
adc dx,cx
|
|
shrd ax,dx,8
|
|
sar dx,8
|
|
|
|
mov bx,ax
|
|
mov cx,dx
|
|
shrd ax,dx,3
|
|
sar dx,3
|
|
add ax,bx
|
|
adc dx,cx
|
|
|
|
idiv bp
|
|
add ax,160
|
|
push ax
|
|
cmp ax,319
|
|
ja @@2
|
|
|
|
;shadow
|
|
|
|
xor ax,ax
|
|
mov dx,8
|
|
idiv bp
|
|
add ax,100
|
|
cmp ax,199
|
|
ja @@2
|
|
mov bx,ax
|
|
shl bx,1
|
|
mov bx,ds:_rows[bx]
|
|
pop ax
|
|
add bx,ax
|
|
push ax
|
|
|
|
mov di,ds:[si+6]
|
|
mov ax,fs:[di]
|
|
mov es:[di],ax
|
|
mov ax,87+87*256
|
|
mov word ptr es:[bx],ax
|
|
mov ds:[si+6],bx
|
|
|
|
;ball
|
|
|
|
mov ax,ds:_gravity
|
|
add ds:[si+14],ax
|
|
mov ax,ds:[si+2] ;Y
|
|
add ax,ds:[si+14]
|
|
cmp ax,ds:_gravitybottom
|
|
jl @@4
|
|
push ax
|
|
mov ax,ds:[si+14]
|
|
neg ax
|
|
imul cs:_gravityd
|
|
sar ax,4
|
|
mov ds:[si+14],ax
|
|
pop ax
|
|
add ax,ds:[si+14]
|
|
@@4: mov ds:[si+2],ax
|
|
cwd
|
|
shld dx,ax,6
|
|
shl ax,6
|
|
idiv bp
|
|
add ax,100
|
|
cmp ax,199
|
|
ja @@3
|
|
mov bx,ax
|
|
shl bx,1
|
|
mov bx,ds:_rows[bx]
|
|
pop ax
|
|
add bx,ax
|
|
|
|
mov di,ds:[si+8]
|
|
mov eax,fs:[di]
|
|
mov es:[di],eax
|
|
add di,320
|
|
mov eax,fs:[di]
|
|
mov es:[di],eax
|
|
add di,320
|
|
mov eax,fs:[di]
|
|
mov es:[di],eax
|
|
; add di,320
|
|
; mov eax,fs:[di]
|
|
; mov es:[di],eax
|
|
shr bp,6
|
|
and bp,not 3
|
|
|
|
cmp bp,cs:_bpmin
|
|
jge @@t1
|
|
mov cs:_bpmin,bp
|
|
@@t1: cmp bp,cs:_bpmax
|
|
jle @@t2
|
|
mov cs:_bpmax,bp
|
|
@@t2:
|
|
mov ax,word ptr ds:_depthtable1[bp]
|
|
mov word ptr es:[bx+1],ax
|
|
mov eax,ds:_depthtable2[bp]
|
|
mov dword ptr es:[bx+320],eax
|
|
mov ax,word ptr ds:_depthtable3[bp]
|
|
mov word ptr es:[bx+641],ax
|
|
mov ds:[si+8],bx
|
|
|
|
@@z: pop cx
|
|
add si,16
|
|
loop @@1
|
|
@@0: CEND
|
|
|
|
@@2: mov di,ds:[si+8]
|
|
mov eax,fs:[di]
|
|
mov es:[di],eax
|
|
add di,320
|
|
mov eax,fs:[di]
|
|
mov es:[di],eax
|
|
add di,320
|
|
mov eax,fs:[di]
|
|
mov es:[di],eax
|
|
mov di,ds:[si+6]
|
|
mov ds:[si+6],ax
|
|
mov ax,fs:[di]
|
|
mov es:[di],ax
|
|
pop bx
|
|
pop cx
|
|
add si,16
|
|
loop @@1
|
|
jmp @@0
|
|
@@3: mov di,ds:[si+8]
|
|
mov eax,fs:[di]
|
|
mov es:[di],eax
|
|
add di,320
|
|
mov eax,fs:[di]
|
|
mov es:[di],eax
|
|
add di,320
|
|
mov eax,fs:[di]
|
|
mov es:[di],eax
|
|
pop bx
|
|
pop cx
|
|
add si,16
|
|
loop @@1
|
|
jmp @@0
|
|
_drawdots ENDP
|
|
|
|
PUBLIC _setpalette
|
|
_setpalette PROC FAR
|
|
push bp
|
|
mov bp,sp
|
|
push si
|
|
push di
|
|
push ds
|
|
mov si,[bp+6]
|
|
mov ds,[bp+8]
|
|
mov dx,3c8h
|
|
mov al,0
|
|
out dx,al
|
|
inc dx
|
|
mov cx,768
|
|
rep outsb
|
|
pop ds
|
|
pop di
|
|
pop si
|
|
pop bp
|
|
ret
|
|
_setpalette ENDP
|
|
|
|
_face LABEL WORD
|
|
public _face
|
|
include face.inc
|
|
dw 30000,30000,30000
|
|
|
|
PUBLIC _sin1024
|
|
include sin1024.inc
|
|
|
|
code ENDS
|
|
END
|