From ef492db3b89ae7e0fe6317d3a1d0e727c28bf8ca Mon Sep 17 00:00:00 2001 From: Ralph Ronnquist Date: Mon, 8 May 2023 12:33:36 +1000 Subject: [PATCH] removed generated --- reference.html | 3932 ------------------------------------------------ rrqforth | Bin 2152181 -> 0 bytes 2 files changed, 3932 deletions(-) delete mode 100644 reference.html delete mode 100755 rrqforth diff --git a/reference.html b/reference.html deleted file mode 100644 index 9137d07..0000000 --- a/reference.html +++ /dev/null @@ -1,3932 +0,0 @@ - - - - - - -RRQFORTH Reference Documentation - - - - - -
-
-

Word Index

-
- -

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

-

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

-

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

-

ABS   -AGAIN   -ALLOT   -AND   -[ASM]  

-

BASE   -BEGIN   -BREAK  

- -

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

-

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

-

FALSE   -FDEMIT   -FDTELL   -FIND   -FORTH  

-

HERE   -HEX  

-

IF   -IFAGAIN   -IFBREAK   -IMMEDIATE   -INPUT  

- -

MAIN-ARGS   -MALLOC   -MIN   -MAX  

-

NEGATE   -NIP   -NL   -NOT   -NUMBER  

-

OPEN-FILE   -OR   -OVER  

- -

QUIT  

- -

SP   -STATE   -STDIN   -STREAM   -STREAM-NCHARS   -STR>TEMP   -STRLEN   -STRNCMP   -STRNCPY   -SWAP   -SYSTEM  

-

TELL   -.TEMP   -TEMP   -TEMPHELD   -TEMPSPACE   -TEMPUSED   -TERMINATE0   -TFA>CFA   -TFA>DFA   -TFA>FLAGS@   -TFA>NAMEZ   -THEN   -THIS-WORD   -TRUE   -TUCK  

-

UNSTREAM   -USE  

- -

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:
-
-
-

Note that the FORTH compiler does not invoke an assembler so any -inline assembly code must be provided in its binary form.

-
-_______________________________________________________ -
-

-
-
-

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.

-

Note that the branch offset is a byte count and each FORTH word of a -definition take up a cell of 8 bytes. The offset is relative to the -cell address immediately subsequent to the offset cell. In other -words, offset 0 is not branching anywhere and an offset of -16 would -make a tight loop back to the branch instruction itself. The latter -would pull data stack values until and including the first non-zero -value.

-

See also 1BRANCH, BRANCH, IF, -ELSE, IFBREAK and IFAGAIN.

-
-_______________________________________________________ -
-

-
-
-

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.

-

This is the same function as 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 for 0<
-

( v — 0/1 ) : 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.

-

Note that the branch offset is a byte count and each FORTH word of a -definition take up a cell of 8 bytes. The offset is relative to the -cell address immediately subsequent to the offset cell. In other -words, offset 0 is not branching anywhere and an offset of -16 would -make a tight loop back to the branch instruction itself. The latter -would pull data stack values until and including the first zero value.

-

See also 0BRANCH, BRANCH, IF, -ELSE, IFBREAK and IFAGAIN.

-
-_______________________________________________________ -
-

-
-
-

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 for 2DUP
-

( v1 v2 — v1 v2 v1 v2 ) : 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 for 2OVER
-

( v1 v2 v3 v4 — v1 v2 v3 v4 v1 v2 ) : 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 for 2SWAP
-

( v1 v2 v3 v4 — v3 v4 v1 v2 ) : 2SWAP 3 ROLL 3 ROLL ;

-
-
-
-_______________________________________________________ -
-

-
-
-

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 for C,
-

: C, HERE @ 1 ALLOT C! ; ( v — ; Claim 1 byte and put lsb value there )

-
-
-

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

-
-_______________________________________________________ -
-

-
-
-

Word: W,

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

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

-
-
-
-
-
Definition concept for W,
-

: W, HERE @ 2 ALLOT W! ;

-
-
-
-_______________________________________________________ -
-

-
-
-

Word: D,

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

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

-
-
-
-
-
Definition concept for D,
-

: D, HERE @ 4 ALLOT D! ;

-
-
-
-_______________________________________________________ -
-

-
-
-

Word: D[n]

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

"D[n]" is a function word that pushes the address for the n:th cell of -the data stack onto the data stack.

