home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Party 1994: Try This At Home
/
disk_image.bin
/
source
/
fakesrc
/
land.asm
< prev
next >
Wrap
Assembly Source File
|
1993-10-21
|
20KB
|
552 lines
;=============================================================================
; land.asm - Landscape fractal demostration.
; File created: 9/30/93
; Copyright (c) 1993, Carlos Hasan Last modified: 10/22/93
;
; Description:
; This file implements a fractal 3D landscape rotation using the basic
; plasma routines and 3D rotations. This uses the VGA 320x200x256 mode.
;
; Portability:
; Requires Turbo Assembler 3.2 or better to be assembled.
; Dependent on the IBM PC 286 and the VGA graphics card.
;
; Modifications:
; 10/22/93 - Startup Code. Now is an Standalone Program.
;=============================================================================
.model small,pascal
.286
dosseg ; used to link like
.stack 1024 ; an standalone program.
global DrawPlasma:proc ; in PLASMA.ASM file.
global LandScape:proc
;===================== Demo equates and data =================================
TIMEOUT equ 70 * 10 ; about 10 sec for timeout.
FADESPEED equ 6 ; fade speed.
SCREENWIDTH equ 320 ; screen dimensions.
SCREENHEIGHT equ 200
TRIGSHIFT equ 6 ; sin/cos shift factor.
LANDSCAPEX equ 320 ; landscape grid dimensions.
LANDSCAPEY equ 200
WATERLEVEL equ 128 ; plasma water level.
PLASMASEED equ 8945h ; plasma random seed.
CENTERX equ 160 ; screen grid center
CENTERY equ 140 ; position.
GRIDX equ 32 ; screen grid dimensions
GRIDY equ 32 ; and gaps length.
GRIDDX equ 6
GRIDDY equ 6
.data
include sincos.inc ; sinus/cosinus table.
LandSeg dw ? ; landscape levels.
Pixels dw GRIDX * GRIDY dup (?) ; screen pixels locations.
Palette db 768 dup (?) ; hold the color palette.
FromPalette db 768 dup (?) ; fading-palettes.
ToPalette db 768 dup (?)
Timer dw ? ; timer counter.
;======================= Demo routines =======================================
.code
;-----------------------------------------------------------------------------
; WaitVRT - Waits the VGA vertical retrace period.
;-----------------------------------------------------------------------------
WaitVRT proc near
mov dx,3DAh
WaitVRT1: in al,dx ; wait the start of
test al,8 ; vertical retrace.
jz WaitVRT1
WaitVRT2: in al,dx ; wait the end of
test al,8 ; vertical retrace.
jnz WaitVRT2
ret
WaitVRT endp
;-----------------------------------------------------------------------------
; SetPalette - set the 256 entries of the VGA color palette.
; In:
; DS:SI - Palette structure address.
;-----------------------------------------------------------------------------
SetPalette proc near
mov cx,768
mov dx,3C8h
xor al,al
out dx,al
call WaitVRT
mov dx,3C9h
rep outsb
ret
SetPalette endp
;-----------------------------------------------------------------------------
; FadeTo - Fade palette effect.
; In:
; FromPalette - Source palette.
; ToPalette - Destination palette.
;-----------------------------------------------------------------------------
FadeTo proc near
FadeLoop: lea si,[FromPalette]
call SetPalette
mov cx,768
xor dx,dx
xor bx,bx
FadeColor: mov al,[FromPalette+bx]
mov ah,[ToPalette+bx]
cmp al,ah
je SkipFade
ja FadeOut
FadeIn: add al,FADESPEED
cmp al,ah
jl SetColor
mov al,ah
jmp SetColor
FadeOut: sub al,FADESPEED
cmp al,ah
jg SetColor
mov al,ah
jmp SetColor
SetColor: mov [FromPalette+bx],al
inc dx
SkipFade: inc bx
loop FadeColor
test dx,dx
jne FadeLoop
ret
FadeTo endp
;-----------------------------------------------------------------------------
; FlashIn - Flash fade-in effect.
; In:
; Palette - Source palette.
;-----------------------------------------------------------------------------
FlashIn proc near
mov ax,ds
mov es,ax
cld
lea di,[FromPalette] ; fade from black to white.
mov cx,768
mov al,00h
rep stosb
lea di,[ToPalette]
mov cx,768
mov al,3Fh
rep stosb
call FadeTo
lea di,[FromPalette] ; fade from white to
mov cx,768 ; destination palette.
mov al,3Fh
rep stosb
lea si,[Palette]
lea di,[ToPalette]
mov cx,768
rep movsb
call FadeTo
ret
FlashIn endp
;-----------------------------------------------------------------------------
; FlashOut - Flash fade-out effect.
; In:
; Palette - Source palette.
;-----------------------------------------------------------------------------
FlashOut proc near
mov ax,ds
mov es,ax
cld
lea di,[ToPalette] ; fade from source palette
mov cx,768 ; to white palette.
mov al,3Fh
rep stosb
lea si,[Palette]
lea di,[FromPalette]
mov cx,768
rep movsb
call FadeTo
lea di,[FromPalette] ; fade from white to black.
mov cx,768
mov al,3Fh
rep stosb
lea di,[ToPalette]
mov cx,768
mov al,00h
rep stosb
call FadeTo
ret
FlashOut endp
;-----------------------------------------------------------------------------
; GenLandscape - This routines generates the lanscape surface using the
; plasma routines basically and checks that all the mountain levels
; are in the right range.
; In:
; LandSeg - Segment addressing for the landscape.
;-----------------------------------------------------------------------------
GenLandscape proc near
mov ax,[LandSeg] ; clear landscape area.
mov es,ax
xor di,di
xor ax,ax
mov cx,LANDSCAPEX * LANDSCAPEY
cld
rep stosb
; draw initial plasma landscape.
call DrawPlasma,0,0,LANDSCAPEX-1,LANDSCAPEY-1, \
PLASMASEED,[LandSeg]
; adjust levels for the real landscape.
mov ax,[LandSeg]
mov es,ax
xor di,di
mov cx,LANDSCAPEX * LANDSCAPEY
cld
AdjLoop: mov al,es:[di]
sub al,WATERLEVEL
test al,al
jge AdjLevel
xor al,al
AdjLevel: xor ah,ah
imul ax,192
inc ah
mov es:[di],ah
inc di
loop AdjLoop
ret
GenLandscape endp
;-----------------------------------------------------------------------------
; DrawLandscape - Draws a region of the landscape on the screen starting
; at the specified position and rotation angles. The clipping support
; have been removed for speed.
; In:
; (PosX,PosY) - Landscape starting position.
; AngleY - Inclination angle.
; AngleZ - Spin angle.
;-----------------------------------------------------------------------------
DrawLandscape proc near PosX:word,PosY:word, AngleY:word,AngleZ:word
local SinY:word,SinZ:word,CosY:word,CosZ:word, \
YIAdd:word,YJAdd:word,ZIAdd:word,ZJAdd:word, \
Y0:word,Z0:word,Y:word,Z:word
mov bx,[AngleY] ; compute rotation
mov al,[SinTable+bx] ; parameters.
cbw
mov [SinY],ax
mov al,[CosTable+bx]
cbw
mov [CosY],ax
mov bx,[AngleZ]
mov al,[SinTable+bx]
cbw
mov [SinZ],ax
mov al,[CosTable+bx]
cbw
mov [CosZ],ax
mov ax,[SinZ] ; yiadd = griddx * sinz
imul ax,GRIDDX
mov [YIAdd],ax
mov ax,[CosZ] ; yjadd = griddy * cosz
imul ax,GRIDDY
mov [YJAdd],ax
mov ax,[CosZ] ; ziadd = griddx * cosz * siny
mov dx,[SinY]
imul dx
imul ax,GRIDDX
sar ax,TRIGSHIFT
mov [ZIAdd],ax
mov ax,[SinZ] ; zjadd = -griddy * sinz * siny
mov dx,[SinY]
imul dx
imul ax,-GRIDDY
sar ax,TRIGSHIFT
mov [ZJAdd],ax
mov ax,[YIAdd] ; compute starting grid
imul ax,-GRIDX/2 ; corner position.
mov dx,[YJAdd]
imul dx,-GRIDY/2
add ax,dx
mov [Y0],ax
mov ax,[ZIAdd]
imul ax,-GRIDX/2
mov dx,[ZJAdd]
imul dx,-GRIDY/2
add ax,dx
mov [Z0],ax
mov ax,[LandSeg] ; es = landscape segment.
mov es,ax
lea si,[Pixels] ; ds:si = pixels offsets.
mov di,[PosY] ; store offset
imul di,LANDSCAPEX ; just for speed.
add di,[PosX]
mov cx,GRIDX
ForI: push cx
mov ax,[Y0] ; y = y0
mov [Y],ax
mov ax,[Z0] ; z = z0
mov [Z],ax
mov cx,GRIDY
ForJ: push es
mov ax,0A000h ; clear old pixel.
mov es,ax
mov bx,[si]
mov byte ptr es:[bx],al
pop es
; here the code must be hooked to support clipping, use an "illegal"
; offset to store pixels that are not drawed, and then the routine above
; must erase only "legal" pixels.
mov bl,es:[di] ; bl = landscape(posx,posy)
mov al,bl ; ax = -centery + (z + bl*cosy)
xor ah,ah
imul [CosY]
add ax,[Z]
sar ax,TRIGSHIFT
sub ax,CENTERY
imul ax,SCREENWIDTH
mov dx,[Y] ; dx = centery + y
sar dx,TRIGSHIFT
add dx,CENTERX
sub dx,ax
mov [si],dx ; store pixel offset.
push es
mov ax,0A000h ; paint new pixel.
mov es,ax
xchg dx,bx
mov es:[bx],dl
pop es
mov ax,[YJAdd] ; y = y + yjadd
add [Y],ax
mov ax,[ZJAdd] ; z = z + zjadd
add [Z],ax
inc di ; posy = posy + 1
add si,2
loop ForJ
mov ax,[YIAdd] ; y0 = y0 + yiadd
add [Y0],ax
mov ax,[ZIAdd] ; z0 = z0 + ziadd
add [Z0],ax
add di,LANDSCAPEX-GRIDY ; posy = posy - gridy
pop cx ; posx = posx + 1
loop ForI
ret
DrawLandscape endp
;-----------------------------------------------------------------------------
; LandScape - Main landscape demo routine. Because this routine was tested
; using the Borland Pascal high-level interface, the allocation of the
; memory is done by the caller.
; In:
; DS - Data segment.
; MemSeg - Memory segment of 64K needed for storage.
;-----------------------------------------------------------------------------
LandScape proc MemSeg:word
local PosX:word,PosY:word,AngleY:word,AngleZ:word
mov ax,0013h ; set VGA 320x200x256 mode.
int 10h
mov ax,[MemSeg] ; setup landscape
mov [LandSeg],ax ; memory segment.
lea di,[Palette] ; set black palette.
mov ax,ds
mov es,ax
mov cx,768
xor ax,ax
cld
rep stosb
lea si,[Palette]
call SetPalette
GenPalette: lea di,[Palette] ; generate color palette.
mov ax,3F00h
mov [di+0],al ; background.
mov [di+1],al
mov [di+2],al
add di,3
mov [di+0],al ; blue. (water)
mov [di+1],al
mov [di+2],ah
add di,3
mov ax,0000h ; green to brown.
mov bx,3F00h
mov dx,0000h
mov cx,61
GP0: mov [di+0],ah
mov [di+1],bh
mov [di+2],dh
add di,3
add ax,0108h
sub bx,0086h
add dx,0000h
loop GP0
mov ax,3F00h ; brown to white.
mov bx,2000h ; (mountain)
mov dx,0000h
mov cx,48
GP1: mov [di+0],ah
mov [di+1],bh
mov [di+2],dh
add di,3
add ax,0000h
add bx,00AAh
add dx,0150h
loop GP1
mov ax,3F00h ; white. (snow)
mov bx,3F00h
mov dx,3F00h
mov cx,145
GP2: mov [di+0],ah
mov [di+1],bh
mov [di+2],dh
add di,3
add ax,0000h
add bx,0000h
add dx,0000h
loop GP2
call GenLandscape ; creates the landscape.
mov [AngleY],240 ; inclination angle.
mov [AngleZ],0 ; initial spin angle.
mov [PosX],0 ; starting landscape
mov [PosY],0 ; position.
; pixels offset array could be cleaned but not necesary,
; because i am using the 64K of video memory ...
; i can't overwrite anything! :-)
; draw hidden landscape and do flash-in effect.
call DrawLandscape,[PosX],[PosY],[AngleY],[AngleZ]
lea si,[Palette]
call FlashIn
mov [Timer],0 ; set timer counter.
mov si,1 ; starting landscape
mov di,1 ; directions.
LandLoop: call WaitVRT ; wait vertical retrace.
push si ; draw landscape.
push di
call DrawLandscape,[PosX],[PosY],[AngleY],[AngleZ]
pop di
pop si
inc byte ptr [AngleZ] ; increase spin angle.
add [PosX],si ; advance landscape position.
add [PosY],di
TestX: cmp [PosX],0 ; check for boundaries.
jl NegIncX
cmp [PosX],LANDSCAPEX-GRIDX
jl TestY
NegIncX: sub [PosX],si
neg si
TestY: cmp [PosY],0
jl NegIncY
cmp [PosY],LANDSCAPEY-GRIDY
jl CheckExit
NegIncY: sub [PosY],di
neg di
CheckExit: inc [Timer] ; timeout?
cmp [Timer],TIMEOUT
jae ByeBye
mov ah,1 ; any key pressed?
int 16h
jz LandLoop
ByeBye: call FlashOut ; flash-out!
mov ax,03h ; set 80x25x16 text mode.
int 10h
ret
LandScape endp
;-----------------------------------------------------------------------------
; Start - Startup code called from DOS.
; In:
; ES - Program Segment Prefix.
;-----------------------------------------------------------------------------
Start proc
mov ax,@Data
mov ds,ax
mov ax,ss ; shrink memory block.
mov bx,es
sub ax,bx
mov bx,sp
shr bx,4
inc bx
add bx,ax
mov ah,4Ah
int 21h
mov ah,48h ; allocate 64000 bytes.
mov bx,4000
int 21h
jc Exit
push ax
call LandScape,ax ; do demostration.
pop es
mov ah,49h ; free 64000 bytes.
int 21h
Exit: mov ax,4C00h ; exit to DOS.
int 21h
Start endp
end Start