From c8819ee75b180664d649f542f4448122f6c4cdce Mon Sep 17 00:00:00 2001 From: Ralph Ronnquist Date: Wed, 2 Jun 2021 13:45:35 +1000 Subject: [PATCH] saving prebuilt binaries --- .gitignore | 2 - reference.html | 3342 ++++++++++++++++++++++++++++++++++++++++++++++++ rrqforth | Bin 0 -> 2148423 bytes 3 files changed, 3342 insertions(+), 2 deletions(-) create mode 100644 reference.html create mode 100755 rrqforth diff --git a/.gitignore b/.gitignore index d2b2e19..cc6b724 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,4 @@ archive gdbinit -reference.html -rrqforth rrqforth.fas rrqforth.map diff --git a/reference.html b/reference.html new file mode 100644 index 0000000..f57f5c8 --- /dev/null +++ b/reference.html @@ -0,0 +1,3342 @@ + + + + + + +RRQFORTH Reference Documentation + + + + + +
+
+

Word Index

+
+ +

<   +<=   +=   +!=   +>   +>=   +0=   +0<   +-   +*   ++   +/   +<<   +>>   +s>>   +[']  

+

@   +!   +C@   +C!   +2@   +2!   +!+   +@n++   +@n--   +C,   +S"   +>R   +R@   +R>   +R[n]  

+

DATA-STACK   +RETURN-STACK   +  +BRANCH   +0BRANCH   +1BRANCH   +  +2DROP   +2DUP   +2OVER   +2SWAP  

+

ABS   +ALLOT   +AND   +[ASM]  

+

BASE   +BEGIN   +BREAK  

+ +

DECIMAL   +DEPTH   +DIGITS   +/MOD   +DFA>TFA   +doDOES   +DOES>   +doFASM   +doFORTH   +doSTRING   +doVALUE   +doVARIABLE   +DROP   +DUP  

+

ELSE   +EMIT   +END   +ERASE   +EVALUATE-STREAM   +EXECUTE   +EXIT  

+

FALSE   +FIND   +FORTH  

+

HERE   +HEX  

+

IF   +IFAGAIN   +IFBREAK   +IMMEDIATE  

+ + +

NEGATE   +NIP   +NL   +NOT   +NUMBER  

+

OPEN-FILE"   +OR   +OVER  

+ +

QUIT  

+ +

SP   +STATE   +STDIN   +STREAM   +STREAM-NCHARS   +STRLEN   +STRNCMP   +STRNCPY   +SWAP   +SYSTEM  

+

TELL   +TERMINATE0   +TFA>CFA   +TFA>DFA   +TFA>FLAGS@   +TFA>NAMEZ   +THEN   +THIS-WORD   +TRUE   +TUCK  

+ +

WITHIN   +WORDS  

+

XOR  

+ +
+
+
+

Word Descriptions

+
+

+
+

Word: [ASM]

+
+
+
data stack: ( -- )
+
+

"[ASM]" is a function word that introduces inline assembly in an +RRQFORTH definition. Such assembly code may return to subsequence +RRQFORTH executon by means of the following instruction sequence:

+
+
+
+
+
        mov rsi,forthcode
+        lodsq
+        jmp qword [rax]
+forthcode:
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: 0BRANCH

+
+
+
Data stack: ( v -- )
+
+

"0BRANCH" is a function word that implements execution conditional by +means of optionally adding the subsequent branch offset, or not, to +the point of execution. If the value, v, is 0 then the branch offset +is added, and otherwise execution continues with the cell following +the branch offset in the definition.

+
+_______________________________________________________ +
+

+
+
+

Word: 0=

+
+
+
Data stack: ( v -- 0/-1 )
+
+

"0=" is a function word that replaces a value with its logical +complement; the result is zero if the value non-zero, and the result +is non-zero if the value is zero.

+

Compare with NOT.

+
+_______________________________________________________ +
+

+
+
+

Word: 0<

+
+
+
Data stack: ( v -- 0/-1 )
+
+

"0<" is a function word that replaces a value with -1 if the value is +less than 0, and 0 otherwise.

+
+
+
+
Definition concept 1: Word: 0<
+
+
: 0= 0 SWAP < ;
+
+
+

See also SWAP and +<.

+
+_______________________________________________________ +
+

+
+
+

Word: 1BRANCH

+
+
+
Data stack: ( v -- )
+
+

"1BRANCH" is a function word that implements execution conditional by +means of optionally adding the subsequent branch offset, or not, to +the point of execution. If the value, v, is non-zero then the branch +offset is added, and otherwise execution continues with the cell +following the branch offset in the definition.

+
+_______________________________________________________ +
+

+
+
+

Word: 2DROP

+
+
+
Data stack: ( v1 v2 -- )
+
+

"2DROP" is a function word that plainly discards the top 2 cells from +the data stack.

+
+_______________________________________________________ +
+

+
+
+

Word: 2DUP

+
+
+
Data stack: ( v1 v2 -- v1 v2 v1 v2 )
+
+

"2DUP" is a function word that duplicates the top 2 cells on the data +stack.

+
+
+
+
Definition concept 2: Word: 2DUP
+
+
: 2DUP OVER OVER ;
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: 2@

+
+
+
Data stack: ( a -- v2 v1 )
+
+

"2@" is a function word that pushes the two concecutive values v1 and +v2 from the address a onto the data stack. Value v1 is from address a +and value v2 is from address a + 8.

+
+_______________________________________________________ +
+

+
+
+

Word: 2OVER

+
+
+
Data stack: ( v1 v2 v3 v4 -- v1 v2 v3 v4 v1 v2 )
+
+

"2OVER" is a function word that replicates the second duble-cell pair +onto the top of the data stack. This is similar to OVER but +working with cell pairs rather than single cells.

+
+
+
+
Definition concept 3: Word: 2OVER
+
+
: 2OVER 3 PICK 3 PICK ;
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: 2!

+
+
+
Data stack: ( v2 v1 a -- )
+
+

"2!" is a function word that stors two concecutive values v1 and v2 to +the address a from the data stack. Value v1 is stored at address a and +value v2 is stored at address a + 8.

+
+_______________________________________________________ +
+

+
+
+

Word: 2SWAP

+
+
+
Data stack: ( v1 v2 v3 v4 -- v3 v4 v1 v2 )
+
+

"2SWAP" is a function word the reorgnizes the top 4 cells swappping +the upper and lower pair. This is similar to SWAP but +working with cell pairs rather than single cells.

+
+
+
+
Definition concept 4: Word: 2SWAP
+
+
: 2SWAP 3 ROLL 3 ROOL ;
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: C,

+
+
+
Data stack: ( v -- )
+
+

"C," (C-comma) is a function word that puts a byte on the +HERE heap. The least significant byte of the value is put +at the current free head address, which also is incremented.

+
+
+
+
Definition concept 5: Word: C,
+
+
: C, HERE @ 1 ALLOT C! ;  ( v -- ; Claim 1 byte and put lsb value there )
+
+
+

See also :, [p_comma]. HERE, @, +ALLOT, C! and ;.

+
+_______________________________________________________ +
+

+
+
+

Word: C@

+
+
+
Data stack: ( a -- v )
+
+

"C@" is a function word that pushes the byte value v from the address a.

+
+_______________________________________________________ +
+

+
+
+

Word: C!

+
+
+
Data stack: ( v a -- )
+
+

"C!" is a function word that stores the byte value v (the least +significant byte of the cell) at the address a.

+
+_______________________________________________________ +
+

+
+
+

Word: R@

+
+
+
Data stack: ( -- v )   Return stack: ( v -- v )
+
+

"R@" is a function word that "copies" the top return stack value onto +the data stack.

+
+_______________________________________________________ +
+

+
+
+

Word: R>

+
+
+
Data stack: ( -- v )   Return stack: ( v -- )
+
+

"R>" is a function word that "moves" the top return stack value onto +the data stack.

+
+_______________________________________________________ +
+

+
+
+

Word: ABS

+
+
+
Data stack: ( v1 -- v2 )
+
+

"ABS" is a function word that replaces a value with its absolute +value. To that end, the values are 64-bit signed integers.

+
+_______________________________________________________ +
+

+
+
+

Word: ALLOT

+
+
+
Data stack: ( n -- )
+
+

"ALLOT" is a function word that merely increments the HERE +variable with n so as to claim that amount of the heap.

+
+
+
+
+
Defintion concept for ALLOT
+

( n — ) : ALLOT HERE @ + HERE ! ;

+
+
+
+
+
Usage example 1: claim 16 bytes for variable FOO

CREATE FOO DROP HERE @ 16 ALLOT

+
+
+_______________________________________________________ +
+

+
+
+

Word: AND

+
+
+
Data stack: ( v1 v2 -- v3 )
+
+

"AND" is a function word that replaces a value pair with their bitwise +conjunction; each bit is 1 if the corresponding bits of both operands +are 1 and 0 if not.

+
+_______________________________________________________ +
+

+
+
+

Word: MAIN-ARGS

+
+
+
Data stack: ( -- p[argv** argc] )
+
+

"ARGS" is a value word that holds a pointer to the command line data +block which consists of a count cell followed by that many asciiz +pointers and then a 0 cell.

+
+
+
+
Usage example 2: the command line argument block
+
+
ARGS -> 8 bytes: count of non-zero asciiz pointers following
+        8 bytes: command name string
+        8 bytes: first argument string
+        8* ...
+        8 zero
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: BASE

+
+
+
Data stack: ( -- a )
+
+

"BASE" is a variable word for the numerical base used by input and +output functions, NUMBER and [p_dot], when +translating numbers between cell value form and text form. The +numerical base is set to 10 or 16 by DECIMAL and +HEX respectively, and those are the only two bases currently +supported.

+

See also DIGITS, which holds the mapping table from +digits to text.

+
+
+
Usage example 3: claim 16 bytes for variable FOO

CREATE FOO BASE

+
+
+_______________________________________________________ +
+

+
+
+

Word: BEGIN

+
+
+
Data stack: Compiling: ( -- a 0 )
+
+

"BEGIN" is an immediate function word that is used together with +IFBREAK, IFAGAIN and END to +implement structured execution control. BEGIN simply places the +address for resolving branches back to this point during execution, +and then a 0 as a marker so as to allow for an unknown number of block +exit points.

+
+_______________________________________________________ +
+

+
+
+

Word: [']

+
+
+
Data stack: ( -- cfa )   Input stream: word
+
+

"[']" is an immediate function word that reads the next word on the +input stream and pushes its cfa.

+
+_______________________________________________________ +
+

+
+
+

Word: BRANCH

+
+
+
Data stack: ( -- )
+
+

"BRANCH" is a function word that implements execution transfer by +means of adding the subsequent branch offset to the point of +execution.

+
+_______________________________________________________ +
+

+
+
+

Word: BREAK

+

"BREAK" is an immediate function word that lays out an unconditional +branch out of an enclosing xef:p_begin[BEGIN]-END block. +Similar to IFBREAK it lays out the branch cell +followed by a reserved cell for the branch offset, and inserts the +resolution address just above the required 0 on the data stack.

+
+_______________________________________________________ +
+

+
+
+

Word: [calltrace]

+

"[calltrace]" is a variable word that ccontains a small assembly +snippet that may be used for debugging when running under gdb.

+
+_______________________________________________________ +
+

+
+
+

Word: CFA>FLAGS@

+
+
+
Data stack: ( cfa -- flags )
+
+

"CFA>FLAGS@" is a function word that pushes word flags of the given cfa.

+
+
+
+
+
Defintion concept for CFA>FLAGS@
+

: CFA>FLAGS@ 16 - @ 16 + ;

+
+
+
+_______________________________________________________ +
+

+
+
+

Word: CLEAR-STREAM

+
+
+
Data stack: ( stream -- )
+
+

"CLEAR-STREAM" is a function word that discards whatever is currently +remaining in the buffer for the stream, so that a subsequent read will +pull in more data from its source.

+ +
+_______________________________________________________ +
+

+
+
+

Word: :

+
+
+
Data stack: ( -- )    Input stream: word
+
+

":" (colon) is a function word that starts a new forth definition. +This includes reading the next word for making a new dictionary entry +and setting evaluation state to compiling mode.

+
+
+
+
Definition concept 6: Word: :
+
+
: : doFORTH READ-WORD CREATE TFA>CFA ! ] ;
+
+
+

See also doFORTH, READ-WORD, +CREATE, TFA>CFA, !, +] and ;.

