--- /dev/null
+\ Remaining field address conversion words
+
+: >NAME
+ BEGIN
+ 1- DUP @
+ NFA_MARK AND
+ NFA_MARK = UNTIL
+;
+
+: NAME> 1- LINK> ;
+
+: >LINK >NAME 1- ;
+
+: >BODY 1+ ;
+
+: BODY> 1- ;
+
+\ Constants and Variables
+
+: CONSTANT
+ CREATE ,
+DOES> @
+;
+
+: ALLOT ( n -- )
+ H +! ( adds n to H, after this the old value of H is still on the stack )
+;
+
+: VARIABLE
+ CREATE
+ 1 CELLS ALLOT ( allocate 1 cell of memory, push the pointer to this memory )
+;
+
+: VALUE ( n -- )
+ CREATE ,
+DOES> @
+;
+
+: TO IMMEDIATE ( n -- )
+ BL WORD ( get the name of the value )
+ FIND DROP ( look it up in the dictionary )
+ >BODY ( get a pointer to the first data field (the 'LIT') )
+ STATE @ IF ( compiling? )
+ ['] LIT , ( compile LIT )
+ , ( compile the address of the value )
+ ['] ! , ( compile ! )
+ ELSE ( immediate mode )
+ ! ( update it straightaway )
+ THEN
+;
+
+( x +TO VAL adds x to VAL )
+: +TO IMMEDIATE
+ BL WORD ( get the name of the value )
+ FIND DROP ( look it up in the dictionary )
+ >BODY ( get a pointer to the first data field (the 'LIT') )
+ STATE @ IF ( compiling? )
+ ['] LIT , ( compile LIT )
+ , ( compile the address of the value )
+ ['] +! , ( compile +! )
+ ELSE ( immediate mode )
+ +! ( update it straightaway )
+ 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
+;