1
0
mirror of https://github.com/mgcaret/of816.git synced 2024-12-28 10:30:21 +00:00
of816/docs/forth_dictionary.md

1633 lines
26 KiB
Markdown
Raw Normal View History

2020-01-14 00:58:39 +00:00
# Forth Dictionary
2020-01-21 07:09:50 +00:00
Updated: 2020-01-16 09:50:15 -0800
2020-01-14 00:58:39 +00:00
## !
_( n c-addr -- )_ write cell n to c-addr
## "
_( "text"<"> -- c-addr u )_ parse string, including hex interpolation
2020-01-21 07:09:50 +00:00
## \#
2020-01-14 00:58:39 +00:00
_( ud1 -- ud2 )_ divide ud1 by BASE, convert remainder to char and HOLD it, ud2 = quotient
## #>
_( ud -- )_ conclude pictured numeric output
## #IN
_( -- addr )_ Variable containing number of chars in the current input buffer.
## #LINE
_( -- addr )_ Variable containing the number of lines output.
## #OUT
_( -- addr )_ variable containing the number of chars output on the current line.
## #S
_( ud -- 0 )_ perform # until quotient is zero
## $2VALUE
_( n1 n2 str len )_ create a definition that pushes the first two cells of the body
initially n1 and n2
## $BYTE-EXEC
_( addr xt -- )_ evaluate FCode at addr with fetch function xt, do not save state
## $CREATE
_( c-addr u -- )_ like CREATE but use c-addr u for name
## $DIRECT
_( -- addr )_ addr = address of the CPU direct page
## $EMPTY-WL
_( -- wid )_ create a new empty wordlist _(danger!)_
## $ENV?-WL
_( -- wid )_ Return the WID of the wordlist for environmental queries.
## $FIND
_( c-addr u -- xt true | c-addr u false )_ find word in search order
## $FORGET
_( xt -- )_ forget word referenced by xt and subsequent words
## $HEX(
_( "text"<rparen> -- c-addr u )_ parse hex, return in allocated string
## $MEMTOP
_( -- addr )_ addr = top of usable data space
## $NUMBER
_( addr len -- true | n false )_ attmept to convert string to number
## $RESTORE-INPUT
## $SEARCH
_( c-addr u -- 0 | xt +-1 )_ search for word in current search order
## $SOURCE-ID
_( -- a-addr )_ variable containing current input source ID
## $SYSIF
_( ... u -- ... )_ call system interface function u
## $TMPSTR
2020-01-21 07:09:50 +00:00
Allocate a temporary string buffer for interpretation semantics of strings
and return the address and length of the buffer. If taking the slot used
by an existing buffer, free it.
2020-01-14 00:58:39 +00:00
## $VALUE
_( n str len )_ create a definition that pushes the first cell of the body, initially n
## '
_( old-name<> -- xt )_ parse old-name in input stream, return xt of word
## (
_( "text"<rparen> -- )_ parse and discard text until a right paren or end of input
## (.)
_( n -- c-addr u )_ convert n to text via pictured numeric output
## (CR
_( -- )_ emit a CR with no linefeed, set #OUT to 0
## (IS-USER-WORD)
_( str len xt -- )_ create a DEFER definition for string with xt as its initial behavior
## (SEE)
_( xt -- )_ attempt to decompile the word at xt
## (U.)
_( u -- c-addr u )_ convert u to text via pictured numeric output
## *
_( n1 n2 -- n3 )_ n3 = n1*n2
## */
_( n1 n2 n3 -- n4 )_ n4 = symmetric quot of n1*n2/n3
## */MOD
_( n1 n2 n3 -- n4 n5 )_ n4, n5 = symmetric rem, quot of n1*n2/n3
## +
_( n1 n2 -- n3 )_ n3 = n1+n2
## +!
_( n c-addr -- )_ add n to value at c-addr
## +LOOP
Compilation: _( C: do-sys -- )_
Execution: _( u|n -- )_ add u|n to loop index and continue loop if within bounds
## ,
_( n -- )_ compile cell n into the dictionary
## -
_( n1 n2 -- n3 )_ n3 = n1-n2
## -1
_( -- -1 )_
## -ROT
_( n1 n2 n3 -- n3 n1 n2 )_
## -TRAILING
_( c-addr u1 -- c-addr u2 )_ u2 = length of string with trailing spaces omitted
## .
_( n -- )_ output n
## ."
_( "text"<"> -- )_ output parsed text
## .(
_( "text"<rparen> -- )_ parse text until a right paren or end of input, output text
## .D
_( n -- )_ output n in decimal base
## .H
_( n -- )_ output n in hexadecimal base
## .R
_( n u -- )_ output n in a field of u chars
## .S
_( -- )_ display stack contents
## .VERSION
_( -- )_ Display version information.
## /
_( n1 n2 -- n3 )_ symmetric divide n1 by n2, giving quotient n3
## /C
_( -- u )_ u = size of char in bytes.
## /C*
_( n1 -- n2 )_ n2 = n1 * size of char.
## /L
_( -- u )_ u = size of long in bytes.
## /L*
_( n1 -- n2 )_ n2 = n1 * size of long.
## /MOD
_( n1 n2 -- n3 n4 )_ symmetric divide n1 by n2, giving quotient n4 and remainder n3
## /N
_( -- u )_ u = size of cell in bytes.
## /N*
_( n1 -- n2 )_ n2 = n1 * size of cell.
## /STRING
_( c-addr1 u1 n -- c-addr2 u2 )_ adjust string
## /W
_( -- u )_ u = size of word in bytes.
## /W*
_( n1 -- n2 )_ n2 = n1 * size of word.
## 0
_( -- 0 )_
## 0<
_( n -- f )_ f = true if x < 0, false if not
## 0<=
_( n -- f )_ f = true if x <= 0, false if not
## 0<>
_( n -- f )_ f = false if x is zero, true if not
## 0=
_( n -- f )_ f = true if x is zero, false if not
## 0>
_( n -- f )_ f = true if x > 0, false if not
## 0>=
_( n -- f )_ f = true if x >= 0, false if not
## 1
_( -- 1 )_
## 1+
_( n -- n' )_ increment top stack item
## 1-
_( n -- n' )_ decrement top stack item
## 2
_( -- 2 )_
## 2!
_( n1 n2 c-addr -- )_ write consecutive cells n1 and n2 to c-addr
## 2*
_( n -- n' )_ shift n1 one bit left
## 2+
_( n -- n' )_ increment top stack item by 2
## 2-
_( n -- n' )_ decrement top stack item by 2
## 2/
_( n -- n' )_ shift n1 one bit right, extending sign bit
## 2>R
_( n1 n2 -- )_ _(R: -- n1 n2 )_
## 2@
_( c-addr -- n1 n2 )_ fetch two consecutive cells from c-addr
## 2CONSTANT
_( n1 n2 "name"<> -- )_ create name, name does _( -- n1 n2 )_ when executed
## 2DROP
_( n1 n2 -- )_
## 2DUP
_( n1 n2 -- n1 n2 n3 n4 )_ n3 = n1, n4 = n2
## 2OVER
_( x1 x2 x3 x4 -- x1 x2 x3 x4 x5 x6 )_ x5 = x1, x6 = x2
## 2R>
_( R: n1 n2 -- )_ _( -- n1 n2 )_
## 2R@
_( R: n1 n2 -- n1 n2 )_ _( -- n1 n2 )_
## 2ROT
_( x1 x2 x3 x4 x5 x6 -- x3 x4 x5 x6 x1 x2 )_
## 2S>D
_( n n -- d d )_ convert two numbers to double-numbers
## 2SWAP
_( x1 x2 x3 x4 -- x3 x4 x1 x2 )_
## 3
_( -- 3 )_
## 3DROP
_( n1 n2 n3 -- )_
## 3DUP
_( n1 n2 n3 -- n1 n2 n3 n4 n5 n6 )_ n4 = n1, n5 = n2, n6 = n3
## :
_( "name"<> -- colon-sys )_ parse name, create colon definition and enter compiling state
## :NONAME
2020-01-21 07:09:50 +00:00
_( -- colon-sys )_ Create an anonymous colon definition and enter compiling state.
The xt of the anonymous definition is left on the stack after ;.
2020-01-14 00:58:39 +00:00
## :TEMP
2020-01-21 07:09:50 +00:00
_( -- colon-sys )_ Create a temporary anonymous colon definition and enter
compiling state. The temporary definition is executed immediately after ;
2020-01-14 00:58:39 +00:00
## ;
_( colon-sys -- )_ consume colon-sys and enter interpretation state, ending the current
definition. If the definition was temporary, execute it.
## ;CODE
_( -- )_ end compiler mode, begin machine code section of definition
## ;]
2020-01-21 07:09:50 +00:00
_( C: quot-sys -- )_ _( R: -- xt )_ End a quotation. During executon,
leave xt of the quotation on the stack.
## \<
2020-01-14 00:58:39 +00:00
_( n1 n2 -- f )_ f = true if n1 < n2, false if not
2020-01-21 07:09:50 +00:00
## \<#
2020-01-14 00:58:39 +00:00
_( -- )_ begin pictured numeric output
2020-01-21 07:09:50 +00:00
## \<<
2020-01-14 00:58:39 +00:00
_( n1 n2 -- n3 )_ n3 = n1 << n2
2020-01-21 07:09:50 +00:00
## \<=
2020-01-14 00:58:39 +00:00
_( n1 n2 -- f )_ f = true if n1 <= n2, false if not
2020-01-21 07:09:50 +00:00
## \<>
2020-01-14 00:58:39 +00:00
_( n1 n2 -- f )_ f = true if n1 <> n2, false if not
2020-01-21 07:09:50 +00:00
## \<W@
2020-01-14 00:58:39 +00:00
_( c-addr -- n )_ fetch sign-extended word from c-addr
## =
_( n1 n2 -- f )_ f = true if n1 = n2, false if not
2020-01-21 07:09:50 +00:00
## \>
2020-01-14 00:58:39 +00:00
_( n1 n2 -- f )_ f = true if n1 > n2, false if not
2020-01-21 07:09:50 +00:00
## \>=
2020-01-14 00:58:39 +00:00
_( n1 n2 -- f )_ f = true if n1 >= n2, false if not
2020-01-21 07:09:50 +00:00
## \>>
2020-01-14 00:58:39 +00:00
_( n1 n2 -- n3 )_ n3 = n1 >> n2
2020-01-21 07:09:50 +00:00
## \>>A
2020-01-14 00:58:39 +00:00
_( n1 n2 -- n3 )_ n3 = n1 >> n2, extending sign bit
2020-01-21 07:09:50 +00:00
## \>BODY
2020-01-14 00:58:39 +00:00
_( xt -- a-addr)_ return body of word at xt, if unable then throw exception -31
2020-01-21 07:09:50 +00:00
## \>IN
2020-01-14 00:58:39 +00:00
_( -- addr )_ Variable containing offset to the current parsing area of input buffer.
2020-01-21 07:09:50 +00:00
## \>LINK
2020-01-14 00:58:39 +00:00
_( xt -- addr|0 )_ get link field of function at xt or 0 if none
2020-01-21 07:09:50 +00:00
## \>NAME
2020-01-14 00:58:39 +00:00
_( xt -- c-addr u )_ get string name of function at xt, or ^xt if anonymous/noname
2020-01-21 07:09:50 +00:00
## \>NUMBER
2020-01-14 00:58:39 +00:00
_( ud1 c-addr1 u1 -- ud2 c-addr2 u2 )_ convert text to number
2020-01-21 07:09:50 +00:00
## \>R
2020-01-14 00:58:39 +00:00
_( n -- )_ _(R: -- n )_
2020-01-21 07:09:50 +00:00
## \>R@
2020-01-14 00:58:39 +00:00
_( n -- n )_ _( R: -- n )_
## ?
_( a-addr -- )_ output signed contents of cell at a-addr
## ?DO
Compilation: _( -- )_ ( R: -- do-sys )
Execution: _( limit start -- )_ begin DO loop, skip if limit=start
## ?DUP
_( n -- n )_ if n = 0, else _( n1 -- n1 n2 )_ n2 = n1
## ?LEAVE
_( f -- )_ exit loop if f is nonzero
## @
_( c-addr -- n )_ fetch cell from c-addr
## A"
_( "text"<"> -- c-addr u )_ parse quoted text in input buffer, copy to allocated string
## ABORT
_( -- )_ Execute -1 THROW.
## ABORT"
Compilation/Interpretation: _( [text<">] -- )_ Execution: _( f -- )_
If f is true, display text and execute -2 THROW.
## ABS
_( n -- n' )_ take the absolute value of n
## ACCEPT
_( addr len -- u )_ get input line of up to len chars, stor at addr, u = # chars accepted
## ACONCAT
2020-01-21 07:09:50 +00:00
_( c-addr1 u1 c-addr2 u2 -- c-addr3 u1+u2 )_ Concatenate allocated strings,
freeing the originals.
2020-01-14 00:58:39 +00:00
## AGAIN
_( C: dest -- )_ _( R: -- )_ resolve dest, jump to BEGIN
## AHEAD
_( C: orig )_ _( E: -- )_ jump ahead as resolved by e.g. THEN
## ALIAS
_( "name1"<> "name2"<> -- )_ create name1, name1 is a synonym for name2
## ALIGN
_( u -- u )_ align u _(no-op in this implementation)_
## ALIGNED
_( u1 -- u2 )_ u2 = next aligned address after u1.
## ALLOC-MEM
_( u -- c-addr )_ Allocate memory from heap.
## ALLOT
_( n -- )_ allocate n bytes in the dictionary
## ALSO
_( -- )_ Fuplicate the first wordlist in the search order.
## AND
_( n1 n2 -- n3 )_ n3 = n1 & n2
## ASCII
_( "word"<> -- char )_ perform either CHAR or [CHAR] per the current compile state
## AT-XY
_( u1 u2 -- )_ place cursor at col u1 row u2 _(uses ANSI escape sequence)_
## BASE
_( -- a-addr )_ System BASE variable.
## BEGIN
_( C: -- dest )_ _( E: -- )_ start a BEGIN loop
## BEHAVIOR
_( "name"<> -- )_ return the first cell of the body of name, which should be a DEFER word
## BELL
_( -- <bel> )_
## BETWEEN
_( n1|u1 n2|u2 n3|u3 -- f )_ f = true if n2|u2 <= n1|u1 <= n3|u3, false otherwise
## BINARY
_( -- )_ store 2 to BASE
## BL
_( -- ' ' )_
## BLANK
_( addr len -- )_ fill memory with spaces
## BLJOIN
_( b.l b2 b3 b.h -- q )_ Join bytes into quad.
## BODY>
_( a-addr -- xt )_ return xt of word with body at a-addr, if unable throw exc. -31
## BOUNDS
_( n1 n2 -- n1+n2 n1 )_
## BS
_( -- <bs> )_
## BSX
_( byte -- sign-extended )_
## BUFFER:
_( n -- )_ allocate memory immediately, create definition that returns address of memory
## BWJOIN
_( b.l b.h -- w )_ Join bytes into word.
## BYE
_( -- )_ Restore system stack pointer and exit Forth.
## BYTE-LOAD
_( addr xt -- )_ sav state, evaluate FCode at addr with fetch function xt, restore state
## C!
_( char c-addr -- )_ write char n to c-addr
## C,
_( char -- )_ compile char into dictionary
## C;
_( code-sys -- )_ consume code-sys, end CODE or LABEL definition
## C@
_( c-addr -- char )_ fetch char from c-addr
## CA+
_( u1 n -- u2 )_ u2 = u1 + n * size of char in bytes.
## CA1+
_( n1 -- n2 )_ n2 = n1 + size of char.
## CARRET
_( -- <cr> )_
## CASE
Compilation: _( R: -- case-sys )_ start a CASE...ENDCASE structure
Execution: _( -- )_
## CATCH
_( xt -- xi ... xj n|0 )_ Call xt, trap exception, and return it in n.
## CELL+
_( u1 -- u2 )_ u2 = u1 + size of cell in bytes.
## CELLS
_( n1 -- n2 )_ n2 = n1 * size of cell.
## CHAR
_( "word"<> -- char )_ parse word from input stream, return value of first char
## CHAR+
_( u1 -- u2 )_ u2 = u1 + size of char in bytes.
## CHARS
_( n1 -- n2 )_ n2 = n1 * size of char.
## CICOMP
_( addr1 addr2 u1 -- n1 )_ case-insensitive compare two strings of length u1
## CLEAR
_( n1 ... nx -- )_ empty stack
## CMOVE
_( addr1 addr2 len -- )_ move startomg from the bottom
## CMOVE>
_( addr1 addr2 len -- )_ move starting from the top
## CODE
_( "name"<> -- code-sys )_ create a new CODE definiion
## COMP
_( addr1 addr2 u1 -- n1 )_ compare two strings of length u1
## COMPARE
_( addr1 u1 addr2 u2 -- n1 )_ compare two strings
## COMPILE
_( -- )_ Compile code to compile the immediately following word. Better to use POSTPONE.
## COMPILE,
_( xt -- )_ compile xt into the dictionary
## CONSTANT
_( n "name"<> -- )_ alias of VALUE, OF816 doesn't have true constants
## CONTEXT
_( -- wid )_ Return first wordlist in search order.
## CONTROL
_( "name"<> )_ parse name, place low 5 bits of first char on stack, if compiling stat
compile it as a literal
## COUNT
_( c-addr -- c-addr+1 u )_ count packed string at c-addr
## CPEEK
_( addr -- char true )_ access memory at addr, returning char
## CPOKE
_( char addr -- true )_ store char at addr
## CR
_( -- )_ emit a CR/LF combination, set increment #LINE
## CREATE
_( "name"<> -- )_ create a definition, when executed pushes the body address
## D#
_( "#"<> -- n | -- )_ parse following number as decimal, compile as literal if compiling
## D+
_( d1 d2 -- d3 )_ d3 = d1+d2
## D-
_( d1 d2 -- d3 )_ d3 = d1-d2
## D.
_( d -- )_ output d
## D.R
_( d u -- )_ output d in a field of u chars
## D>S
_( d -- n )_ convert double-number to number
## DABS
_( d -- d' )_ take the absolute value of d
## DEBUG-MEM
_( -- )_ Display heap and temporary string information.
## DECIMAL
_( -- )_ store 10 to BASE
## DEFER
_( "name"<> -- )_ create definition that executes the first word of the body as an xt
## DEFINITIONS
_( -- )_ Set the compiler wordlist to the first wordlist in the search order.
## DEPTH
_( n1 ... nx -- n1 ... nx x )_
## DIGIT
_( char base -- digit true | char false )_ attempt to convert char to digit
## DNEGATE
_( d -- d' )_ negate d
## DO
Compilation: _( -- )_ ( R: -- do-sys )
Execution: _( limit start -- )_ begin DO loop
## DOES>
_( -- )_ alter execution semantics of most recently-created definition to perform
the following execution semantics.
## DROP
_( n1 -- )_
## DUMP
_( addr len -- )_ dump memory
## DUP
_( n1 -- n1 n2 )_ n2 = n1
## ELSE
_( C: if-sys -- else-sys )_ _( E: -- )_ ELSE clause of IF ... ELSE ... THEN
## EMIT
_( char -- )_ Output char.
## END-CODE
_( code-sys -- )_ synonym for C;
## ENDCASE
Compilation: _( case-sys -- )_ conclude a CASE...ENDCASE structure
Execution: _( | n -- )_ continue execution, dropping n if no OF matched
## ENDOF
Compilation; ( case-sys of-sys -- case-sys ) conclude an OF...ENDOF structure
Execution: Continue execution at ENDCASE of case-sys
## ENVIRONMENT?
_( c-addr u -- xn...x1 t | f )_ environmental query
## ERASE
_( addr len -- )_ zero fill memory with spaces
## EVAL
synonym for EVALUATE
## EVALUATE
_( xxn...xx1 c-addr u -- yxn...yx1 )_ interpret text in c-addr u
## EVEN
_( n1 -- n2 )_ if n1 is odd, n2=n1+1, otherwise n2=n1
## EXECUTE
_( xt -- )_ execute xt, regardless of its flags
## EXIT
## EXIT?
_( -- f )_ If #LINE >= 20, prompt user to continue and return false if they want to.
## EXPECT
_( addr len -- )_ get input line of up to len chars, stor at addr, actual len in SPAN
## FALSE
_( -- false )_ false = all zero bits
## FCODE-REVISION
_( -- u )_ Return FCode revision
## FERROR
_( -- )_ display FCode IP and byte, throw exception -256
## FIELD
_( offset size "name"<> -- offset+size )_ create name, name exec: _( addr -- addr+offset)_
## FILL
_( addr len char -- )_ fill memory with char
## FIND
_( c-addr -- xt )_ find packed string word in search order, 0 if not found
## FM/MOD
_( d n1 -- n2 n3 )_ floored divide d by n1, giving quotient n3 and remainder n2
## FORGET
_( "name"<> -- )_ attempt to forget name and subsequent definitions in compiler
word list. This may have unintended consequences if things like wordlists and
such were defined after name.
## FORTH
_( -- )_ Set the first wordlist in the search order to the system words
## FORTH-WORDLIST
_( -- wid )_ Return the WID of the wordlist containing system words.
## FREE-MEM
_( c-addr u -- )_ Release memory to heap, u is currently ignored.
## GET-CURRENT
_( -- wid )_ Get WID current compiler wordlist.
## GET-ORDER
_( -- widn ... wid1 u )_ Get dictionary search order.
## GET-TOKEN
_( fcode# -- xt f )_ get fcode#'s xt and immediacy
## H#
_( "#"<> -- n | -- )_ parse following number as hex, compile as literal if compiling
## HERE
_( -- c-addr )_ return dictionary pointer
## HEX
_( -- )_ store 16 to BASE
## HOLD
_( c -- )_ place c in pictured numeric output
## I
_( -- n )_ copy inner loop index to stack
## IF
_( C: if-sys )_ _( E: n -- )_ begin IF ... ELSE ... ENDIF
## IMMEDIATE
_( -- )_ mark last compiled word as an immediate word
## INVERT
_( x -- x' )_ invert the bits in x
## J
_( -- n )_ copy second-inner loop index to stack
## KEY
_( -- char )_ wait for input char, return it
## KEY?
_( -- f )_ f = true if input char is ready, false otherwise
## L!
_( n c-addr -- )_ write cell n to c-addr
## L,
_( q -- )_ compile quad into the dictionary
## L@
_( c-addr -- n )_ fetch cell from c-addr
## LA+
_( u1 n -- u2 )_ u2 = u1 + n * size of long in bytes.
## LA1+
_( n1 -- n2 )_ n2 = n1 + size of long.
## LABEL
_( "name"<> -- code-sys )_ create a new LABEL definition
## LAST
## LBFLIP
_( q -- q' )_ Flip the byte order of quad.
## LBFLIPS
_( addr len -- )_ perform LBFLIP on the cells in memory
## LBSPLIT
_( u -- u1 ... u4 )_ u1 ... u4 = bytes of u.
## LCC
_( char -- char' )_ lower case convert char
## LEAVE
_( -- )_ exit loop
## LEFT-PARSE-STRING
_( str len char -- r-str r-len l-str l-len )_ parse string for char, returning
the left and right sides
## LINEFEED
_( -- <lf> )_
## LITERAL
_( n -- )_ compile numeric literal n into dictionary, leave n on stack at execution
## LOOP
Compilation: _( C: do-sys -- )_
Execution: _( -- )_ add 1 to loop index and continue loop if within bounds
## LPEEK
_( addr -- cell true )_ access memory at addr, returning cell
## LPOKE
_( cell addr -- true )_ store cell at addr
## LSHIFT
_( n1 n2 -- n3 )_ n3 = n1 << n2
## LWFLIP
_( q -- q )_ Flip the word order of quad.
## LWFLIPS
_( addr len -- )_ perform LWFLIP on the cells in memory
## LWSPLIT
_( u -- u1 ... u2 )_ u1 ... u2 = words of u.
## M*
_( n1 n2 -- d )_ d = n1*n2
## MAX
_( n1 n2 -- n1|n2 )_ return the greater of n1 or n2
## MIN
_( n1 n2 -- n1|n2 )_ return the smaller of n1 or n2
## MOD
_( n1 n2 -- n3 )_ symmetric divide n1 by n2, giving remainder n3
## MOVE
_( addr1 addr2 len -- )_ move memory
## N>R
_( x1 ... xn n -- n )_ _( R: x1 ... xn -- )_
## NA+
_( u1 n -- u2 )_ u2 = u1 + n * size of cell in bytes.
## NA1+
_( n1 -- n2 )_ n2 = n1 + size of cell.
## NEGATE
_( n -- n' )_ negate n
## NIP
_( n1 n2 -- n2 )_
## NOOP
_( -- )_ Do nothing.
## NOSHOWSTACK
_( -- )_ assuming STATUS is a defer, set it to NOOP
## NOT
_( x -- x' )_ invert the bits in x
## NR>
_( R: x1 ... xn -- )_ _( n -- x1 ... xn n )_
## O#
_( "#"<> -- n | --)_ parse following number as octal, compile as literal if compiling
## OCTAL
_( -- )_ store 8 to BASE
## OF
Compilation: _( case-sys -- case-sys of-sys )_ begin an OF...ENDOF structure
Execution: _( x1 x2 -- | x1 )_ execute OF clause if x1 = x2, leave x1 on stack if not
## OFF
_( c-addr -- )_ store all zero bits to cell at c-addr
## ON
_( c-addr -- )_ store all one bits to cell at c-addr
## ONLY
_( -- )_ Set the search order to contain only the system wordlist.
## OR
_( n1 n2 -- n3 )_ n3 = n1 | n2
## ORDER
_( -- )_ Display the current search order and compiler wordlist.
## OVER
_( n1 n2 -- n1 n2 n3 )_ n3 = n1
## PACK
_( str len addr -- addr )_ pack string into addr, similar to PLACE in some Forths
## PAD
_( -- a-addr )_ return address of PAD
## PAGE
_( -- )_ clear screen & home cursor _(uses ANSI escape sequence)_
## PARSE
_( char "word"<char> -- c-addr u )_ parse word from input stream, delimited by char
## PARSE-2INT
_( str len -- val.lo val.hi )_ parse two integers from string in the form "n2,n2"
## PARSE-NAME
_( "word"<> -- c-addr u )_ alias of PARSE-WORD
## PARSE-WORD
_( "word"<> -- c-addr u )_ parse word from input stream, return address and length
## PICK
_( x1 ... xn u -- x1 ... xn x(n-u)_ )
## POSTPONE
_( "name"<> -- )_
## PREVIOUS
_( -- )_ Remove the first wordlist in the search order.
## QUIT
_( -- )_ _( R: ... -- )_ enter outer interpreter loop, aborting any execution
## R+1
_( R: n -- n' )_ n' = n + 1
## R>
_( R: n -- )_ _( -- n )_
## R@
_( R: n -- n )_ _( -- n )_
## RB!
_( byte addr -- )_ perform FCode-equivalent RB!: store byte
## RB@
_( addr -- byte )_ perform FCode-equivalent RB@: fetch byte
## RDROP
_( R: n -- )_
## RECURSE
_( -- )_ compile the execution semantics of the most recently-created definition
## RECURSIVE
_( -- )_ make the current definition findable during compilation
## REFILL
_( -- f )_ refill input buffer, f = true if that worked, false if not
## REPEAT
_( C: orig dest -- )_ _(R: -- )_ resolve orig and dest, repeat BEGIN loop
## RESET-ALL
_( -- )_ Reset the system.
## RESTORE-INPUT
## RL!
_( cell addr -- )_ perform FCode-equivalent RL!, store cell
## RL@
_( addr -- cell )_ perform FCode-equivalent RL@: fetch cell
## ROLL
_( xu ... x0 u -- xu-1 .. x0 xu )_
## ROT
_( n1 n2 n3 -- n2 n3 n1 )_
## RSHIFT
_( n1 n2 -- n3 )_ n3 = n1 >> n2
## RW!
_( word addr -- )_ perform FCode-equivalent RW!: store word
## RW@
_( addr -- word )_ perform FCode-equivalent RW@: fetch word
## S"
_( "text"<"> -- c-addr u )_
## S.
_( n -- )_ output n
## S>D
_( n -- d )_ convert number to double-number
## SAVE-INPUT
## SEAL
_( -- )_ Set the search order to contain only the current top of the order.
## SEARCH
_( c-addr1 u1 c-addr2 u2 -- c-addr3 u3 flag )_
## SEARCH-WORDLIST
_( c-addr u wid -- 0 | xt +-1 )_ search wordlist for word
## SEE
_( "name"<> -- )_ attempt to decompile name
## SET-CURRENT
_( wid -- )_ Set the compiler wordlist.
## SET-ORDER
_( widn ... wid1 n -- )_ Set dictionary search order.
## SET-TOKEN
_( xt fcode# f -- )_ set fcode# to execute xt, immediacy f
## SHOWSTACK
_( -- )_ assuming STATUS is a defer, set it to .S
## SIGN
_( n -- )_ place - in pictured numeric output if n is negative
## SIGNUM
_( n -- s )_ s = -1 if n is negative, 0 if 0, 1 if positive
## SLITERAL
C: _( c-addr1 u -- )_ R: _( -- c-addr 2 u )_ compile string literal into current def
## SM/REM
_( d n1 -- n2 n3 )_ symmetric divide d by n1, giving quotient n3 and remainder n2
## SOURCE
_( -- c-addr u )_ return address and length of input source buffer
## SOURCE-ID
_( -- n )_ return current input source id _(0 = console, -1 = string, >0 = file)_
## SPACE
_( -- )_ emit a space
## SPACES
_( u -- )_ emit u spaces
## SPAN
## SQRTREM
_( u1 -- u2 u3 )_ u2 = closest square root <= to the true root, u3 = remainder
## STATE
_( -- a-addr )_ STATE variable, zero if interpreting.
## STRUCT
_( -- 0 )_
## SWAP
_( n1 n2 -- n2 n1 )_
## THEN
_( C: if-sys|else-sys -- )_ _( E: -- )_
## THROW
_( n -- )_ Throw exception n if n <> 0.
## TO
_( n "name"<> -- )_ change the first cell of the body of xt to n. Can be used on
## TRUE
_( -- true )_ true = all one bits
## TUCK
_( n1 n2 -- n3 n1 n2 )_ n3 = n2
## TYPE
_( addr u -- )_ Output string.
## U#
_( u1 -- u2 )_ divide u1 by BASE, convert remainder to char and HOLD it, u2 = quotient
## U#>
_( u -- )_ conclude pictured numeric output
## U#S
_( u -- 0 )_ perform U# until quotient is zero
## U*
_( u1 u2 -- u3 )_ u3 = u1*u2
## U.
_( u -- )_ output u
## U.0
## U.R
_( u1 u2 -- )_ output u1 in a field of u2 chars
## U/MOD
_( u1 u2 -- u3 u4 )_ divide u1 by u2, giving quotient u4 and remainder u3
## U2/
_( n -- n' )_ shift n1 one bit right
## U<
_( u1 u2 -- f )_ f = true if u1 < u2, false if not
## U<=
_( u1 u2 -- f )_ f = true if u1 <= u2, false if not
## U>
_( u1 u2 -- f )_ f = true if u1 > u2, false if not
## U>=
_( u1 u2 -- f )_ f = true if u1 >= u2, false if not
## UD/MOD
_( d1 n1 -- d2 n2 )_ d2, n2 = remainder and quotient of d1/n1
## UM*
_( u1 u2 -- ud )_ ud = u1*u2
## UM/MOD
_( ud u1 -- u2 u3 )_ divide ud by u1, giving quotient u3 and remainder u2
## UNALIGNED-L!
_( n c-addr -- )_ write cell n to c-addr
## UNALIGNED-L@
_( c-addr -- n )_ fetch cell from c-addr
## UNALIGNED-W!
_( word c-addr -- )_ write word n to c-addr
## UNALIGNED-W@
_( c-addr -- n )_ fetch word from c-addr
## UNLOOP
_( -- )_ _( R: loop-sys -- )_ remove loop parameters from stack
## UNTIL
_( C: dest -- )_ _( R: x -- )_ UNTIL clause of BEGIN...UNTIL loop
## UNUSED
_( -- u )_ u = unused data space accounting for PAD and dynamic allocations
## UPC
_( char -- char' )_ upper case convert char
## VALUE
_( n "name"<> -- )_ create a definition that pushes n on the stack, n can be changed
with TO
## VARIABLE
_( "name"<> -- )_ execute CREATE name and ALLOT one cell, initially a zero.
## VOCABULARY
_( "name"<> -- )_ Create a new named wordlist definition. When name is executed,
put the WID of the wordlist at the top of the search order.
2020-01-21 07:09:50 +00:00
The WID is the address of the body of the named wordlist definition.
2020-01-14 00:58:39 +00:00
## W!
_( word c-addr -- )_ write word n to c-addr
## W,
_( word -- )_ compile word into dictionary
## W@
_( c-addr -- word )_ fetch word from c-addr
## WA+
_( u1 n -- u2 )_ u2 = u1 + n * size of word in bytes.
## WA1+
_( n1 -- n2 )_ n2 = n1 + size of word.
## WBFLIP
_( w -- w' )_ Flip the byte order of w.
## WBFLIPS
_( addr len -- )_ perform WBFLIP on the words in memory
## WBSPLIT
_( u -- u1 .. u2 )_ u1 .. u2 = bytes of word u.
## WHILE
_( C: dest -- orig dest )_ _( E: x -- )_ WHILE clause of BEGIN...WHILE...REPEAT loop
## WITHIN
_( n1|u1 n2|u2 n3|u3 -- f )_ f = true if n2|u2 <= n1|u1 < n3|u3, false otherwise
## WLJOIN
_( w.l w.h -- q )_ Join words into quad.
## WORD
_( char "word"<char> -- c-addr )_ parse word from input stream delimited by char, return
address of WORD buffer containing packed string
## WORDLIST
_( -- wid )_ Create a new wordlist.
## WORDS
_( -- )_ output the words in the CONTEXT wordlist
## WPEEK
_( addr -- word true )_ access memory at addr, returning word
## WPOKE
_( word addr -- true )_ store word at addr
## WSX
_( word -- sign-extended )_
## XOR
_( n1 n2 -- n3 )_ n3 = n1 ^ n2
## [
_( -- )_ Enter interpretation state.
## [']
_( [old-name<>] -- xt )_ immediately parse old-name in input stream, return xt of word
## [:
2020-01-21 07:09:50 +00:00
_( C: -- quot-sys )_ _( R: -- )_ Start a quotation.
2020-01-14 00:58:39 +00:00
## [CHAR]
_( "word"<> -- char )_ immediately perform CHAR and compile literal
## [COMPILE]
_( "name"<> -- )_ Compile name now. Better to use POSTPONE.
## \
_( "..."<end> -- )_ discard the rest of the input buffer _(line during EVALUATE)_
## ]
_( -- )_ Enter compilation state.