+
+_______________________________________________________ +
+

+
+
+

Word: ,

+
+
+
Data stack: ( v -- )
+
+

"," (comma) is a function word that puts a cell value on the +HERE heap.

+
+
+
+
Definition concept7: Word: ,
+
+
: , HERE @ 8 ALLOT ! ; ( v -- ; Claim 8 bytes and put value there )
+
+
+

See also :, [p_Ccomma]. HERE, @, +ALLOT, ! and ;.

+
+_______________________________________________________ +
+

+
+
+

Word: CREATE

+
+
+
Data stack: ( char* n -- tfa )
+
+

"CREATE" is a function word that allocates a "word header" with the +indicated [n:char*] print name, and returns the "TFA" (Token Field +Address) of the word. The header memory layout is as follows:

+
+
+
+
+
struct WORD
+TFA  8 link ; tfa of previous word
+pCFA 8 cfap ; CFA = Code Field Address of this word
+     8 flags ;
+PFA  8 length ; length of pname representation
+     ? pname ; the pname bytes
+     1 nul ; a forced nul byte following the pname
+pTFA 8 tfap ; TFA = Token Field Address of this word
+OFF  8 doff ; entry offset for FORTH level execution
+CFA  8 doer ; word execution semantics
+DFA  0 content ; DFA = Data Field Address
+end_struct
+
+
+

