home *** CD-ROM | disk | FTP | other *** search
- ;
- ;
- ;
-
- .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
-