home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Computerworld 1996 March
/
Computerworld_1996-03_cd.bin
/
idg_cd3
/
grafika
/
fraktaly
/
frasr192
/
lsysa.asm
< prev
next >
Wrap
Assembly Source File
|
1995-02-03
|
6KB
|
265 lines
; LSYSA.ASM: assembler support routines for optimized L-System code
; Nicholas Wilt, 11/13/91.
; Updated to work with integer/FP code, 7/93.
ifdef ??version
masm51
quirks
endif
.MODEL MEDIUM,C
lsys_turtlestatei STRUC
counter DB ?
angle DB ?
reverse DB ?
stackoflow DB ?
maxangle DB ?
dmaxangle DB ?
curcolor DB ?
dummy DB ?
ssize DD ?
realangle DD ?
xpos DD ?
ypos DD ?
xmin DD ?
ymin DD ?
xmax DD ?
ymax DD ?
aspect DD ?
num DD ?
lsys_turtlestatei ENDS
EXTRN overflow:WORD
EXTRN boxy:DWORD
sins equ boxy
coss equ boxy + 200 ; 50 * 4 bytes
.CODE
DECANGLE MACRO
LOCAL @1
dec al
jge @1
mov al,[bx.dmaxangle]
@1: mov [bx.angle],al
ENDM
INCANGLE MACRO
LOCAL @1
inc al
cmp al,[bx.maxangle]
jne @1
xor ax,ax
@1: mov [bx.angle],al
ENDM
PUBLIC lsysi_doplus
lsysi_doplus PROC lsyscmd:ptr
mov bx,lsyscmd
mov al,[bx.angle]
cmp [bx.reverse],0
jnz PlusIncAngle
DECANGLE
ret
PlusIncAngle:
INCANGLE
ret
lsysi_doplus ENDP
PUBLIC lsysi_dominus
lsysi_dominus PROC lsyscmd:ptr
mov bx,lsyscmd ; Get pointer
mov al,[bx.angle]
cmp [bx.reverse],0
jnz MinusDecAngle
INCANGLE
ret
MinusDecAngle:
DECANGLE
ret
lsysi_dominus ENDP
PUBLIC lsysi_doplus_pow2
lsysi_doplus_pow2 PROC lsyscmd:ptr
mov bx,lsyscmd ; Get pointer
mov al,[bx.angle]
cmp [bx.reverse],0
jnz Plus2IncAngle
dec al
and al,[bx.dmaxangle]
mov [bx.angle],al
ret
Plus2IncAngle:
inc al
and al,[bx.dmaxangle]
mov [bx.angle],al
ret
lsysi_doplus_pow2 ENDP
PUBLIC lsysi_dominus_pow2
lsysi_dominus_pow2 PROC lsyscmd:ptr
mov bx,lsyscmd ; Get pointer
mov al,[bx.angle]
cmp [bx.reverse],0
jz Minus2IncAngle
dec al
and al,[bx.dmaxangle]
mov [bx.angle],al
ret
Minus2IncAngle:
inc al
and al,[bx.dmaxangle]
mov [bx.angle],al
ret
lsysi_dominus_pow2 ENDP
PUBLIC lsysi_dopipe_pow2
lsysi_dopipe_pow2 PROC lsyscmd:ptr
mov bx,lsyscmd ; Get pointer
xor ax,ax
mov al,[bx.maxangle]
shr ax,1
xor dx,dx
mov dl,[bx.angle]
add ax,dx
and al,[bx.dmaxangle]
mov [bx.angle],al
ret
lsysi_dopipe_pow2 ENDP
PUBLIC lsysi_dobang
lsysi_dobang PROC lsyscmd:ptr
mov bx,lsyscmd ; Get pointer
mov al,[bx.reverse] ; reverse = ! reverse;
dec al ; -1 if was 0; 0 if was 1
neg al ; 1 if was 0; 0 if was 1
mov [bx.reverse],al ;
ret
lsysi_dobang ENDP
; Some 386-specific leaf functions go here.
.386
PUBLIC lsysi_doslash_386
lsysi_doslash_386 PROC lsyscmd:ptr
mov bx,lsyscmd ; Get pointer
mov eax,[bx.num]
cmp [bx.reverse],0
jnz DoSlashDec
add [bx.realangle],eax
ret
DoSlashDec:
sub [bx.realangle],eax
ret
lsysi_doslash_386 ENDP
PUBLIC lsysi_dobslash_386
lsysi_dobslash_386 PROC lsyscmd:ptr
mov bx,lsyscmd ; Get pointer
mov eax,[bx.num]
cmp [bx.reverse],0
jz DoBSlashDec
add [bx.realangle],eax
ret
DoBSlashDec:
sub [bx.realangle],eax
ret
lsysi_dobslash_386 ENDP
PUBLIC lsysi_doat_386
lsysi_doat_386 PROC lsyscmd:ptr,N:DWORD
mov bx,lsyscmd ; Get pointer
mov eax,[bx.ssize] ; Get size
imul [bx.num] ; Mul by n
shrd eax,edx,19
mov [bx.ssize],eax ; Save back
ret
lsysi_doat_386 ENDP
PUBLIC lsysi_dosizegf_386
lsysi_dosizegf_386 PROC USES SI,lsyscmd:ptr
mov si,lsyscmd ;
mov ecx,[si.ssize] ; Get size; we'll need it twice
movzx ebx,[si.angle]
ifndef ??version
mov eax,coss[ebx*4] ; eax <- coss[angle]
else
; TASM-only (this is slower but it should work)
shl bx,2
add bx,offset DGROUP:coss
mov eax,[ebx] ; eax <- coss[angle]
endif
imul ecx ; Mul by size
shrd eax,edx,29 ; eax <- multiply(size, coss[angle], 29)
add eax,[si.xpos] ;
jno nooverfl ; check for overflow
mov overflow,1 ; oops - flag the user later
nooverfl:
cmp eax,[si.xmax] ; If xpos <= [si.xmax,
jle GF1 ; jump
mov [si.xmax],eax ;
GF1: cmp eax,[si.xmin] ; If xpos >= [si.xmin
jge GF2 ; jump
mov [si.xmin],eax ;
GF2: mov [si.xpos],eax ; Save xpos
ifndef ??version
mov eax,sins[ebx*4] ; eax <- sins[angle]
else ; sins table is 200 bytes before coss
mov eax,[ebx-200] ; eax <- sins[angle]
endif
imul ecx ;
shrd eax,edx,29 ;
add eax,[si.ypos] ;
cmp eax,[si.ymax] ; If ypos <= [si.ymax,
jle GF3 ; jump
mov [si.ymax],eax ;
GF3: cmp eax,[si.ymin] ; If ypos >= [si.ymin
jge GF4 ; jump
mov [si.ymin],eax ;
GF4: mov [si.ypos],eax ;
ret
lsysi_dosizegf_386 ENDP
PUBLIC lsysi_dodrawg_386
lsysi_dodrawg_386 PROC USES SI,lsyscmd:ptr
mov si,lsyscmd ; Get pointer to structure
mov ecx,[si.ssize] ; Because we need it twice
movzx ebx,[si.angle]
ifndef ??version
mov eax,coss[ebx*4] ; eax <- coss[angle]
else
; TASM-only (this is slow but it should work)
shl bx,2
add bx,offset DGROUP:coss
mov eax,[ebx] ; eax <- coss[angle]
endif
imul ecx ;
shrd eax,edx,29 ;
add [si.xpos],eax ; xpos += size*coss[angle] >> 29
ifndef ??version
mov eax,sins[ebx*4] ; eax <- sins[angle]
else ; sins table is 200 bytes before coss
mov eax,[ebx-200] ; eax <- sins[angle]
endif
imul ecx ; ypos += size*sins[angle] >> 29
shrd eax,edx,29 ;
add [si.ypos],eax ;
ret ;
lsysi_dodrawg_386 ENDP
END