-
-_______________________________________________________ -
-

-
-
-

Word: CFA>TFA

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

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

-
-
-
-
-
Definition concept for CFA>TFA
-

: CFA>TFA 14 - @ ;

-
-
-
-_______________________________________________________ -
-

-
-
-

Word: C@

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

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

-
-_______________________________________________________ -
-

-
-
-

Word: W@

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

"W@" is a function word that pushes the "word" (double-byte) value v -from 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: 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: W!

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

"W!" is a function word that stores the "word" (2-byte) value v (the -two least significant bytes of the cell) at the address a.

-
-_______________________________________________________ -
-

-
-
-

Word: D!

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

"D!" is a function word that stores the "doublw word" (4-byte) value v -(the four least significant bytes 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: AGAIN

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

"AGAIN" is an immediate function word that is used together with -BEGIN and instead of END to implement structured -execution control. AGAIN scans the datastack for the nearest preceding -BEGIN marker and lays out an unconditional branch from this point the -beginning of the block during execution. It thereafter performs the -END compile action to end the block.

-
-_______________________________________________________ -
-

-
-
-

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. That is next followed by the environment -as a number of asciiz pointers and 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: argument strings
-        8 bytes: zero cell
-        8* bytes: envirnment strings
-        8 bytes: zero cell
-
-
-
-_______________________________________________________ -
-

-
-
-

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.

-
-_______________________________________________________ -
-

-
-
-

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.

-
-
-
-
Usage example 3:
-
-
: WTELL ( tfa -- ; Print word pname )
-  24 + DUP 8 + SWAP @ TELL SP EMIT
-;
-
-: WORDS ( wordlist -- ; Print all words of word list )
-  BEGIN
-    @ DUP 0= IFBREAK
-    DUP WTELL
-  END
-  DROP
-  NL EMIT
-;
-
-
-
-_______________________________________________________ -
-

-
-
-

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.

-
-
-
-
-
Definition concept for [']
-

: ['] IMMEDIATE ' ;

-
-
-
-_______________________________________________________ -
-

-
-
-

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.

-

Note that the branch offset is a byte count and each FORTH word of a -definition take up a cell of 8 bytes. The offset is relative to the -cell address immediately subsequent to the offset cell. In other -words, offset 0 is not branching anywhere and an offset of -16 would -make a tight loop back to the branch instruction itself. The latter -would pull data stack values until and including the first zero value.

-

See also 0BRANCH, 1BRANCH, IF, -ELSE, IFBREAK and IFAGAIN.

-
-_______________________________________________________ -
-

-
-
-

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.

-
-
-
-
Usage example 4: unconditional break with a condition.
-
-
: WTELL ( tfa -- ; Print word pname )
-  24 + DUP 8 + SWAP @ TELL SP EMIT
-;
-
-: WORDS ( wordlist -- ; Print all words of word list )
-  BEGIN
-    @ DUP IF DUP WTELL ELSE BREAK THEN
-    1 IFAGAIN
-  END
-  DROP
-  NL EMIT
-;
-
-
-

See also BRANCH, 0BRANCH, -1BRANCH, IF, ELSE, -IFBREAK and IFAGAIN.

-
-_______________________________________________________ -
-

-
-
-

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 for :
-

: : 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 concept for ,
-

: , 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:

-
-
-
-
Layout 1: rrqforth word structure
-
-
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 for 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 5: 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 2: 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 for DECIMAL
-

: DECIMAL 10 BASE ! ;

-
-
-
-_______________________________________________________ -
-

-
-
-

Word: DEFINITIONS

-
-
-
Data stack: ( wordlist -- )
-
-

"DEFINITIONS" is a function word that installs the given wordlist as -the CURRENT-WORDLIST one.

-
-
-
-
-
Definition concept for DEFINITIONS
-

: DEFINITIONS CURRENT-WORDLIST ! ;

-
-
-
-_______________________________________________________ -
-

-
-
-

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>".

-
-
-
-
-
Defintion concept for 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: .TEMP

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

".TEMP" is a function word that renders a cell value as an integer -using the current BASE, which is either -DECIMAL or HEX. In DECIMAL -BASE, a negative value is rendered as such with a leading -minus sign, whereas HEX BASE rendering is -unsigned.

-
-_______________________________________________________ -
-

-
-
-

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.

-
-_______________________________________________________ -
-

-
-
-

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: ( v -- )
-
-

"EXIT" is a function word that terminates the rrqforth process -immediately with the given exit code.

-
-_______________________________________________________ -
-

-
-
-

Word: FALSE

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

"FALSE" is a value word representing logical false.

-
-_______________________________________________________ -
-

-
-
-

Word: FDEMIT

-
-
-
Data stack: ( c fd -- )
-
-

"FDEMIT" is a function word that puts the given character code to the -given file descriptor. The character is the least significant byte of -the data stack cell.

-
-_______________________________________________________ -
-

-
-
-

Word: FDTELL

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

"FDTELL" is a function word that prints a string to the given file -descriptor.

-
-_______________________________________________________ -
-

-
-
-

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 for @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.

-
-
-
-
-
allocate 1024 bytes on the heap
-

1024 HEAP @ + 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 for 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 for IMMEDIATE
-

: IMMEDIATE IMMEDIATE 1 CURRENT-WORDLIST @ @ 16 + ! ;

-
-
-

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

-
-_______________________________________________________ -
-

-
-
-

Word: INPUT

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

"INPUT" is a variable word for the input stream buffer used by -EVALUATE-STREAM.

-
-_______________________________________________________ -
-

-
-
-

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 for [
-

: [ 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 for LIT
-

: LIT R> DUP 8 + >R @ ;

-
-
-
-_______________________________________________________ -
-

-
-
-

Word: LIT-STRING

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

"LIT-STRING" is a function word that pushes the char* and length n of -a subsequent inline string, then advances execution to continue after -the string. This is similar to LIT but for a block literal.

-

Note that the inlined byte count includes the terminating NUL byte.

-
-
-
-
-
Definition concept for LIT-STRING
-

: LIT-STRING R@ DUP @ 8 + R@ @ 2DUP + R> + >R 1 - ;

-
-
-
-_______________________________________________________ -
-

-
-
-

Word: S"

-
-
-
Data stack: ( -- )  Input stream: " chars"
-
-

"S"" is an immediate function word that compiles the subseqent -characters up to terminating double-quote into the current definition, -preceded by a LIT-STRING cell, and the count of -bytes scanned. The inline text includes a terminating NUL character -which also is included in the inlined count.

-

Note that "S"" uses " for reading the string.

-
-_______________________________________________________ -
-

-
-
-

Word: LOAD-BUFFER-SIZE

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

"LOAD-BUFFER-SIZE" is a variable word telling the buffer size in bytes -that LOAD-FILE should use.

-
-_______________________________________________________ -
-

-
-
-

Word: LOAD-FILE

-
-
-
data stack: ( chaz* -- * 0/1 )
-
-

"LOAD-FILE" is a function word that evaluates a text file. It opens a -file via OPEN-FILE and sets up a stream with a -buffer of LOAD-BUFFER-SIZE bytes for -reading it. The stream is passed to -EVALUATE-STREAM for processing its words. Upon -its return the file is closed and the stream memory is reclaimed, and -then the function returns whatever -EVALUATE-STREAM returns.

-
-_______________________________________________________ -
-

-
-
-

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: MAX

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

"MAX" is a function word that selects the greatest of v1 and v2. To -that end, the values are 64-bit signed integers.

-
-_______________________________________________________ -
-

-
-
-

Word: MIN

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

"MIN" is a function word that selects the least of v1 and v2. To that -end, the values are 64-bit signed integers.

-
-_______________________________________________________ -
-

-
-
-

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 for 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.

-
-_______________________________________________________ -
-

-
-
-

Word: OPEN-FILE

-
-
-
Data stack: ( chaz* -- fd )
-
-

"OPEN-FILE" is a function word that opens the file named by the zero -terminated character string and returns the file descriptor, or if -less than 0, the system call error code.

-
-_______________________________________________________ -
-

-
-
-

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: RSP

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

"RSP" is a function word that pushes the return stack pointer value -onto the data stack.

-
-_______________________________________________________ -
-

-
-
-

Word: R[n]

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

"R[n]" is a function word that pushes the address for the n:th cell of -the return stack onto the data stack.

-
-
-
-
-
Defintion concept for R[n]
-

( n — a ) : R[n] 8 * RSP + ;

-
-
-
-_______________________________________________________ -
-

-
-
-

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-STREAM-LINE

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

"READ-STREAM-LINE" is a function word that gets the next line from the -given stream buffer into PAD and returns number of characters. If the -stream is backed by a file descriptor, the stream buffer is refilled -from there as needed, by a SYS_READ call when more characters are -needed.

-
-_______________________________________________________ -
-

-
-
-

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.

-
-
Special syntax 1: Whitespace
-
-

All character codes less or equal to 32 are regarded as "whitespace".

-
-
-
Special syntax 2: Rest-of-line comment
-
-

The "#" character following whitespace starts a line comment and the -rest of the line is ignored. Note that this is also recognised with -parethesis commenting.

-
-
-_______________________________________________________ -
-

-
-
-

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

-
-_______________________________________________________ -
-

-
-
-

Word: RETURN

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

"RETURN" is a function word that implements the ending of a FORTH -definition and make execution return to the next step in the calling -definition.

-
-_______________________________________________________ -
-

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 for ]
-

: ] 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: ;

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

";" (semi-colon) is an immediate function word that ends a new forth -definition by means of adding an EXIT cell, then changing -<<p_state,STATE> to interpreting.

-
-
-
-
-
Definition concept for ;
-

: ; 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:

-
-
-
-
Layout 3: file descriptor stream
-
-
  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:

-
-
-
-
Layout 4: memory block stream
-
-
  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: STR>TEMP

-
-
-

Data stack: ( char* n — char* n )

-
-

"STR>TEMP" is a function word that copies a given string plus a -terminating NUL character into a TEMPSPACE snippet, -all preceded by a length cell. It returns a pointer for to the text in -the snippet and its length, excluding the NUL character at end and the -length cell before tie text.

-
-
Layout for copied string
-
-
        length: 8 bytes
-returned char*: n bytes
-           nul: 1 byte
-
-
-_______________________________________________________ -
-

-
-
-

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: TEMP

-
-
-

Data stack: ( size — addr )

-
-

"TEMP" is a function word that "allocates" a TEMPSPACE -area of given size and returns its base address. The allocation is -temporary and only valid until there is a later allocation that -overruns this area.

-

Allocations are done in succession until the requested size overruns -the TEMPSPACE. If so, the allocation pointer is reset -and the space is allocated from start again. This is all intended for -small and short-lived data areas.

-
-_______________________________________________________ -
-

-
-
-

Word: TEMPHELD

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

"TEMPHELD" is a variable word that keeps the lowest offset of the -TEMPSPACE space to reuse upon cycling. The space -below TEMPHELD is "held" in the sense of not being reused upon -cycling. An application may change the TEMPSPACE offset as needed to -dynamically preserve memory longer term.

-
-_______________________________________________________ -
-

-
-
-

Word: TEMPSPACE

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

"TEMPSPACE" is a variable word that holds three cells the for managing -"temporary memory":

-
    -
  • -

    -the size of the temporary memory space (default 104857600 bytes) -

    -
  • -
  • -

    -the base address for whole temporary memory area -

    -
  • -
  • -

    -the amount currently used -

    -
  • -
-

This memory is intended to be used by requesting snippets of memory in -a cyclic fashion via TEMP without concern about it possibly -overlapping a prior request.

-
-_______________________________________________________ -
-

-
-
-

Word: TEMPUSED

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

"TEMPUSED" is a variable word that keeps the lowest offset of the -TEMPSPACE space to use next as temporary space. This -is advance upon each allocation via TEMP, and recycled back -to TEMPHELD when next allocation otherwise would exceed -the space size.

-
-_______________________________________________________ -
-

-
-
-

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 for 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 for 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: UNSTREAM

-
-
-
Data stack: ( stream* -- )
-
-

"UNSTREAM" is a function word that releases the memory allocated for a -stream, and closes the associated file if it’s a file stream.

-
-

File descriptor backed stream

-

This kind of stream has the stream header as a prefix within the -allocated memory. Thus, stream* is the base address for the memory to -reclaim, and the size of this is determined from the cell at (stream* -+ 16) plus the 32 bytes head itself.

-
-
-

Memory block backed STREAM

-

This kind of stream has a separate header which points at the memory -area to reclaim. The cell at stream* is the base address, and the cell -at (stream* + 16) is its size.

-
-_______________________________________________________ -
-

-
-
-
-

Word: USE

-
-
-
Data value: ( wordlist -- )  Input stream: word
-
-

"USE" is a function word that looks up next word given the wordlist. -It reads next word on INPUT via READ-WORD, -then temporarily changes CURRENT-WORDLIST to -FIND the word via the given wordlist, and returns the TFA -of that word, or just 0 if the word coudn’t be found.

-
-_______________________________________________________ -
-

-
-
-

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 for 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 deleted file mode 100755 index 8b7119150e5eab1ff561176a8d21df9fa653a89b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2152181 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 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-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&U_jpx5&TUdOy{MWIYKD)a2 zkDu8uEDl)px%-#@8vg8k?6JqT`aN5-opl>q$G4vT_{+Cn`1I{he99AAVddVT#Z9}1 z%FuBCvf<7{KeKDsuI^2r*)9Cz0jq9(T&G<3nFD%1ofInKpON%GOD#XVP}f_1w^%g0 zd3LTdQ9L(Wo#vL5#$LOvHz3vR{>uK(u}iTk{?C@7*@^RuFK698RI`p~>lFKD>r;nKyIN`0i?WhEs}^H(#Z?xR_K5cY>ItMj7=S1oyDdja&2eb*ko}*T-)2S@K-|Hb?W;bS`?R*|2%)k zllv1%wLf02<4k90eeuC%I)<5S4lTpYu*6Ir9oF1-VH!I27u(9-En%ceXs7$eY#h#zvH&syH^k2 zF@HduXzKs9Ww&E!-B7@L{qo!Klx4SLu3S@YL&(2dxh1##cX#KO)#>Kj`J_H}>V5WW zw)Li&_L@E7q&t%%#Zhrx{HFzntH0mf@rYjg&-B{2S8wU=_h-xSFYPY<8DF{C&Qgs>N^zgPST80`smcm zT({UKTbu5T{`8h@X+Uq8>i#mTKQLAeZgM*J zvZi~|7rVQ@_=oPU8{T(Dam5|otM?64igBN~q_36wJm@bM$ECAdh?^Xq-dy~AK;Gu9 z7j$?0u6W)(yN~?s_Jgk6@6PUS|I*#{FWud~(%toyU%lfGRd727r-pA?DR^SKxFlPj zPjvGITe~NHrk8#2AKrDvsxaf{-x2=hn$cayuG=+T<^IzX`V&t5(w>%#(;Z(pW=4wd z4+srstY`co?BhGn4yWvLx8D%6;I~;*n>EJ?Dnj*|T9^ zxFqb{^X<4DY2MWyv$?mQJz}BB&b@B?Xm{sC*#ASf(EOk>=C-$A+CL!D4f%_U`|}FN zMA(jS3x^B6YSK5ym1#cvyyNA&&u;&ApYPo~ zFNsZ4aXNRWrs-m!UED8=t2S}hiSzB)CDr_8R-3vUU0jl_sk&_GUVZrd9gpo#F;)F2 zt4`P8!|mdO*{Z5h_oVM$bNKB1^|4i|d+3`N?FDAk*{Z5jxi^LXHm#n2XY7_rANkhBROt$$Gcy#fgZ9YQ)*6QU-5qzVzVe9f zO?#9FNB_!xe)Vm)-nd86-SxTdu77&|ujd~g(^8*zWc|{%AAMZ$v}{$1+Ony;+u`#+ z+tx=&Rkvr=snHo{6rapirAC{(H?LVU|IXMbRh{;>#q&>%&N{2uBU@E#^pG|4=fy^; z>Z+`|rxIW;51q!db+t}steHPJc1l%W%Bs`7cKa#E9ap?2TbWvI*|h7#66yejz2KQCOIUOiI& zb>y1)kDS-HOGA!%*Ww9Ro7rpps{xI}6IbE#H#84dHf6%j^VS^Ry*dUSKHrUDsm-gi zu(T`AOwASBvULk{=ymV)Jg>|t1A9M(%hI20>CYw&{!P{-Da}lcj~6#&D^tSe?hQW( z2jmaBJBLf3(Sy9|1M%tEf7dU5eS% z>vU@Dl&ap7Ri`bU9vfa?T%N65XcbN&yH442{wL@5=bs9HlMP7S<~D?GH)JcTZd;~j zr{~`gTcxT;zi06jt2=_3V&804)hIpwpP!1&QsuSTh}3N6tYUMvDm6>b0!+{E9-F1g zZ)YQ_X6@o#*{alR*A>P5-*4_)rJAGvdhrC)Z8$SKUEID*pAGX@#4f4glB`P-pDFJG z9+s_4o6|ckd-nqUtL#>6n(9B9joYp0|2eLBX|^VH3>O9AaQN1y{uEQy?tim*imA`> z#aEZ@b4=*-ir6PrJ!Y9c#}j^=zWW)oOY5EieC?EHvfd!D^*^R z^-6q0;rW%JY+c&4P2HozERTwvQq`xj>U5A#%@jMcRSS*w3XQ(8p+CJ;wfg$S(@UGQ zDRlbAvYk!}ovw+UQq{~dohHM**L|{eX`8ygJ!H-NP;8Wn-k24yiaW*VQ27GP6SB3x z->n_j_ZMmX53{~EIyR2THNYI`h}NO;_0Q0I{M7wyDPSO@el6|t-c)oN_CsER%xToDjt}vS-ep%e_h$> zh2gJM_x7wlZPZz37MEqK7Pq=?qHOi>@K>t)udF`prV~Ts<5R=M-)E~+yY$rmrc275 zeEO2|>~P8b%D=+?v8(rww_X29~4722h; z_hjX1tHU$!ouP^1Y1!($Tkkqz#~r)2pEn(zYQ8yC&)+iLKc16Eda8NXDQm*xitq}` z|KHBl21i+4;Y*e!Aq5gGlvto{5rq!fG=TyM`C#+0;qJIeHoFOgP;{+?M(7ZlvPdD2 zXmG}5O|i91ah$dktgTcXk>ZF{Aq01!Sp1-MsGTuCtop(ZQ>HT*B-HJ>AJ4Mhu+;x$ zf9$*Od(L_8Ip^Mc?$>!YdPT6kpxLn90XFKhy>SP2M||fF4ki+-9VAuw5=m`L15Q$O zeA!E9nc+Nf*eQI+!<5K@eOj+<1m{IVV!Vb`fKE!o zsPqTeO9mHk(fWBroDwa|<+GRN@!lWPdVMSppQa=YN8H9EMcnp7dQ7Lb+0T_Zy6Lp# zRQIQH;fM2xpw!wUy=SJ8IN5+E%C6Q%}cy1|yPSu=sfPWd(#O|FMJW9(x)X zN|58BsEmPr;&t@|aTI*TOntE2$L_B$ruY%kFcC+l%R14r>4Uus@M}0`;z55*#IX*7 zJd%6h2iOO^>p4zTDSJpe0*oVTR2<%jhRgGK$*Jx&ymup2>)o`4%KKUz0oojkxg?OchU0MD-@M-Rz)cVQ|9Jp$0VyQ#z*zl54m2X^ zgYADc2%@~2fs&F3#aX_aweP1`BPV{gWd>Je|VRgSo2XEIwc~PKTu2mZCI;M<*COjd= zZ=E%RID1MnlL{Av@L_#_LvtSP8P3kxc7+xW@fcjk|D;Nj{-ZApj?>xK42tPo=~K#G zh($Yy(<;##n2A6b^W60&{>u=?KE*XY0cYJe@{gX^9nefrKL52Znuj@fZB3J#c8xC?He!l`y=+{O4P*}OkpHPsOmev{ z3i+-JsGX)RXtV{a!l0lDzzb%3Gn+Z&-#2g&?uF9= zzRGGh+ih^59!Miss&e3)-5*SS%&-;}h?MwP!~UHfPzr*+{sutY?X6*@21ANw5(xA| z1|Ry8Y#7@N;)sUPTYekW4(rZO%o|HTsK(Ech;_uJYTVov*kO-TsHg1B4T8DUeivQ3 zrpTGT%`TAWSwC@f-AX)uaUZs4h>J}uFQyF%VcWFdiHkf4w0|Vwbfop@QlT}5EqENx zrp0Q7H1A$Lu7P2Md2$It*_dQkKk-_hEE<$AH^6Dh5kw?-h`h~ZzCfc-EZZ*%_E$7J z5+A{yT$}ttGeD8rfgp5|S5yXf``zpogNPcv^qvv|z0cr7=%}Vy3Y`HgF~}p0p7i+{ za&TnYUg7yj1`peKtXeMKmQnI_-aWi;v*YU1A_?+}91vqXd^_)rW$~EYo{~Sqo5ihA zQQej=k+u2tK+^W7DwHpwPxWzS2GbveD6!Gi#Ks#`bm`iGpybDSH8NZf)gkvwLmt6m zCR<}rfNahhF!w`JCte>xt3uu*N(Sz2Zzv5>qD|_{*z%bx*hgu~Mu5Wgk*LCe6}U%P zz}cqD(nTa+5~0xsOtVA76zeZcl8Wke&3{c_qd=@auOVRb! zs{|^0u>A%4nPnwPm9CH()UrUcYxtT5cc6kjn--a(R(L=rwf0(+tw1k3h)v7Lcn_5# zUqzr!;>v2IUSd6_iv$>|9)_UVcxiq$H5SBUd4(wn^`cXyh639jgB{Zqf)cx9p8Cb? z`vwaTd4%57h-NL}qoR~i=CeLts2l_SOIi+&LE8vSXUEb(CUf}9tA@!9u}q<#juM6P zNwnYuMbAyTEUX6*J(t}>+2%Y_K3edGbA%-2pP%fqJsqd~^YRN~_Kro#e2oEReow%u zA5>(ZNrc8ugNg_X3DD1LK3I+Ga`uXWko05Bet-g?0J8R!C?A5i_+$_T$ScrRurUTD z1+9(H1f$iY(ZCxvWJYW3Dv?jvWDsFswq^qT9fL1Z(`($-9y;M*Pa5!=vTvtWOQ{@IZsiJOv)QXCz z@eK$k(v0>qnn+}aCiYY~Lpk(RVDSXC`IB4yqHWzz^UvqX3cK88CEb(r3q9eZJbalC z-8n#F-cfWDi=Qp4?7FM0wR?R20-D9_Bf^%+@%PH^>$;_E6Fpo?4|j@(8S#F#>_;2@ z*#hM#vDrzl6%Gw9ZI?=c-l^%Z2m_P0H~FTir{34x#O9w0f*`M`Vmt)>WrHs{x8Ed>k;x>$z%2go_J9Ofc;sTk)8j~jH1mY}cGbZjc1k3kQV1O365&JO4Uy>Ugk zxSIaPF%!zOQ^ye>=-Hz0u|WV__yy-4z(vympEi?0Z_qKHLK8i6ItW&I1^zfdn3BJbQh3Alu86_Yf zcO;v~{lnWpCv;WKwY6?K zl=QT^*?FT31f5+Al?3P^0}$Fa_}ul*T94PwN)3*rwwQlVYHzy$m0z@E+e-qLT`PXb z=8^?s(vh4|{If_|2Kdj7VxWk$Oe%8R;6Mez1avO*aM33fU<|%P6T%@rEqjTZ42#FwyT`_FEp>?4hqBX(TDend~ zyt-g8@cA1S`z!12rTpdqy*0}I@y-|d?#^&Yff@3fF~7gjQQOhEzTL5*t@B3@bgXq0 z78KDxM9e9iQ{*h1?<|~`oy2&=DD&Fnu7)y)8Vo8n?{q;)`dbDcDzuJXe0Em)7YEo* zgTq7u9Rn3g$kIQ^_Ns<}dl4HnfY8_>0D9}0pnL>p<2sAY(iBLHXymczCStJ)zO7nq zx^RSMF7h$xP1JexJt}l8&~A}1y^$J=9u+87fkGMaUZD^QJ(27qM>XHKD2w6Fk11C3 z*c;-1Gpr8})A~|01snd14mePoJr107>bJ3?&Uh>f=Yu6hzD=)D%XQkqL!j}!hH zWY2`o_iRnD&=4PbcK}BB5Fz!Gt8b`{Rl5TLSy|2{bb7tWU^M*<5b*uY;2(D#V7AL( z8sYkgJx)th9?9eVAKJv`5FbVVk1%Zq*)8wF_Ac==Vh@Q+soWFWQcvsUm2^+5M7BMz zXV|&^1E1J_a?zXKR=aahZa?9@UBn&?lTO_*P@C~R$trPbQE2_5@#Z*|360IPzBFGe zPns4xF8=aG*Cx%HkI*`nh3Zzb_S~6Nsj=uMLe2hsr6vLu)Y)NwT&#Oz(ebonWj&?2 z;B0Ua-6`msH66VO;Sa{5wh?JCr$ZD#I5hc@4T(QKK{%YKD_Q;>P4n6{YdaoX>v*uE cb7e|2#Qg48dVYs8&FFZ|7TNC4&7vCpFT%JZKmY&$ -- 2.39.2