A "word" is generally understod as a marker in memory for some content +as held in the memory space following the DFA (Data Field Address).

+

The words CFA (Code Field Address) is the most important field for +RRQFORTH execution, as holding a jump address to the assembly code +that implements the particular execution semantics for the word. +"CREATE" will assign this as "dovariable", which makes the word push +its DFA when executed. This is changed to "doforth" for RRQFORTH +function words initiated by ":" (aka "COLON") or changed to "dovalue" +for RRQFORTH constants created by "CONSTANT".

+
+
+
+
Definition concept 8: Word: CREATE
+
+
HERE @ R> ( save tfa on RS )
+  R@ CURRENT-WORD @ DUP @ , ! ( link in a new word )
+  DUP 49 + R@ + ,             ( pCFA )
+  0 ,                         ( flags )
+  DUP , ( length )
+  HERE @ ROT ROT MEMCPY 0 C,  ( pname + NUL )
+  R@ ,                        ( pTFA )
+  0 ,                         ( OFF )
+  doVARIABLE                  ( CFA, default semantics )
+
+
+
+
+
Usage example: a possible definition of CONSTANT
+

: CONSTANT READ-WORD CREATE TFA>DFA doVALUE OVER 8 - ! ! ;

+
+

See also !, +, [p_comma], @, +[p_Ccomma], CURRENT-WORD, DUP, +HERE, HERE, R@, ROT, +and doVARIABLE, +as well as EXECUTE +about the range of "doer" assignments and their meanings.

+
+_______________________________________________________ +
+

+
+
+

Word: CURRENT-WORDLIST

+
+
+
Data stack: ( -- a )
+
+

"CURRENT-WORDLIST" is a variable word that points out the DFA of the +current word list word for FIND to use finding words. The +word list word content is as follows:

+
+
+
+
Layout 1: word list word content
+
+
  8 TFA of latest word in the word list
+  8 DFA of the/a subsequent word list to search through
+
+
+

Note that word lists are chained by "extension" and in general it ends +with the FORTH word list. Initially the +SYSTEM word list is the only other word list.

+
+_______________________________________________________ +
+

+
+
+

Word: DATA-STACK

+
+
+
Data stack: ( -- a )
+
+

"DATA-STACK" is a variable word that harbours the data stack.

+
+_______________________________________________________ +
+

+
+
+

Word: DECIMAL

+
+
+
Data stack: ( -- )
+
+

"DECIMAL" is a function word that sets BASE to 10.

+
+
+
+
Definition concept 9: Word: DECIMAL
+
+
: DECIMAL 10 BASE ! ;
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: DEPTH

+
+
+
Data stack: ( -- v )
+
+

"DEPTH" is a function word that pushes the count of data stack cells +onto the data stack.

+
+_______________________________________________________ +
+

+
+
+

Word: DFA>TFA

+
+
+
Data stack: ( dfa -- tfa )
+
+

"DFA>TFA" is a function word that pushes word tfa of the given dfa.

+
+
+
+
+
Definition concept for DFA>TFA
+

: DFA>TFA 24 - @ ;

+
+
+
+_______________________________________________________ +
+

+
+
+

Word: DIGITS

+
+
+
Data stack: ( -- a )
+
+

"DIGITS" is a variable word that holds the character array for mapping +digit values to characters. It contains the 16 characters 0-9 and a-f.

+
+_______________________________________________________ +
+

+
+
+

Word: /

+
+
+
Data stack: ( v1 v2 -- q )
+
+

"/" (div) is a function word that replaces a pair of values with the +results of signed integer division of the first, v1, divided by the +second, v2. To that end, the values are 64-bit signed integers. The +result is the integer quotient, q, and the discarded remainder, r, +where q and r are the respectively largest and smallest integers to +satisfy the formula:

+
+
+
       v1 = q * v2 + r
+
+
+_______________________________________________________ +
+

+
+
+

Word: /MOD

+
+
+
Data stack: ( v1 v2 -- q r )
+
+

"/MOD" (div-mod) is a function word that replaces a pair of values +with the results of signed integer division of the first, v1, divided +by the second, v2. To that end, the values are 64-bit signed integers. +The result is the integer quotient, q, and the remainder, r, where q +and r are the respectively largest and smallest integers to satisfy +the formula:

+
+
+
       v1 = q * v2 + r
+
+
+_______________________________________________________ +
+

+
+
+

Word: doDOES

+
+
+
Data stack: ( -- a )
+
+

"doDOES" is a variable word whose value is the implementation of the +[p_does] execution semantics. This is the same as +doFORTH but it starts at an offset into the word +concerned.

+
+_______________________________________________________ +
+

+
+
+

WORD: DOES>

+
+
+
Data stack: ( -- )
+
+

"DOES>" is a function that in execution mode does nothing but in +compilation mode it changes the execution semantics assignments for +the most recent word to use the dodoes sematics with adjustment +offset to the current heap address. I.e., the word being defined will +have its execution start at whatever comes after "DOES>".

