Category : Recently Uploaded Files
Archive   : FRASRC19.ZIP
Filename : LSYSA.ASM

 
Output of file : LSYSA.ASM contained in archive : FRASRC19.ZIP
; 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


  3 Responses to “Category : Recently Uploaded Files
Archive   : FRASRC19.ZIP
Filename : LSYSA.ASM

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/