# LithosAnanke / StarForth — Word Dictionary Reference **Status:** Living reference document, generated 2026-08-12. Keep it up to date as words are added, removed, or re-registered — see "Keeping this current" at the bottom. **Scope: core C primitives only.** This covers every word registered via `register_word()` (and the one file that uses `vm_create_word()` directly, `physics_pipelining_diagnostic_words.c`) across `src/word_source/*.c` and `src/starkernel/capsule/mama_forth_words.c` — roughly 470 words. It does **not** cover the ~330 FORTH-defined words living inside `.4th` capsules (`ACL.4th`, `zuse.4th`, `doe.4th`, workload capsules, etc.) — those are experiment/workload/ policy definitions layered on top of this vocabulary, not the language itself, and change per-capsule rather than per-build. If a capsule-word reference is wanted later, it belongs in a separate document — the two have very different lifecycles. **Source of truth.** Every entry below was extracted directly from source: the word name as passed to `register_word()`, the stack effect and description from the doc comment immediately above the implementing function (or inferred from the function body where no comment exists, marked `(inferred)`). Registration order within each file is preserved (rather than alphabetized) because related words are grouped together at the call site. **Two name collisions exist in the live dictionary.** FORTH dictionary lookup walks the definition chain newest-first (`vm->latest` backward via `->link`), so when two files register the same name, **the file registered later in `register_forth79_words()` (`src/word_registry.c`) wins** — the earlier registration becomes permanently unreachable by name (though still present in the chain). Both cases are noted at point of use below: - `[`, `]`, `STATE` — registered by `dictionary_manipulation_words.c` (Module 13), then again by `defining_words.c` (Module 17). **`defining_words.c`'s versions are live.** - `MOD`, `/MOD`, `*/`, `*/MOD` — registered by `arithmetic_words.c` (Module 4), then again by `mixed_arithmetic_words.c` (Module 6). **`mixed_arithmetic_words.c`'s versions are live.** --- ## Stack (`stack_words.c`) | Word | Stack Effect | Description | |---|---|---| | `DROP` | `( n -- )` | Removes the top stack item. | | `DUP` | `( n -- n n )` | Duplicates the top stack item. | | `?DUP` | `( n -- n n \| n -- 0 )` | Duplicates the top item only if it is non-zero. | | `SWAP` | `( n1 n2 -- n2 n1 )` | Exchanges the top two stack items. | | `OVER` | `( n1 n2 -- n1 n2 n1 )` | Copies the second stack item to the top. | | `ROT` | `( n1 n2 n3 -- n2 n3 n1 )` | Rotates the top three stack items, moving the third to the top. | | `-ROT` | `( n1 n2 n3 -- n3 n1 n2 )` | Reverse-rotates the top three stack items. | | `DEPTH` | `( -- n )` | Pushes the current number of items on the data stack. | | `PICK` | `( n -- stack[n] )` | Copies the nth stack item (0-indexed from top, after popping `n`) to the top. | | `ROLL` | `( n -- )` | Moves the nth stack item to the top, shifting intermediate items down. | ## Return Stack (`return_stack_words.c`) FORTH-79 compliance, stated in this file's own header: only `>R`/`R>`/`R@` are provided — no direct return-stack addressing (`RP!`/`RP@`), which FORTH-79 forbids. | Word | Stack Effect | Description | |---|---|---| | `>R` | `( x -- )` | Moves x from the data stack to the return stack. | | `R>` | `( -- x )` | Moves x from the return stack back to the data stack. | | `R@` | `( -- x )` | Copies the top of the return stack to the data stack without removing it. | ## Memory (`memory_words.c`) | Word | Stack Effect | Description | |---|---|---| | `@` | `( addr -- n )` | Fetches a cell from VM memory at `addr`. | | `!` | `( n addr -- )` | Stores cell `n` at VM memory address `addr`. | | `C@` | `( addr -- c )` | Fetches a byte from VM memory at `addr`. | | `C!` | `( c addr -- )` | Stores byte `c` at VM memory address `addr`. | | `+!` | `( n addr -- )` | Adds `n` to the cell currently at `addr`. | | `-!` | `( n addr -- )` | Subtracts `n` from the cell currently at `addr`. | | `2@` | `( addr -- x_low x_high )` | Fetches two consecutive cells starting at `addr`. | | `2!` | `( x_low x_high addr -- )` | Stores two consecutive cells starting at `addr`. | | `FILL` | `( addr len c -- )` | Fills `len` bytes starting at `addr` with byte value `c`. | | `MOVE` | `( addr1 addr2 len -- )` | Copies `len` bytes from `addr1` to `addr2`, handling overlap correctly. | | `ERASE` | `( addr len -- )` | Zeroes `len` bytes starting at `addr`. | | `CELLS` | `( n -- n' )` | Multiplies `n` by the cell size in bytes. | ## Arithmetic (`arithmetic_words.c`) `MOD`, `/MOD`, `*/`, `*/MOD` below are **shadowed** — see the collision note at the top of this document; `mixed_arithmetic_words.c`'s versions are the ones actually live. | Word | Stack Effect | Description | |---|---|---| | `+` | `( n1 n2 -- n3 )` | Adds `n1` and `n2`. | | `-` | `( n1 n2 -- n3 )` | Subtracts `n2` from `n1`. | | `*` | `( n1 n2 -- n3 )` | Multiplies `n1` by `n2`. | | `/` | `( n1 n2 -- n3 )` | Divides `n1` by `n2`; errors on division by zero. | | `MOD` *(shadowed)* | `( n1 n2 -- n3 )` | `n1` modulo `n2`; errors on division by zero. | | `/MOD` *(shadowed)* | `( n1 n2 -- n3 n4 )` | Pushes `n1 MOD n2` (remainder) then `n1 / n2` (quotient). | | `*/` *(shadowed)* | `( n1 n2 n3 -- n4 )` | Computes `n1 * n2 / n3` using a 64-bit intermediate to avoid overflow. | | `*/MOD` *(shadowed)* | `( n1 n2 n3 -- n4 n5 )` | Computes `n1 * n2 / n3`, pushing remainder then quotient, via a 64-bit intermediate. | | `1+` | `( n -- n+1 )` | Adds 1. | | `1-` | `( n -- n-1 )` | Subtracts 1. | | `2+` | `( n -- n+2 )` | Adds 2. | | `2-` | `( n -- n-2 )` | Subtracts 2. | | `2*` | `( n -- n*2 )` | Multiplies by 2 (left shift). | | `2/` | `( n -- n/2 )` | Divides by 2 (right shift). | | `ABS` | `( n -- \|n\| )` | Absolute value. | | `NEGATE` | `( n -- -n )` | Two's-complement negation. | | `MIN` | `( n1 n2 -- n3 )` | Pushes the smaller of `n1` and `n2`. | | `MAX` | `( n1 n2 -- n3 )` | Pushes the larger of `n1` and `n2`. | ## Logical & Comparison (`logical_words.c`) | Word | Stack Effect | Description | |---|---|---| | `AND` | `( n1 n2 -- n3 )` | Bitwise AND. | | `OR` | `( n1 n2 -- n3 )` | Bitwise OR. | | `XOR` | `( n1 n2 -- n3 )` | Bitwise XOR. | | `NOT` | `( flag -- flag )` | FORTH-79 logical NOT: 0 → true (-1), non-zero → false (0). | | `INVERT` | `( n1 -- n2 )` | Bitwise complement (FORTH-83 extension). | | `LSHIFT` | `( x1 u -- x2 )` | Logical left shift by `u` bits. | | `RSHIFT` | `( x1 u -- x2 )` | Logical right shift by `u` bits. | | `0=` | `( n -- flag )` | True if `n` is zero. | | `0<` | `( n -- flag )` | True if `n` is negative. | | `0>` | `( n -- flag )` | True if `n` is positive. | | `0<>` | `( n -- flag )` | True if `n` is non-zero. | | `=` | `( n1 n2 -- flag )` | True if equal. | | `<>` | `( n1 n2 -- flag )` | True if not equal. | | `<` | `( n1 n2 -- flag )` | True if `n1 < n2` (signed). | | `>` | `( n1 n2 -- flag )` | True if `n1 > n2` (signed). | | `>=` | `( n1 n2 -- flag )` | True if `n1 >= n2` (signed). | | `<=` | `( n1 n2 -- flag )` | True if `n1 <= n2` (signed). | | `U<` | `( u1 u2 -- flag )` | True if `u1 < u2` (unsigned). | | `U>` | `( u1 u2 -- flag )` | True if `u1 > u2` (unsigned). | | `WITHIN` | `( n low high -- flag )` | True if `low <= n < high`. | | `TRUE` | `( -- flag )` | Pushes -1. | | `FALSE` | `( -- flag )` | Pushes 0. | ## Mixed Arithmetic (`mixed_arithmetic_words.c`) `MOD`, `/MOD`, `*/`, `*/MOD` here are the **live** versions — see the collision note at the top of this document. | Word | Stack Effect | Description | |---|---|---| | `M+` | `( d_high d_low n -- d_high' d_low' )` | Adds single-cell signed `n` to double-cell `d`, with carry propagation. | | `M-` | `( d_high d_low n -- d_high' d_low' )` | Subtracts single-cell signed `n` from double-cell `d`, with carry propagation. | | `M*` | `( n1 n2 -- d_low d_high )` | Multiplies two single-cell signed integers into a double-cell result (TOS = high cell). | | `M/MOD` | `( d_high d_low n -- remainder quotient )` | Divides double-cell dividend `d` by single-cell divisor `n`; TOS = quotient. | | `MOD` | `( n1 n2 -- remainder )` | Computes `n1 % n2`; errors on division by zero. | | `/MOD` | `( n1 n2 -- remainder quotient )` | Divides `n1` by `n2`, leaving both remainder and quotient (TOS = quotient). | | `*/` | `( n1 n2 n3 -- quotient )` | Computes `(n1 * n2) / n3` using a wider intermediate to avoid overflow. | | `*/MOD` | `( n1 n2 n3 -- remainder quotient )` | Computes `(n1 * n2) / n3`, leaving both remainder and quotient. | ## Double-Precision (`double_words.c`) A double is represented on the stack as `dlow dhigh` (high cell on top). | Word | Stack Effect | Description | |---|---|---| | `S>D` | `( n -- d )` | Converts a single-precision number to double, sign-extending into the high cell. | | `D+` | `( d1 d2 -- d3 )` | Double-precision addition with carry propagation. | | `D-` | `( d1 d2 -- d3 )` | Double-precision subtraction with borrow propagation. | | `DNEGATE` | `( d1 -- d2 )` | Double-precision two's-complement negation. | | `DABS` | `( d1 -- d2 )` | Double-precision absolute value. | | `DMAX` | `( d1 d2 -- d3 )` | Maximum of two double-precision numbers. | | `DMIN` | `( d1 d2 -- d3 )` | Minimum of two double-precision numbers. | | `D<` | `( d1 d2 -- flag )` | True if `d1 < d2` (double-precision signed compare). | | `D=` | `( d1 d2 -- flag )` | True if `d1 = d2`. | | `2DROP` | `( d -- )` | Drops a double (two cells). | | `2DUP` | `( d -- d d )` | Duplicates a double. | | `2SWAP` | `( d1 d2 -- d2 d1 )` | Swaps two doubles. | | `2OVER` | `( d1 d2 -- d1 d2 d1 )` | Copies the second double to the top. | | `2ROT` | `( d1 d2 d3 -- d2 d3 d1 )` | Rotates three doubles. | | `2>R` | `( d -- ) ( R: -- d )` | Moves a double to the return stack (nesting-aware: preserves the resume IP above it when inside a colon-word executor). | | `2R>` | `( -- d ) ( R: d -- )` | Moves a double from the return stack back to the data stack. | | `2R@` | `( -- d ) ( R: d -- d )` | Copies a double from the return stack without removing it. | | `D0=` | `( d -- flag )` | True if the double is zero. | | `D0<` | `( d -- flag )` | True if the double is negative. | | `D2*` | `( d1 -- d2 )` | Double-precision left shift by 1 (multiply by 2), carrying across cells. | | `D2/` | `( d1 -- d2 )` | Double-precision arithmetic right shift by 1 (divide by 2), preserving sign, carrying across cells. | ## Format & Numeric Output (`format_words.c`) | Word | Stack Effect | Description | |---|---|---| | `.` | `( n -- )` | Prints `n` in the current base, followed by a space. | | `.R` | `( n width -- )` | Prints `n` right-justified in a field of `width` characters. | | `U.` | `( u -- )` | Prints `u` as unsigned, followed by a space. | | `U.R` | `( u width -- )` | Prints `u` as unsigned, right-justified in a field of `width`. | | `D.` | `( d -- )` | Prints double-cell `d` as signed decimal (or `DOUBLE-OVERFLOW` if it doesn't fit a single cell). | | `D.R` | `( d width -- )` | Prints double-cell `d` right-justified in a field of `width`. | | `.S` | `( -- )` | Prints the entire data stack contents non-destructively, prefixed with the depth. | | `?` | `( addr -- )` | Fetches and prints the cell at `addr`. | | `DUMP` | `( addr u -- )` | Prints a hex/ASCII memory dump of `u` bytes starting at `addr`. | | `<#` | `( -- )` | Begins pictured numeric output conversion; resets the hold buffer. | | `#` | `( ud \| n -- ud2 )` | Converts one digit of the number (in the current base) into the hold buffer. | | `#S` | `( ud \| n -- 0 0 )` | Converts all remaining digits of the number into the hold buffer. | | `#>` | `( [ud] -- addr u )` | Ends pictured numeric conversion; pushes the address and length of the formatted string. | | `HOLD` | `( c -- )` | Prepends character `c` to the pictured-numeric hold buffer. | | `SIGN` | `( n -- )` | If `n` is negative, holds a `-` character for pictured output. | | `BASE` | `( -- addr )` | Pushes the VM address of the `BASE` variable (current numeric conversion radix). | | `DECIMAL` | `( -- )` | Sets `BASE` to 10. | | `HEX` | `( -- )` | Sets `BASE` to 16. | | `OCTAL` | `( -- )` | Sets `BASE` to 8. | ## String & Text Processing (`string_words.c`) | Word | Stack Effect | Description | |---|---|---| | `COUNT` | `( addr1 -- addr2 u )` | Converts a counted string (length-prefixed) at `addr1` into an address/length pair. | | `EXPECT` | `( addr u -- )` | Reads a line from stdin into the buffer at `addr` (max `u` bytes) and updates `SPAN` with the actual length read. | | `SPAN` | `( -- addr )` | Pushes the address of the `SPAN` variable, holding the character count from the last `EXPECT`/`QUERY`. | | `QUERY` | `( -- )` | Reads a line from stdin into the terminal input buffer (TIB), resetting `>IN` to 0 and updating `SPAN`. | | `TIB` | `( -- addr )` | Pushes the address of the terminal input buffer. | | `WORD` | `( c -- addr )` | Parses the next word from the input stream delimited by character `c`, returning the address of a counted-string scratch buffer. | | `(s")` | `( -- c-addr u )` | Runtime for compiled `S"` — reads an inline length-prefixed string from the threaded-code stream and pushes its address/length, advancing past it. | | `S"` | `( "ccc" -- c-addr u )` | Parses a quoted string literal. Interpret mode: stores it at `HERE` and pushes address/length. Compile mode: compiles `(s")` plus the inline string data. Immediate. | | `>IN` | `( -- addr )` | Pushes the address of the `>IN` input-stream-position variable. | | `SOURCE` | `( -- addr u )` | Pushes the address and length of the current input source (the TIB). | | `BL` | `( -- c )` | Pushes the ASCII code for space (32). | | `[']` | `( -- xt )` | Parses the next word from the input stream and pushes (or compiles as a literal) its execution token. Immediate. | | `LITERAL` | `( -- )` | Placeholder/no-op in this implementation. | | `[LITERAL]` | `( -- )` | Placeholder/no-op in this implementation (delegates to `LITERAL`). | | `CONVERT` | `( d1 addr1 -- d2 addr2 )` | Converts digit characters starting at `addr1` into a running double-precision accumulator `d1`→`d2` (simplified, base 10 only), returning the address just past the converted digits. | | `NUMBER` | `( addr -- n flag )` | Converts a counted string at `addr` to a number (base 10 only); flag is 1 on success, 0 on failure. | | `ENCLOSE` | `( addr c -- addr1 n1 n2 n3 )` | Parses a delimited field: `n1` = leading-delimiter count, `n2` = end offset of the field, `n3` = offset past trailing delimiters. | | `-TRAILING` | `( addr u -- addr u' )` | Trims trailing ASCII spaces from a string (direct or counted-string form auto-detected), returning the trimmed length. | | `CMOVE` | `( addr1 addr2 u -- )` | Copies `u` bytes from `addr1` to `addr2`, ascending address order (correct for overlap when `addr2 >= addr1`). | | `CMOVE>` | `( addr1 addr2 u -- )` | Copies `u` bytes from `addr1` to `addr2`, descending address order (correct for overlap when `addr2 < addr1`). | | `COMPARE` | `( addr1 u1 addr2 u2 -- n )` | Lexicographically compares two strings (direct or counted-string form), returns -1/0/+1. | | `SEARCH` | `( addr1 u1 addr2 u2 -- addr3 u3 flag )` | Finds the first occurrence of string 2 within string 1; returns the matching tail and a found flag. | | `SCAN` | `( addr u char -- addr' u' )` | Finds the first occurrence of `char` in the string, returning the tail starting there (or end-of-string if not found). | | `SKIP` | `( addr u char -- addr' u' )` | Skips leading occurrences of `char` in the string, returning the remaining tail. | | `BLANK` | `( addr u -- )` | Fills `u` bytes at `addr` with ASCII space (auto-detects counted-string form). | ## I/O & Terminal (`io_words.c`) | Word | Stack Effect | Description | |---|---|---| | `EMIT` | `( c -- )` | Outputs the character `c` to the terminal. | | `CR` | `( -- )` | Outputs a newline character. | | `KEY` | `( -- c )` | Reads one character from the terminal and pushes it. | | `?TERMINAL` | `( -- flag )` | Pushes whether input is available (stub implementation, always pushes false). | | `TYPE` | `( addr u -- )` | Outputs `u` characters from VM memory starting at `addr`. | | `SPACE` | `( -- )` | Outputs a single space character. | | `SPACES` | `( n -- )` | Outputs `n` space characters. | | `(do-string)` | `( -- )` | Runtime helper compiled by `."` — reads an inline length-prefixed string from the threaded code and prints it, advancing IP past it. Not meant to be called directly. | | `."` | `( "ccc" -- )` | Immediate. Interpretation: parses and prints a string up to the closing `"` directly. Compilation: compiles `(do-string)` plus the inline string data. | ## Block & Mass Storage (`block_words.c`) | Word | Stack Effect | Description | |---|---|---| | `BLOCK` | `( u -- addr )` | Returns the VM address of block `u`'s content, loading it if needed (does not mark dirty). | | `BUFFER` | `( u -- addr )` | Returns the VM address of block `u`'s buffer without reading its content; marks it dirty. | | `UPDATE` | `( -- )` | Marks the currently-loaded block (per `SCR`) dirty and syncs it to the underlying block-subsystem buffer. | | `BLK-CONFIRM-FORMAT` | `( lbn -- )` | Commits the low-level disk container format for the slot owning block `lbn`; until called, writes to that disk slot are refused. Must be called only by the disk's owner after classifying its content as safe. | | `SAVE-BUFFERS` | `( -- )` | Writes back every dirty block window slot to the block subsystem. | | `EMPTY-BUFFERS` | `( -- )` | Invalidates all block window slots and zeroes all user blocks, without writing back. | | `FLUSH` | `( -- )` | Same as `SAVE-BUFFERS` — syncs and invalidates all buffers. | | `LOAD` | `( u -- )` | Sets `SCR` to `u` and interprets block `u`'s content as FORTH source. | | `LIST` | `( u -- )` | Sets `SCR` to `u` and prints the block's content formatted as 16 lines of 64 characters with line numbers. | | `THRU` | `( u1 u2 -- )` | Executes `LOAD` on every block from `u1` to `u2` inclusive. | | `SCR` | `( -- addr )` | Pushes the VM address of the `SCR` (current block) variable. | | `-->` | `( -- )` | Continues interpretation on the next sequential block after the current `SCR`. | ## Dictionary & Compilation (`dictionary_words.c`) | Word | Stack Effect | Description | |---|---|---| | `HERE` | `( -- addr )` | Returns the dictionary pointer. | | `ALIGN` | `( -- )` | Aligns the dictionary pointer to a cell boundary. | | `ALLOT` | `( n -- )` | Allocates `n` bytes in the dictionary; `n` may be negative to deallocate. | | `,` | `( n -- )` | Compiles a single cell value into the dictionary at `HERE`. | | `C,` | `( c -- )` | Compiles a single byte value into the dictionary at `HERE`. | | `2,` | `( d -- )` | Compiles a double-cell value into the dictionary at `HERE`, low cell first. | | `PAD` | `( -- addr )` | Returns the VM address of the 512-byte scratch text buffer at top of memory. | | `SP!` | `( sp -- )` | Sets the data stack pointer; can only shrink the stack, never grow it. | | `SP@` | `( -- sp )` | Returns the current data stack-pointer index (top is 0). | | `LATEST` | `( -- addr )` | Returns the VM address near the most recent compiled definition (end of dictionary). | ## Dictionary Manipulation (`dictionary_manipulation_words.c`) `[`, `]`, `STATE` below are **shadowed** — see the collision note at the top of this document; `defining_words.c`'s versions are the ones actually live. | Word | Stack Effect | Description | |---|---|---| | `[` *(shadowed)* | `( -- )` | Enters interpretation mode. | | `]` *(shadowed)* | `( -- )` | Enters compilation mode. | | `STATE` *(shadowed)* | `( -- addr )` | Pushes the address of this file's own `state_variable` (a separate static, not the VM's `vm->state_addr` used by `defining_words.c`'s `STATE`). | | `SMUDGE` | `( -- )` | Compile-only: intended to toggle the hidden/smudge bit of the latest word (function body is a stub/placeholder in the current source). | | `HIDDEN` | `( -- )` | Compile-only: sets the hidden flag on the most recently defined word. | | `>BODY` | `( xt -- addr )` | Converts an execution token to its data-field (body) address. | | `>NAME` | `( xt -- addr )` | Converts an execution token to the address of its name field. | | `NAME>` | `( addr -- xt )` | Converts a name-field address back to its execution token, by linear search of the dictionary. | | `>LINK` | `( addr -- addr )` | Pushes the address of a dictionary entry's link field. | | `LINK>` | `( addr -- addr )` | Dereferences a link-field address to get the next dictionary entry. | | `CFA` | `( addr -- xt )` | Returns the code-field address of an entry — in this implementation, the entry pointer itself. | | `LFA` | `( addr -- addr )` | Alias for `>LINK` — returns the link-field address. | | `NFA` | `( addr -- addr )` | Returns the name-field address of a dictionary entry. | | `PFA` | `( addr -- addr )` | Returns the parameter-field (body) address of a dictionary entry. | | `TRAVERSE` | `( addr n -- addr )` | Moves forward or backward across a name field by `n`. | | `INTERPRET` | `( -- )` | Sets interpret mode; actual interpretation is driven by the VM's own `vm_interpret()`, not this word's body. | | `FIND` | `( "name" -- xt \| 0 )` | Parses the next word and pushes its dictionary entry pointer, or 0 if not found (a miss is not an error). | | `'` | `( "name" -- xt )` | FORTH-79 tick: parses the next word and pushes its execution token; errors if not found. Non-immediate — the compiler compiles a call to it in compile mode. | ## Vocabulary System (`vocabulary_words.c`) | Word | Stack Effect | Description | |---|---|---| | `VOCABULARY` | `( -- )` | Creates a new vocabulary; executing the created word selects itself as CONTEXT. | | `DEFINITIONS` | `( -- )` | Sets CURRENT to CONTEXT, so new words are defined into the CONTEXT vocabulary. | | `CONTEXT` | `( -- addr )` | Returns the VM address of the cell holding the CONTEXT vocabulary pointer. | | `CURRENT` | `( -- addr )` | Returns the VM address of the cell holding the CURRENT vocabulary pointer. | | `FORTH` | `( -- )` | Makes FORTH the CONTEXT vocabulary. | | `ORDER` | `( -- )` | Prints the current search order (CONTEXT then FORTH) and CURRENT. | | `(FIND)` | `( addr -- addr flag )` | Primitive finder: searches CONTEXT then FORTH vocabularies for the counted string at `addr`. | ## System & Environment (`system_words.c`) | Word | Stack Effect | Description | |---|---|---| | `(` | `( -- )` | Begins a comment; skips input up to the matching `)`, honoring nested parens. Immediate. | | `\` | `( -- )` | Line comment; skips input to the end of the current line. Immediate. | | `COLD` | `( -- )` | Performs a cold start: resets VM state and rewinds `HERE` toward the base dictionary. | | `WARM` | `( -- )` | Performs a warm restart: resets stacks/mode/error without rewinding `HERE`. | | `BYE` | `( -- )` | Halts the VM, signalling the REPL to stop. (Overridden for Hera — see Kernel: Capsule Birth & Tripod Fleet below.) | | `REBOOT` | `( addr len -- )` | Sets boot arguments from the given string and performs a cold reset (kernel target) or prints a hosted-stub message and halts. Interpret-only. | | `SAVE-SYSTEM` | `( -- )` | Writes a trivial snapshot of VM memory (up to `HERE`) to `forth_system.img`. | | `WORDS` | `( -- )` | Lists every word name currently in the dictionary, 8 per line, with a total count. | | `VLIST` | `( -- )` | Lists every dictionary entry with its name, address, and flags byte. | | `SEE` | `( "name" -- )` | Decompiles and prints the named word's definition (threaded code, or `` for C words). | | `PAGE` | `( -- )` | Clears the terminal screen via an ANSI escape sequence. | | `EXECUTE` | `( xt -- )` | Executes the word whose execution token is on the stack. | | `NOP` | `( -- )` | Does nothing. | | `79-STANDARD` | `( -- flag )` | Prints and pushes whether FORTH-79 standard-compliance mode is active (-1) or not (0). | | `QUIT` | `( -- )` | Clears the return stack and returns to the interpreter, without treating it as an error. Immediate. | | `ABORT` | `( -- )` | Clears both stacks and returns to the interpreter; not treated as an error condition. | | `(ABORT")` | `( flag addr len -- )` | Runtime helper for `ABORT"`: if `flag` is nonzero, prints the message at `addr len` and performs `ABORT` semantics. | | `ABORT"` | `( flag -- )` | Parses a message up to the next `"`; if `flag` is nonzero (interpret mode) or at run time (compiled), prints it and aborts. Immediate. | ## Line Editor (`editor_words.c`) Non-standard (not FORTH-79). | Word | Stack Effect | Description | |---|---|---| | `L` | `( u -- )` | Prints line `u` (0-15) of the current SCR block. | | `S` | `( c-addr len u -- )` | Sets line `u` of the current SCR block from a buffer, padding with spaces to 64 chars. | | `SHOW` | `( -- )` | Prints the whole 16x64 current screen with line numbers. | | `EDIT` | `( u -- )` | Enters a tiny interactive line-editor shell (stdin/stdout) on block `u`. | ## Defining Words (`defining_words.c`) `[`, `]`, `STATE` here are the **live** versions — see the collision note at the top of this document. | Word | Stack Effect | Description | |---|---|---| | `:` | `( "name" -- )` | Begins a colon definition; parses the name and enters compile mode. Immediate. | | `;` | `( -- )` | Ends a colon definition, compiling an implicit `EXIT` and returning to interpret mode. Immediate. | | `CREATE` | `( "name" -- )` | Defines a new word whose runtime pushes its data-field address (FORTH-79: allocates no data itself). | | `VARIABLE` | `( "name" -- )` | Defines a new word that allocates one cell (initialized to 0) and whose runtime pushes that cell's address. | | `CONSTANT` | `( n "name" -- )` | Defines a new word whose runtime pushes the fixed value `n`. | | `IMMEDIATE` | `( -- )` | Marks the most recently defined word as IMMEDIATE (executes during compilation instead of being compiled in). | | `STATE` | `( -- addr )` | Pushes the VM address of the `STATE` variable (0 = interpreting, nonzero = compiling). | | `[` | `( -- )` | Enters interpret state (sets `STATE` to 0). Immediate. | | `]` | `( -- )` | Enters compile state (sets `STATE` to -1). | | `FORGET` | `( "name" -- )` | Removes the named word and every word defined after it from the dictionary, rewinding `HERE`. | | `COMPILE` | `( "word" -- )` | Legacy immediate word: parses the next word and compiles a call to it. Immediate. | | `[COMPILE]` | `( "word" -- )` | Compiles the next word even if it is itself IMMEDIATE. Immediate. | | `LIT` | `( -- n )` | Runtime primitive: fetches the next cell from threaded code (via the return-stack IP) and pushes it as a literal. | | `LITERAL` | `( n -- )` | Compiles `n` as a literal into the current definition (via `LIT`). Immediate. | | `does_rt` | `( -- )` *(inferred)* | Internal helper: patches the just-created child word to use the `DOES>` runtime and records the `DOES>` body address in its parameter field. Not meant to be called directly from FORTH. | | `DOES>` | `( -- )` | Finalizes a defining word's CREATE-part and compiles the following code as the DOES>-body run by every word the defining word subsequently creates. Immediate, compile-only. | | `DEFER` | `( "name" -- )` | Creates a deferred word with an empty execution-token slot; errors if executed before `IS` sets it. | | `IS` | `( xt "name" -- )` | Stores execution token `xt` into a word previously created with `DEFER`. | | `DEFER@` | `( "name" -- xt )` | Fetches the execution token currently stored in a deferred word. | ## Control Flow (`control_words.c`) | Word | Stack Effect | Description | |---|---|---| | `(BRANCH)` | `( -- )` | Runtime: unconditional branch — reads a relative byte offset from the inline thread and adjusts the return-stack IP by it. | | `(0BRANCH)` | `( f -- )` | Runtime: conditional branch — pops a flag; if zero, branches by the inline relative offset, otherwise skips it. | | `(?DO)` | `( limit index -- )` | Runtime for `?DO` — if index equals limit the loop body is skipped entirely (branches past it); otherwise pushes (limit, index) onto the return stack as the loop frame. | | `(DO)` | `( limit index -- )` | Runtime for `DO` — unconditionally pushes (limit, index) onto the return stack as the loop frame. | | `(LOOP)` | `( -- )` | Runtime for `LOOP` — increments the loop index; if still less than the limit, branches back to the loop body, else drops the loop frame and falls through. | | `(+LOOP)` | `( n -- )` | Runtime for `+LOOP` — adds `n` to the loop index; continues looping while the (signed-direction-aware) index hasn't crossed the limit, else exits. | | `(LEAVE)` | `( -- )` | Runtime for `LEAVE` — forces the current loop to exit at the next `LOOP`/`+LOOP` by setting index equal to limit. | | `IF` | `( f -- )` *(compile-time)* | Compiles a conditional branch (`0BRANCH`) with a placeholder target, pushed for later patching by `ELSE`/`THEN`. Immediate. | | `ELSE` | `( -- )` *(compile-time)* | Patches the matching `IF`'s branch to land here, compiles an unconditional branch past the else-clause, pushed for `THEN` to patch. Immediate. | | `THEN` | `( -- )` *(compile-time)* | Patches the matching `IF` or `ELSE` branch to land here, closing the conditional. Immediate. | | `BEGIN` | `( -- )` *(compile-time)* | Marks the start of a loop (target for `UNTIL`/`AGAIN`/`REPEAT`). Immediate. | | `WHILE` | `( f -- )` *(compile-time)* | Compiles a conditional exit branch inside a `BEGIN...REPEAT` loop, patched by `REPEAT`. Immediate. | | `REPEAT` | `( -- )` *(compile-time)* | Compiles an unconditional branch back to `BEGIN` and patches `WHILE`'s exit branch to land after it. Immediate. | | `AGAIN` | `( -- )` *(compile-time)* | Compiles an unconditional branch back to the matching `BEGIN` (infinite loop unless exited via `LEAVE`/`EXIT`). Immediate. | | `UNTIL` | `( f -- )` *(compile-time)* | Compiles a conditional branch back to the matching `BEGIN`; loop repeats while the flag is false. Immediate. | | `?DO` | `( limit index -- )` *(compile-time)* | Compiles the `(?DO)` runtime call plus loop-frame bookkeeping for `LOOP`/`LEAVE`. Immediate. | | `DO` | `( limit index -- )` *(compile-time)* | Compiles the `(DO)` runtime call plus loop-frame bookkeeping for `LOOP`/`LEAVE`. Immediate. | | `LOOP` | `( -- )` *(compile-time)* | Compiles the `(LOOP)` runtime call, patches the back-edge to `DO`/`?DO` and any pending `LEAVE` sites. Immediate. | | `+LOOP` | `( n -- )` *(compile-time)* | Compiles the `(+LOOP)` runtime call, patches the back-edge to `DO`/`?DO` and any pending `LEAVE` sites. Immediate. | | `LEAVE` | `( -- )` *(compile-time)* | Compiles the runtime leave-flag plus a forward branch out of the enclosing loop, patched at the next `LOOP`/`+LOOP`. Immediate. | | `I` | `( -- i )` | Pushes the index of the innermost active `DO`/`?DO` loop. | | `J` | `( -- j )` | Pushes the index of the next-outer `DO`/`?DO` loop (requires nested loops). | | `UNLOOP` | `( -- )` | Discards the current loop's (limit, index) frame from the return stack without branching — used before an early `EXIT` from inside a loop. | | `EXIT` | `( -- )` | Marks the current colon definition for a one-shot early return. | | `CASE` | `( n -- n )` *(compile-time)* | Marks the start of a `CASE...OF...ENDOF...ENDCASE` selector statement. Immediate. | | `OF` | `( n1 n2 -- \| n1 )` *(compile-time)* | Compiles a compare-and-branch (`OVER = 0BRANCH DROP`) for one `CASE` clause. Immediate. | | `ENDOF` | `( -- )` *(compile-time)* | Ends one `OF` clause: patches its branch, compiles a jump to `ENDCASE`. Immediate. | | `ENDCASE` | `( n -- )` *(compile-time)* | Ends the `CASE` statement: compiles a `DROP` for the selector and patches all `ENDOF` branches to land here. Immediate. | ## StarForth Extensions (`starforth_words.c`) Each word is registered twice — once into the root vocabulary, once again into the `STARFORTH` vocabulary context (`ENTROPY@`/`ENTROPY!` only registered the second time). Listed once below. | Word | Stack Effect | Description | |---|---|---| | `ENTROPY@` | `( addr -- n )` | Fetches the execution-heat counter for the `DictEntry` at `addr` (validated against the live dictionary chain). | | `ENTROPY!` | `( n addr -- )` | Sets the execution-heat counter for the `DictEntry` at `addr`. | | `WORD-ENTROPY` | `( -- )` | Prints execution-heat statistics (per word, total, average) for every word in the dictionary. | | `RESET-ENTROPY` | `( -- )` | Resets every word's execution-heat counter and compudynamics metadata (temperature, latency, last-active) to zero. | | `TOP-WORDS` | `( n -- )` | Prints the `n` most frequently executed words, sorted descending by execution heat. | | `(-` | `( -- )` | Comment word: consumes input up to a balanced closing `)` — used for `init.4th` metadata markers. | | `INIT` | `( -- )` | Reads `./capsules/core/init.4th`, remaps and copies its numbered blocks sequentially starting at block 1, executes them via `LOAD`, then zeroes the init blocks for userspace reuse. | | `VERSION` | `( -- )` | Prints the StarForth version string (`STARFORTH_VERSION_FULL`). | | `SEED` | `( n -- )` | Seeds the internal PRNG (LCG) with `n` (forces non-zero state). | | `RANDOM` | `( lo hi -- n )` | Returns a pseudo-random integer in the inclusive range `[lo, hi]`. | | `WAIT` | `( n -- )` | Waits `n` heartbeat ticks (calls `vm_tick()` n times) — architecture-independent, no wall-clock dependency. | | `ZUSE-AUTHENTICATE` | `( -- )` | Sets `vm->zuse_session = 1` — C-only superuser bypass, no FORTH-level authentication logic. | ## Word-Level ACL (`acl_words.c`) | Word | Stack Effect | Description | |---|---|---| | `ACL-MODE@` | `( xt -- mode )` | Fetches the ACL enforcement mode of the word `xt`: 0 = STRICT (permanent), 1 = TTL (expires after countdown). | | `ACL-PINNED?` | `( xt -- flag )` | Pushes -1 if the word `xt` is pinned (its ACL fields are immutable), 0 otherwise. | | `ACL-TTL@` | `( xt -- n )` | Fetches the current TTL countdown of the word's ACL entry. | | `ACL-ALLOW@` | `( xt -- flag )` | Fetches the cached allow/deny decision for the word: -1 = allowed, 0 = denied. | | `ACL-HEAT@` | `( xt -- heat )` | Fetches the execution-heat counter for the word (used to calibrate TTL). | | `ACL-WORD-ID` | `( xt -- n )` | Fetches the word's stable `word_id`, assigned at registration and usable as a persistent table index. | | `ACL-MODE!` | `( mode xt -- )` | Sets the ACL enforcement mode of word `xt`. No-op if the word is pinned. | | `ACL-TTL!` | `( n xt -- )` | Sets the TTL countdown on the word's ACL entry (clamped to `[0, UINT32_MAX]`). No-op if pinned. | | `ACL-ALLOW!` | `( flag xt -- )` | Sets the cached allow/deny decision for word `xt`. No-op if pinned. | | `ACL-PIN` | `( xt -- )` | Sets `acl_pinned` on word `xt`. One-way ratchet — can never be cleared once set. | | `ACL-INHERIT` | `( src dst -- )` | Copies `acl_mode` from `src` to `dst`, then clears `dst`'s pin, resets its TTL to 0, and sets `acl_allow` to 1 (optimistic default). | | `ACL-INIT-PRIMITIVES` | `( -- )` | Walks the entire dictionary and resets ACL fields (TTL=0, allow=1, mode=TTL) on every unpinned entry. | ## Compudynamics: Benchmark (`physics_benchmark_words.c`) | Word | Stack Effect | Description | |---|---|---| | `BENCH-DICT-LOOKUP` | `( iterations -- )` | Benchmarks dictionary lookup performance over a set of common words for the given iteration count; warns if iterations < 10,000 for statistical validity. | | `PHYSICS-CACHE-STATS` | `( -- )` | Displays detailed hot-words cache statistics and current cache contents. | | `PHYSICS-TOGGLE-CACHE` | `( -- )` | Enables/disables the hot-words cache at runtime for A/B testing. | | `PHYSICS-RESET-STATS` | `( -- )` | Resets cache and pipeline-metrics statistics for a clean before/after comparison. | | `PHYSICS-BUILD-INFO` | `( -- )` | Prints the current hot-words cache build configuration and runtime state. | | `PHYSICS-BAYESIAN-REPORT` | `( addr_baseline -- )` | Generates a Bayesian inference report comparing current cache stats against a baseline. | ## Compudynamics: Pipelining Diagnostics (`physics_pipelining_diagnostic_words.c`) Registers via `vm_create_word()` directly rather than `register_word()` — the only file in the tree that does this (verified by a `vm_create_word(vm, "` sweep of the whole `word_source/` directory). | Word | Stack Effect | Description | |---|---|---| | `PIPELINING-SHOW-STATS` | `( c-addr u -- )` | Displays word-to-word transition metrics (prefetch attempts/hits/misses, latency saved) for the named word. | | `PIPELINING-SHOW-TOP-TRANSITIONS` | `( c-addr u n -- )` | Displays the top `n` words that typically follow the named word, ranked by transition count. | | `PIPELINING-RESET-ALL` | `( -- )` | Clears transition metrics from every word in the dictionary. | | `PIPELINING-ENABLE` | `( -- )` | Reports whether pipelining metrics collection is enabled (compile-time flag; this word does not toggle it). | | `PIPELINING-STATS` | `( -- )` | Displays aggregate pipelining statistics (transitions, prefetch hit rate) across the whole dictionary. | | `PIPELINING-ANALYZE-WORD` | `( c-addr u -- )` | Comprehensive analysis of one word's transition predictability (entropy/distribution spread) plus prefetch net benefit. | ## Compudynamics: Freeze/Decay Control (`physics_freeze_words.c`) | Word | Stack Effect | Description | |---|---|---| | `FREEZE-WORD` | `( caddr u -- )` | Sets `WORD_FROZEN` on the named word so its execution heat stops decaying; silently succeeds if not found. | | `UNFREEZE-WORD` | `( caddr u -- )` | Clears `WORD_FROZEN` on the named word, letting heat decay resume normally. | | `FROZEN?` | `( caddr u -- flag )` | Pushes true (-1) if the named word is frozen, false (0) otherwise or if not found. | | `HEAT!` | `( heat caddr u -- )` | Directly writes `execution_heat` for the named word (diagnostics; bypasses normal accumulation/decay). | | `HEAT@` | `( caddr u -- heat )` | Pushes the current `execution_heat` of the named word (0 if not found). | | `SHOW-HEAT` | `( caddr u -- )` | Prints the named word's heat plus frozen/pinned status to stdout. | | `ALL-HEATS` | `( -- )` | Prints a table of every dictionary word sorted by descending execution heat. | | `DECAY-RATE@` | `( -- rate )` | Pushes the compile-time base heat decay rate (Q48.16) per microsecond used by Loop #3. | | `FREEZE-CRITICAL` | `( -- )` | Freezes a hard-coded list of 21 system-critical words (`DUP`, `DROP`, `SWAP`, `IF`, `EXECUTE`, etc.) so they never decay out of the hot-words cache. | ## Compudynamics: General Diagnostics (`physics_diagnostic_words.c`) | Word | Stack Effect | Description | |---|---|---| | `PHYSICS-WORD-METRICS` | `( -- )` | Displays temperature, execution heat, latency, mass, and derived thermal pressure for the most recently executed word. | | `PHYSICS-CALC-KNOBS` | `( -- )` | Calculates and displays recommended priority/sampling/stack-limit/affinity adjustments based on the most recent word's thermal pressure. | | `PHYSICS-BURN` | `( n -- )` | Executes the most recently executed word `n` times, printing thermal feedback progress and a final summary. | | `PHYSICS-SHOW-FEEDBACK` | `( -- )` | Displays the full feedback-loop demonstration (metrics → math → knobs → effect) for the most recent word. | ## Dictionary Heat Optimization (`dictionary_heat_diagnostic_words.c`) | Word | Stack Effect | Description | |---|---|---| | `HEAT-PERCENTILES` | `( -- 25th 50th 75th )` | Pushes the three heat percentile thresholds used by heat-aware dictionary lookup. | | `LOOKUP-STRATEGY@` | `( -- strategy )` | Pushes the current lookup strategy: 0 = naive (newest-first), 1 = heat-aware. | | `LOOKUP-STRATEGY!` | `( strategy -- )` | Sets the lookup strategy; only 0 or 1 accepted, other values silently discarded. | | `REORG-BUCKETS` | `( -- )` | Forces an immediate re-sort of dictionary lookup buckets by heat and refreshes percentile thresholds. | | `SHOW-HEAT-OPTIMIZATION` | `( -- )` | Prints a summary of lookup strategy, percentile thresholds, and resulting hot/warm/cool zones. | | `COMPARE-LOOKUPS` | `( iterations -- )` | Micro-benchmarks naive vs. heat-aware dictionary lookup over six common words and prints the speedup/slowdown. | ## Log Level Control (`log_words.c`) | Word | Stack Effect | Description | |---|---|---| | `LOG-ERROR` | `( -- n )` | Pushes the `LOG_ERROR` level constant. | | `LOG-WARN` | `( -- n )` | Pushes the `LOG_WARN` level constant. | | `LOG-INFO` | `( -- n )` | Pushes the `LOG_INFO` level constant. | | `LOG-TEST` | `( -- n )` | Pushes the `LOG_TEST` level constant. | | `LOG-DEBUG` | `( -- n )` | Pushes the `LOG_DEBUG` level constant. | | `LOG-LEVEL!` | `( n -- )` | Sets the active log filter level (clamped to `[LOG_ERROR, LOG_DEBUG]`). | | `LOG-LEVEL@` | `( -- n )` | Pushes the current log filter level. | | `(do-log-error)` | `( -- )` | Runtime for compiled `LOG-ERROR"` — emits the inline string at ERROR level. | | `(do-log-warn)` | `( -- )` | Runtime for compiled `LOG-WARN"` — emits the inline string at WARN level. | | `(do-log-info)` | `( -- )` | Runtime for compiled `LOG-INFO"` — emits the inline string at INFO level. | | `(do-log-test)` | `( -- )` | Runtime for compiled `LOG-TEST"` — emits the inline string at TEST level. | | `(do-log-debug)` | `( -- )` | Runtime for compiled `LOG-DEBUG"` — emits the inline string at DEBUG level. | | `LOG-ERROR"` | `( "ccc" -- )` | Logs a quoted string literal at ERROR level (interpret: immediate; compile: compiles the runtime + inline data). Immediate. | | `LOG-WARN"` | `( "ccc" -- )` | Logs a quoted string literal at WARN level. Immediate. | | `LOG-INFO"` | `( "ccc" -- )` | Logs a quoted string literal at INFO level. Immediate. | | `LOG-TEST"` | `( "ccc" -- )` | Logs a quoted string literal at TEST level. Immediate. | | `LOG-DEBUG"` | `( "ccc" -- )` | Logs a quoted string literal at DEBUG level. Immediate. | | `LOG-ERROR-STR` | `( c-addr u -- )` | Logs a stack-supplied string (e.g. from `S"`) at ERROR level. | | `LOG-WARN-STR` | `( c-addr u -- )` | Logs a stack-supplied string at WARN level. | | `LOG-INFO-STR` | `( c-addr u -- )` | Logs a stack-supplied string at INFO level. | | `LOG-TEST-STR` | `( c-addr u -- )` | Logs a stack-supplied string at TEST level. | | `LOG-DEBUG-STR` | `( c-addr u -- )` | Logs a stack-supplied string at DEBUG level. | ## Q48.16 Fixed-Point Math (`q48_words.c`) `cell_t` reinterpreted as `uint64_t`; 1.0 = 65536, resolution ≈ 0.0000153. | Word | Stack Effect | Description | |---|---|---| | `Q.+` | `( q1 q2 -- q_sum )` | Q48.16 addition. | | `Q.-` | `( q1 q2 -- q_diff )` | Q48.16 subtraction. | | `Q.*` | `( q1 q2 -- q_prod )` | Q48.16 multiplication. | | `Q./` | `( q1 q2 -- q_quot )` | Q48.16 division; returns `q=0` on division by zero. | | `Q.ABS` | `( q -- \|q\| )` | Absolute value. | | `Q.NEG` | `( q -- -q )` | Negation. | | `Q.LOG` | `( q -- ln_q )` | Natural log via Newton-Raphson approximation. | | `Q.EXP` | `( q -- e^q )` | Exponential via Taylor series approximation. | | `Q.SQRT` | `( q -- sqrt_q )` | Square root via Newton-Raphson approximation. | | `Q.SIN` | `( q -- sin_q )` | Sine (radians, any magnitude) via Taylor series. | | `Q.COS` | `( q -- cos_q )` | Cosine (radians, any magnitude) via Taylor series. | | `Q.FROM-INT` | `( n -- q )` | Converts integer to Q48.16 (`n << 16`). | | `Q.TO-INT` | `( q -- n )` | Converts Q48.16 to integer, truncating (`q >> 16`). | | `Q.1` | `( -- 65536 )` | Pushes 1.0 in Q48.16. | | `Q.0` | `( -- 0 )` | Pushes 0.0 in Q48.16. | | `Q.SCALE` | `( -- 65536 )` | Pushes the scale factor (alias of `Q.1`). | | `Q.=` | `( q1 q2 -- flag )` | -1 if equal, else 0. | | `Q.<` | `( q1 q2 -- flag )` | -1 if `q1 < q2`, else 0. | | `Q.>` | `( q1 q2 -- flag )` | -1 if `q1 > q2`, else 0. | | `Q.0=` | `( q -- flag )` | -1 if `q = 0`, else 0. | | `Q.MAX` | `( q1 q2 -- q_max )` | Maximum of two Q48.16 values. | | `Q.MIN` | `( q1 q2 -- q_min )` | Minimum of two Q48.16 values. | | `Q.PRINT` | `( q -- )` | Prints as `"integer.frac"` to the console. | Note: `q48_16_words.c` (despite the similar filename) registers no FORTH words at all — it's a pure C support library (multiply/divide with wide intermediates) consumed by other files like `ttf_words.c`, not a word-registration file. ## SSM Inference + Jacquard (`inference_words.c`) | Word | Stack Effect | Description | |---|---|---| | `Q.VARIANCE` | `( addr u -- q )` | Computes the variance of `u` uint64 cells starting at `addr`, result as Q48.16. | | `INFER-DECAY-SLOPE` | `( addr u -- q )` | Computes the exponential decay slope of `u` cells at `addr` via linear regression, as Q48.16. | | `INFER-WINDOW-WIDTH` | `( addr u -- n )` | Computes the optimal window width from the variance inflection point of `u` cells at `addr`. | | `WINDOW-DIVERSITY` | `( -- u )` | Pushes the rolling window's diversity (entropy) metric. | | `INFER-RUN` | `( -- )` | Runs the full inference engine against this VM's rolling window and dictionary heat stats, updating `vm->last_inference_outputs`. | | `INFER-WINDOW@` | `( -- u )` | Fetches the last computed adaptive window width. | | `INFER-DECAY@` | `( -- q )` | Fetches the last computed adaptive decay slope (Q48.16). | | `INFER-VARIANCE@` | `( -- q )` | Fetches the last computed window variance (Q48.16). | | `INFER-FIT@` | `( -- q )` | Fetches the last computed slope fit quality (Q48.16). | | `INFER-EARLY-EXIT@` | `( -- flag )` | Pushes 1 if the last `INFER-RUN` used the ANOVA early-exit path. | | `L8-MODE` | `( -- n )` | Pushes the current L8 Jacquard mode (0-15). | | `L8-UPDATE` | `( entropy_q cv_q temporal_q stability_q -- )` | Feeds four Q48.16 metrics into the L8 Jacquard mode selector's update function. | | `L8-APPLY` | `( -- )` | Applies the current L8 mode to `vm->ssm_config` (legacy 16-mode path). | | `L8-TABLE-FORCE` | `( config_idx -- )` | Forces the adaptive 128-config table onto `config_idx`, as if the bandit's own selection had picked it, and applies it immediately. | | `BAYES-CACHE-MEAN` | `( -- q )` | Pushes the Bayesian mean latency estimate for hot-word cache hits (Q48.16). | | `BAYES-CACHE-LOWER` | `( -- q )` | Pushes the 95% credible lower bound for cache-hit latency. | | `BAYES-CACHE-UPPER` | `( -- q )` | Pushes the 95% credible upper bound for cache-hit latency. | | `BAYES-BUCKET-MEAN` | `( -- q )` | Pushes the Bayesian mean latency estimate for dictionary bucket searches. | | `BAYES-BUCKET-LOWER` | `( -- q )` | Pushes the 95% credible lower bound for bucket-search latency. | | `BAYES-BUCKET-UPPER` | `( -- q )` | Pushes the 95% credible upper bound for bucket-search latency. | ## DEFER / Late Binding (`defer_words.c`) | Word | Stack Effect | Description | |---|---|---| | `DEFER` | `( -- )` | Parses a name and creates a deferred word with an unset (0) data field; calling it before `IS` sets `vm->error`. | | `IS` | `( xt -- )` | Parses a name (which must have been created by `DEFER`) and stores `xt` as its target action, enabling late binding. | | `DEFER@` | `( -- xt )` | Parses a name (must be `DEFER`-created) and pushes its current target execution token. | ## Console Fabric — Framebuffer (`framebuffer_words.c`) Kernel-only (`__STARKERNEL__`); no-ops on hosted builds. Raw hardware-boundary access — FABRIC.md item 4.3.3. | Word | Stack Effect | Description | |---|---|---| | `PLOT` | `( x y color -- )` | Raw raster pixel write at (x,y), top-left origin, Y-down. No Cartesian awareness. | | `FB-WIDTH` | `( -- n )` | Pushes the framebuffer width in pixels (0 on hosted builds). | | `FB-HEIGHT` | `( -- n )` | Pushes the framebuffer height in pixels (0 on hosted builds). | ## Console Fabric — Keyboard (`keyboard_words.c`) | Word | Stack Effect | Description | |---|---|---| | `KBD-SCAN` | `( -- c -1 \| 0 )` | Pops one raw scancode off the amd64 i8042 ring buffer if available; pushes 0 if empty or on other architectures. | | `KBD-DEBUG` | `( -- isr_count spurious_count )` | Pushes the i8042 interrupt and spurious-interrupt counters (amd64 diagnostic). | | `VKBD-EVENT` | `( -- code value -1 \| 0 )` | Pops one decoded EV_KEY event off the virtio-input ring buffer (riscv64/aarch64); pushes 0 if empty. | | `VKBD-DEBUG` | `( -- isr_count )` | Pushes the virtio-input interrupt counter (riscv64/aarch64 diagnostic). | | `KEY-EVENT` | `( -- keycode pressed -1 \| 0 )` | Cross-architecture converged key event: pops one keycode/pressed pair in the Linux input-keycode namespace, translated from whichever backend (i8042 or virtio-input) is live. | | `ALT+TAB` | `( -- )` | Programmatic equivalent of the physical Alt+Tab interception — toggles the framebuffer graphics/text overlay state. | ## Console Fabric — TrueType Text (`ttf_words.c`) Kernel-only (`__STARKERNEL__`); no-op on hosted builds. FABRIC.md item 4.3.7e. | Word | Stack Effect | Description | |---|---|---| | `TTF-TEXT` | `( c-addr u x y size color -- )` | Renders a UTF-8 string via the TrueType rasterizer at Cartesian position (x,y) (origin bottom-left of the framebuffer) with the given point size and color. | ## Console Fabric — Scrollback (`scroll_words.c`) Kernel-only (`__STARKERNEL__`); no-op on hosted builds. FABRIC.md item 4.4q (boot-mode scrollback added by 4.4ac). | Word | Stack Effect | Description | |---|---|---| | `SCROLL-BACK` | `( n -- )` | Moves the REPL framebuffer scrollback view back `n` lines. | | `SCROLL-FWD` | `( n -- )` | Moves the REPL framebuffer scrollback view forward `n` lines, toward live. | ## Kernel: Capsule Birth & Tripod Fleet (`mama_forth_words.c`) Kernel-only (`__STARKERNEL__`). Implements the MAMA vocabulary — capsule birth protocol and Tripod fleet control (`src/starkernel/capsule/mama_forth_words.c`). Two registration functions exist: `register_mama_forth_words()` gives Hera (Mama) her full word set, registered identically into both the FORTH and MAMA vocabularies; `register_child_vm_words()` gives child VMs (Hermes/Artemis/etc.) a smaller subset, since they aren't bootstrapped through the same path. **Hera's word set:** | Word | Stack Effect | Description | |---|---|---| | `BYE` | `( -- )` | Hera-only override: reaps all child VMs, then cold-restarts the machine. (Children instead get the standard `system_word_bye` from `system_words.c`, which just halts back to the parent's REPL.) | | `CONNECT-HERMES` | `( -- )` | Enters Hermes's REPL, birthing her first if not already live/stopped (idempotent). | | `CONNECT-ARTEMIS` | `( -- )` | Enters Artemis's REPL, birthing her first if not already live/stopped (idempotent). | | `BIRTH` | `( c-addr u -- )` | Births a named child VM from its capsule (name → `name:init.4th`). Idempotent if already live; refuses to re-birth Hera. | | `KILL` | `( c-addr u -- )` | Destroys a named VM unconditionally, fanning its heat out to survivors first. Hera cannot be killed. Idempotent. | | `START` | `( c-addr u -- )` | Enters a named VM's REPL loop synchronously; caller blocks until the target halts via STOP/BYE. Cannot start a LIVE/DEAD/STILLBORN VM. | | `STOP` | `( -- )` | Self-stop: sets `vm->halted` so the current VM's REPL loop exits on its next iteration. Registered in every VM including children. | | `USE` | `( c-addr u -- )` | Redirects system-wide REPL input to a named VM without touching the C call stack; `USE Hera` resets to default dispatch. | | `EXEC` | `( c-addr u -- )` | Executes a named capsule in the current VM — same path as Mama's own init auto-run. | | `CAPSULE-COUNT` | `( -- n )` | Pushes the number of capsules in the capsule directory. | | `CAPSULE@` | `( idx -- desc )` | Pushes the capsule descriptor address at index `idx` (0 if out of bounds). | | `CAPSULE-HASH@` | `( desc -- hash )` | Pushes the content hash field from a capsule descriptor. | | `CAPSULE-FLAGS@` | `( desc -- flags )` | Pushes the flags field from a capsule descriptor. | | `CAPSULE-LEN@` | `( desc -- len )` | Pushes the payload length field from a capsule descriptor. | | `CAPSULE-BIRTH` | `( capsule-id -- vm-id-hi vm-id-lo )` | Births a baby VM from a production (p) capsule by index; returns the new VM's 128-bit ID as a double, or all-ones on failure. | | `CAPSULE-RUN` | `( capsule-id -- )` | Runs an experiment (e) capsule on Mama by index. | | `MAMA-VM-ID` | `( -- 0 0 )` | Pushes Mama's (Hera's) own VM ID as a double — always zero. | | `VM-COUNT` | `( -- n )` | Pushes the number of registered VMs. | | `VM-CONSERVED?` | `( -- flag )` | FORTH boolean: true if the fleet heat sum is within epsilon of `Q.1` (conservation check). | | `VM-PHYSICS-STATUS` | `( -- )` | Prints the fleet compudynamics diagnostic report. | | `VM-STEP` | `( c-addr u -- )` | Gives one REPL turn (prompt, read one line, execute, return) to a named VM — the Compudynamics context-switch primitive. | | `VM-EXEC` | `( cmd-caddr cmd-u vm-name-caddr vm-name-u -- )` | Injects and immediately executes a command string in a named VM, no readline/blocking. | | `VM-CALL` | `( cmd-caddr cmd-u vm-name-caddr vm-name-u -- n )` | Like `VM-EXEC` but pops one cell from the target's stack afterward and pushes it onto the caller's stack (cross-VM query primitive). | | `CAPSULE-TEST` | `( -- )` | Prints a diagnostic message confirming the capsule system is active. | **Additional words in `register_child_vm_words()` only (not in Hera's own dictionary — this keeps Hera's `dict_hash` off item 4.1's baseline):** | Word | Stack Effect | Description | |---|---|---| | `STADIUM-ADMIT` | `( identity heat behaviour -- cell \| -1 )` | Admits a mass-1 patron into the calling VM's own Stadium quota; -1 if behaviour tag is invalid or admission is refused. | | `STADIUM-EVICT` | `( cell -- flag )` | Reaps the patron header at `cell`; true (-1) on success, false (0) if refused (out of range, not resident, pinned, or contains-gated). | | `STADIUM-RES@` | `( -- heat )` | Read-only peek at the calling VM's own reservoir balance (Q48.16). | | `STADIUM-RES-PULL` | `( qty -- heat )` | Pulls up to `qty` (Q48.16) from the calling VM's own reservoir; returns the amount actually pulled (never more, never negative). | | `STADIUM-RES-PUSH` | `( heat -- )` | Credits heat (Q48.16) back into the calling VM's own reservoir. | | `STADIUM-HEAT@` | `( cell -- heat )` | Reads a resident cell's own heat; 0 if not resident or not owned by the calling VM. | | `STADIUM-HEAT!` | `( new-heat cell -- )` | Writes a resident cell's own heat, atomically reconciling the reservoir delta; silently refused if not owned by the calling VM or reservoir can't cover an increase. | | `STADIUM-WORD-HEAT` | `( -- heat )` | Sum of heat held by the calling VM's own word-execution residents (item 4.1's cells) — closes the term application-level conservation checks (e.g. Hermes's `HERMES-K`) need. | ## Hosted-Build-Only Lifecycle Stubs (`lifecycle_words_hosted.c`) Compiled only when `__STARKERNEL__` is **not** defined. In the hosted build there is no capsule blob or kernel VM registry, so these five just consume their arguments and log intent — real behavior lives in `mama_forth_words.c` (`BIRTH`/`USE`) plus separate kernel-side `KILL`/`PAUSE`/`RESUME` words for the kernel build. | Word | Stack Effect | Description | |---|---|---| | `BIRTH` | `( c-addr u -- )` | Hosted stub: logs "BIRTH name (hosted)"; no real VM lifecycle in the hosted build. | | `KILL` | `( c-addr u -- )` | Hosted stub: logs "KILL name (hosted)". | | `PAUSE` | `( c-addr u -- )` | Hosted stub: logs "PAUSE name (hosted)". | | `RESUME` | `( c-addr u -- )` | Hosted stub: logs "RESUME name (hosted)". | | `USE` | `( c-addr u -- )` | Hosted stub: logs "USE name (hosted)". | --- ## Keeping this current This document was built by reading every `register_word()` (and the one `vm_create_word()`) call site directly, plus the doc comment above each implementing function. When words are added, removed, or re-registered: 1. Update the relevant category table above — keep registration order within a file, not alphabetical. 2. If a new file registers a name that collides with an existing one, add it to the collision note at the top of this document and mark both entries (`*(shadowed)*` / live) at point of use, the same way `[`/`]`/`STATE` and `MOD`/`/MOD`/`*/`/`*/MOD` are handled above — determine the winner from `register_forth79_words()`'s call order in `src/word_registry.c` (later registration wins; search is newest-first via `vm->latest`/`->link`). 2. If a new `word_source/*.c` file is added, give it its own `##` section, placed near related categories. 3. Word counts aren't tracked as a running total in this document on purpose — they drift too easily and the categories are the useful unit, not a single number. If a total is needed, `grep -rc 'register_word(' src/word_source/*.c src/starkernel/capsule/mama_forth_words.c` plus a check for `vm_create_word(vm, "` (the one alternate registration path found so far) gets close, but always verify against this document rather than trusting either grep alone — see the `physics_pipelining_diagnostic_words.c` case above for why.