+
+
+
+
Word: DOES>
+
+
: DOES> IMMEDIATE
+STATE @ != IF ( only for compilation mode )
+  CURRENT-WORDLIST @ @ TFA>CFA    ( cfa of current word )
+    doDOES OVER !                 ( set up doer )
+    HERE @ OVER 8 + - SWAP 8 - !  ( set up offset
+  THEN
+;
+
+
+

See also +!, +!⇒>, +→>, +@, +CURRENT-WORDLIST, +HERE, +IF, +IMMEDIATE, +OVER, +STATE, +SWAP, +TFA>CFA, +THEN, +doDOES, +as well as EXECUTE +about the range of "doer" assignments and their meanings.

+
+_______________________________________________________ +
+

+
+
+

Word: doFASM

+
+
+
Data stack: ( -- a )
+
+

"doFASM" is a variable word whose value is the implementation of the +execution semantics for assembly code content.

+
+_______________________________________________________ +
+

+
+
+

Word: doFORTH

+
+
+
Data stack: ( -- a )
+
+

"doFORTH" is a variable word whose value is the implementation of the +RRQFORTH execution semantics.

+
+_______________________________________________________ +
+

+
+
+

Word: doSTRING

+
+
+
Data stack: ( -- a )
+
+

"doFASM" is a variable word whose value is the implementation of the +execution semantics for assembly code implemented words. In those +cases the execution leads to the word content.

+

The register context at entry to an assembly code implemented word is +as follows:

+
+
+
    rax = cfa* of word to execute
+    rsi = cell* in the calling definition, after calling cell
+    rsp = data stack pointer
+    rbp = return stack pointer
+
+

The assembly code must ensure that rsi is preserved and that rsp +and rbp are used according to their roles.

+
+_______________________________________________________ +
+

+
+
+

Word: .

+
+
+
Data stack: ( v -- )
+
+

"." is a function word that prints the top stack value to stdout using +the current BASE (either DECIMAL or +HEX).

+
+_______________________________________________________ +
+

+
+
+

Word: "

+
+
+
data stack: ( -- char n )    Input stream: ...."
+
+

""" (double quote) is a function word that copies the input stream +text up to next double quote to PAD, and returns the +[n:char*] cell pair for that string.

+
+_______________________________________________________ +
+

+
+
+

Word: doVALUE

+
+
+
Data stack: ( -- a )
+
+

"doVALUE" is a variable word whose value is the implementation of the +execution semantics for cell values, which are variables with a single +64-bit cell holding the value.

+

The execution of this result in pushing the value:

+
+
+
Resulting data stack: ( -- v )
+
+
+_______________________________________________________ +
+

+
+
+

Word: doVARIABLE

+
+
+
Data stack: ( -- a )
+
+

"doVARIABLE" is a variable word whose value is the implementation of +the execution semantics for "variables", which basically are markers +into the heap for some number block of memory.

+

The execution of a variable results in pushing its content address:

+
+
+
Resulting data stack: ( -- a )
+
+
+_______________________________________________________ +
+

+
+
+

Word: DROP

+
+
+
Data stack: ( v -- )
+
+

"DROP" is a function word that discards the top stack cell.

+
+_______________________________________________________ +
+

+
+
+

Word: DUP

+
+
+
Data stack: ( v -- v v )
+
+

"DUP" is a function word that duplicates the top stack cell.

+
+_______________________________________________________ +
+

+
+
+

Word: ELSE

+
+
+
Data stack: Compiling: ( a -- a )
+
+

"ELSE" is an immediate function word that is used together with +IF and THEN to implement structured execution +control. ELSE lays out an unresolved unconditional branch as an ending +for the "then-part" of the structured statement, and it then performs +the branch resolution for the "else-part". To that end it replaces the +stacked address which pin-points the foot address the branch offset to +resolve, so that at execution time there is an appropriate conditional +branch past the "then-part" and the "else-part" of the "structured +statement".

+
+_______________________________________________________ +
+

+
+
+

Word: EMIT

+
+
+
Data stack: ( c -- )
+
+

"EMIT" is a function word that puts the given character code to +standard output (file descriptor 1). The character is the least +significant byte of the top cell.

+
+_______________________________________________________ +
+

+
+
+

Word: END

+
+
+
Data stack: Compiling: ( a 0 * -- )
+
+

"END" is an immediate function word that is used together with +BEGIN, IFBREAK and IFAGAIN to +implement structured execution control. END processes the data stack +to resolve any dangling IFBREAK branch offset for the +block of the matching BEGIN.

+
+_______________________________________________________ +
+

+
+
+

Word: =

+
+
+
Data stack: ( v1 v2 -- 0/-1 )
+
+

"=" is a function word that replaces a pair of values with -1 of the +values are equal, and 0 otherwise.

+
+_______________________________________________________ +
+

+
+
+

Word: ERASE

+
+
+
Data stack: ( a n -- )
+
+

"ERASE" is a function word that stores n NUL bytes at address a an up.

+
+_______________________________________________________ +
+

+
+
+

Word: EVALUATE-STREAM

+
+
+
Data stack: ( stream -- ??? 0/1 )     Input stream: ......
+
+

"EVALUATE-STREAM" is a function word that reads words separated by +whitespace from the stream until it discovers an unknown word, or the +stream is exhausted. Depending on STATE, the words are +either executed or compiled, and all ther stack and heap effects are +preserved. "EVALUATE-STREAM" returns with an additional 0 or 1 on the +stack to respectively indicate that the last word was unkown, i.e. not +found (FIND) in the current word list +(CURRENT-WORDLIST) and not a +NUMBER of the current BASE.

+

Note that numbers in the current BASE are treated as known +words that are parsed into cell values. If interpreting, then the +value is left on the stack. If compiling, then the value is added to +the heap subsequent to first adding LIT, which is done +so as to make that value be push to the data stack upon a later +execution.

+

In the DECIMAL base, the number word may begin with a +minus sign.

+

The words are read and executed one by one, accounting for whether its +a number word or not, whether it is an IMMEDIATE word +or not, and whether the state at the time of execution indicates +"compiling" of "interpreting". Immediate words are executed in both +interpreting and compiling state, while other words have their CFA get +added to the heap so as to gain their execution effect upon a later +execution.

+

Note that "EVALUATE-STREAM" keeps the stream (pointer) on the return +stack while reading, parsing and executing.

+

If "EVALUATE-STREAM" ends with 0, then THIS-WORD holds +the [n:chars] reference of the offending word in the stream buffer.

+
+
+
+
Definition concept 10: Word: EVALUATE-STREAM
+
+
( too complex to include here )
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: EXECUTE

+
+
+
Data stack: ( cfa -- )
+
+

"EXECUTE" is a function word that transfers the execution to the +indicated "Code Field Address", which typically is the CFA of an +RRQFORTH word with the CFA cell containing a jump address for the code +that implements the execution semnatics of the word.

+

The following execution semantics are predefined:

+
    +
  • +

    +assembler implemented words constitute their own execution + semantics; +

    +
  • +
  • +

    +[p_doforth] implements the FORTH machine. This treats the word + content as a succession of cells that hold the cfa pointers for the + words that make of the definition. As is customary in FORTH + machines, the advance through that succession is provided by each + word code ending making an explicit jump to its successor. The + RETURN-STACK serves as a call stack for tracking + the nesting of FORTH executions by saving the "addresses" of the + successor cells. +

    +
  • +
  • +

    +[p_dodoes] implements the variation of starting the FORTH + execution somewhere within a definition rather than at the + beginning. +

    +
  • +
  • +

    +[p_dostring], [p_dovalue] and [p_dovariable] implement + different common ways of using word content other the as FORTH + definitions. +

    +
  • +
+
+_______________________________________________________ +
+

+
+
+

Word: EXIT

+
+
+
Data stack: ( -- )
+
+

"EXIT" is a function word that implements the ending of a FORTH +definition and its threading to the subsequent step of the calling +definition.

+
+_______________________________________________________ +
+

+
+
+

Word: FALSE

+
+
+
Data stack: ( -- 0 )
+
+

"FALSE" is a value word representing logical false.

+
+_______________________________________________________ +
+

+
+
+

Word: FIND

+
+
+
Data stack: ( char* n -- [ char* n 0 ]/[ tfa ] )
+
+

"FIND" is a function word that searches the current word list search +path for the given [n:char*] word, and returns the TFA of the matching +word if any. Otherwise FIND preserves the initial data stack but adds +0 to it.

+

The word is sought starting with the +CURRENT-WORDLIST word list, for the first +occurence of a match. If not found, the search continues with the +subsequent word list, and so on.

+

When a word is found, then the data stack is changed by discarding the +[n:char*] double cell string pointer and pushing (only) the TFA of the +matching word instead.

+
+_______________________________________________________ +
+

+
+
+

Word: FORTH

+
+
+
data stack: ( -- a )
+
+

"FORTH" is a variable word for the FORTH word list, which does not +have any subsequent word list.

+
+_______________________________________________________ +
+

+
+
+

Word: @

+
+
+
Data stack: ( a -- v )
+
+

"@" is a function word that pushes the value v from the address a.

+
+_______________________________________________________ +
+

+
+
+

Word: @n--

+
+
+
Data stack: ( a n -- v )
+
+

"@n--" is a function word that pushes the value from the address, a, +then decrements the cell at that address by n.

+
+
+
+
Defintion concept 11Word: @n++
+
+
: @n++ OVER @ DUP ROT - ROT ! ;
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: @n++

+
+
+
Data stack: ( a n -- v )
+
+

"@n++" is a function word that pushes the value from the address, a, +then increments the cell at that address by n.

+
+
+
+
+
Defintion concept for @n++
+

( a n — v ) : @n++ OVER @ DUP ROT + ROT ! ;

+
+
+
+_______________________________________________________ +
+

+
+
+

Word: >=

+
+
+
Data stack: ( v1 v2 -- 0/-1 )
+
+

">=" is a function word that replaces a pair of values with -1 if the +first, v1, is greater than or equal to the second, v1, otherwise 0. To +that end, the values are 64-bit signed integers.

+
+_______________________________________________________ +
+

+
+
+

Word: >

+
+
+
Data stack: ( v1 v2 -- 0/-1 )
+
+

">" is a function word that replaces a pair of values with -1 if the +first, v1, is greater than the second, v1, otherwise 0. To that end, +the values are 64-bit signed integers.

+
+_______________________________________________________ +
+

+
+
+

Word: >R

+
+
+
Data stack: ( v -- )   Return stack: ( -- v )
+
+

">R" is a function word that "moves" the top data stack value onto the +return stack.

+
+_______________________________________________________ +
+

+
+
+

Word: HERE

+
+
+
Data stack: ( -- a )
+
+

"HERE" is a variable word that keeps the lowest address of the free +allocation space. It get updated by all words that allocate memory.

+
+
+
Usage example
+

1024 HEAP @ + HEAP ! ( allocate 1024 bytes on the heap )

+
+

See also ALLOT.

+
+_______________________________________________________ +
+

+
+
+

Word: HEX

+
+
+
Data stack: ( -- )
+
+

"HEX" is a function word that sets BASE to 16, which uses +letters a-f as additional digits. (Uppercase letter are also accepted +on input).

+
+
+
+
Definition concept 12: Word: HEX
+
+
: HEX 16 BASE ! ;
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: IF

+
+
+
Data stack: Compiling: ( -- a )
+
+

"IF" is an immediate function word that is used together with +ELSE and THEN to implement structured execution +control. IF results in layout of a 0BRANCH instruction +with an unresolved branch offset, and places the address for resolving +this instruction on the datastack. This address will then be resolved +and asssigned by a subsequent ELSE or THEN so +that at execution time there is an appropriate conditional branch past +the "then-part" of the "structured statement".

+
+_______________________________________________________ +
+

+
+
+

Word: IFAGAIN

+
+
+
Data stack: Compiling: ( -- a )
+
+

"IFAGAIN" is an immediate function word that is used together with +BEGIN, BREAK and END to implement +structured execution control. IFAGAIN scans the datastack for the +nearest preceding BEGIN marker and lays out a branch from this point +the beginning of the block during execution.

+
+_______________________________________________________ +
+

+
+
+

Word: IFBREAK

+
+
+
Data stack: Compiling: ( -- a )
+
+

"IFBREAK" is an immediate function word that is used together with +BEGIN, IFAGAIN and END to +implement structured execution control. IFBREAK simply places the +address for resolving branches from this point the end of the block +during execution.

+
+_______________________________________________________ +
+

+
+
+

Word: IMMEDIATE

+
+
+
Data stack: ( -- )
+
+

"IMMEDIATE" is an immediate function word that sets the flags field of +the most recent word to 1, thereby making that word an immediate word.

+
+
+
+
Definition concept 13:Word: IMMEDIATE
+
+
: IMMEDIATE IMMEDIATE 1 CURRENT-WORDLIST @ @ 16 + ! ;
+
+
+

See also :, CURRENT-WORDLIST, +@, +, !, and [p_semicolon;].

+
+_______________________________________________________ +
+

+
+
+

Word: [

+
+
+
Data stack: ( -- )
+
+

"[" (left bracket) is a function word that sets the stream evaluation +mode to be intepreting. In this mode, words are executed immediately +after parsing, by invoking their "doer".

+
+
+
+
Definition concept 14: Word: [
+
+
: [ IMMEDIATE 0 STATE ! ;
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: <=

+
+
+
Data stack: ( v1 v2 -- 0/-1 )
+
+

"<=" is a function word that replaces a pair of values with -1 if the +first, v1, is less than or equal to the second, v1, otherwise 0. To +that end, the values are 64-bit signed integers.

+
+_______________________________________________________ +
+

+
+
+

Word: <

+
+
+
Data stack: ( v1 v2 -- 0/-1 )
+
+

"<" is a function word that replaces a pair of values with -1 if the +first, v1, is less than the second, v1, otherwise 0. To that end, the +values are 64-bit signed integers.

+
+_______________________________________________________ +
+

+
+
+

Word: LIT

+
+
+
Data stack: ( -- v )
+
+

"LIT" is a function word that pushes the cell subsequent and moves +excution past that. The literal value is thus layed out as if a +subsequent CFA pointer in the containing definition, and the LIT +execution will make the execution skip past that and instead contine +with the CFA pointer following the value.

+

It’s not a good idea to use "LIT" interactively.

+
+
+
+
Definition concept 15: Word: LIT
+
+
: LIT R> DUP 8 + >R @ ;
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: S"

+
+
+
Data stack: ( -- chars* n )
+
+

"S"" is a function word that pushes the [n:char] pointer for a string +inlined subsequently to it in the containing definition. This is +similar to LIT but for a string literal.

+
+
+
+
Definition concept 16: Word: LIT
+
+
: LIT R> DUP @ 2DUP + 8 + >R SWAP 8 + SWAP ;
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: LOAD-FILE"

+
+
+
data stack: ( "name" -- )
+
+

"LOAD-FILE"" is a function word that opens a file via +OPEN-FILE", allocates a stream buffer of 15000 +bytes for reading it, saves the stream pointer as value for the newly +created filename variable, and then it invokes +EVALUATE-STREAM for processing the file.

+
+_______________________________________________________ +
+

+
+
+

Word: (

+
+
+
Data stack: ( -- )
+
+

"(" (left parenthesis) is a function word that scans and ignores words +until the next right parenthesis, or the end of the stream. This is +used for comments in RRQFORTH code.

+

Note that the terminating right parenthesis is a word, i.e. must have +whitespace before and after it.

+
+_______________________________________________________ +
+

+
+
+

Word: MALLOC

+
+
+
Data stack: ( n -- a )
+
+

"MALLOC" is a word that allocates memory using mmap of at least n +bytes and returns the lowest address of the allocated block.

+

Note that this makes new page allocations for the process from the +kernel, and the granularity is in pages, i.e. a multiple of 4 kb.

+

The memory is allocated with READ and WRITE access but not EXEC +access, and flagged as PRIVATE, ANONYMOUS and LOCKED. See the "man +page" of mmap for details.

+

See also STREAM

+
+_______________________________________________________ +
+

+
+
+

Word: -

+
+
+
Data stack: ( v1 v2 -- v3 )
+
+

"-" (minus) is a function word that replaces a pair of values with the +result of reducing the first, v1, with the second, v2. To that end, +the values are 64-bit signed integers.

+
+_______________________________________________________ +
+

+
+
+

Word: *

+
+
+
Data stack: ( v1 v2 -- v3 )
+
+

"*" is a function word that replaces a pair of values with the result +of multiplying them. To that end, the values are 64-bit signed +integers, and clipping the result to the least signifcant 64 bits.

+
+_______________________________________________________ +
+

+
+
+

Word: NEGATE

+
+
+
Data stack: ( v1 -- v2 )
+
+

"NEGATE" is a function word that replaces a value with its +2’s-complement negation. To that end, the values are 64-bit signed +integers.

+
+_______________________________________________________ +
+

+
+
+

Word: NIP

+
+
+
Data stack: ( v1 v2 -- v2 )
+
+

"NIP" is a function word that discards the second of the top two cells +on the data stack.

+
+
+
+
Definition concept 17: Word: NIP
+
+
: NIP SWAP DROP ;
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: NL

+
+
+
Data stack: ( -- v )
+
+

"NL" is a value word pushing a newline character onto the data stack.

+
+_______________________________________________________ +
+

+
+
+

Word: NOT

+
+
+
Data stack: ( v1 -- v2 )
+
+

"NOT" is a function word that replaces a value with its bitwise +complement; each bit is zero if non-zero, and non-zero if zero.

+

Compare with <<p_0equal,0⇒>.

+
+_______________________________________________________ +
+

+
+
+

Word: NUMBER

+
+
+
Data stack: ( char n -- [ 0 ]/[ v 1 ] )
+
+

"NUMBER" is a function word that parses a text number using +BASE as numerical base, then returns the result number and +a 1 on top, or just a 0 if the word didn’t parse.

+

A number consists of, first an optional minus sign, if in +DECIMAL base, then digits 0-9 and, if in HEX +base, letters a-f or A-F for values 10-15. I.e. the normal positive or +negative decimal integers or normal (positive only) hexadecimal +integers.

+
+
+
+
Definition concept 18: Word: NUMBER
+
+
( too complex to include here )
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: OPEN-FILE"

+
+
+
Data stack: ( "name" -- fd )
+
+

"OPEN-FILE"" is a function word that reads the intputstream for a +filename, adds that to the dictionary as a no-content variable, opens +that file and returns the input file descriptor.

+
+_______________________________________________________ +
+

+
+
+

Word: OR

+
+
+
Data stack: ( v1 v2 -- v3 )
+
+

"OR" is a function word that replaces a value pair with their bitwise +disjunction; each bit is 1 if the corresponding bits of any operand +is 1 and 0 if not.

+
+_______________________________________________________ +
+

+
+
+

Word: OVER

+
+
+
Data stack: ( v1 v2 -- v1 v2 v1 )
+
+

"OVER" is a function word that duplicates the second top stack cell on +the data stack.

+
+_______________________________________________________ +
+

+
+
+

Word: PAD

+
+
+
Data stack: ( -- a )
+
+

"PAD" is a variable word for a 1 kb data space that is used by +[p_double_quote] (only), and otherwise free for temporary use.

+
+_______________________________________________________ +
+

+
+
+

Word: PICK

+
+
+
Data stack: ( vu...v1 v0 u -- vu...v1 v0 vu )
+
+

"PICK" is a function word that pushes the u:th data stack cell down +from top onto the data stack. 0 indicates the top cell making it the +same as DUP, and 1 indicates the second top cell making it +the same as OVER.

+
+_______________________________________________________ +
+

+
+
+

Word: +

+
+
+
Data stack: ( v1 v2 -- v3 )
+
+

"+" (plus) is a function word that replaces a pair of values with the +result of adding them. To that end, the values are 64-bit signed +integers.

+
+_______________________________________________________ +
+

+
+
+

Word: PROGRAM_VERSION

+
+
+
Data stack: ( -- char* length )
+
+

"PROGRAM_VERSION" is a string variable hilding the version string.

+
+_______________________________________________________ +
+

+
+
+

Word: !

+
+
+
Data stack: ( v a -- )
+
+

"!" is a function word that stores the cell value v at the address a.

+
+_______________________________________________________ +
+

+
+
+

Word: !+

+
+
+
Data stack: ( a n -- )
+
+

"!+" is a function word that adds n to the cell value at a.

+
+
+
+
+
definition concept for !+
+

( a n — ) : !+ OVER @ + SWAP ! ;

+
+
+
+_______________________________________________________ +
+

+
+
+

Word: QUIT

+
+
+
Data stack: ??
+
+

"QUIT" is a function word that implements the root execution loop of +RRQFORTH. First it resets the stacks to their original settings, and +thereafter it enters loop of reading words from STDIN and +executing them.

+
+_______________________________________________________ +
+

+
+
+

Word: '

+
+
+
data stack: ( -- cfa )    Input stream: word
+
+

"'" (single quote) is a function word that reads and find the next +word on the input stream and pushes its cfa.

+
+_______________________________________________________ +
+

+
+
+

Word: READ-STREAM-CHAR

+
+
+
Data stack: ( stream -- c )
+
+

"READ-STREAM-CHAR" is a function word that gets the next character +from the given stream buffer, possibly refilling the buffer if it is +backed by a file descriptor. The refill is done by a SYS_READ call +when more characters are needed. The next character is pushed on the +stack, unless the stream is exhausted in which case the -1 is pushed +instead.

+

See also STREAM.

+
+_______________________________________________________ +
+

+
+
+

Word: READ-WORD

+
+
+
Data stack: ( stream -- char* n )
+
+

"READ-WORD" is a function word that "reads" the next whitespace +separated word from the given stream and returns the [n:char*] duoble +cell pointer for it. The characters of the word are copied to +PAD, and there is a limit of 1024 characters.

+

At the end of the stream READ-WORD returns 0 length.

+
+_______________________________________________________ +
+

+
+
+

Word: REALLOC

+
+
+
Data stack: ( a m n -- a )
+
+

"REALLOC" is a word that reallocates memory using mremap of address a +of size m to be size n bytes and returns the lowest address of the +allocated block.

+

Note that this makes new page allocations for the process from the +kernel, and the granularity is in pages, i.e. a multiple of 4 kb.

+

The memory is reampped using the MREMAP_MAYMOVE flag,

+

See also MALLOC

+
+_______________________________________________________ +
+

compile.asm: WORD p_right_bracket,],fasm

+

+
+
+

Word: ]

+
+
+
Data stack: ( -- )
+
+

"]" (right bracket) is a function word that sets the stream evaluation +mode to be compiling. In this mode words parsed into CFA pointers +which are placed on the heap in the given order, unless the word is +flagged as IMMEDIATE or a NUMBER. An +immediate word is executed immediately, and a number is parsed and +left on the stack.

+

Note that a word is parsed as a number only if it is not found in the +wordlist; i.e., the word list may contain definitions for numbers.

+
+
+
+
Definition concept 19: Word: ]
+
+
: ] 1 STATE ! ;
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: ROLL

+
+
+
Data stack: ( vu...v1 v0 u -- ...v1 v0 vu )
+
+

"ROLL" is a function word that "moves" the u:th data stack cell down +from top onto the data stack while discarding it. 0 indicates the top +cell; 1 indicates the second top cell making it the same as +SWAP; 2 indicates the third top cell making it the same as +ROT.

+
+_______________________________________________________ +
+

+
+
+

Word: ROT

+
+
+
Data stack: ( v1 v2 v3 -- v2 v3 v1 )
+
+

"ROT" is a function word that "rotates" the top three data stack cells +such that the third becomes the first while the second becomes third +and the first becomes the second.

+

See also ROLL.

+
+_______________________________________________________ +
+

+
+
+

Word: R[n]

+
+
+
Data stack: ( n -- a )
+
+

"R[n]" is a function word that pushes the address for the n:th cell on +the top return stack value onto the data stack.

+
+_______________________________________________________ +
+

+
+
+

Word: ;

+
+
+
Data stack: ( -- )
+
+

";" (semi-colon) is a function word that ends a new forth definition +by means of adding an EXIT

+
+
+
+
Definition concept 20: Word: :
+
+
: ; IMMEDIATE ' EXIT , ;
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: [p_setup_signals]

+
+
+
Data stack: ( -- a )
+
+

"[p_setup_signals]" is a variable word that contains the assembly code +sniippet for setting up the signal handling. rrqforth handles SEGV by +restarting the interpreter loop on STDIN.

+
+_______________________________________________________ +
+

+
+
+

Word: <<

+
+
+
Data stack: ( v1 n -- v2 )
+
+

"<<" is a function word that shifts value v1 n steps left (i.e. +"moving" bits towards more significant bits) to form value v2.

+
+_______________________________________________________ +
+

+
+
+

Word: >>

+
+
+
Data stack: ( v1 n -- v2 )
+
+

">>" is a function word that shifts value v1 n steps right (i.e. +"moving" bits towards less significant bits) to form value v2.

+
+_______________________________________________________ +
+

+
+
+

Word: s>>

+
+
+
Data stack: ( v1 n -- v2 )
+
+

"s>>" is a function word that shifts value v1 n steps right (i.e. +"moving" bits towards less significant bits) to form value v2, but +preserving (and copying) the sign bit.

+
+_______________________________________________________ +
+

+
+
+

Word: SP

+
+
+
Data stack: ( -- v )
+
+

"SP" is a value word pushing a space character onto the data stack.

+
+_______________________________________________________ +
+

+
+
+

Word: STATE

+
+
+
Data stack: ( -- a )
+
+

"STATE" is a variable word marking whether the stream evaluator is in +compiling mode (1) or interpreting (0) mode.

+
+_______________________________________________________ +
+

+
+
+

Word: STDIN

+
+
+
Data stack: ( -- stream )
+
+

"STDIN" is a value word referring to the stream buffer for the +standard input file descriptor.

+
+_______________________________________________________ +
+

+
+
+

Word: STREAM

+
+
+
Data stack: ( fd size -- addr ) or ( block -1 -- addr )
+
+

"STREAM" is a function word that sets up a buffer for an input file +descriptor or for a memory block (of size+data).

+
+

File descriptor backed STREAM

+

A file descriptor backed STREAM gains a buffer of the given size +prefixed by a 32 byte STREAM header of the following layout:

+
+
+
+
Stream layout 2, for file descriptor
+
+
  8 bytes = size of buffer (excluding the 32 byte header)
+  8 bytes source file descriptor
+  8 bytes current fill
+  8 current read position
+
+
+
+
+

Memory block backed STREAM

+

A memory block stream is only the header (though allocated via +MALLOC which reserves a full kernel page) with the +following layout:

+
+
+
+
Stream layout 3, for memory block
+
+
  8 bytes = block address
+  8 -1 (indicates memory block)
+  8 size of block (taken from the block's first 8 bytes)
+  8 current read position
+
+
+
+_______________________________________________________ +
+

+
+
+
+

Word: STREAM-NCHARS

+
+
+
Data stack: ( stream -- n )
+
+

"STREAM-NCHARS" is a function word that scans ahead in the stream +buffer for the next non-whitespace character, and returns its position +relative to the end of the buffer. This is done without changing the +stream (or filling it by reading the backing file).

+
+_______________________________________________________ +
+

+
+
+

Word: STRLEN

+
+
+
Data stack: ( s -- n )
+
+

"STRLEN" is a function words that counts how many bytes there are from +s to the first NUL byte and returns that count, n, not including the +NUL byte.

+
+_______________________________________________________ +
+

+
+
+

Word: STRNCMP

+
+
+
Data stack: ( s1 s2 n -- v )
+
+

"STRNCMP" is a function words that compares up to n characters of +character sequences s1 and s2, and returns the difference of the first +differing characters, as in s2[i] - s1[i], or 0 if all n characters +are the same.

+

I.e., the value v is less than 0 if string [n:s1] is alpha-numerically +less than [n:s2], +v is greater than 0 if [n:s1] is greater than [n:s2], +and v is 0 if [n:s1] and [n:s2] are equal.

+
+_______________________________________________________ +
+

+
+
+

Word: STRNCPY

+
+
+
Data stack: ( s1 s2 n -- )
+
+

"STRNCPY" is a function words that copies n bytes of byte sequence s1 +to s2.

+
+_______________________________________________________ +
+

+
+
+

Word: SWAP

+
+
+
Data stack: ( v1 v2 -- v2 v1 )
+
+

"SWAP" is a function word the swaps the top two data stack cells.

+
+_______________________________________________________ +
+

+
+
+

Word: SYSTEM

+
+
+
Data value: ( -- a )
+
+

"SYSTEM" is a variable that holds the word list data for the system +calls. This is set up as separate word list from FORTH +merely as a matter of segregation.

+
+_______________________________________________________ +
+

+
+
+

Word: TELL

+
+
+
Data stack: ( char* n -- )
+
+

"TELL" is a function word that prints a string to stdout (file +descriptor 1).

+
+_______________________________________________________ +
+

+
+
+

Word: TERMINATE0

+
+
+
Data stack: ( -- )
+
+

"TERMINATE0" is a function word that terminates the program with exit +code 0.

+
+_______________________________________________________ +
+

+
+
+

Word: TFA>CFA

+
+
+
Data stack: ( tfa -- cfa )
+
+

"TFA>CFA" is a function word that pushes word cfa of the given tfa.

+
+
+
+
+
Definition concept for TFA>CFA
+

: TFA>CFA 8 + @ ;

+
+
+
+_______________________________________________________ +
+

+
+
+

Word: TFA>DFA

+
+
+
Data stack: ( tfa -- dfa )
+
+

"TFA>DFA" is a function word that pushes word dfa of the given tfa.

+
+
+
+
+
Definition concept for TFA>DFA
+

: TFA>DFA TFA>CFA 8 + ;

+
+
+
+_______________________________________________________ +
+

+
+
+

Word: TFA>FLAGS@

+
+
+
Data stack: ( tfa -- flags )
+
+

"TFA>FLAGS@" is a function word that pushes word flags of the given tfa.

+
+
+
+
Defintion concept 21Word: TFA>FLAGS@
+
+
: TFA>FLAGS@ 16 + @ ;
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: TFA>NAMEZ

+
+
+
Data stack: ( tfa -- char* )
+
+

"TFA>NAMEZ" is a function word that pushes changes a tfa pointer to a +pointer to the word pname’s character sequence, which is zero +terminated as well as preceded by a length cell.

+
+
+
+
Defintion concept for TFA>NAMEZ
+
+
: TFA>NAMEZ 32 + ;
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: THEN

+
+
+
Data stack: Compiling: ( a -- )
+
+

"THEN" is an immediate function word that is used together with +IF and ELSE to implement structured execution +control. THEN performs the branch resolution for the stacked address +which pinpoints the foot address the branch offset to resolve, so that +at execution time there is an appropriate conditional branch past the +"then-part" or the "else-part" of the "structured statement".

+
+_______________________________________________________ +
+

+
+
+

Word: THIS-WORD

+
+
+
Data stack: ( -- a )
+
+

"THIS-WORD" is a variable word used in +[p_evaluate_stream:EVALUATE-STREAM] as cache for the [n:char*] +values of the successive words being evaluated. This typically points +into the input stream buffer and remain valid until further stream +buffering functions are used.

+
+_______________________________________________________ +
+

+
+
+

Word: TRUE

+
+
+
Data stack: ( -- -1 )
+
+

"TRUE" is a value word representing logical true.

+
+_______________________________________________________ +
+

+
+
+

Word: TUCK

+
+
+
Data stack ( v1 v2 -- v2 v1 v2 )
+
+

"TUCK" is a function word that "inserts" the top cell below the second +cell on the data stack.

+
+
+
+
Definition concept 22: Word: TUCK
+
+
: TUCK SWAP OVER ;
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: !=

+
+
+
Data stack: ( v1 v2 -- 0/-1 )
+
+

"!=" is a function word that replaces a pair of values with -1 of the +values are unequal, and 0 otherwise.

+
+_______________________________________________________ +
+

+
+
+

Word: VERBOSE?

+
+
+
Data stack: ( -- a )
+
+

"VERBOSE?" is a variable word that is assigned at start up to -1 or 0 +signify whether or not the command line arguments includes "-v". When +non-zero (i.e. running rrqforth with "-v") the evaluation loop is more +verbose.

+
+_______________________________________________________ +
+

+
+
+

Word: WITHIN

+
+
+
Data stack: ( v lo hi -- 0/-1
+
+

"WITHIN" is a function word that replaces a triple of values with -1 +of the the first, v, is within the value range spanned by the second, +lo, inclusive and third, hi, exclusive.

+
+
+
+
Definition concept 23: Word: WITHIN
+
+
: WITHIN 2 PICK > ROT ROT <= AND ;
+
+
+
+_______________________________________________________ +
+

+
+
+

Word: WORDS

+
+
+
Data stack: ( wl -- )
+
+

"WORDS" is a function word that prints all words of teh given word +list to stdout (file descriptor 1).

+
+_______________________________________________________ +
+

+
+
+

Word: XOR

+
+
+
Data stack: ( v1 v2 -- v3 )
+
+

"XOR" is a function word that replaces a value pair with their bitwise +exclusion; each bit is 1 if the corresponding bits of the two operands +differ and 0 if not.

+
+_______________________________________________________ +
+

+
+
+

Word: RETURN-STACK

+
+
+
Data stack: ( -- a )
+
+

"RETURN-STACK" is a variable word harbouring the return stack.

+
+
+
+
+

System calls

+
+

RRQFORTH includes function wrapping for all "Linux syscalls", which +generally are described in their "man pages. This wrapping takes the +arguments fro the data stack in reverse order, i.e. the first argument +is deepest.

+

Use SYSTEM WORDS to get a list of all (321) available syscalls.

+
+
+
+

+ + + diff --git a/rrqforth b/rrqforth new file mode 100755 index 0000000000000000000000000000000000000000..378758d58e4ddc7438250e7a5fd1591d409cef2b GIT binary patch literal 2148423 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 zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0{@Q!yWP|-M(((2y061Nq;LI<{C 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