home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 June
/
SIMTEL_0692.cdr
/
msdos
/
forth
/
fifth.arc
/
MANDEL.FIV
< prev
next >
Wrap
Text File
|
1986-05-27
|
7KB
|
416 lines
CREATE MANDEL
CREATE MACHINE
EDIT
( TI=0 / IBM=1 Machine flag)
0 constant machine
~UP
CREATE XMAX
CREATE X
EDIT
( Maximum X for this machine)
: x machine if 320 else 720 endif ;
~UP
EDIT
( Maximum X value)
x constant xmax
~UP
CREATE YMAX
CREATE Y
EDIT
: y machine if 200 else 300 endif ;
~UP
EDIT
y constant ymax
~UP
CREATE GCLS
EDIT
: GCLS cls 4 vmode
0 0 0 xmax 1- ymax 1- FILLBOX
;
~UP
CREATE DIS
EDIT
: dis
8 0 do
i 0 palette
loop
;
~UP
CREATE H#
EDIT
\ Hex constant
: h# base @ 16 base ! ' ['] literal execute base ! ; immediate
~UP
CREATE R87
EDIT
\ Parse a following 8087 register ==> stack element 0-7.
: r87
' dup 8 u< not abort" Register must be 0-7"
;
~UP
CREATE POP?
EDIT
\ 8087 operation & POP if trailing P : FADD P1 ==> FADDP ST(1)
: pop?
>in @
begin
dup c@@ dup 32 = over 13 = or over 10 = or swap 9 = or while
1+ repeat
dup c@@ dup 80 = swap 112 = or
if 1+ >in ! h# DE c,
else drop h# D8 c, endif
;
~UP
CREATE FINIT
EDIT
\ Initilize 8087
: finit
h# DB c, h# E3 c, ; immediate
~UP
CREATE FLD
EDIT
\ Load real to 8087 stack & pop Fifth stack
: fld
h# 9B c, \ FWAIT
h# D9 c, h# 46 c, h# 00 c, \ FLD [BP+0]
h# 83 c, h# C5 c, h# 04 c, \ ADD BP,4
h# 9B c, \ FWAIT
; immediate
~UP
CREATE FSTP
EDIT
\ Push 8087 real to Fifth stack, pop from 8087.
: fstp
h# 9B c, \ FWAIT
h# 83 c, h# C5 c, h# FC c, \ ADD BP,-4
h# D9 c, h# 5E c, h# 00 c, \ FSTP [BP+0]
h# 9B c, \ FWAIT
; immediate
~UP
CREATE FPICK
EDIT
\ PICK a value on the 8087 stack, must be 0-7: FPICK87 3
: fpick
r87
h# 9B c, \ FWAIT
h# D9 c, h# C0 + c, \ FLD ST(i)
; immediate
~UP
CREATE FSWAP
EDIT
\ Exchange 8087 TOS with the nth register, must be 0-7
: fswap
r87
h# 9B c, \ FWAIT
h# D9 c, h# C8 + c, \ FXCH ST(i)
; immediate
~UP
CREATE FPOP
EDIT
\ Drop an 8087 value
: fpop
h# 9B c, \ FWAIT
h# D9 c, h# D8 c, \ FSTP ST(0)
; immediate
~UP
CREATE FADD
EDIT
\ Add two 8087 numbers
: fadd
h# 9B c, \ FWAIT
pop? r87 h# C0 + c, \ FADD ST(i)
; immediate
~UP
CREATE FMUL
EDIT
\ Multiply two 8087 numbers
: fmul
h# 9B c, \ FWAIT
pop? r87 h# C8 + c, \ FMUL ST(i)
; immediate
~UP
CREATE FSUB
EDIT
\ Subtract two 8087 numbers
: fsub
h# 9B c, \ FWAIT
pop? r87 h# E0 + c, \ FSUB ST(i)
; immediate
~UP
CREATE FSUBR
EDIT
\ Subtract reversed two 8087 numbers
: fsubr
h# 9B c, \ FWAIT
pop? r87 h# E8 + c, \ FSUBR ST(i)
; immediate
~UP
CREATE FDIV
EDIT
\ Divide two 8087 numbers
: fdiv
h# 9B c, \ FWAIT
pop? r87 h# F0 + c, \ FDIV ST(i)
; immediate
~UP
CREATE FDIVR
EDIT
\ Divide reversed two 8087 numbers
: fdivr
h# 9B c, \ FWAIT
pop? r87 h# F8 + c, \ FDIVR ST(i)
; immediate
~UP
CREATE H
EDIT
variable h
~UP
CREATE SPEED
EDIT
create speed 1 ,
~UP
CREATE DRAW
CREATE X
EDIT
\ Real part start
-2. constant x
~UP
CREATE Y
EDIT
\ Imaginary part start
-2. constant y
~UP
CREATE SX
EDIT
\ Size of real part
4. constant sx
~UP
CREATE SY
EDIT
\ Size of imagniary part
4. constant sy
~UP
CREATE GX
EDIT
\ Real pixel gap
sx xmax i->f f/ constant gx
~UP
CREATE GY
EDIT
\ Imaginary pixel gap
sy ymax i->f f/ constant gy
~UP
CREATE CNTABLE
EDIT
\ Count of iterations, determines color
create cntable
10 , \ Black
20 , \ Blue
40 , \ Red
80 , \ Purple
160 , \ Green
320 , \ Light blue
640 , \ Yellow
1280 , \ White
~UP
CREATE XC
EDIT
\ real corner of pixel in progress
variable xc
~UP
CREATE YC
EDIT
\ imaginary corner of pixel in progress
variable yc
~UP
CREATE CNT
EDIT
\ count of iterations until z explodes
variable cnt
~UP
EDIT
\ Exploring the Mandelbrot set
: draw
speed !
xmax 0 do
gx i i->f f* x f+ xc !
ymax 0 do
gy i i->f f* y f+ yc !
63 cnt !
0. 0.
63 0 do
finit
fld fld fpick 0 fmul 0 fpick 2 fmul 0 fpick 1 fadd 1 fstp
fsubr p1 xc @ fld fadd p1 fstp
fmul p1 -2. fld fmul p1 yc @ fld fadd p1 fstp
stack abc|bca 4. f< if else i cnt ! leave endif
loop
drop drop
cnt @ \ dup pad c! pad 1 h @ write drop drop
j i pset
speed @ +loop
?term if key dup 49 = if 1 speed +! else
dup 48 = if -1 speed +! speed @ 0= if 1 speed ! endif else
abort endif endif endif
speed @ +loop
;
~UP
CREATE LOOK
EDIT
: look
" m.dat " 1+ 0 open if h ! else ." open error " . quit endif
100000 0 do
pad 1 h @ read drop drop
pad @ . cr
loop
;
~UP
CREATE PLAY
CREATE DATA
CREATE DATA1
EDIT
create data1 33000 allot
~UP
CREATE DATA2
EDIT
create data2 33000 allot
~UP
CREATE DATA3
EDIT
create data3 33000 allot
~UP
CREATE DATA4
EDIT
create data4 33000 allot
~UP
CREATE DATA5
EDIT
create data5 33000 allot
~UP
CREATE DATA6
EDIT
create data6 33000 allot
~UP
CREATE DATA7
EDIT
create data7 33000 allot
~UP
CREATE WHICH
CREATE TABLE
EDIT
create table
data1 , 32768 0 * ,
data2 , 32768 1 * ,
data3 , 32768 2 * ,
data4 , 32768 3 * ,
data5 , 32768 4 * ,
data6 , 32768 5 * ,
data7 , 32768 6 * ,
~UP
CREATE LOAD
CREATE TRY
EDIT
: try
0
10 0 do
i . dup . 32767 + dup . 1+ cr
loop
drop
;
~UP
EDIT
: load
" m.dat" 1+ 0 open if h ! else ." open error (which) " . quit endif
data1 32768 h @ read ." data1 " . . cr
data2 32768 h @ read ." data2 " . . cr
data3 32768 h @ read ." data3 " . . cr
data4 32768 h @ read ." data4 " . . cr
data5 32768 h @ read ." data5 " . . cr
data6 32768 h @ read ." data6 " . . cr
data7 [ 216000 32768 6 * - ] literal h @ read ." data7 " . . cr
h @ close if else ." close error (which) " . quit endif
;
~UP
EDIT
: which
3 shl table + dup @ swap 4 + @ - +
;
load
~UP
EDIT
: data
dup 15 shr which c@
;
~UP
CREATE MAP
CREATE DEFINE
CREATE LOG
EDIT
: log
20 - abs
0 begin over while 1+ swap 2 / swap repeat
swap drop
;
~UP
EDIT
: define create
256 0 do i log 8 mod dup . c, loop
does>
swap 255 and + c@
;
~UP
EDIT
define map
~UP
CREATE MSET
CREATE ROTATE
EDIT
: rotate
0 vmode
1000 0 do
i
8 0 do
dup 7 and i swap palette
1+
?term if quit endif
loop
drop 1000 0 do loop
loop
;
~UP
EDIT
: mset
4 vmode
0
xmax 0 do
ymax 0 do
dup data map j i pset
1+
loop
?term if quit endif
loop
key drop
;
~UP
EDIT
~UP
EDIT
: mandel
gcls
\ " m.dat" 1+ 1 open if h ! else ." open failed " . quit then 1 draw
begin 1 while
speed @ draw
repeat
key drop
;
~UP
ABORT