SecondReality/DOTS/ASM.ASM
2017-09-24 01:45:36 +02:00

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