home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Unsorted BBS Collection
/
thegreatunsorted.tar
/
thegreatunsorted
/
programming
/
asm_programming
/
3DSCAPE.ZIP
/
SUPPORT.ASM
< prev
Wrap
Assembly Source File
|
1993-10-12
|
10KB
|
787 lines
;
;
;
.model small,c
public Plot, sn_tbl, SwapScreens, DoPlasma, GetRand
public PlotProjection, screen, ClearMyScreen, view_screen
public SetMyMode, Project, grid, rand_seed
public pitch_sine,pitch_cosine,roll_sine,roll_cosine
public PutGrid, GetGrid
extrn roll:word, cpitch:word, cz:word, cy:word
extrn gx:word, gy:word, gp:word, idx:word
EYEDIST equ 8 ; perspective factor
GRIDSIZE equ 80
VIEWSIZE equ 61 ; Must be odd
EXPAND equ 5 ; distance between dots
ARRAYSIZE equ (GRIDSIZE*GRIDSIZE)
DEPTH_CUTOFF equ 1300 ; point at which depth cueing starts
DEPTH_SHIFT equ 7 ; severity of depth cueing (high numbers = less severe)
.data
align 2
vid_data dw table_len
dw 5f00h, 4f01h, 5002h, 8203h ; CRTC Registers
dw 5404h, 8005h,0bf06h, 1f07h
dw 0008h, 0c009h, 000ah, 000bh
dw 000ch, 000dh, 000eh, 000fh
dw 9c10h, 8e11h, 8f12h, 2813h
dw 0014h, 9615h,0b916h,0E317h
table_len equ ($-vid_data-1)/2
sn_tbl dw (360+90) dup(0)
align 2
point_size equ 6
mx dw 0
my dw 0
gridptr dw 0
point_grid dw (VIEWSIZE*point_size) dup(0)
point_x equ word ptr 0
point_y equ word ptr 2
point_col equ word ptr 4
rand_seed dw 0
align 4
screen dd 0a0004000h
view_screen dd 0a0000000h
pitch_sine dd 0
pitch_cosine dd 0
roll_sine dd 0
roll_cosine dd 0
grid db ARRAYSIZE dup(0)
grid_end equ $
.code
.386
shift equ 14
param1 equ [bp+4]
param2 equ [bp+6]
param3 equ [bp+8]
param4 equ [bp+10]
param5 equ [bp+12]
param6 equ [bp+14]
param7 equ [bp+16]
param8 equ [bp+18]
param9 equ [bp+20]
RandPixel proc near
x equ word ptr param1
y equ word ptr param2
x1 equ word ptr param3
y1 equ word ptr param4
x2 equ word ptr param5
y2 equ word ptr param6
push bp
mov bp,sp
mov ax,x
sub ax,x1
cwd
xor ax,dx
sub ax,dx
mov bx,ax
mov ax,y
sub ax,y1
cwd
xor ax,dx
sub ax,dx
add bx,ax
call GetRand
xor ah,ah
sub ax,128
imul bx
mov bx,GRIDSIZE/6
idiv bx
push ax
mov bx,y1
mov ax,x1
call GetGrid
push ax
mov bx,y2
mov ax,x2
call GetGrid
pop bx
add ax,bx
sar ax,1
pop bx
add ax,bx
cmp ax,1
jge rp_s1
mov al,1
rp_s1:
cmp ax,255
jle rp_s2
mov al,255
rp_s2:
xor ah,ah
push ax
mov cl,al
mov bx,y
mov ax,x
call PutGrid
pop ax
pop bp
ret
RandPixel endp
GetRand proc near
mov ax,rand_seed
add ax,56791
imul ax,13579
mov rand_seed,ax
and ax,07fffh
ret
GetRand endp
GetGrid proc near
imul bx,GRIDSIZE
add bx,ax
add bx,idx
sub bx,ARRAYSIZE
jnc no_add1
add bx,ARRAYSIZE
no_add1:
mov al,[bx+grid]
xor ah,ah
ret
GetGrid endp
PutGrid proc near
imul bx,GRIDSIZE
add bx,ax
add bx,idx
sub bx,ARRAYSIZE
jnc no_add2
add bx,ARRAYSIZE
no_add2:
mov [bx+grid],cl
ret
putGrid endp
DoPlasma proc near
x1 equ word ptr param1
y1 equ word ptr param2
x2 equ word ptr param3
y2 equ word ptr param4
x equ word ptr [bp-2]
y equ word ptr [bp-4]
s equ word ptr [bp-6]
push bp
mov bp,sp
sub sp,6
mov ax,x2
sub ax,x1
cmp ax,1
jg not_return
mov ax,y2
sub ax,y1
cmp ax,1
jg not_return
jmp exit_doplasma
not_return:
mov ax,y1
add ax,y2
sar ax,1
mov y,ax
mov ax,x1
add ax,x2
sar ax,1
mov x,ax
mov bx,y1
call GetGrid
or ax,ax
jnz dp_s1
push y1
push x2
push y1
push x1
push y1
push x
call RandPixel
add sp,12
dp_s1:
mov s,ax
mov bx,y
mov ax,x2
call GetGrid
or ax,ax
jnz dp_s2
push y2
push x2
push y1
push x2
push y
push x2
call RandPixel
add sp,12
dp_s2:
add s,ax
mov bx,y2
mov ax,x
call GetGrid
or ax,ax
jnz dp_s3
push y2
push x2
push y2
push x1
push y2
push x
call RandPixel
add sp,12
dp_s3:
add s,ax
mov bx,y
mov ax,x1
call GetGrid
or ax,ax
jnz dp_s4
push y2
push x1
push y1
push x1
push y
push x1
call RandPixel
add sp,12
dp_s4:
add s,ax
mov bx,y
mov ax,x
call GetGrid
or ax,ax
jnz no_plot
mov cx,s
shr cx,2
mov bx,y
mov ax,x
call PutGrid
no_plot:
push y
push x
push y1
push x1
call DoPlasma
add sp,8
push y
push x2
push y1
push x
call DoPlasma
add sp,8
push y2
push x
push y
push x1
call DoPlasma
add sp,8
push y2
push x2
push y
push x
call DoPlasma
add sp,8
exit_doplasma:
leave
ret
DoPlasma endp
SwapScreens proc near
mov dx, 03dah
ss_1:
in al,dx
test al,8
jz ss_1
ss_2:
in al,dx
test al,8
jnz ss_2
cli
add word ptr view_screen,04000h
add word ptr screen,04000h
mov bx,word ptr view_screen
mov dx,03d4h
mov al,0dh
mov ah,bl
out dx,ax
dec al
mov ah,bh
out dx,ax
sti
ret
SwapScreens endp
Plot proc near
cmp bx, 319
jae Plot_quit
cmp cx, 199
jae Plot_quit
push di
push ax
les di,screen
mov dx,cx
shl dx,6
shl cx,4
add dx,cx
mov cx,bx
shr bx,2
add bx,dx
add di,bx
mov dx,03c4h
mov ax,0102h
and cl,3
shl ah,cl
out dx,ax
pop ax
mov es:[di],al
pop di
Plot_quit:
ret
Plot endp
MatrixRotate proc near
movsx esi,ax
imul esi,roll_cosine
movsx edx,bx
imul edx,roll_sine
sub esi,edx
sar esi, shift
movsx ecx,ax
imul ecx,roll_sine
movsx edx,bx
imul edx,roll_cosine
add ecx,edx
sar ecx, shift
mov ebx,ecx
imul ebx,pitch_cosine
movsx edx,di
imul edx,pitch_sine
sub ebx,edx
sar ebx, shift
mov ax,bx
imul ecx,pitch_sine
movsx edx,di
imul edx,pitch_cosine
add ecx,edx
sar ecx, shift
mov dx,cx
ret
MatrixRotate endp
PlotProjection proc near
push bp
mov bp,sp
push si
push di
movsx ebx,word ptr param3
mov di,gridptr
cmp bx,1 shl EYEDIST
jg no_quit_proj
quit_projection:
mov point_col[di],0
jmp exit_projection
no_quit_proj:
mov ax,param1
cwd
xor ax,dx
sub ax,dx
shr ax,2
add ax,bx
shr byte ptr param4,2
cmp ax,DEPTH_CUTOFF
jg do_depth
push word ptr param4
jmp skip_depth
do_depth:
sub ax,DEPTH_CUTOFF
shr ax,DEPTH_SHIFT
cmp ax,4
jae quit_projection
shl al,6
add al,param4
push ax
skip_depth:
movsx eax,word ptr param2
shl eax,EYEDIST
cdq
idiv ebx
add ax,100
mov cx,ax
movsx eax,word ptr param1
shl eax,EYEDIST
cdq
idiv ebx
add ax,160
mov bx,ax
pop ax
mov si,bx
push cx
call Plot
pop cx
push ax
cmp my,VIEWSIZE/2 shl EXPAND
jz skip_below
cmp point_col[di],0
jz skip_below
push cx
mov bx,si
add bx,point_x[di]
sar bx,1
add cx,point_y[di]
sar cx,1
mov ax,point_col[di]
call Plot
pop cx
cmp mx,VIEWSIZE/2 shl EXPAND
jz skip_below
cmp point_col[di+point_size],0
jz skip_below
push cx
mov bx,si
add bx,point_x[di+point_size]
sar bx,1
add cx,point_y[di+point_size]
sar cx,1
mov ax,point_col[di+point_size]
call Plot
pop cx
skip_below:
cmp mx,-VIEWSIZE/2 shl EXPAND
jz skip_left
cmp point_col[di-point_size],0
jz skip_left
push cx
mov bx,si
add bx,point_x[di-point_size]
sar bx,1
add cx,point_y[di-point_size]
sar cx,1
mov ax,point_col[di-point_size]
call Plot
pop cx
skip_left:
pop ax
mov point_x[di],si
mov point_y[di],cx
mov point_col[di],ax
exit_projection:
pop di
pop si
pop bp
ret
PlotProjection endp
SetMyMode proc near
push si
push di
mov ax,013h
int 10h
mov dx,03c4h
mov ax,0604h
out dx,ax
mov ax,0f02h
out dx,ax
xor di,di
mov ax,0a000h
mov es,ax
mov cx,07fffh
xor ax,ax
rep stosw
cli
mov dx,03d4h
mov al,011h
out dx,al
jmp $+2
inc dx
in al,dx
and al,07fh
out dx,al
mov dx,03d4h
mov si,offset vid_data
cld
lodsw
mov cx,ax
out_next:
lodsw
out dx,ax
loop out_next
sti
pop di
pop si
ret
SetMyMode endp
ClearMyScreen proc near
push di
mov dx,03c4h
mov ax,0f02h
out dx,ax
les di,screen
mov cx,4000
xor eax,eax
rep stosd
; xor cx,cx
; xor bx,bx
; xor al,al
;
;next_col:
; push ax
; push bx
; push cx
; call Plot
; pop cx
; pop bx
; pop ax
; inc bx
; inc al
; jnz next_col
pop di
ret
ClearMyScreen endp
Project proc near
p equ word ptr [bp-2]
push bp
mov bp,sp
sub sp,2
push si
push di
mov di,gp
mov p,di
mov my,VIEWSIZE/2 shl EXPAND
jmp test_y
next_y:
mov gridptr, offset point_grid
mov mx,-VIEWSIZE/2 shl EXPAND
jmp test_x
next_x:
mov di,p
movzx di,byte ptr [di]
cmp di,63
jae skip_levelsea
mov di,63
skip_levelsea:
mov ax,mx
mov bx,my
call MatrixRotate
push di
sub dx,cz
push dx
sub ax,cy
push ax
push si
call PlotProjection
add sp,8
add mx,1 shl EXPAND
inc p
cmp p,offset grid_end
jb skip_modp
sub p,ARRAYSIZE
skip_modp:
add gridptr,6
test_x:
cmp mx,VIEWSIZE/2 shl EXPAND
jle next_x
sub my,1 shl EXPAND
add p,GRIDSIZE-VIEWSIZE
cmp p,offset grid_end
jb test_y
sub p,ARRAYSIZE
test_y:
cmp my,-VIEWSIZE/2 shl EXPAND
jge next_y
Project_quit:
pop di
pop si
leave
ret
Project endp
end