--- /dev/null
+( --- Complex integer arithmetic --- )
+
+: c* ( x1 y1 x2 y2 -- x3 y3 )
+ swap rot ( x1 x2 y1 y2 )
+ 2dup * negate ( x1 x2 y1 y2 -y1y2 )
+ 4 pick 4 pick * + ( x1 x2 y1 y2 (x1x2-y1y2))
+ 4 roll 2 roll * ( x2 y1 (x1x2-y1y2) x1y2 )
+ 3 roll 3 roll * + ( (x1x2-y1y2) (x1y2+x2y1) )
+;
+
+: c+ ( x1 y1 x2 y2 -- x3 y3 )
+ rot +
+ -rot +
+ swap
+;
+
+: csq 2dup c* ;
+
+; cmagsq ( x1 y1 -- mag )
+ csq abs
+;
+
+( --- Mandelbrot set calculations --- )
+
+: iterate ( cr ci zr zi -- cr ci z'r z'i )
+ csq c+
+;
+
+: inSet? ( cr ci -- res )
+
+ 100 0 DO
+
+ 2SWAP 2DUP 5 ROLL 5 ROLL
+ iterate
+ 2DUP cmagsq
+ 100 > IF
+ LEAVE
+ THEN
+
+ LOOP
+;
+
return NEXT
end)
+RFETCH = defPrimWord("R@", () -> begin
+ pushPS(mem[reg.RSP])
+ return NEXT
+end)
+
RSPFETCH = defPrimWord("RSP@", () -> begin
pushPS(reg.RSP)
return NEXT
-' 1+ , : / /MOD SWAP DROP ;
+: / /MOD SWAP DROP ;
: MOD /MOD DROP ;
+: */ * / ;
: '\n' 10 ;
: BL 32 ;
;
: DO IMMEDIATE
- ' >R , ' >R ,
+ ' LIT ,
+ HERE @
+ 0 ,
+ ' >R , ' >R , ' >R ,
HERE @
;
+: I RSP@ 2- @ ;
+
+: LEAVE RDROP RDROP RDROP EXIT ;
+
: LOOP IMMEDIATE
' R> , ' R> , ' 1+ , ' 2DUP , ' - ,
' SWAP , ' >R , ' SWAP , ' >R ,
' 0<= , ' 0BRANCH ,
HERE @ - ,
- ' RDROP , ' RDROP ,
+ ' RDROP , ' RDROP , ' RDROP ,
+ DUP HERE @ SWAP -
+ SWAP !
;
@ ( and fetch )
;
+
( With the looping constructs, we can now write SPACES, which writes n spaces to stdout. )
: SPACES ( n -- )
BEGIN
U.
;
-: U. U. SPACE ;
-
: . 0 .R SPACE ;
: .S ( -- )
DROP
;
+: U. U. SPACE ;
+
( ? fetches the integer at an address and prints it. )
: ? ( addr -- ) @ . ;