Implemented FILL and ERASE.
[forth.jl.git] / src / lib.4th
index 745acf6..ad6a3a5 100644 (file)
 ;
 
 : ." IMMEDIATE          ( -- )
-        STATE @ IF      ( compiling? )
-                [COMPILE] S"    ( read the string, and compile LITSTRING, etc. )
-                ['] TELL ,        ( compile the final TELL )
-        ELSE
-                ( In immediate mode, just read characters and print them until we get
-                  to the ending double quote. )
-                KEY DROP
-                BEGIN
-                        KEY
-                        DUP '"' = IF
-                                DROP    ( drop the double quote character )
-                                EXIT    ( return from this function )
-                        THEN
-                        EMIT
-                AGAIN
-        THEN
+        [COMPILE] S"    ( read the string, and compile LITSTRING, etc. )
+        ['] TELL ,      ( compile the final TELL )
+;
+
+: .( 
+        KEY DROP
+        BEGIN
+                KEY
+                DUP ')' = IF
+                        DROP    ( drop the double quote character )
+                        EXIT    ( return from this function )
+                THEN
+                EMIT
+        AGAIN
 ;
 
 
 ( CONSTANTS AND VARIABLES ------------------------------------------------------ )
 
 : CONSTANT
-        WORD            ( get the name (the name follows CONSTANT) )
-        CREATE          ( make the dictionary entry )
+        WORD HEADER     ( make dictionary entry (the name follows CONSTANT) )
         DOCOL ,         ( append DOCOL (the codeword field of this word) )
         ['] LIT ,       ( append the codeword LIT )
         ,               ( append the value on the top of the stack )
         ['] EXIT ,      ( append the codeword EXIT )
 ;
 
-: ALLOT         ( n -- addr )
-        HERE @ SWAP     ( here n )
+: ALLOT         ( n -- )
         HERE +!         ( adds n to HERE, after this the old value of HERE is still on the stack )
 ;
 
 : VARIABLE
+        CREATE
         1 CELLS ALLOT   ( allocate 1 cell of memory, push the pointer to this memory )
-        WORD CREATE     ( make the dictionary entry (the name follows VARIABLE) )
-        DOCOL ,         ( append DOCOL (the codeword field of this word) )
-        ['] LIT ,         ( append the codeword LIT )
-        ,               ( append the pointer to the new memory )
-        ['] EXIT ,        ( append the codeword EXIT )
 ;
 
 
 : VALUE         ( n -- )
-        WORD CREATE     ( make the dictionary entry (the name follows VALUE) )
+        WORD HEADER     ( make the dictionary entry (the name follows VALUE) )
         DOCOL ,         ( append DOCOL )
         ['] LIT ,       ( append the codeword LIT )
         ,               ( append the initial value )
         THEN
 ;
 
+( Fill u ints, starting at a, with the value b )
+: FILL          ( a u b -- )
+        -ROT OVER + SWAP ?DO
+                DUP I !
+        LOOP
+        DROP
+;
+
+: ERASE         ( a u -- )
+        0 FILL
+;
 
 ( PRINTING THE DICTIONARY ------------------------------------------------------ )
 
         DROP            ( at this point, the stack is: start-of-word end-of-word )
         SWAP            ( end-of-word start-of-word )
 
+        DUP >CFA @ CASE
+                DOCOL OF
+                        \ Colon definition
+                        ':' EMIT SPACE DUP ID. SPACE
+                        DUP ?IMMEDIATE IF ." IMMEDIATE " THEN CR
+                ENDOF
+                DOVAR OF
+                        \ Variable definition
+                        ." Variable " DUP ID. CR
+                        2DROP EXIT
+                ENDOF
+                DOCON OF
+                        \ Constant definition
+                        ." Constant " DUP ID. CR
+                        2DROP EXIT
+                ENDOF
+
+                \ Unknown codeword
+                ." Primitive or word with unrecognized codeword." CR 
+                DROP 2DROP EXIT
+        ENDCASE
+
         ( begin the definition with : NAME [IMMEDIATE] )
-        ':' EMIT SPACE DUP ID. SPACE
-        DUP ?IMMEDIATE IF ." IMMEDIATE " THEN CR 4 
+        ( ':' EMIT SPACE DUP ID. SPACE
+        DUP ?IMMEDIATE IF ." IMMEDIATE " THEN CR 4 )
+
+        4 SPACES
 
         >DFA            ( get the data address, ie. points after DOCOL | end-of-word start-of-data )
 
 ;
 
 
-( WELCOME MESSAGE ------------------------------------------------------------- )
-
-CR CR ."  --- TimForth initialized  --- "
-
+( MEMORY  ------------------------------------------------------------------ )
 
+: UNUSED  ( -- cells )
+        MEMSIZE HERE @ - ;