%% Vol I, Chapter 2 — FORTH-79 Interpreter %% SOURCE: .claude/CLAUDE.md (Architecture → Source Tree, Memory Model, Key Data Structures) %% docs/working/scratch/src/architecture-internals/INIT_SYSTEM.adoc %% docs/working/scratch/src/build-and-tooling/BUILD_OPTIONS.adoc \chapter{FORTH-79 Interpreter} \label{vol1:chap:interpreter} %% TODO(bob): introductory paragraph — StarForth implements FORTH-79 with %% explicit extensions for the adaptive runtime; all extensions are backwards- %% compatible with standard FORTH-79. \section{Memory Model} \label{vol1:sec:interp:memory} %% TODO(bob): describe the VM address space and the canonical accessors. %% Key facts from .claude/CLAUDE.md (Memory Model): %% - vaddr_t — VM addresses are byte offsets, not C pointers %% - vm_load_cell() / vm_store_cell() — canonical accessors %% - VM_ADDR(cell) / CELL(vaddr) — stack↔offset conversions %% - Dictionary: first 2MB (DICTIONARY_BLOCKS=2048) %% - User blocks start at 2048; total VM memory 5MB %% - Log blocks: 3072–5120 (2MB, 32768 max lines at 64 bytes/line) \section{Dictionary Structure} \label{vol1:sec:interp:dictionary} %% TODO(bob): describe DictEntry fields from include/vm.h. %% Key fields: execution_heat, physics (DictPhysics), transition_metrics, %% word_id, acl_default %% Note WORD_IMMEDIATE, WORD_PINNED, WORD_FROZEN flag semantics. \section{FORTH-79 Word Categories} \label{vol1:sec:interp:words} %% TODO(bob): table of the 25 word-implementation files (from CLAUDE.md source %% tree listing) with one-line summary of each category's scope. \begin{table}[ht] \centering \caption{StarForth word implementation files} \label{tab:words} \begin{tabular}{ll} \toprule File & Scope \\ \midrule \texttt{arithmetic\_words.c} & \texttt{+ - * / MOD ABS MIN MAX} \\ \texttt{stack\_words.c} & \texttt{DUP DROP SWAP ROT OVER NIP TUCK} \\ \texttt{control\_words.c} & \texttt{IF ELSE THEN DO LOOP BEGIN UNTIL WHILE} \\ \texttt{defining\_words.c} & \texttt{: ; CREATE DOES> VARIABLE CONSTANT} \\ \texttt{memory\_words.c} & \texttt{@ ! C@ C! MOVE FILL} \\ \texttt{return\_stack\_words.c} & \texttt{>R R> R@ RDROP 2>R 2R@ 2R>} \\ \texttt{double\_words.c} & \texttt{2DUP 2DROP 2SWAP 2@ 2! D+ D-} \\ \texttt{logical\_words.c} & \texttt{AND OR XOR NOT INVERT LSHIFT RSHIFT} \\ \texttt{io\_words.c} & \texttt{EMIT KEY TYPE CR TAB SPACE ACCEPT} \\ \texttt{string\_words.c} & \texttt{S" SLITERAL} and string operations \\ \texttt{block\_words.c} & \texttt{BLOCK BUFFER LOAD THRU FLUSH} \\ \texttt{format\_words.c} & \texttt{.( .R .S HEX DECIMAL BASE} \\ \texttt{system\_words.c} & \texttt{BYE ABORT INCLUDE STATE} \\ \texttt{dictionary\_words.c} & \texttt{FIND SEARCH-WORDLIST WORDS} \\ \texttt{vocabulary\_words.c} & \texttt{VOCABULARY DEFINITIONS FORTH-WORDLIST} \\ \texttt{q48\_16\_words.c} & $\Qtype$ fixed-point word definitions \\ \texttt{starforth\_words.c} & StarForth-specific extensions \\ %% TODO(bob): add remaining 8 files from the physics word set \bottomrule \end{tabular} \end{table} \section{Initialization and Boot} \label{vol1:sec:interp:boot} %% TODO(bob): describe init.4th, the INIT word, and the dictionary fence %% mechanism. Source: docs/working/scratch/src/architecture-internals/INIT_SYSTEM.adoc \section{Q48.16 Fixed-Point Arithmetic} \label{vol1:sec:interp:q4816} %% TODO(bob): describe the Q48.16 format, its rationale for the physics engine, %% and the formal proof in proof/StarForth_Q48_16.thy.