Compare commits
67
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
63434f3762 | ||
|
|
0195631315 | ||
|
|
7ad02bf72f | ||
|
|
9382df69e5 | ||
|
|
4be9f37c12 | ||
|
|
529ba0fc48 | ||
|
|
3506747d5a | ||
|
|
c88af25e1e | ||
|
|
450dea9c24 | ||
|
|
d154342314 | ||
|
|
bf97f339f6 | ||
|
|
f4f566bb37 | ||
|
|
5283e67ded | ||
|
|
ba9d432a01 | ||
|
|
9842b9cd50 | ||
|
|
1e41a68872 | ||
|
|
0d5139238d | ||
|
|
924c48cece | ||
|
|
d2df3679ac | ||
|
|
afd9d46d29 | ||
|
|
11b5d402b1 | ||
|
|
473e105a69 | ||
|
|
99c46eeda8 | ||
|
|
a6da45df53 | ||
|
|
39744473f3 | ||
|
|
a28b5f2230 | ||
|
|
ff75e69e91 | ||
|
|
a73580e949 | ||
|
|
1bf19d6224 | ||
|
|
084c520a54 | ||
|
|
c233cb6536 | ||
|
|
07911dcf91 | ||
|
|
080811dbd2 | ||
|
|
0f82d8c22a | ||
|
|
32753f5479 | ||
|
|
42f8a13914 | ||
|
|
1ed56b93b4 | ||
|
|
952df0f44a | ||
|
|
d0b0eee54b | ||
|
|
884721783a | ||
|
|
528bed0874 | ||
|
|
3eca84e433 | ||
|
|
e429d30a7e | ||
|
|
58f3837498 | ||
|
|
c7bf68fe13 | ||
|
|
3b49cb15a2 | ||
|
|
1ce8576b76 | ||
|
|
79db0e8d88 | ||
|
|
7bc658bb83 | ||
|
|
fcb89b0695 | ||
|
|
f8fbc37698 | ||
|
|
776c89457e | ||
|
|
7aed588f78 | ||
|
|
1a4b163861 | ||
|
|
e729c64ba3 | ||
|
|
739cb9c163 | ||
|
|
080b7012ba | ||
|
|
0e2c60dac3 | ||
|
|
4da370f492 | ||
|
|
5e26fad30d | ||
|
|
029a8ed9cf | ||
|
|
b7e8e4b058 | ||
|
|
c15589b39e | ||
|
|
9772ee8b68 | ||
|
|
c95191736e | ||
|
|
f4e359859a | ||
|
|
010cfc54e6 |
+56
-34
@@ -119,9 +119,8 @@ about "which line am I on."
|
||||
|
||||
## Word-Level ACL System — Complete through Phase 7 (independently verified)
|
||||
|
||||
**Design doc:** `docs/03-architecture/word-acl/DESIGN.md` (this repo kept the old-style
|
||||
`docs/03-architecture/` tree alongside the newer `docs/formal/`/`docs/working/` restructure —
|
||||
both exist here; this path is still current for ACL specifically).
|
||||
**Design doc:** `docs/reference/word-acl/DESIGN.md` (moved there from the old
|
||||
`docs/03-architecture/` tree in the 2026-10-14 docs reorganisation).
|
||||
|
||||
The word-level ACL system is fully implemented, including kernel parity. Key constraints:
|
||||
|
||||
@@ -149,8 +148,11 @@ The word-level ACL system is fully implemented, including kernel parity. Key con
|
||||
confirmed **absent** from `v3/src/vm.c`. (The `feature/acl-rwt` branch this work was
|
||||
apparently done on is not traceable in `git log --all` — likely squash-merged without
|
||||
preserving the ref. The code is real and verified; the branch name is not.)
|
||||
8. ⬜ PKI / thumbdrive — Ed25519 challenge-response; user minting by zuse. **This is the open
|
||||
item — pick up here next.**
|
||||
8. ✅ PKI / thumbdrive — closed 2026-10-14. User minting by Zuse is built (`MINT`, `MINT-SCRATCH`,
|
||||
WIREBIND cert verification). Challenge-response against a cloned drive was ruled out by design
|
||||
("there's only the drive", `FABRIC-3.7.md`). Runtime word-ACL elevation (`ELEVATE-GRANT`, the
|
||||
Zuse eligibility list) was ruled not needed and removed, with the hole it carried
|
||||
(`FABRIC-3.md` §XXXVII).
|
||||
|
||||
**ACL-RWT DoE campaign (June 15–16 2026) — superseded, kept for historical record:**
|
||||
- 3×3 Latin square: 3 seeds × amd64/aarch64/riscv64, 30 reps each
|
||||
@@ -199,8 +201,8 @@ removed as an active target.)
|
||||
**Current status: M7.1** — capsule birth protocol, Mama FORTH vocabulary, Tripod multi-VM
|
||||
fleet (Hera/Artemis/Hestia — Hermes moved into the kernel as kernel-Hermes, FABRIC-3.6.md
|
||||
Phase 4, 2026-09-22), and word-level ACL (Phases 1–7) are live; POST at boot verifies parity
|
||||
hash across amd64/aarch64/riscv64 with a 530-word Mama capsule dictionary (word count as of
|
||||
the Phase 4 strip; verify against a live `PARITY:M7.1a word_count=` line before citing, it
|
||||
hash across amd64/aarch64/riscv64 with a 526-word Mama capsule dictionary (word count as of
|
||||
2026-10-14, `FABRIC-3.md` §XXXVIII, hash `0x82f4ae7cb2e2d424`; verify against a live `PARITY:M7.1a word_count=` line before citing, it
|
||||
changes with any new C word registration).
|
||||
|
||||
**Key distinguishing features:**
|
||||
@@ -245,12 +247,13 @@ make -f kernel/Makefile clean
|
||||
Output: `build/<arch>/kernel/starkernel_loader.efi` + `build/<arch>/kernel/starkernel_kernel.elf`.
|
||||
|
||||
Two independently tracked version strings flow into the generated `include/version.h`:
|
||||
`VERSION` (`kernel/Makefile` — the embedded StarForth engine version, currently `3.1.0`;
|
||||
`VERSION` (`kernel/Makefile` — the embedded StarForth engine version, currently `3.2.0`;
|
||||
note this does **not** auto-sync with the standalone StarForth repo's own version) and
|
||||
`LITHOS_VERSION` (`kernel/Makefile` — the kernel version, currently **`2.0.0`**;
|
||||
corrected 2026-09-19 — this file said `2.0.1`, but `FABRIC-3.md` §I.2 rolled it back to
|
||||
`2.0.0` on 2026-09-04 because `2.0.1` names the SER5 hardware-track line and claims hardware
|
||||
progress not yet verified. The versioning policy is **semantic, not sequential** — see the
|
||||
`LITHOS_VERSION` (`kernel/Makefile` — the kernel version, currently **`2.1.0`**, bumped at
|
||||
the `v2.1.0` tag that closed FABRIC-3.6; corrected 2026-10-14 -- this file said `3.1.0` /
|
||||
`2.0.0`. History: it said `2.0.1` until 2026-09-19, but `FABRIC-3.md` §I.2 had rolled that
|
||||
back to `2.0.0` on 2026-09-04 because `2.0.1` names the SER5 hardware-track line and claims
|
||||
hardware progress not yet verified. The versioning policy is **semantic, not sequential** — see the
|
||||
roadmap table in `kernel/Makefile` before choosing any version).
|
||||
|
||||
### Build configuration (Kconfig — real, wired, not vestigial)
|
||||
@@ -302,12 +305,23 @@ architectures in QEMU and capturing the serial log. There is no other test.
|
||||
The vendored hosted `make` build (above) is NEVER used to validate kernel changes.
|
||||
|
||||
```bash
|
||||
# Run in this exact order for every kernel change:
|
||||
# Run in this exact order for every kernel change. v4 is the default (2026-10-14):
|
||||
make -f kernel/Makefile ARCH=amd64 clean qemu
|
||||
make -f kernel/Makefile ARCH=aarch64 clean qemu
|
||||
make -f kernel/Makefile ARCH=riscv64 clean qemu
|
||||
# ...and the 32-bit build -- v4 with 32-bit cells, the F18/Zynq (FPGA) case: its nucleus
|
||||
# image and every v4 test at that width (no QEMU; not a substitute for the boots above):
|
||||
make -C v4 test-32
|
||||
```
|
||||
|
||||
**v4 is the default build (Captain Bob, 2026-10-14: "v4 is the default build ... no, qemu to v4
|
||||
too ... we are effectively trying to retire v3").** Every kernel build carries v4 and v3 and
|
||||
boots v4; `system=v3` in the boot arguments (`KERNEL_ARGS` for QEMU, `starforth.cfg` /
|
||||
`cmdline.txt` on a board's medium) boots v3. `STARFORTH_V4=0` builds v3 alone. The boot prints
|
||||
which system runs and why ("System: ..."). See `boards/BRINGUP.md` A6, `FABRIC-3.md` §XLIII.
|
||||
**v3 is not part of acceptance** (Captain Bob, 2026-10-14: "i don't care about v3"). It is still
|
||||
in the tree and `system=v3` still boots it, but nothing is accepted or refused on its account.
|
||||
|
||||
**QEMU rule — non-negotiable:** Only ONE QEMU instance may run at a time, always in the
|
||||
foreground (never backgrounded). All three instances use `accel=tcg` (software emulation);
|
||||
concurrent runs compete for host CPU and corrupt the timing signal the DoE measures.
|
||||
@@ -327,8 +341,13 @@ audit artifacts — they are committed to the repo. Do not delete them. There is
|
||||
timestamped convention (self-documented via its own README); not a contradiction, just a
|
||||
second, less-structured log location.
|
||||
|
||||
Do not claim a change is accepted until all three architectures have booted
|
||||
to `zuse)ok>` and their logs are present in `logs/`.
|
||||
Do not claim a change is accepted until all three architectures have booted, and their logs are
|
||||
present in `logs/`:
|
||||
- **as built (v4)** to `ok> `, with `PARITY:V4_POST tests=538 pass=538 fail=0` (the count
|
||||
grows with v4's POST) and `POST: PASSED`, and `PARITY:V4_SYSTEM ... dict_hash=` equal across
|
||||
the three;
|
||||
- **the 32-bit build** (Captain Bob, 2026-10-14: "the 32 bit build needs to go into the
|
||||
acceptance test too"): `make -C v4 test-32` passes -- every test, `0 failures`.
|
||||
|
||||
### CI
|
||||
|
||||
@@ -433,7 +452,7 @@ UEFI Firmware → uefi_loader.c (BOOTX64.EFI / BOOTAA64.EFI / BOOTRISCV64.EFI)
|
||||
- ✅ M0–M6: complete, v1.5.1-FINAL
|
||||
- ✅ M7: StarForth VM integration + parity validation, complete
|
||||
- 🔄 M7.1: capsule birth protocol · Mama FORTH vocabulary · Tripod fleet · word-level ACL —
|
||||
in progress (Phase 8 PKI is the open item, see ACL section above)
|
||||
in progress (Phase 8 PKI closed 2026-10-14, see ACL section above)
|
||||
- Planned: M8 (REPL keyboard input), M9 (block storage — see the virtio note above; source
|
||||
exists but milestone-complete status not independently verified here)
|
||||
|
||||
@@ -498,7 +517,7 @@ mistakenly invoke).
|
||||
|
||||
## Roadmap
|
||||
|
||||
`ROADMAP.md` and `docs/lithosananke/ROADMAP.md` contain real, LithosAnanke-specific phase
|
||||
`ROADMAP.md` and `docs/reference/ROADMAP.md` contain real, LithosAnanke-specific phase
|
||||
content (e.g. "PHASE 2: STARKERNEL (Months 3-5)", "StarKernel boots to 'ok' on QEMU ✅") —
|
||||
not a copy of the standalone StarForth repo's roadmap. Prefer these when citing roadmap
|
||||
status for kernel work.
|
||||
@@ -572,25 +591,28 @@ capsule and compare dict hashes. Zero-deviation means 0% algorithmic variance.
|
||||
|
||||
## Documentation
|
||||
|
||||
Key files (this repo has both the older `docs/03-architecture/` tree — still current for
|
||||
ACL/Tripod specifically — and the newer restructured `docs/formal/`/`docs/working/`/
|
||||
`docs/patent/` trees, plus a repo-specific `docs/lithosananke/` tree):
|
||||
**Start at `docs/README.md`** -- the map: where each kind of document lives and which one is
|
||||
authoritative for what. `docs/INDEX.md` lists every document with its status;
|
||||
`docs/DEAD-AND-REVISED.md` is the register of abandoned ideas and revised claims. (Reorganised
|
||||
2026-10-14: the old `docs/03-architecture/` and `docs/lithosananke/` trees are gone -- their
|
||||
current parts are in `docs/reference/`, the rest in `docs/working/archive/`.)
|
||||
|
||||
- `README.md` — project overview and quick start
|
||||
- `docs/lithosananke/SYSTEM_ARCHITECTURE.md` — full kernel + VM design
|
||||
- `docs/lithosananke/hal/` — HAL reference
|
||||
- `docs/lithosananke/M7.1.md` — capsule birth protocol design
|
||||
- `docs/lithosananke/ROADMAP.md` — milestone plan through self-hosting
|
||||
- `docs/lithosananke/hosted-acceptance-test/README.md` — the hosted-VM acceptance test
|
||||
writeup referenced from the standalone StarForth repo's own docs
|
||||
- `docs/03-architecture/tripod/`, `docs/03-architecture/word-acl/DESIGN.md`
|
||||
- `docs/working/architecture/VM-FLEET-ATTRACTOR-DESIGN-20260705.md` — Tripod/Hermes/Artemis
|
||||
physics + build-system history
|
||||
- `docs/working/architecture/getting-started/DEVELOPER.md` — dev setup, Kconfig reference
|
||||
- `ROADMAP.md`, `CHANGELOG.md`
|
||||
- `experiments/bare_metal/README.md` — **mandatory read before touching capsules** (block
|
||||
- `README.md` -- project overview and quick start
|
||||
- `docs/fabric/` -- the design and work record (`FABRIC-3.md` living; the others closed)
|
||||
- `docs/v4.0.0/` -- StarForth v4 design
|
||||
- `docs/reference/` -- current reference: `ROADMAP.md` (roadmap and versioning policy),
|
||||
`M7.1.md` (capsule birth protocol), `word-acl/DESIGN.md` (word-level ACL), `kernel-args/`,
|
||||
`hosted-acceptance-test/`, `DICTIONARY.md`, `STARFORTH_PRIMITIVES.md`, `ONTOLOGY.md`
|
||||
- `boards/BRINGUP.md` -- bare-metal bring-up checklist and blockers
|
||||
- `kernel/src/hal/README.md` -- the HAL as built (the proposed `hal_*` contract was never
|
||||
adopted; it is archived as dead)
|
||||
- `docs/working/architecture/VM-FLEET-ATTRACTOR-DESIGN-20260705.md` -- fleet physics and
|
||||
build-system history (pre-reshuffle: it still names the Hermes VM)
|
||||
- `docs/working/architecture/getting-started/DEVELOPER.md` -- dev setup, Kconfig reference
|
||||
- `CHANGELOG.md`
|
||||
- `experiments/bare_metal/README.md` -- **mandatory read before touching capsules** (block
|
||||
namespace rules, see ACL section above)
|
||||
- `experiments/bare_metal/analysis/report/bare_metal_doe_report.pdf` — DoE campaign report
|
||||
- `experiments/bare_metal/analysis/report/bare_metal_doe_report.pdf` -- DoE campaign report
|
||||
- `sbom.spdx` / `sbom.spdx.json`
|
||||
|
||||
---
|
||||
|
||||
@@ -75,3 +75,5 @@ tools/kconfig/.qconf.*
|
||||
# record) are NOT ignored — those are tracked deliberately.
|
||||
/tools/capsule-claims.txt
|
||||
/.directory
|
||||
# Agent worktrees are never to be used in this repo (Captain Bob's Law); ignored so a stray one is never tracked.
|
||||
/.claude/worktrees/
|
||||
|
||||
+5
-1
@@ -1,5 +1,9 @@
|
||||
# Changelog
|
||||
|
||||
## 2026-10-09 — StarForth v4.0.0 Step 6e review and wire refinement
|
||||
|
||||
Implemented whole-message handling on the engine wire (`d5cd6460`), ensured nodes only process one message at a time (`b1d09af0`), and refined message processing logic (`6a7d0aa2`, `f1419e73`). Fixed wake-up order, room checks, and overflow issues during message transit (`83694b18`).
|
||||
|
||||
Milestone-level achievements only — not a commit log. For full history see
|
||||
`git log` on the relevant branch. Two products share this file:
|
||||
**StarForth** (hosted FORTH-79 VM, `master`) and **LithosAnanke** (bare-metal
|
||||
@@ -100,7 +104,7 @@ on both branches, plus the now-orphaned `scripts/pgo-workload.sh`. Verified
|
||||
Also proved out and documented, for the first time, that the hosted VM
|
||||
starts cleanly not just on amd64 but on aarch64 and riscv64 too (cross-built,
|
||||
run under `qemu-{aarch64,riscv64}-static` user-mode emulation) —
|
||||
`docs/lithosananke/hosted-acceptance-test/README.md`. This is what surfaced
|
||||
`docs/reference/hosted-acceptance-test/README.md`. This is what surfaced
|
||||
the `blk_ram` sizing bug above.
|
||||
|
||||
## 2026-07-07 – 2026-07-08 — Kconfig build-configuration system (both, committed on `lithosananke`)
|
||||
|
||||
+2
-2
@@ -9,7 +9,7 @@ Thank you for your interest in contributing to StarForth! This document provides
|
||||
3. **Run tests**: `make test` (all 780+ tests must pass)
|
||||
4. **Read** [ONTOLOGY.md](ONTOLOGY.md) for formal definitions and terminology
|
||||
5. **Read** `docs/CLAUDE.md` for project overview
|
||||
6. **Explore** `docs/03-architecture/` for architecture details
|
||||
6. **Explore** `docs/README.md` (the documentation map) for architecture details
|
||||
|
||||
**Important:** All contributors must use terminology from [ONTOLOGY.md](ONTOLOGY.md) in code comments and documentation. This ensures precise, academically rigorous language throughout the project.
|
||||
|
||||
@@ -36,7 +36,7 @@ void function_name(VM *vm) {
|
||||
### Platform Abstraction
|
||||
- **Never** call platform-specific APIs directly from VM code
|
||||
- **Always** use HAL interfaces (`hal_time.h`, `hal_memory.h`, etc.)
|
||||
- See `docs/03-architecture/hal/` for HAL documentation
|
||||
- See `kernel/src/hal/README.md` for the HAL as built
|
||||
|
||||
### Memory Safety
|
||||
- Use `vaddr_t` for VM addresses (not C pointers)
|
||||
|
||||
+9
-7
@@ -14,15 +14,17 @@ config STARFORTH_ENABLE_VM
|
||||
block in kernel/Makefile, not just a handful of -D flags.
|
||||
|
||||
config STARFORTH_V4
|
||||
bool "Boot StarForth v4, the F18-derived engine, at a single prompt (STARFORTH_V4)"
|
||||
default n
|
||||
bool "Build StarForth v4, the F18-derived engine, in -- and boot it (STARFORTH_V4)"
|
||||
default y
|
||||
help
|
||||
Instead of the v3 VM and its fleet, the kernel starts one StarForth
|
||||
v4 host node after the M0-M6 hardware milestones: the golden model
|
||||
The kernel carries StarForth v4 as well as v3 and boots v4: one
|
||||
host node, after the M0-M6 hardware milestones, of the golden model
|
||||
of the 32-opcode engine (v4/src) running the capsule image built
|
||||
from v4/capsule, with its console on the kernel's serial console.
|
||||
It reaches v4's "ok> " prompt and stays there. The v3 VM is still
|
||||
compiled in but is not started. See docs/v4.0.0/DECOMPOSITION.md.
|
||||
from v4/capsule, with its console on the kernel's serial console;
|
||||
it reaches v4's "ok> " prompt. `system=v3` in the boot arguments
|
||||
boots the v3 VM and its fleet instead. On by default since
|
||||
2026-10-14: v3 is being retired. Off builds v3 alone. See
|
||||
docs/v4.0.0/DECOMPOSITION.md and boards/BRINGUP.md A6.
|
||||
|
||||
config PARITY_MODE
|
||||
bool "Deterministic parity harness mode (PARITY_MODE)"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
# docs/book/Makefile -- the single LaTeX book (build/docs/*.pdf)
|
||||
# Every sub-make runs from this directory, so paths are always repo-relative.
|
||||
#
|
||||
# TARGET is either a board (SER5 RASPI MILKV ZYNQ7020), a hosted v3 profile
|
||||
# TARGET is either a board (PC RASPI MILKV ZYNQ7020), a hosted v3 profile
|
||||
# (standard fast fastest turbo asan ...), or empty:
|
||||
#
|
||||
# make [all] every board that has a kernel port, the
|
||||
@@ -16,7 +16,9 @@
|
||||
# make [all] TARGET=<board> that board's boot image + its book
|
||||
# make [all] TARGET=<profile> hosted v3 build with that profile
|
||||
#
|
||||
# make boot_image TARGET=<board> only the board's boot image
|
||||
# make boot_image TARGET=<board> only the board's boot image, with its SBOM
|
||||
# (build/boards/<board>/*.spdx*) and a fresh
|
||||
# source SBOM -- needs syft
|
||||
# make boot_images every board that has a kernel port
|
||||
# make docs [TARGET=<board>] the book; a board adds its appendix
|
||||
#
|
||||
@@ -25,17 +27,18 @@
|
||||
# make clean TARGET=<profile> build/<arch>/<profile> for every arch
|
||||
# make clean-docs build/docs/
|
||||
#
|
||||
# make sbom SPDX SBOM of the source tree (sbom.spdx, sbom.spdx.json)
|
||||
# make kernel ARCH=<arch> [GOAL=g] kernel/Makefile goal (default: all)
|
||||
# make boards list boards and whether they can be built
|
||||
# make <other goal> goes to v3/Makefile (make help-hosted)
|
||||
# ==============================================================================
|
||||
|
||||
# Board name (as typed on the command line) -> boards/ directory.
|
||||
BOARD_DIR_SER5 := ser5
|
||||
BOARD_DIR_PC := pc
|
||||
BOARD_DIR_RASPI := raspi
|
||||
BOARD_DIR_MILKV := milkv
|
||||
BOARD_DIR_ZYNQ7020 := zynq7020
|
||||
BOARDS := SER5 RASPI MILKV ZYNQ7020
|
||||
BOARDS := PC RASPI MILKV ZYNQ7020
|
||||
empty :=
|
||||
space := $(empty) $(empty)
|
||||
|
||||
@@ -53,7 +56,7 @@ BOARD_DIR := $(if $(TARGET),$(BOARD_DIR_$(TARGET)))
|
||||
SUBMAKE := $(MAKE) --no-print-directory
|
||||
|
||||
.DEFAULT_GOAL := all
|
||||
.PHONY: all boot_image boot_images docs clean clean-docs kernel boards help help-hosted
|
||||
.PHONY: all boot_image boot_images docs clean clean-docs kernel boards help help-hosted sbom sbom-board
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# all
|
||||
@@ -95,8 +98,18 @@ boot_image:
|
||||
echo " $(call board_field,$(TARGET),BOARD_DESC)"; \
|
||||
exit 1; \
|
||||
fi
|
||||
@# Both systems in one image, v4 unless the boot arguments say system=v3
|
||||
@# (boards/BRINGUP.md A6, ruled 2026-10-14; v4 the default, same day). A clean build every time: the
|
||||
@# kernel objects are shared with `make qemu`, and make does not see a
|
||||
@# change of compile flags -- an image could otherwise carry objects built
|
||||
@# without v4, or without the bring-up console.
|
||||
@$(SUBMAKE) -f kernel/Makefile ARCH=$(call board_arch,$(TARGET)) TARGET=kernel clean
|
||||
@$(SUBMAKE) -f kernel/Makefile \
|
||||
BOARD=$(BOARD_DIR) ARCH=$(call board_arch,$(TARGET)) TARGET=kernel boot_image
|
||||
BOARD=$(BOARD_DIR) ARCH=$(call board_arch,$(TARGET)) TARGET=kernel \
|
||||
STARFORTH_V4=1 V4_DEFAULT=1 boot_image
|
||||
@# Its SBOM, and the source tree's, are part of the build (2026-10-14).
|
||||
@$(SUBMAKE) sbom-board TARGET=$(TARGET)
|
||||
@$(SUBMAKE) sbom
|
||||
|
||||
boot_images:
|
||||
@for b in $(READY_BOARDS); do \
|
||||
@@ -104,6 +117,55 @@ boot_images:
|
||||
done
|
||||
@$(foreach b,$(UNREADY_BOARDS),echo "Skipped $(b): needs kernel/src/arch/$(call board_arch,$(b)), which does not exist yet";)
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# SBOMs (SPDX 2.3, by syft; config mk/syft.yaml) -- part of every board build
|
||||
# ------------------------------------------------------------------------------
|
||||
# The source SBOM covers what the product is built from: the tracked files of
|
||||
# the kernel, v3, v4, capsules, boards, build tooling and proofs, each with its
|
||||
# SHA-256 -- copied to build/sbom/src first, so nothing untracked in the
|
||||
# working directory is ever swept in. Not logs, documents, experiment data or
|
||||
# the disk images. A board's SBOM covers
|
||||
# its image and every file on it, copied off the image, so the SBOM is of what
|
||||
# is on the medium, not of what was meant to be. Versioned as the kernel
|
||||
# version and the commit. No syft: the build stops, as for any missing tool.
|
||||
SYFT ?= syft
|
||||
SBOM_VERSION = $(shell sed -n 's/^LITHOS_VERSION *?= *//p' kernel/Makefile)+$(shell git describe --always --dirty 2>/dev/null)
|
||||
# What the product is built from: tracked files only, in these places (never
|
||||
# untracked or ignored files in the working directory).
|
||||
SBOM_SOURCES := kernel v3 v4 capsules boards mk tools scripts proof configs \
|
||||
Makefile Kconfig Kconfig.arch Kconfig.heartbeat Kconfig.kernel \
|
||||
Kconfig.physics Kconfig.variant LICENSE NOTICE.md
|
||||
GIT_PLAIN := git -c filter.lfs.process= -c filter.lfs.smudge=cat -c filter.lfs.required=false
|
||||
|
||||
define need_syft
|
||||
@command -v $(SYFT) >/dev/null 2>&1 || { \
|
||||
echo "Error: syft not found -- the SBOM is part of this build."; \
|
||||
echo " Install a release from https://github.com/anchore/syft/releases"; \
|
||||
echo " (verify it against the release's checksums), or SYFT=/path/to/syft."; exit 1; }
|
||||
endef
|
||||
|
||||
sbom:
|
||||
$(need_syft)
|
||||
@echo " SBOM source tree -> sbom.spdx, sbom.spdx.json ($(SBOM_VERSION))"
|
||||
@rm -rf build/sbom/src && mkdir -p build/sbom/src && \
|
||||
$(GIT_PLAIN) ls-files -z -- $(SBOM_SOURCES) | xargs -0 cp --parents -t build/sbom/src && \
|
||||
$(SYFT) -q -c mk/syft.yaml dir:build/sbom/src \
|
||||
--source-name LithosAnanke --source-version "$(SBOM_VERSION)" \
|
||||
-o spdx-json=sbom.spdx.json -o spdx=sbom.spdx
|
||||
|
||||
sbom-board:
|
||||
$(need_syft)
|
||||
@if [ -z "$(BOARD_DIR)" ]; then echo "Usage: make sbom-board TARGET=<$(subst $(space),|,$(BOARDS))>"; exit 1; fi
|
||||
@img=build/boards/$(BOARD_DIR)/$(call board_field,$(TARGET),BOARD_IMAGE); \
|
||||
if [ ! -f "$$img" ]; then echo "Error: $$img not built (make boot_image TARGET=$(TARGET))"; exit 1; fi; \
|
||||
rm -rf build/boards/$(BOARD_DIR)/contents && mkdir -p build/boards/$(BOARD_DIR)/contents && \
|
||||
mcopy -s -n -i "$$img@@1M" '::/*' build/boards/$(BOARD_DIR)/contents/ && \
|
||||
echo " SBOM $$img -> $${img%.img}.spdx, $${img%.img}.spdx.json" && \
|
||||
$(SYFT) -q -c mk/syft.yaml dir:build/boards/$(BOARD_DIR) \
|
||||
--exclude './*.spdx' --exclude './*.spdx.json' \
|
||||
--source-name "LithosAnanke-$(BOARD_DIR)" --source-version "$(SBOM_VERSION)" \
|
||||
-o spdx-json=$${img%.img}.spdx.json -o spdx=$${img%.img}.spdx
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# docs
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# LithosAnanke v2.0.1
|
||||
# LithosAnanke v2.1.0
|
||||
|
||||
**UEFI-bootable FORTH microkernel.** Boots from firmware, initialises memory and interrupts, then runs the StarForth VM as its sole userspace runtime. No libc. No OS. Just stone and necessity.
|
||||
**UEFI-bootable FORTH microkernel.** Boots from firmware, initialises memory and interrupts, then
|
||||
runs StarForth as its sole userspace runtime. No libc. No OS. Just stone and necessity.
|
||||
|
||||
*Lithos* (foundation) + *Ananke* (necessity) — the kernel under StarshipOS.
|
||||
|
||||
@@ -13,54 +14,55 @@ StarForth v4 moves the engine onto a 32-instruction core derived from Chuck Moor
|
||||
|
||||
| Product | What it is |
|
||||
|---|---|
|
||||
| **Hosted StarForth F18** | The v4 engine as a native Linux build, for amd64, arm64 and riscv64, on real hardware. |
|
||||
| **FPGA StarForth F18** | A 32-bit build of the same engine loaded into the FPGA. It is the gateway to the rest: the foundation everything else is built up from. |
|
||||
| **StarshipOS** | The bare-metal product: LithosAnanke running the v4 F18 engine. |
|
||||
| **Hosted StarForth F18** | The v4 engine as a native Linux build, for amd64, arm64 and riscv64. |
|
||||
| **FPGA StarForth F18** | A 32-bit build of the same engine loaded into the FPGA: the gateway to the rest, the foundation everything else is built up from. |
|
||||
| **StarshipOS** | The bare-metal product: LithosAnanke running StarForth. |
|
||||
|
||||
FORTH-79 is recomposed on the F18 engine and stored as a capsule; the StarshipOS-specific
|
||||
vocabulary gets the same treatment. The source tree will be reorganised around this split.
|
||||
|
||||
v3 remains the reference system until v4 meets its acceptance criteria
|
||||
(`docs/v4.0.0/JUSTIFICATION.md` §16). Everything below describes v3 as it stands today.
|
||||
vocabulary gets the same treatment. v3 remains the reference system until v4 meets its
|
||||
acceptance criteria (`docs/v4.0.0/JUSTIFICATION.md` §16). **Both run on bare metal now:** every
|
||||
board image carries v4 and v3, boots v4 as built, and one word in its boot configuration
|
||||
chooses (see below).
|
||||
|
||||
---
|
||||
|
||||
## Status — M7.1 (Capsule System · Multi-VM Fleet)
|
||||
## Status
|
||||
|
||||
| Milestone | | Status |
|
||||
|---|---|---|
|
||||
| M0–M6 | UEFI boot · PMM · VMM · IDT · APIC · heap · framebuffer VT100 console (v1.5.1-FINAL) | ✅ Complete |
|
||||
| M0–M6 | UEFI boot · PMM · VMM · IDT · APIC · heap · framebuffer VT100 console | ✅ Complete |
|
||||
| M7 | StarForth VM integration + parity validation | ✅ Complete |
|
||||
| **M7.1** | **Capsule birth protocol · Mama FORTH vocabulary · Tripod multi-VM fleet (Hermes/Artemis) · Word-level ACL (Phases 1–7)** | 🔄 **In Progress** |
|
||||
| M8 | REPL — keyboard input, interactive Forth | Planned |
|
||||
| M9 | Block storage — AHCI driver | Planned |
|
||||
| M7.1 | Capsule birth · Mama FORTH vocabulary · the Tripod fleet · kernel-Hermes · word-level ACL | ✅ Live |
|
||||
| M8 | Keyboard input to the REPL — PS/2, virtio and **USB** keyboards (a full keyboard: Caps/Num Lock, keypad) | ✅ In QEMU, all three ISAs |
|
||||
| M9 | Block storage — Artemis's disk on virtio-blk; identity thumbdrives on USB mass storage | ✅ In QEMU · real disks: no driver yet (`boards/BRINGUP.md` A4) |
|
||||
| Bare metal | a generic PC (amd64; first on the bench: a Beelink SER5), Raspberry Pi 5 (aarch64), Milk-V Mars (riscv64); Zynq-7020 (ARMv7) not yet ported | Images build; first boots on the bench — `boards/BRINGUP.md` |
|
||||
|
||||
POST at boot: **parity hash verified across amd64/aarch64/riscv64 · Mama capsule dictionary: 453 words**
|
||||
**v4 is the default build, and v3 is being retired**: every kernel boots v4 unless its boot
|
||||
arguments say `system=v3`. POST at boot, on all three ISAs: v4 — **538 tests**,
|
||||
`PARITY:V4_SYSTEM word_count=317 dict_hash=0xe5a57f3eb72ff94a`; v3 — **1052 tests**,
|
||||
`PARITY:M7.1a word_count=526 hash=0x82f4ae7cb2e2d424`.
|
||||
|
||||
### What's live in M7.1
|
||||
### What's live
|
||||
|
||||
- **Tripod** — a named multi-VM fleet (Hera the Mama VM, Artemis, two Hermes
|
||||
instances) births, runs, and re-births independently, verified booting
|
||||
live pre-REPL on all three architectures.
|
||||
- **Hermes** — a 17-block inter-VM messaging/channel layer between fleet
|
||||
members, with async delivery and channel negotiation.
|
||||
- **Artemis** — a Block Allocation Map (BAM) storage subsystem with Q48.16
|
||||
block-heat tracking and cooldown/reclamation (`ART-COOL`/`ART-REAP`).
|
||||
- **Word-level ACL** — every dictionary entry carries a TTL/allow/mode/pin
|
||||
access-control record. Strict, TTL, and pinned modes; two console layers
|
||||
(emergency `ok>` and superuser `zuse)ok>`). Phases 1–7 complete (C
|
||||
infrastructure, FORTH policy layer, `zuse` bootstrap superuser, Isabelle
|
||||
proof stubs, kernel parity); Phase 8 (Ed25519 PKI / thumbdrive
|
||||
challenge-response) is the only item remaining. Measured overhead once
|
||||
active on every check: **+0.0054%–+0.0088%**, CV = **0.000%**, across a
|
||||
3×3 Latin-square DoE campaign (architecture × seed × 30 replicates) —
|
||||
three orders of magnitude below the measurement floor.
|
||||
- **VM Fleet Attractor physics** — the L8 Jacquard mode selector now has a
|
||||
real per-VM heat channel into fleet-wide tuning, replacing hardcoded
|
||||
compudynamics constants with a dynamically-inferred rate.
|
||||
- **Kconfig build configuration** — every physics/heartbeat/pipelining/
|
||||
kernel-only tuning knob (~40 total) is now a discoverable, optional
|
||||
Kconfig symbol shared with the hosted VM build. See **Quick Start** below.
|
||||
- **The Tripod** — a named multi-VM fleet: **Hera** (the Mama VM, the governor), **Artemis**
|
||||
(block storage: a Block Allocation Map with Q48.16 block heat, cooldown and reclamation) and
|
||||
**Hestia**, birthed, run and re-birthed independently on all three architectures.
|
||||
- **kernel-Hermes** — messaging moved into the kernel (the Hermes VM is gone,
|
||||
`docs/fabric/FABRIC-3.5.md`): every VM takes its own messages on its own turn, under a
|
||||
cooperative switcher that every VM takes part in.
|
||||
- **Identities on thumbdrives** — Zuse, the superuser, and every user is a minted USB
|
||||
thumbdrive (Ed25519, Zuse-signed); plugging one in births that user's VMs, pulling it out
|
||||
ends them. There is only the drive: no password, no PIN.
|
||||
- **Word-level ACL** — every dictionary entry carries a TTL/allow/mode/pin access-control
|
||||
record; strict, TTL and pinned modes; two console layers (emergency `ok>` and superuser
|
||||
`zuse)ok>`). Measured overhead of the live ACL-TTL mechanism: **+0.0603%**, CV 0.000%,
|
||||
architecture-independent (`docs/fabric/FABRIC-1.md` §T).
|
||||
- **Logs that persist** — every VM's log records go to a ring on Artemis's disk (`LOG-FLUSH`,
|
||||
`LOG-SHOW`).
|
||||
- **The physics-driven runtime** — seven feedback loops and the L8 Jacquard mode selector, with
|
||||
a per-VM heat channel into fleet-wide tuning (VM Fleet Attractor).
|
||||
- **Kconfig build configuration** — about 40 physics, heartbeat, pipelining and kernel-only
|
||||
knobs, shared with the hosted build.
|
||||
|
||||
---
|
||||
|
||||
@@ -68,48 +70,44 @@ POST at boot: **parity hash verified across amd64/aarch64/riscv64 · Mama capsul
|
||||
|
||||
```bash
|
||||
# One boot image per physical target (output: build/boards/<board>/)
|
||||
make boot_image TARGET=SER5 # Beelink SER5 -- GPT/ESP, BOOTX64.EFI
|
||||
make boot_image TARGET=PC # any x86-64 UEFI PC -- GPT/ESP, BOOTX64.EFI
|
||||
make boot_image TARGET=RASPI # Raspberry Pi 5 -- FAT, config.txt + kernel_2712.img + DTB
|
||||
make boot_image TARGET=MILKV # Milk-V Mars -- GPT/ESP, BOOTRISCV64.EFI (U-Boot bootefi)
|
||||
make boot_image TARGET=ZYNQ7020 # Zynq-7020 -- ARMv7 port in progress
|
||||
make boards # list boards
|
||||
make boards # list boards (the Zynq-7020 has no ARMv7 port yet)
|
||||
|
||||
# Each image carries v4 and v3. As built it boots v4; to boot v3, change the one word
|
||||
# system=v4 -> system=v3
|
||||
# in starforth.cfg on the PC's stick or the Mars's card, or cmdline.txt on the Pi 5's card.
|
||||
|
||||
# The same TARGET drives all, docs and clean (make help)
|
||||
make # every board with a kernel port + hosted v3 + the book
|
||||
make TARGET=RASPI # one board's image + build/docs/LithosAnanke-raspi.pdf
|
||||
make docs # build/docs/LithosAnanke.pdf (LaTeX master: docs/book/main.tex)
|
||||
make clean TARGET=RASPI # that board's outputs and build/aarch64/kernel
|
||||
make clean # all of build/ except build/cache/
|
||||
|
||||
# Build kernel (requires cross-compilation toolchain, or native gcc)
|
||||
make -f kernel/Makefile ARCH=amd64
|
||||
# The kernel in QEMU (OVMF / AAVMF / EDK2), one architecture at a time -- boots v4
|
||||
make -f kernel/Makefile ARCH=amd64 clean qemu
|
||||
make -f kernel/Makefile ARCH=aarch64 clean qemu
|
||||
make -f kernel/Makefile ARCH=riscv64 clean qemu
|
||||
make -f kernel/Makefile ARCH=amd64 KERNEL_ARGS=system=v3 clean qemu # v3, while it remains
|
||||
|
||||
# Run in QEMU with OVMF
|
||||
make -f kernel/Makefile qemu
|
||||
|
||||
# Other architectures
|
||||
make -f kernel/Makefile ARCH=aarch64 qemu
|
||||
make -f kernel/Makefile ARCH=riscv64 qemu
|
||||
# The Pi 5's native boot path, rehearsed on QEMU's virt machine at EL2
|
||||
make -f kernel/Makefile ARCH=aarch64 RPI5_NATIVE_BASE=0x40080000 rpi5-rehearsal
|
||||
```
|
||||
|
||||
Artifacts: `build/amd64/kernel/starkernel_loader.efi` · `build/amd64/kernel/starkernel_kernel.elf`
|
||||
Artifacts: `build/<arch>/kernel/starkernel_loader.efi` · `build/<arch>/kernel/starkernel_kernel.elf`
|
||||
|
||||
Tree: `kernel/` (LithosAnanke: `Makefile`, `src/`, `include/starkernel/`, `linker/`),
|
||||
`v3/` (StarForth v3 engine and hosted build: `Makefile`, `src/`, `include/`),
|
||||
`v4/` (StarForth v4, see `docs/v4.0.0/`), `boards/<board>/` (`board.mk` + boot files).
|
||||
Every makefile runs from the repo root; the root `Makefile` forwards any other goal to
|
||||
`v3/Makefile` (hosted build).
|
||||
`v3/` (StarForth v3 engine and hosted build), `v4/` (StarForth v4, see `docs/v4.0.0/`),
|
||||
`boards/<board>/` (`board.mk` + boot files), `capsules/` (the FORTH capsules). Every makefile
|
||||
runs from the repo root; the root `Makefile` forwards any other goal to `v3/Makefile`.
|
||||
|
||||
For the hosted VM by itself (Linux, no cross-compiler needed, no bare-metal tooling): see
|
||||
the separate **StarForth** repository — LithosAnanke used to be a branch inside that repo,
|
||||
now it's its own project with its own `master`.
|
||||
For the hosted v3 VM by itself, see the separate **StarForth** repository — LithosAnanke used to
|
||||
be a branch inside it, and is now its own project.
|
||||
|
||||
### Build configuration (optional)
|
||||
|
||||
Every kernel-only knob (`STARFORTH_ENABLE_VM`, `PARITY_MODE`, the shared
|
||||
physics/heartbeat family, etc.) is an optional Kconfig symbol — a plain
|
||||
`make -f kernel/Makefile` uses the same defaults it always has unless
|
||||
you opt in:
|
||||
Every kernel-only knob is an optional Kconfig symbol; a plain `make -f kernel/Makefile` uses
|
||||
the defaults unless you opt in:
|
||||
|
||||
```bash
|
||||
make -f kernel/Makefile ARCH=amd64 menuconfig
|
||||
@@ -120,15 +118,21 @@ make -f kernel/Makefile ARCH=amd64 kernel_amd64_defconfig
|
||||
|
||||
## Documentation
|
||||
|
||||
**Start at [docs/README.md](docs/README.md)** — the map: where each kind of document lives and
|
||||
which to believe. Among them:
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| [System Architecture](docs/lithosananke/SYSTEM_ARCHITECTURE.md) | Full kernel + VM design |
|
||||
| [HAL Reference](docs/lithosananke/hal/) | Hardware abstraction layer interfaces |
|
||||
| [Capsule System — M7.1](docs/lithosananke/M7.1.md) | Capsule birth protocol design |
|
||||
| [VM Fleet Attractor design log](docs/working/architecture/VM-FLEET-ATTRACTOR-DESIGN-20260705.md) | Tripod/Hermes/Artemis physics + build-system history |
|
||||
| [Getting Started / Kconfig reference](docs/working/architecture/getting-started/DEVELOPER.md#build-configuration-kconfig) | Full symbol reference for both build targets |
|
||||
| [The FABRIC record](docs/fabric/) | Every design decision and the work as it happened (`FABRIC-3.md` is the living one) |
|
||||
| [StarForth v4](docs/v4.0.0/) | The F18-derived engine |
|
||||
| [Board bring-up](boards/BRINGUP.md) | Getting onto a PC, the Pi 5 and the Mars |
|
||||
| [Roadmap and versioning](docs/reference/ROADMAP.md) | Milestone plan and release-versioning policy |
|
||||
| [Capsule System — M7.1](docs/reference/M7.1.md) | Capsule birth protocol |
|
||||
| [Word-level ACL](docs/reference/word-acl/DESIGN.md) | The access-control design |
|
||||
| [HAL, as built](kernel/src/hal/README.md) | Hardware abstraction layer |
|
||||
| [Developer guide / Kconfig reference](docs/working/architecture/getting-started/DEVELOPER.md#build-configuration-kconfig) | Full symbol reference for both builds |
|
||||
| [Dead ideas and revised claims](docs/DEAD-AND-REVISED.md) | What is no longer true, and since when |
|
||||
| [Changelog](CHANGELOG.md) | Milestone-level history |
|
||||
| [Roadmap](docs/lithosananke/ROADMAP.md) | Milestone plan through self-hosting |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,292 @@
|
||||
# Board bring-up checklist
|
||||
|
||||
Written 2026-10-13, before any of the four boards has been booted. It is what to do on the day
|
||||
a board is on the bench, and what has to be true before that day is worth having.
|
||||
|
||||
Nothing here has been done on hardware. Every statement about the code was checked in the code
|
||||
on the date above; where it comes from a document instead, the document is named. When a board
|
||||
has been booted, its results go in `docs/fabric/FABRIC-3.md` (sections III, IV, V) and its
|
||||
`README.md` here, and this file is corrected.
|
||||
|
||||
The four boards: `PC` (amd64, any x86-64 UEFI PC; the one on the bench is a Beelink SER5 -- the target was named `SER5` until 2026-10-14), `RASPI` (Pi 5, aarch64), `MILKV` (Mars, riscv64), `ZYNQ7020`
|
||||
(ARMv7, no port yet). See `boards/README.md` for what each image is.
|
||||
|
||||
---
|
||||
|
||||
## 1. What stands between today and a first boot
|
||||
|
||||
Found while writing this checklist. Items marked **blocks first boot** will stop a board
|
||||
showing anything, or stop it being typed to; they are worth closing before the bench day.
|
||||
None has been fixed: each needs your word.
|
||||
|
||||
### 1.1 All boards
|
||||
|
||||
| # | What | Where | Effect on hardware |
|
||||
|---|---|---|---|
|
||||
| A1 | **Fixed 2026-10-14.** The USB controller was matched by QEMU's own IDs (`1B36:000D`) on PCI bus 0 alone. Now: found by its PCI class (`0C/03/30`) on any bus, slot and function; its register window mapped at the size its BAR reports; taken from the firmware through the USB Legacy Support capability (SMIs off); and 64-byte contexts (`CSZ=1`, common on real controllers) laid out instead of refused. Every controller is driven, up to 8 (since 2026-10-14, `FABRIC-3.md` XLII): a stick or keyboard may be in any port. | `kernel/src/usb/xhci.c`, `kernel/src/pci/pci.c`; `FABRIC-3.md` XL | Rehearsed in QEMU with another vendor's controller behind a bridge, all three ISAs. Not rehearsable: the firmware handoff and 64-byte contexts (QEMU's controller has neither). |
|
||||
| A2 | **No prompt without a login.** The production default, `EMERGENCY_CONSOLE_ENABLED=n`, keeps the system headless until an identity logs in by thumbdrive. | `Kconfig.heartbeat:68`; `FABRIC-3.md` VIII.1 | With A1, the v3 system never shows a prompt on hardware. A bring-up build must set `EMERGENCY_CONSOLE_ENABLED=1`. |
|
||||
| A3 | **Fixed 2026-10-14.** A USB boot-protocol keyboard is driven (xHCI interrupt endpoint, `SET_PROTOCOL(boot)`), its reports become the same key events as the PS/2 and virtio keyboards, and the console treats a full keyboard as one: Caps Lock and Num Lock as toggles shown on the keyboard's lights, the keypad as digits or navigation, the arrows and navigation block mapped (the line editor itself still has no cursor movement). While a USB keyboard runs, the console services its reports every timer tick. | `kernel/src/usb/usb_kbd.c`, `kernel/src/usb/xhci.c`, `kernel/src/repl.c`; `FABRIC-3.md` XLI | Rehearsed in QEMU on all three ISAs; on amd64 with the USB keyboard the only keyboard. Limits: a keyboard whose first interface is not the keyboard is not used; no key repeat. Several keyboards, on any controllers, each its own. |
|
||||
| A4 | **The only disk driver is virtio.** | `kernel/src/virtio/virtio_blk.c`; `kernel_main.c:493` | On hardware Artemis finds no disk ("Artemis: no virtio-blk disk"). What the fleet then does has not been tried even in QEMU: see step 3.3. |
|
||||
| A5 | **Entropy:** RDRAND on amd64 only. aarch64 and riscv64 have virtio-rng alone. | `kernel/src/rng/rng.c` | Pi 5 and Mars print the "no entropy backend available" warning; anything that needs random bytes is refused. Minting needs them. |
|
||||
| A6 | **Fixed 2026-10-14.** Every board image carries both systems, v3 and v4, and the boot arguments choose: `system=v4` (as built: v4 is the default) or `system=v3` -- one word in `starforth.cfg` on the SER5's and the Mars's stick or card, in `cmdline.txt` on the Pi 5's card. No rebuild to switch. | root `Makefile`, `kernel/Makefile`, `kernel/src/kernel_main.c`, `kernel/src/boot/cmdline.c`; `FABRIC-3.md` XLIII | The SER5 image itself, booted under OVMF: v3 as built, v4 after the one-word edit. The boot says which system runs and why ("System: ..."). |
|
||||
|
||||
### 1.2 PC (the SER5 on the bench)
|
||||
|
||||
| # | What | Where | Effect |
|
||||
|---|---|---|---|
|
||||
| S1 | HPET address fixed at `0xFED00000`, not read from ACPI. | `FABRIC-3.md` III item 6, finding 1 | Wrong only on a machine that puts it elsewhere. Most do not. |
|
||||
| S2 | Local APIC address fixed at `0xFEE00000`; the MADT's override entry is not parsed. | finding 2 | The same. |
|
||||
| S3 | **Half fixed 2026-10-14.** The i8042: a PC without one (port 0x64 reads 0xFF) hung the kernel at boot, in a drain loop that never ended -- found rehearsing A3 with QEMU's `i8042=off`. Now detected and skipped, every drain bounded. Still open: the legacy PIC is written to with no check that it exists. | `kernel/src/arch/amd64/i8042.c`; finding 3; `FABRIC-3.md` XLI | A legacy-free SER5 no longer stops at the I/O APIC. The PIC: unknown on a machine without one. |
|
||||
| S4 | `BYE` resets through the i8042, not the ACPI reset register. | finding 4 | `BYE` may do nothing. It does not hang. |
|
||||
| S5 | Whether the SER5 has a serial header is not known. | `FABRIC-3.md` III | Without one, and with A3, the SER5 can be watched over HDMI and not typed to. |
|
||||
|
||||
The loader probes COM1 before using it, and since 2026-10-13 so does the kernel's console.
|
||||
Before that, on a board with no COM1 the status port read all ones: writes went nowhere, and
|
||||
the prompt was told a key was waiting on every poll and read `0xFF` for ever.
|
||||
|
||||
### 1.3 Raspberry Pi 5
|
||||
|
||||
| # | What | Where | Effect |
|
||||
|---|---|---|---|
|
||||
| R1 | **Fixed 2026-10-13.** Every character the console printed was also written to a PL011 at `0x09000000`, QEMU's address, which on a Pi 5 is ordinary RAM. The console now finds its serial line from the devicetree's `/chosen/stdout-path`: on the Pi 5 that is `serial10`, the debug connector, a PL011 at `0x107d001000`. | `kernel/src/hal/console.c`, `kernel/src/hal/fdt_uart.c`; `tools/fdt_uart_test.c` reads the board's real devicetree | Checked off the board only. The first run is the board's. |
|
||||
| R2 | **Fixed 2026-10-14.** Entry is at EL2 with the MMU off, where every access is Device memory: unaligned accesses and atomics fault, nothing is cached. The entry stub now cleans the cache over the image, turns the MMU and caches on before any C (identity map: the image's GiB Normal in 2 MiB blocks, the rest Device), and routes interrupts to EL2; C then makes the rest of the devicetree's RAM Normal. Rehearsing it found and fixed three more: the PL011 register shift, the GIC address (not carried through `/soc`'s `ranges`), and the EL2 timer interrupt never being taken. | `native_rpi5_entry.S`, `rpi5_mmu.c`, `fdt.c` (`fdt_reg_address`), `apic.c`; `FABRIC-3.md` XXXIX | Rehearsed on QEMU virt at EL2 (section 3.2): POST passes, same parity hash. Not yet on the board. |
|
||||
| R3 | **Partly fixed 2026-10-14.** The address returned is now carried through the devicetree's `dma-ranges` (on the Pi 5 it is already physical; the old `& 0x3FFFFFFF` was the Pi 4's rule), every mailbox wait gives up after one second, the request buffer is cleaned to RAM and back around the exchange, and the framebuffer is mapped uncached. Still unverified: the size field of the allocate tag. The mode is fixed at 1920x1080x32. | `rpi5_mailbox.c`, `rpi5_mmu.c`; `FABRIC-3.md` IV.3 item 3, XXXIX | QEMU virt has no mailbox: none of this runs before the board. No picture shows as no framebuffer, not a hang. |
|
||||
| R4 | USB, Ethernet and GPIO are behind the RP1 chip on PCIe, which needs a Broadcom-specific driver that is not written. | `FABRIC-3.md` IV.3 item 5 | No USB on the Pi 5 whatever is done about A1. |
|
||||
| R5 | No hardware entropy source is known for the BCM2712. | `FABRIC-3.md` IV.2 | A5 stands. |
|
||||
|
||||
### 1.4 Milk-V Mars
|
||||
|
||||
| # | What | Where | Effect |
|
||||
|---|---|---|---|
|
||||
| M1 | **Fixed 2026-10-13.** The console, and the UEFI loader before it, wrote to a 16550 at `0x10000000` with registers one byte apart. The JH7110's UART is at that address with `reg-shift = <2>` and `reg-io-width = <4>` (mainline `jh7110.dtsi`): the loader would have waited for ever on its first character. Both now take the layout from the devicetree. | `kernel/src/hal/console.c`, `kernel/src/boot/uefi_loader.c` | Rehearsed in QEMU through U-Boot, which hands over a devicetree: "serial line is a 16550 at 0x10000000 (named by the devicetree)". QEMU's UART is byte-spaced, so the four-byte layout itself is checked by the host test only. |
|
||||
| M2 | The display depends on U-Boot offering a framebuffer to the EFI loader. | `boards/milkv/README.md` | Unknown. With M1 unfixed there is then no channel at all. |
|
||||
| M3 | USB is behind the JH7110's PCIe controller; whether that is plain ECAM has not been looked up. | `FABRIC-3.md` V.3 item 5 | No USB until it is. |
|
||||
| M4 | `FABRIC-3.md` V describes a native entry at `0x40000000`; the image built today is the UEFI loader run by U-Boot's `bootefi`. The README here is the newer and is what the build does. | `boards/milkv/README.md` | None; noted so the two are not confused on the day. |
|
||||
| M5 | Whether the U74 has the entropy instruction is not known. | `FABRIC-3.md` V.2 | A5 stands. |
|
||||
|
||||
### 1.5 Zynq-7020
|
||||
|
||||
No image can be built. Needed first, in order: the board chosen (it fixes `BOOT.BIN`); an ARMv7
|
||||
port, `kernel/src/arch/armv7` (entry, MMU, GIC, private timer); and the four files that use
|
||||
`__int128` or have no ARMv7 branch (`boards/zynq7020/README.md` names them). It is the host for
|
||||
the v4 mesh, so it also waits on A6.
|
||||
|
||||
### 1.6 Found in rehearsal, and fixed, 2026-10-13: the bring-up build flooded its prompt
|
||||
|
||||
Built with `EMERGENCY_CONSOLE_ENABLED=1` and booted with no thumbdrive, the prompt printed
|
||||
`ok> ok` without end: 1.4 million times in 200 seconds. The line reader
|
||||
(`kernel/src/repl.c`, `sk_console_readline()`) gave up at once whenever no identity was logged
|
||||
in, which the production build answers by going silent; the bring-up build took it as an
|
||||
empty line and asked again. It now gives up only in the production build. Rehearsed on
|
||||
riscv64 (`logs/20261013-235129`): one prompt, which waits, and three typed lines answered.
|
||||
|
||||
### 1.7 What I would close before the bench day
|
||||
|
||||
In this order, each as a design for approval first:
|
||||
|
||||
1. ~~R1 and M1: a console that finds its UART from the devicetree, and does nothing when
|
||||
there is none.~~ Done 2026-10-13, and 1.6, the flood.
|
||||
2. A6: the v4 switch in the board images. The v4 node needs only a console to reach a prompt;
|
||||
it has no login, no fleet and no disk to wait for, so it is the shorter road to a first
|
||||
prompt on each board.
|
||||
3. A1: find the USB controller by its class code, not one vendor's number. That gives the SER5
|
||||
thumbdrives. The Pi 5 and the Mars need R4 and M3 as well.
|
||||
4. A serial cable for every board (section 2).
|
||||
|
||||
---
|
||||
|
||||
## 2. Before the day
|
||||
|
||||
**To have on the bench**
|
||||
|
||||
- [ ] A USB-to-serial adapter with 3.3 V logic levels, and jumper wires. It is the one channel
|
||||
that survives a framebuffer failure, and with A3 it is the one way to type. FABRIC-3
|
||||
decided HDMI only for the Pi 5 and the Mars because no adapter was to hand; that
|
||||
decision is worth revisiting before the day.
|
||||
- [ ] HDMI display and cable (micro-HDMI for the Pi 5).
|
||||
- [ ] A USB stick for the SER5; a microSD card each for the Pi 5 and the Mars; a card reader.
|
||||
- [ ] A PS/2 keyboard if the SER5 turns out to have a PS/2 port; otherwise serial.
|
||||
- [ ] A camera, for the screen: when there is no serial log, photographs are the record.
|
||||
- [ ] The identity thumbdrives (`disk/README.md`), once A1 is closed.
|
||||
|
||||
**To know before starting**
|
||||
|
||||
- [ ] SER5: Secure Boot is off (`FABRIC-3.md` III says it is on this unit); which key opens
|
||||
the firmware's boot menu; whether there is a serial header.
|
||||
- [ ] Pi 5: the EEPROM firmware is recent enough to honour `kernel_address` and `os_check`
|
||||
(boot Raspberry Pi OS once and note the version).
|
||||
- [ ] Mars: the SPI flash holds a U-Boot that scans the SD card for an EFI loader; the boot
|
||||
switches select SPI flash. Stop U-Boot at its prompt once and save `printenv`, then
|
||||
`fdt addr ${fdtcontroladdr}` and the output of `fdt print /soc/serial@10000000`: that
|
||||
settles M1.
|
||||
|
||||
---
|
||||
|
||||
## 3. Build, and rehearse in QEMU
|
||||
|
||||
### 3.1 Build
|
||||
|
||||
```
|
||||
make boot_image TARGET=PC EMERGENCY_CONSOLE_ENABLED=1
|
||||
make boot_image TARGET=RASPI EMERGENCY_CONSOLE_ENABLED=1
|
||||
make boot_image TARGET=MILKV EMERGENCY_CONSOLE_ENABLED=1
|
||||
```
|
||||
|
||||
- [ ] ~~`make clean TARGET=<board>` first.~~ `make boot_image` now cleans its ISA's kernel
|
||||
objects itself (2026-10-14): make does not see a change of compile flags, and an image
|
||||
built over old objects booted headless (2026-10-13) or would have lacked v4.
|
||||
- [ ] The images boot v4. To boot v3 instead: change `system=v4` to `system=v3` in
|
||||
`starforth.cfg` (PC, Mars) or `cmdline.txt` (Pi 5) on the medium. The boot prints "System: ..." with the choice.
|
||||
- [ ] Each ends with its image in `build/boards/<board>/`. Record `sha256sum` of each.
|
||||
- [ ] Confirm the switch took: the image booted in QEMU (3.2) shows a prompt with no
|
||||
thumbdrive attached. After a clean build it does (tried on `MILKV`).
|
||||
- [ ] The Pi 5 build fetches the board's DTB once from the pinned firmware release; with no
|
||||
network, pass `RPI5_DTB=/path/to/bcm2712-rpi-5-b.dtb`.
|
||||
- [ ] Put back `v3/include/version.h` and `capsules/BLOCK_MAP.md` afterwards: the build
|
||||
rewrites both.
|
||||
|
||||
### 3.2 Rehearse each image as its own disk
|
||||
|
||||
One QEMU at a time. Use a copy of the image: the kernel writes to its disk.
|
||||
|
||||
- [ ] **PC:** q35 with OVMF, the image as the only disk, no `-cdrom`, no virtio disk, no
|
||||
thumbdrive. This is the machine the README's "booted in QEMU" refers to.
|
||||
- [ ] **MILKV:** the command in `boards/milkv/README.md` (OpenSBI, U-Boot, `bootefi`).
|
||||
- [ ] **RASPI:** there is no QEMU model of the Pi 5, but its native path -- raw image, entry
|
||||
at EL2 with the MMU off, devicetree in x0 -- is rehearsed on QEMU virt:
|
||||
`make -f kernel/Makefile ARCH=aarch64 RPI5_NATIVE_BASE=0x40080000 rpi5-rehearsal`
|
||||
(log under `logs/<TS>/aarch64-rpi5/`). Not rehearsed: the mailbox and framebuffer, the
|
||||
Pi 5's own UART and GIC addresses (checked against its real devicetree by
|
||||
`tools/fdt_uart_test.c` instead), and PCI (virt's needs ACPI, the Pi 5's is R4).
|
||||
|
||||
### 3.3 What to settle in the rehearsal
|
||||
|
||||
- [ ] With no virtio disk and no thumbdrive, how far does the v3 system get, and what does it
|
||||
print? (A4. Not tried.)
|
||||
- [ ] Note the verdict lines of that boot (section 5). They are what the board is compared
|
||||
with.
|
||||
- [ ] Type a line over the serial port. If it is not taken in QEMU it will not be on the
|
||||
board.
|
||||
|
||||
---
|
||||
|
||||
## 4. On the bench
|
||||
|
||||
Do one board at a time, in this order: SER5, then the Mars, then the Pi 5. The SER5's path is
|
||||
the one QEMU exercises most closely, and the Pi 5's can be rehearsed only in part (3.2).
|
||||
|
||||
### 4.1 Writing the media, every board
|
||||
|
||||
- [ ] `lsblk` before and after inserting the stick or card. Write down the device name and its
|
||||
size. **`dd` to the wrong device destroys a disk.**
|
||||
- [ ] `sudo dd if=build/boards/<board>/<image> of=/dev/sdX bs=4M conv=fsync status=progress`
|
||||
- [ ] Read it back and compare: `sudo cmp -n $(stat -c %s <image>) <image> /dev/sdX`.
|
||||
|
||||
### 4.2 PC (the SER5)
|
||||
|
||||
- [ ] Serial, if there is a header: 115200 8N1, logged to a file from before power-on.
|
||||
- [ ] HDMI and keyboard connected. Stick in a rear port.
|
||||
- [ ] Power on, open the boot menu, choose the stick.
|
||||
- [ ] Watch for, in order: `StarKernel UEFI Loader`; `GOP: linear framebuffer found`;
|
||||
`LithosAnanke v...`; `PMM initialized.`; `VMM initialized`; `APIC: init done`;
|
||||
`Timer: init done`; `Kernel heap initialized.`; `Stadium: ...`; POST; the verdict lines.
|
||||
- [ ] `rng: backend = rdrand`. In QEMU it says `virtio-rng`; this line is new on hardware.
|
||||
- [ ] The timer lines differ from QEMU's by design: no hypervisor, so the HPET path runs for
|
||||
the first time. S1 is the finding to remember if it stops there.
|
||||
|
||||
### 4.3 Milk-V Mars
|
||||
|
||||
- [ ] Serial on the 40-pin header's UART, 115200 8N1, logged from before power-on. U-Boot
|
||||
talks on it, so it shows whether the board reached U-Boot even if the kernel prints
|
||||
nothing.
|
||||
- [ ] Card in, HDMI connected, power on.
|
||||
- [ ] U-Boot finds `EFI/BOOT/BOOTRISCV64.EFI` and starts it. If it does not, at its prompt:
|
||||
`load mmc 1:1 ${kernel_addr_r} EFI/BOOT/BOOTRISCV64.EFI` then
|
||||
`bootefi ${kernel_addr_r} ${fdtcontroladdr}` (the device number may differ: `mmc list`).
|
||||
- [ ] The lines of 4.2, with `PLIC:` in place of `APIC:`. For the first time the interrupt
|
||||
controller's address and the timer's frequency should come from the devicetree: the
|
||||
QEMU lines "no DTB PLIC node" and "FALLBACK, no devicetree" should **not** appear.
|
||||
- [ ] `satp.MODE` is printed at entry. Under U-Boot it may be 0 where QEMU shows `0xa`.
|
||||
|
||||
### 4.4 Raspberry Pi 5
|
||||
|
||||
- [ ] Serial on the debug connector between the HDMI ports (needs the Pi debug probe or a
|
||||
matching cable), 115200 8N1. The firmware prints there before the kernel runs.
|
||||
- [ ] Card in, HDMI in the port nearest the USB-C socket, power on.
|
||||
- [ ] The firmware loads `kernel_2712.img` at `0x80000`. If the screen stays on the firmware's
|
||||
diagnostic page, the firmware did not accept the image: note what it says.
|
||||
- [ ] Then the lines of 4.2 from `LithosAnanke v...` on (there is no UEFI loader), with
|
||||
`GICv2:` in place of `APIC:`. The line "no DTB GIC node -- using QEMU virt-machine
|
||||
defaults" should **not** appear.
|
||||
- [ ] Expect `PCI: MCFG parse failed on aarch64 -- no ECAM`: that is R4 and is not a failure
|
||||
of the boot.
|
||||
|
||||
---
|
||||
|
||||
## 5. What counts as a pass
|
||||
|
||||
Record which level each board reached. A board is not "booted" on the strength of level 1.
|
||||
|
||||
| Level | What was seen | Compared with |
|
||||
|---|---|---|
|
||||
| 1 | The kernel's first line, on any channel | - |
|
||||
| 2 | Every milestone line through `Kernel heap initialized.` | The QEMU log of the same build |
|
||||
| 3 | `POST: PASSED` and `PARITY:OK` | The same test count as QEMU |
|
||||
| 4 | The `PARITY:M7.1a` line's `word_count` and `hash` equal QEMU's for the same ISA | The rehearsal boot of 3.2 |
|
||||
| 5 | A prompt, and a typed line answered: `1 2 + .` gives `3` | - |
|
||||
| 6 | Entropy from hardware; an identity minted on a thumbdrive and attached again after a power cycle | The gates of `FABRIC-3.md` III, IV, V |
|
||||
|
||||
Level 4 is the one that says the board runs the same system as QEMU. Levels 5 and 6 wait on
|
||||
section 1: today no board can reach 6, and only the SER5 with a serial header can reach 5.
|
||||
|
||||
For the v4 node, once A6 is built, the lines are `PARITY:V4_POST tests=538 pass=538 fail=0`,
|
||||
`PARITY:V4_SYSTEM word_count=... dict_hash=...` equal to the hosted programs', `PARITY:OK`,
|
||||
`POST: PASSED`, and the prompt `ok> `.
|
||||
|
||||
---
|
||||
|
||||
## 6. If it stops
|
||||
|
||||
| What is seen | Look at |
|
||||
|---|---|
|
||||
| Nothing at all, any board | Is the firmware reaching the image? Serial shows the firmware's own output on the Mars and the Pi 5. On the SER5, try the UEFI shell: `startup.nsh` is in the image. |
|
||||
| Pi 5: firmware runs, then nothing | R1, then R2, then R3. |
|
||||
| Mars: U-Boot starts the loader, then nothing on serial | M1. HDMI may still show the boot if M2 holds. |
|
||||
| SER5: stops in the `Timer:` lines | S1. |
|
||||
| Stops at `APIC` / `GICv2` / `PLIC` | The controller's address: S2 on the SER5; on the others, whether the devicetree node was found (the line says). |
|
||||
| Runs through POST, then silence | A2: the build is headless. Rebuild with `EMERGENCY_CONSOLE_ENABLED=1`. |
|
||||
| A prompt that takes no keys | A3. Type over serial. |
|
||||
| `Artemis: no virtio-blk disk` | A4. Expected on every board today. |
|
||||
| `rng: WARNING -- no entropy backend available` | A5. Expected on the Pi 5 and the Mars today. |
|
||||
|
||||
Write down the last line shown, exactly, and photograph the screen. Do not change two things
|
||||
between attempts.
|
||||
|
||||
---
|
||||
|
||||
## 7. What to keep
|
||||
|
||||
- [ ] The serial transcript of every attempt, passed or failed, under `logs/` with the date,
|
||||
the board and the image's `sha256` in its name. Logs are kept and committed, as QEMU's
|
||||
are.
|
||||
- [ ] Photographs of the screen where there was no serial.
|
||||
- [ ] The firmware versions: SER5 BIOS, Pi 5 EEPROM, Mars U-Boot and OpenSBI.
|
||||
- [ ] The Mars's `printenv` and devicetree, and the Pi 5's DTB as used.
|
||||
- [ ] The results written into `FABRIC-3.md` (each section ends with "update this section with
|
||||
results") and each board's `README.md` status line.
|
||||
|
||||
---
|
||||
|
||||
## 8. Before the builds are cut
|
||||
|
||||
The administrative work that is yours to call, listed so it is not found on the day:
|
||||
|
||||
- [ ] The kernel's release number. `kernel/Makefile` holds a table that gives each hardware
|
||||
gate its own number (SER5, then the Pi 5, then the Mars); it is still to be ruled.
|
||||
- [ ] The uncommitted change to `kernel/Makefile` that adds the ISA to the version line: it
|
||||
needs a three-ISA acceptance run in the v3 configuration before it is committed.
|
||||
- [ ] `CHANGELOG.md`: nothing between 2026-08-18 and the uncommitted entry of 2026-10-09.
|
||||
- [ ] `sbom.spdx` and `sbom.spdx.json` brought up to date.
|
||||
- [ ] The merge of `StarForth-v4.0.0` to `master`, and the tags `LithosAnanke v2.0.0` and
|
||||
`StarForth v4.0.0`: only when you say.
|
||||
- [ ] `.claude/CLAUDE.md` still describes the build before `boards/` existed.
|
||||
+3
-2
@@ -6,7 +6,7 @@ that board's boot medium into `build/boards/<board>/`.
|
||||
|
||||
| TARGET | Directory | ISA | Boot path | Image |
|
||||
|---|---|---|---|---|
|
||||
| `SER5` | `ser5/` | amd64 | UEFI firmware, removable-media path | GPT + FAT32 ESP: `EFI/BOOT/BOOTX64.EFI` |
|
||||
| `PC` | `pc/` | amd64 | UEFI firmware, removable-media path -- any x86-64 PC | GPT + FAT32 ESP: `EFI/BOOT/BOOTX64.EFI` |
|
||||
| `RASPI` | `raspi/` | aarch64 | Pi 5 EEPROM firmware, native | MBR + FAT32: `config.txt`, `kernel_2712.img`, `bcm2712-rpi-5-b.dtb` |
|
||||
| `MILKV` | `milkv/` | riscv64 | SPI-flash U-Boot + OpenSBI, `bootefi` | GPT + FAT32 ESP: `EFI/BOOT/BOOTRISCV64.EFI` |
|
||||
| `ZYNQ7020` | `zynq7020/` | armv7 | BootROM, `BOOT.BIN`, U-Boot | not yet: needs `kernel/src/arch/armv7` |
|
||||
@@ -24,6 +24,7 @@ devices. `KERNEL_ARGS="..."` is written as `starforth.cfg` (UEFI boards) or `cmd
|
||||
image size; the default is 128.
|
||||
|
||||
Hardware status: none of these images has been booted on real silicon from this build. The
|
||||
SER5 image has been booted in QEMU (q35 + OVMF, from its own disk) through POST. The Pi 5
|
||||
PC image has been booted in QEMU (q35 + OVMF, from its own disk) through POST. (`PC` was named
|
||||
`SER5` until 2026-10-14, after the first PC on the bench; the image was never specific to it.) The Pi 5
|
||||
native path (`raspi/README.md`) and the JH7110 peripherals have still only been checked by
|
||||
compiling.
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
# PC boot media (generic x86-64, UEFI)
|
||||
|
||||
`make boot_image TARGET=PC` builds `build/boards/pc/lithos-pc.img`: a GPT disk with one FAT32
|
||||
EFI System Partition, for any x86-64 PC whose UEFI firmware boots a removable medium. Write it to
|
||||
a USB stick with `dd`. The partition holds:
|
||||
|
||||
- `EFI/BOOT/BOOTX64.EFI`: the amd64 monolithic loader, with the whole kernel embedded. Firmware
|
||||
finds it through the UEFI removable-media path, so no boot entry has to be created.
|
||||
- `startup.nsh`: runs the loader if the firmware drops into the UEFI shell.
|
||||
- `starforth.cfg`: the boot arguments -- `system=v4` as built; change the word to `system=v3` to
|
||||
boot v3 (and `KERNEL_ARGS="..."` adds to it).
|
||||
|
||||
Beside the image, `lithos-pc.spdx` / `.spdx.json`: its SBOM, every file on it with its SHA-256.
|
||||
|
||||
Nothing in the image is specific to one machine: it follows the generic UEFI/ACPI path in
|
||||
FABRIC-3.md §III. Until 2026-10-14 this target was named `SER5`, after the first PC to be brought
|
||||
up -- a Beelink SER5 (AMD Ryzen), which is still the one on the bench (`boards/BRINGUP.md`).
|
||||
|
||||
Status: booted in QEMU (q35 + OVMF, from this image as its own disk): v4 as built, v3 with
|
||||
`system=v3`. Not yet booted on real hardware.
|
||||
@@ -0,0 +1,12 @@
|
||||
# boards/pc/board.mk -- a generic PC: x86-64, UEFI firmware, ACPI.
|
||||
#
|
||||
# Not one machine: the standards-compliant UEFI path (FABRIC-3.md §III), so
|
||||
# any x86-64 PC whose firmware boots a UEFI removable medium. (The first to be
|
||||
# brought up on the bench is a Beelink SER5, an AMD Ryzen mini-PC -- see
|
||||
# boards/BRINGUP.md.) The monolithic loader embeds the whole kernel, so the
|
||||
# image is a GPT disk with one FAT32 EFI System Partition holding
|
||||
# EFI/BOOT/BOOTX64.EFI. Write it to a USB stick with dd.
|
||||
BOARD_DESC := Generic PC (x86-64, UEFI, ACPI)
|
||||
BOARD_ARCH := amd64
|
||||
BOARD_BOOT := uefi-esp
|
||||
BOARD_IMAGE := lithos-pc.img
|
||||
@@ -1,14 +0,0 @@
|
||||
# Beelink SER5 boot media
|
||||
|
||||
`make boot_image TARGET=SER5` builds `build/boards/ser5/lithos-ser5.img`: a GPT disk with one
|
||||
FAT32 EFI System Partition. Write it to a USB stick with `dd`. The partition holds:
|
||||
|
||||
- `EFI/BOOT/BOOTX64.EFI`: the amd64 monolithic loader, with the whole kernel embedded. Firmware
|
||||
finds it through the UEFI removable-media path, so no boot entry has to be created.
|
||||
- `startup.nsh`: runs the loader if the firmware drops into the UEFI shell.
|
||||
- `starforth.cfg`: only present when `KERNEL_ARGS="..."` is given.
|
||||
|
||||
Nothing in the image is SER5-specific. It follows the generic UEFI/ACPI path in FABRIC-3.md §III.
|
||||
|
||||
Status: booted in QEMU (q35 + OVMF, from this image as its own disk) through POST, with Stadium
|
||||
conservation exact (sum 65536 = `Q48_ONE`). Not yet booted on the SER5 itself.
|
||||
@@ -1,10 +0,0 @@
|
||||
# boards/ser5/board.mk -- Beelink SER5 (AMD Ryzen, x86-64, UEFI/ACPI).
|
||||
#
|
||||
# Generic standards-compliant UEFI path (FABRIC-3.md §III): nothing in the
|
||||
# image is SER5-specific. The monolithic loader embeds the whole kernel, so
|
||||
# the image is a GPT disk with one FAT32 EFI System Partition holding
|
||||
# EFI/BOOT/BOOTX64.EFI. Write it to a USB stick with dd.
|
||||
BOARD_DESC := Beelink SER5 (AMD Ryzen, x86-64, UEFI)
|
||||
BOARD_ARCH := amd64
|
||||
BOARD_BOOT := uefi-esp
|
||||
BOARD_IMAGE := lithos-ser5.img
|
||||
+78
-75
@@ -1,5 +1,5 @@
|
||||
# Capsule Block Manifest — Auto-generated
|
||||
<!-- Generated by mkcapsule --manifest 2026-10-08T00:35:37Z -->
|
||||
<!-- Generated by mkcapsule --manifest 2026-10-16T18:51:39Z -->
|
||||
<!-- DO NOT EDIT — re-run mkcapsule --manifest to refresh. -->
|
||||
<!-- Hand-written justifications and immutability notes live -->
|
||||
<!-- in MANIFEST.md alongside this auto-generated index. -->
|
||||
@@ -10,7 +10,7 @@
|
||||
|---------|----------------|----------|--------|
|
||||
| `ACL.4th` | 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4015 | `0xf8890c05c0d8f921` | n/a |
|
||||
| `acl-std79.4th` | 4023, 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048 | `0x773bf9209df191d1` | n/a |
|
||||
| `artemis:init.4th` | 4110, 4111, 4112, 4113, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4177, 4178, 4179, 4180, 4181, 4182, 4851, 4852, 4853, 4854, 4856, 4857, 4858, 4860 | `0xe6fba9ae56e1c916` | n/a |
|
||||
| `artemis:init.4th` | 4110, 4111, 4112, 4113, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4177, 4178, 4179, 4180, 4181, 4182, 4851, 4852, 4853, 4854, 4856, 4860 | `0x7ba120e2a6aab239` | n/a |
|
||||
| `block-acl.4th` | 4019, 4020 | `0xf6cc2a59e3a6734e` | n/a |
|
||||
| `doe-campaign.4th` | 4060, 4061, 4062, 4063, 4064, 4065 | `0x26fb485e5c9dc6ff` | n/a |
|
||||
| `doe.4th` | 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107 | `0xf154616d248e861f` | n/a |
|
||||
@@ -23,14 +23,16 @@
|
||||
| `init-l8-temporal.4th` | 4830, 4831 | `0x51abd4c138246651` | n/a |
|
||||
| `init-l8-transition.4th` | 4840, 4841, 4842 | `0xbcc1a81976f0a4c9` | n/a |
|
||||
| `init-l8-volatile.4th` | 4810, 4811, 4812, 4813 | `0x98caabbbd92abac4` | n/a |
|
||||
| `init.4th` | 2049, 2050, 2057 | `0xea038ba684c53443` | n/a |
|
||||
| `init.4th` | 2049, 2050, 2057 | `0xd09db9461b336431` | n/a |
|
||||
| `lib.4th` | 4050 | `0x4b216635c359ef73` | n/a |
|
||||
| `multiuser-doe.4th` | 5044, 5045, 5046, 5047, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 5055 | `0x22140588ee7c39e6` | n/a |
|
||||
| `sdk.4th` | 5109, 5110, 5111, 5112, 5113, 5114, 5115 | `0x008fdbbb62c94a3a` | n/a |
|
||||
| `turtle.4th` | 5100, 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108 | `0x4d470418ca543365` | n/a |
|
||||
| `user-font-demo.4th` | 4200, 4201, 4202 | `0xce1fd7d1b581a56d` | n/a |
|
||||
| `v4:centre.4th` | 8100, 8101, 8102, 8103, 8104, 8105, 8106, 8107, 8108 | `0x7b60682500afa138` | n/a |
|
||||
| `v4:forth79.4th` | 6000, 6001, 6002 | `0x4055641ee17d176b` | n/a |
|
||||
| `v4:hera.4th` | 8000, 8001, 8002, 8003, 8004, 8005, 8006 | `0x1c5ea12a9341e796` | n/a |
|
||||
| `v4:hera.4th` | 8000, 8001 | `0xee06b95cae3e3bb4` | n/a |
|
||||
| `v4:starshipos.4th` | 7000, 7001 | `0xb74bfa51f8d4719a` | n/a |
|
||||
| `workload-0.4th` | 2200, 2201 | `0x93f86f60aeba8feb` | n/a |
|
||||
| `workload-1-lite.4th` | 5058, 5059 | `0x44a7a7e3176dcc8d` | n/a |
|
||||
| `workload-1.4th` | 4406, 4415, 4425, 4435 | `0x63e251adb0a03613` | n/a |
|
||||
@@ -44,8 +46,7 @@
|
||||
| `workload-8.4th` | 2160 | `0x56b7f2f0efa000df` | n/a |
|
||||
| `workload-9.4th` | 4706, 4715, 4725, 4735, 4745 | `0x3f2bec73142aa424` | n/a |
|
||||
| `workload-calib1.4th` | 5043 | `0x3b9f2d17b554fabc` | n/a |
|
||||
| `zuse-eligibility.4th` | 4021, 4022 | `0x7b28f4776a32e0b7` | n/a |
|
||||
| `zuse.4th` | 4016, 4017, 4018 | `0xa14d5a7a88791cf6` | n/a |
|
||||
| `zuse.4th` | 4016, 4017, 4018 | `0x490ded9be257a90b` | n/a |
|
||||
|
||||
*Signed column is `n/a`: this manifest run had no `--sign-key`. Re-run with `--sign-key <path>` to check signing status (does not modify or require rebuilding capsule_generated.c).*
|
||||
|
||||
@@ -53,9 +54,9 @@
|
||||
|
||||
| LBN | Capsule | xxHash64 | Status |
|
||||
|-----|---------|----------|--------|
|
||||
| 2049 | `init.4th` | `0xea038ba684c53443` | ok |
|
||||
| 2050 | `init.4th` | `0xea038ba684c53443` | ok |
|
||||
| 2057 | `init.4th` | `0xea038ba684c53443` | ok |
|
||||
| 2049 | `init.4th` | `0xd09db9461b336431` | ok |
|
||||
| 2050 | `init.4th` | `0xd09db9461b336431` | ok |
|
||||
| 2057 | `init.4th` | `0xd09db9461b336431` | ok |
|
||||
| 2064 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
|
||||
| 2065 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
|
||||
| 2066 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
|
||||
@@ -113,13 +114,11 @@
|
||||
| 4007 | `ACL.4th` | `0xf8890c05c0d8f921` | ok |
|
||||
| 4008 | `ACL.4th` | `0xf8890c05c0d8f921` | ok |
|
||||
| 4015 | `ACL.4th` | `0xf8890c05c0d8f921` | ok |
|
||||
| 4016 | `zuse.4th` | `0xa14d5a7a88791cf6` | ok |
|
||||
| 4017 | `zuse.4th` | `0xa14d5a7a88791cf6` | ok |
|
||||
| 4018 | `zuse.4th` | `0xa14d5a7a88791cf6` | ok |
|
||||
| 4016 | `zuse.4th` | `0x490ded9be257a90b` | ok |
|
||||
| 4017 | `zuse.4th` | `0x490ded9be257a90b` | ok |
|
||||
| 4018 | `zuse.4th` | `0x490ded9be257a90b` | ok |
|
||||
| 4019 | `block-acl.4th` | `0xf6cc2a59e3a6734e` | ok |
|
||||
| 4020 | `block-acl.4th` | `0xf6cc2a59e3a6734e` | ok |
|
||||
| 4021 | `zuse-eligibility.4th` | `0x7b28f4776a32e0b7` | ok |
|
||||
| 4022 | `zuse-eligibility.4th` | `0x7b28f4776a32e0b7` | ok |
|
||||
| 4023 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
|
||||
| 4024 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
|
||||
| 4025 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
|
||||
@@ -153,51 +152,51 @@
|
||||
| 4063 | `doe-campaign.4th` | `0x26fb485e5c9dc6ff` | ok |
|
||||
| 4064 | `doe-campaign.4th` | `0x26fb485e5c9dc6ff` | ok |
|
||||
| 4065 | `doe-campaign.4th` | `0x26fb485e5c9dc6ff` | ok |
|
||||
| 4110 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4111 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4112 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4113 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4122 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4123 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4124 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4125 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4126 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4127 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4128 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4129 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4130 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4131 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4132 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4133 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4134 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4135 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4136 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4137 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4138 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4139 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4140 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4141 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4160 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4161 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4162 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4163 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4164 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4165 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4166 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4167 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4168 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4169 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4170 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4171 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4172 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4173 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4174 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4177 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4178 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4179 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4180 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4181 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4182 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4110 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4111 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4112 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4113 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4122 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4123 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4124 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4125 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4126 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4127 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4128 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4129 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4130 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4131 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4132 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4133 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4134 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4135 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4136 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4137 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4138 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4139 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4140 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4141 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4160 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4161 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4162 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4163 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4164 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4165 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4166 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4167 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4168 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4169 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4170 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4171 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4172 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4173 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4174 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4177 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4178 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4179 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4180 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4181 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4182 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4200 | `user-font-demo.4th` | `0xce1fd7d1b581a56d` | ok |
|
||||
| 4201 | `user-font-demo.4th` | `0xce1fd7d1b581a56d` | ok |
|
||||
| 4202 | `user-font-demo.4th` | `0xce1fd7d1b581a56d` | ok |
|
||||
@@ -235,14 +234,12 @@
|
||||
| 4840 | `init-l8-transition.4th` | `0xbcc1a81976f0a4c9` | ok |
|
||||
| 4841 | `init-l8-transition.4th` | `0xbcc1a81976f0a4c9` | ok |
|
||||
| 4842 | `init-l8-transition.4th` | `0xbcc1a81976f0a4c9` | ok |
|
||||
| 4851 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4852 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4853 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4854 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4856 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4857 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4858 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4860 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4851 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4852 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4853 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4854 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4856 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4860 | `artemis:init.4th` | `0x7ba120e2a6aab239` | ok |
|
||||
| 4900 | `fabric.4th` | `0x9d9489cbeca4099b` | ok |
|
||||
| 4901 | `fabric.4th` | `0x9d9489cbeca4099b` | ok |
|
||||
| 4902 | `fabric.4th` | `0x9d9489cbeca4099b` | ok |
|
||||
@@ -371,17 +368,23 @@
|
||||
| 6000 | `v4:forth79.4th` | `0x4055641ee17d176b` | ok |
|
||||
| 6001 | `v4:forth79.4th` | `0x4055641ee17d176b` | ok |
|
||||
| 6002 | `v4:forth79.4th` | `0x4055641ee17d176b` | ok |
|
||||
| 8000 | `v4:hera.4th` | `0x1c5ea12a9341e796` | ok |
|
||||
| 8001 | `v4:hera.4th` | `0x1c5ea12a9341e796` | ok |
|
||||
| 8002 | `v4:hera.4th` | `0x1c5ea12a9341e796` | ok |
|
||||
| 8003 | `v4:hera.4th` | `0x1c5ea12a9341e796` | ok |
|
||||
| 8004 | `v4:hera.4th` | `0x1c5ea12a9341e796` | ok |
|
||||
| 8005 | `v4:hera.4th` | `0x1c5ea12a9341e796` | ok |
|
||||
| 8006 | `v4:hera.4th` | `0x1c5ea12a9341e796` | ok |
|
||||
| 7000 | `v4:starshipos.4th` | `0xb74bfa51f8d4719a` | ok |
|
||||
| 7001 | `v4:starshipos.4th` | `0xb74bfa51f8d4719a` | ok |
|
||||
| 8000 | `v4:hera.4th` | `0xee06b95cae3e3bb4` | ok |
|
||||
| 8001 | `v4:hera.4th` | `0xee06b95cae3e3bb4` | ok |
|
||||
| 8100 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
|
||||
| 8101 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
|
||||
| 8102 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
|
||||
| 8103 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
|
||||
| 8104 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
|
||||
| 8105 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
|
||||
| 8106 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
|
||||
| 8107 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
|
||||
| 8108 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
|
||||
|
||||
## Conflicts
|
||||
|
||||
None.
|
||||
|
||||
---
|
||||
*38 capsule(s) scanned. Re-run `mkcapsule --manifest <dir>` to refresh.*
|
||||
*39 capsule(s) scanned. Re-run `mkcapsule --manifest <dir>` to refresh.*
|
||||
|
||||
@@ -49,7 +49,7 @@ Blocks: **2049–2052, 2057**
|
||||
|
||||
| Block | Immutable | Justification |
|
||||
|-------|-----------|---------------|
|
||||
| 2049 | No | Hera VM init: `VM-TREE`/`VM-PARENT`/`VM-CHILDREN`; loads `ACL.4th`, `block-acl.4th`, `zuse-eligibility.4th`, `lib.4th`. **Corrected 2026-09-19 (three times)** — first pass removed a stale listing of `compudynamics`/`common:msg`/`fleet-k`/`process` (none loaded here; two already-deleted, two stripped in the same pass, FABRIC-3.6.md tasks 0.2/0.3). Second pass (same day): `fabric.4th`/`font.4th` **removed** from this list — relocated to `hestia/init.4th` (FABRIC-3.6.md tasks 1.6/1.7), Hera no longer loads either. Third pass (2026-09-22, FABRIC-3.6.md Phase 4 Stage E): `common:messaging.4th` + `MSG-CD-INIT` **removed** — the file itself is deleted (see "Deleted capsules" below); every FORTH-owned message type was cut over to kernel-Hermes first (Phase 3) |
|
||||
| 2049 | No | Hera VM init: `VM-TREE`/`VM-PARENT`/`VM-CHILDREN`; loads `ACL.4th`, `block-acl.4th`, `lib.4th` (`zuse-eligibility.4th` removed 2026-10-14 with word-ACL elevation — FABRIC-3.md §XXXVII). **Corrected 2026-09-19 (three times)** — first pass removed a stale listing of `compudynamics`/`common:msg`/`fleet-k`/`process` (none loaded here; two already-deleted, two stripped in the same pass, FABRIC-3.6.md tasks 0.2/0.3). Second pass (same day): `fabric.4th`/`font.4th` **removed** from this list — relocated to `hestia/init.4th` (FABRIC-3.6.md tasks 1.6/1.7), Hera no longer loads either. Third pass (2026-09-22, FABRIC-3.6.md Phase 4 Stage E): `common:messaging.4th` + `MSG-CD-INIT` **removed** — the file itself is deleted (see "Deleted capsules" below); every FORTH-owned message type was cut over to kernel-Hermes first (Phase 3) |
|
||||
| 2050 | No | BOOT-BANNER call — separated so the banner block can be swapped without touching init logic |
|
||||
| 2051 | No | TRIPOD-TEST — 6 acceptance gates per TRIPOD.md. Dead EVENT-WAIT step replaced with HERMES-TICK liveness check (`3436d564`) |
|
||||
| 2052 | No | TRIPOD-TEST invocation block |
|
||||
@@ -350,7 +350,7 @@ three-architecture acceptance for the deletion: `logs/20260922-181141/amd64/`,
|
||||
Phase 4 entry for the full account, including one found-not-fixed collateral
|
||||
defect (`SEND-ELEVATE-REQUEST`, this file's own former caller into
|
||||
`zuse-eligibility.4th`'s `ELEVATE-GRANT`, is now unreachable — Captain Bob's
|
||||
2026-09-22 decision: leave it, Phase 8 PKI will build its own entrypoint).
|
||||
2026-09-22 decision: leave it, Phase 8 PKI will build its own entrypoint). Removed 2026-10-14: elevation was ruled not needed, and `zuse-eligibility.4th` (blocks 4021–4022), its C words and the eligibility list went with it (FABRIC-3.md §XXXVII).
|
||||
Former blocks 4100–4153 (ex-Artemis-gaps) are now UNASSIGNED — see Unassigned
|
||||
Ranges below. The per-block justification table this section used to carry
|
||||
(arena allocator ABI, message/channel field accessors, the VM-name routing
|
||||
|
||||
+1
-1
@@ -34,6 +34,6 @@ Each block is limited to 1024 bytes. Verify with `wc -c` before committing.
|
||||
## See also
|
||||
|
||||
- [`experiments/bare_metal/README.md`](../experiments/bare_metal/README.md) — DoE protocols and block namespace rules
|
||||
- [`docs/03-architecture/word-acl/DESIGN.md`](../docs/03-architecture/word-acl/DESIGN.md) — ACL system design
|
||||
- [`docs/reference/word-acl/DESIGN.md`](../docs/reference/word-acl/DESIGN.md) — ACL system design
|
||||
- [`tools/mkcapsule.c`](../tools/mkcapsule.c) — assembles capsules into `capsule_generated.c`
|
||||
- [Project root](../README.md)
|
||||
|
||||
+12
-36
@@ -498,47 +498,23 @@ Block 4854
|
||||
STARTUP-BANNER
|
||||
|
||||
Block 4856
|
||||
( Storage-attach ack builder. Hera sends "<dev-addr> )
|
||||
( HERA-BLK-ATTACH-REQ"; reply is "<dev-addr> <ok?> )
|
||||
( BLK-ATTACH-ACK" so identity birth only proceeds once )
|
||||
( storage is confirmed (repl.c's BLK-ATTACH-ACK). Bob, )
|
||||
( 2026-09-07. )
|
||||
CREATE ATTACH-ACK-BUF 64 ALLOT
|
||||
VARIABLE ATTACH-ACK-LEN
|
||||
: ACK-APPEND ( src-addr len -- )
|
||||
DUP >R
|
||||
ATTACH-ACK-BUF ATTACH-ACK-LEN @ +
|
||||
SWAP CMOVE
|
||||
ATTACH-ACK-LEN @ R> + ATTACH-ACK-LEN ! ;
|
||||
|
||||
Block 4857
|
||||
: ACK-APPEND-CHAR ( char -- )
|
||||
ATTACH-ACK-BUF ATTACH-ACK-LEN @ + C!
|
||||
ATTACH-ACK-LEN @ 1+ ATTACH-ACK-LEN ! ;
|
||||
: ACK-APPEND-NUM ( n -- )
|
||||
0 SWAP <# #S #> ACK-APPEND ;
|
||||
|
||||
Block 4858
|
||||
( HERA-BLK-ATTACH-REQ ( dev-addr -- ): VM-EXEC'd by MSG- )
|
||||
( DELIVER when Hera's request arrives. Runs BLK-ATTACH on )
|
||||
( Artemis's own dictionary, then replies to Hera via kernel- )
|
||||
( Hermes's KH-BLK-ATTACH-SEND (repl.c) -- FABRIC-3.6.md task )
|
||||
( 3.8 Stage C, FORTH Hermes no longer sees this message type. )
|
||||
( HERA-BLK-ATTACH-REQ, dev-addr -- : Hera's storage-attach )
|
||||
( request, VM-EXEC'd into Artemis. Runs BLK-ATTACH here, then )
|
||||
( replies with KH-BLK-ATTACH-SEND, dev-addr ok? -- sent? : )
|
||||
( the kernel writes the reply text for Hera itself, from the )
|
||||
( two numbers, for Artemis only -- so identity birth only )
|
||||
( proceeds once storage is confirmed. Until 2026-10-14 )
|
||||
( Artemis built that text here and the word sent any text )
|
||||
( from any VM, which Hera ran as Zuse: FABRIC-3.md SXXXVII. )
|
||||
: HERA-BLK-ATTACH-REQ ( dev-addr -- )
|
||||
0 ATTACH-ACK-LEN !
|
||||
DUP ACK-APPEND-NUM
|
||||
BL ACK-APPEND-CHAR
|
||||
DUP BLK-ATTACH ACK-APPEND-NUM
|
||||
DROP
|
||||
BL ACK-APPEND-CHAR
|
||||
S" BLK-ATTACH-ACK" ACK-APPEND
|
||||
ATTACH-ACK-BUF ATTACH-ACK-LEN @ KH-BLK-ATTACH-SEND DROP ;
|
||||
DUP BLK-ATTACH KH-BLK-ATTACH-SEND DROP ;
|
||||
|
||||
Block 4860
|
||||
( LOG-APPEND ( level ts msg-addr msg-u -- ) )
|
||||
( FABRIC-3.md SXXVI follow-on Step 4, 2026-09-13: real per-VM )
|
||||
( log persistence, reached via a sender's LOG-FLUSH/MSG-SEND )
|
||||
( round trip, or by hand at the console for a smoke test. )
|
||||
( log persistence, by hand at the console for a smoke test. )
|
||||
( LOG-FLUSH does not come through here: since 2026-10-14 a )
|
||||
( VM's records reach the ring in C, vm_log_buffer.c. )
|
||||
( Thin wrapper -- kernel-only (LOG-APPEND-RAW) (log_words.c/ )
|
||||
( log_region.c) does the real disk write; never calls )
|
||||
( log_message() (see log_region.c's own doc comment on why). )
|
||||
|
||||
@@ -15,7 +15,6 @@ Block 2049
|
||||
: VM-CHILDREN ( -- ) ." (none)" CR ;
|
||||
S" ACL.4th" EXEC
|
||||
S" block-acl.4th" EXEC
|
||||
S" zuse-eligibility.4th" EXEC
|
||||
S" lib.4th" EXEC
|
||||
( FABRIC-3.6.md Phase 4, Stage E: common:messaging.4th/ )
|
||||
( MSG-CD-INIT removed -- no longer exists, no longer needed. )
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
Block 8100
|
||||
( centre.4th -- what a node that births others needs. )
|
||||
( docs/v4.0.0/MESH.md 9a. Births follow v3: any node may )
|
||||
( birth on its own ports, and is its children's parent. )
|
||||
( The kernel's requests, by their numbers in manage.h: )
|
||||
-6 KERNEL-WORD NODE-ME -7 KERNEL-WORD NODE-BORN
|
||||
-8 KERNEL-WORD NODE-WIRE -9 KERNEL-WORD NODE-UNWIRE
|
||||
-13 KERNEL-WORD NODE-PARITY -14 KERNEL-WORD CAPSULE-OPEN
|
||||
-15 KERNEL-WORD CAPSULE-CELL -16 KERNEL-WORD CAPSULE-LINE
|
||||
-17 KERNEL-WORD NODE-CHILD -18 KERNEL-WORD NODE-PLACE
|
||||
( Text for another node is built in PAD. )
|
||||
VARIABLE (T#)
|
||||
: (T0) ( -- ) 0 (T#) ! ;
|
||||
: (TC) ( c -- ) PAD (T#) @ + C! 1 (T#) +! ;
|
||||
: (TS) ( baddr u -- )
|
||||
DUP IF 0 DO DUP I + C@ (TC) LOOP DROP ELSE DROP DROP THEN ;
|
||||
Block 8101
|
||||
: (TN) ( n -- ) 0 <# #S #> (TS) 32 (TC) ;
|
||||
: (T) ( -- baddr u ) PAD (T#) @ ;
|
||||
( The node being born: its number, its place, the port of )
|
||||
( this node that leads to it, its own port that leads here, )
|
||||
( and its personality: a capsule's name, or none. )
|
||||
VARIABLE (KID) VARIABLE (KID#) VARIABLE (KIDP)
|
||||
VARIABLE (KIDC) VARIABLE (PERS) VARIABLE (PERS#)
|
||||
: (FAIL) ( -- )
|
||||
." BIRTH: node " (KID#) @ . ." did not do as it was told" CR
|
||||
-1 NODE-ERROR ! ;
|
||||
: (TOLD) ( how -- ) 1 - IF (FAIL) THEN ;
|
||||
: (TELL) ( baddr u -- ) (KID#) @ SEND (KID#) @ AWAIT (TOLD) ;
|
||||
Block 8102
|
||||
( the system, a capsule of F18 code, cell by cell to its port )
|
||||
: (NUCLEUS) ( -- )
|
||||
S" v4:nucleus-64.f18" CAPSULE-OPEN 0= IF (FAIL) THEN
|
||||
BEGIN CAPSULE-CELL WHILE (KIDP) @ PORT! REPEAT DROP ;
|
||||
( a capsule of FORTH blocks, a line at a time )
|
||||
: (LINES) ( baddr u -- ) CAPSULE-OPEN 0= IF (FAIL) THEN
|
||||
BEGIN PAD CAPSULE-LINE DUP 0< 0= WHILE PAD SWAP (TELL) REPEAT
|
||||
DROP ;
|
||||
Block 8103
|
||||
( The nodes this one has had born: for each its number and )
|
||||
( the port of this node it is on. Sixteen at most. )
|
||||
CREATE (KIDS) 32 ALLOT VARIABLE (KIDS#) 0 (KIDS#) !
|
||||
: (KID@) ( i -- addr ) 2 * (KIDS) + ;
|
||||
: (NOTE) ( number port -- )
|
||||
(KIDS#) @ 16 < IF
|
||||
(KIDS#) @ (KID@) SWAP OVER 1+ ! ! 1 (KIDS#) +!
|
||||
ELSE DROP DROP THEN ;
|
||||
: (WHICH) ( number -- i | -1 )
|
||||
-1 SWAP (KIDS#) @ DUP IF 0 DO
|
||||
DUP I (KID@) @ = IF SWAP DROP I SWAP THEN
|
||||
LOOP ELSE DROP THEN DROP ;
|
||||
: (UNLIST) ( i -- )
|
||||
(KIDS#) @ 1- DUP (KIDS#) ! (KID@) DUP @ SWAP 1+ @
|
||||
ROT (KID@) SWAP OVER 1+ ! ! ;
|
||||
Block 8104
|
||||
( Who it is, where its printing goes, which of its ports )
|
||||
( leads to everything it is not told of, and who is there. )
|
||||
: (WHO) ( -- )
|
||||
(T0) (KID#) @ (TN) S" (ME) ! " (TS)
|
||||
(CONSOLE) @ (TN) S" (CONSOLE) ! " (TS)
|
||||
(KIDC) @ (TN) S" DEFAULT-ROUTE " (TS)
|
||||
(ME) @ (TN) (KIDC) @ (TN) S" NEIGHBOUR" (TS)
|
||||
(T) 0 (KIDP) @ SEND-ON (KID#) @ AWAIT (TOLD) ;
|
||||
Block 8105
|
||||
( number port childport baddr u -- place A NODE IS BORN, )
|
||||
( its port childport joined to this one's port: empty, then )
|
||||
( the system, FORTH-79, and its personality if u is not 0. )
|
||||
: BIRTH-AS
|
||||
(PERS#) ! (PERS) ! (KIDC) ! (KIDP) ! (KID#) !
|
||||
(KID#) @ NODE-BORN DUP 0< IF (FAIL) THEN (KID) !
|
||||
NODE-ME (KIDP) @ (KID) @ (KIDC) @ NODE-WIRE 0= IF (FAIL) THEN
|
||||
(NUCLEUS)
|
||||
(KID#) @ (KIDP) @ ROUTE (KID#) @ (KIDP) @ NEIGHBOUR (WHO)
|
||||
S" v4:forth79.4th" (LINES)
|
||||
(PERS#) @ IF (PERS) @ (PERS#) @ (LINES) THEN
|
||||
S" (SEAL)" (TELL)
|
||||
(KID) @ (KID#) @ NODE-PARITY
|
||||
(KID#) @ (KIDP) @ (NOTE)
|
||||
(KID) @ ;
|
||||
Block 8106
|
||||
( number port childport -- place a node with no capsule )
|
||||
: BIRTH 0 0 BIRTH-AS ;
|
||||
( Two outer nodes are joined: port 3 of X to port 4 of Y, )
|
||||
( and each is told the other is there. )
|
||||
VARIABLE (XP) VARIABLE (XN) VARIABLE (YP) VARIABLE (YN)
|
||||
: (X) ( place number -- ) (XN) ! (XP) ! ;
|
||||
: (Y) ( place number -- ) (YN) ! (YP) ! ;
|
||||
: (SAY) ( them port me -- ) (KID#) !
|
||||
(T0) OVER (TN) DUP (TN) S" ROUTE " (TS)
|
||||
SWAP (TN) (TN) S" NEIGHBOUR" (TS) (T) (TELL) ;
|
||||
: (JOIN) ( -- )
|
||||
(XP) @ 3 (YP) @ 4 NODE-WIRE 0= IF (FAIL) THEN
|
||||
(YN) @ 3 (XN) @ (SAY) (XN) @ 4 (YN) @ (SAY) ;
|
||||
Block 8107
|
||||
( n -- A UNIT: four outer nodes, n+1 to n+4, on ports 2 )
|
||||
( to 5 of this one, each by its own port 2, and joined in a )
|
||||
( square: 1-2, 2-4, 4-3, 3-1. )
|
||||
VARIABLE (U)
|
||||
VARIABLE (P1) VARIABLE (P2) VARIABLE (P3) VARIABLE (P4)
|
||||
: (N) ( k -- number ) (U) @ + ;
|
||||
: UNIT ( n -- ) (U) !
|
||||
1 (N) 2 2 BIRTH (P1) ! 2 (N) 3 2 BIRTH (P2) !
|
||||
3 (N) 4 2 BIRTH (P3) ! 4 (N) 5 2 BIRTH (P4) !
|
||||
(P1) @ 1 (N) (X) (P2) @ 2 (N) (Y) (JOIN)
|
||||
(P2) @ 2 (N) (X) (P4) @ 4 (N) (Y) (JOIN)
|
||||
(P4) @ 4 (N) (X) (P3) @ 3 (N) (Y) (JOIN)
|
||||
(P3) @ 3 (N) (X) (P1) @ 1 (N) (Y) (JOIN) ;
|
||||
Block 8108
|
||||
( n -- NODE n IS GONE: every node this one birthed is told, )
|
||||
( as from this one, and n leaves the list if it was there. )
|
||||
( The system calls this when it believes a GONE, through )
|
||||
( GONE-HOOK in quit.f18; Hera calls it from KILL. )
|
||||
: GONE-DOWN ( n -- )
|
||||
DUP (WHICH) DUP 0< IF DROP ELSE (UNLIST) THEN
|
||||
(KIDS#) @ DUP IF 0 DO DUP I (KID@) @ GONE LOOP
|
||||
ELSE DROP THEN DROP ;
|
||||
' GONE-DOWN (GONE-HOOK) !
|
||||
+28
-109
@@ -1,111 +1,30 @@
|
||||
Block 8000
|
||||
( hera.4th -- Hera: the node that has the others born and )
|
||||
( manages them. docs/v4.0.0/MESH.md sections 9 and 10. )
|
||||
( She asks whoever holds the fabric for a node, wires it, )
|
||||
( and sends it its capsules through the port that joins )
|
||||
( them. The unit rule is here and nowhere else: four outer )
|
||||
( nodes round a centre, an outer node wired only inside its )
|
||||
( unit. )
|
||||
( Text for another node is built in PAD. )
|
||||
VARIABLE (T#)
|
||||
: (T0) ( -- ) 0 (T#) ! ;
|
||||
: (TC) ( c -- ) PAD (T#) @ + C! 1 (T#) +! ;
|
||||
: (TS) ( baddr u -- )
|
||||
DUP IF 0 DO DUP I + C@ (TC) LOOP DROP ELSE DROP DROP THEN ;
|
||||
: (TN) ( n -- ) 0 <# #S #> (TS) 32 (TC) ;
|
||||
: (T) ( -- baddr u ) PAD (T#) @ ;
|
||||
Block 8001
|
||||
( The node being born: its place in the fabric, the number )
|
||||
( it is to have, and the port of this node that leads to it. )
|
||||
VARIABLE (KID) VARIABLE (KID#) VARIABLE (KIDP)
|
||||
: (FAIL) ( -- )
|
||||
." BIRTH: node " (KID#) @ . ." did not do as it was told" CR
|
||||
-1 NODE-ERROR ! ;
|
||||
: (TOLD) ( how -- ) 1 - IF (FAIL) THEN ;
|
||||
: (TELL) ( baddr u -- ) (KID#) @ SEND (KID#) @ AWAIT (TOLD) ;
|
||||
( the nucleus, a capsule of F18 code, cell by cell to its port )
|
||||
: (NUCLEUS) ( -- )
|
||||
S" v4:nucleus-64.f18" CAPSULE-OPEN 0= IF (FAIL) THEN
|
||||
BEGIN CAPSULE-CELL WHILE (KIDP) @ PORT! REPEAT DROP ;
|
||||
( a capsule of FORTH blocks, a line at a time )
|
||||
: (LINES) ( baddr u -- ) CAPSULE-OPEN 0= IF (FAIL) THEN
|
||||
BEGIN PAD CAPSULE-LINE DUP 0< 0= WHILE PAD SWAP (TELL) REPEAT
|
||||
DROP ;
|
||||
Block 8002
|
||||
( The nodes this one has had born: for each its number and )
|
||||
( its place in the fabric. Sixteen at most. )
|
||||
CREATE (KIDS) 32 ALLOT VARIABLE (KIDS#) 0 (KIDS#) !
|
||||
: (KID@) ( i -- addr ) 2 * (KIDS) + ;
|
||||
: (NOTE) ( number place -- )
|
||||
(KIDS#) @ 16 < IF
|
||||
(KIDS#) @ (KID@) SWAP OVER 1+ ! ! 1 (KIDS#) +!
|
||||
ELSE DROP DROP THEN ;
|
||||
( which of them has that number: its place in the list, or -1 )
|
||||
: (WHICH) ( number -- i | -1 )
|
||||
-1 SWAP (KIDS#) @ DUP IF 0 DO
|
||||
DUP I (KID@) @ = IF SWAP DROP I SWAP THEN
|
||||
LOOP ELSE DROP THEN DROP ;
|
||||
Block 8003
|
||||
( who it is, where its printing goes, and that everything )
|
||||
( not told of goes by its port 2, where this node is )
|
||||
: (WHO) ( -- )
|
||||
(T0) (KID#) @ (TN) S" (ME) ! " (TS)
|
||||
(CONSOLE) @ (TN) S" (CONSOLE) ! 2 DEFAULT-ROUTE " (TS)
|
||||
(ME) @ (TN) S" 2 NEIGHBOUR" (TS)
|
||||
(T) 0 (KIDP) @ SEND-ON (KID#) @ AWAIT (TOLD) ;
|
||||
( number port -- place A NODE IS BORN on that port of )
|
||||
( this one: empty, then the nucleus, then FORTH-79. )
|
||||
: BIRTH ( number port -- place )
|
||||
(KIDP) ! (KID#) !
|
||||
NODE-BORN DUP 0< IF (FAIL) THEN (KID) !
|
||||
NODE-ME (KIDP) @ (KID) @ 2 NODE-WIRE 0= IF (FAIL) THEN
|
||||
(NUCLEUS)
|
||||
(KID#) @ (KIDP) @ ROUTE (KID#) @ (KIDP) @ NEIGHBOUR (WHO)
|
||||
S" v4:forth79.4th" (LINES)
|
||||
Block 8004
|
||||
S" (SEAL)" (TELL)
|
||||
(KID) @ (KID#) @ NODE-PARITY
|
||||
(KID#) @ (KID) @ (NOTE)
|
||||
(KID) @ ;
|
||||
( Two outer nodes are joined: port 3 of X to port 4 of Y, )
|
||||
( and each is told the other is there. )
|
||||
VARIABLE (XP) VARIABLE (XN) VARIABLE (YP) VARIABLE (YN)
|
||||
: (X) ( place number -- ) (XN) ! (XP) ! ;
|
||||
: (Y) ( place number -- ) (YN) ! (YP) ! ;
|
||||
: (SAY) ( them port me -- ) (KID#) !
|
||||
(T0) OVER (TN) DUP (TN) S" ROUTE " (TS)
|
||||
SWAP (TN) (TN) S" NEIGHBOUR" (TS) (T) (TELL) ;
|
||||
: (JOIN) ( -- )
|
||||
(XP) @ 3 (YP) @ 4 NODE-WIRE 0= IF (FAIL) THEN
|
||||
(YN) @ 3 (XN) @ (SAY) (XN) @ 4 (YN) @ (SAY) ;
|
||||
Block 8005
|
||||
( n -- A UNIT: four outer nodes, n+1 to n+4, on ports 2 )
|
||||
( to 5 of this one, and joined in a square: 1-2, 2-4, 4-3, )
|
||||
( 3-1. The corners across from each other are not wired: )
|
||||
( what one sends the other goes by this node. )
|
||||
VARIABLE (U)
|
||||
VARIABLE (P1) VARIABLE (P2) VARIABLE (P3) VARIABLE (P4)
|
||||
: (N) ( k -- number ) (U) @ + ;
|
||||
: UNIT ( n -- ) (U) !
|
||||
1 (N) 2 BIRTH (P1) ! 2 (N) 3 BIRTH (P2) !
|
||||
3 (N) 4 BIRTH (P3) ! 4 (N) 5 BIRTH (P4) !
|
||||
(P1) @ 1 (N) (X) (P2) @ 2 (N) (Y) (JOIN)
|
||||
(P2) @ 2 (N) (X) (P4) @ 4 (N) (Y) (JOIN)
|
||||
(P4) @ 4 (N) (X) (P3) @ 3 (N) (Y) (JOIN)
|
||||
(P3) @ 3 (N) (X) (P1) @ 1 (N) (Y) (JOIN) ;
|
||||
Block 8006
|
||||
( n -- KILL: node n is removed, whatever it was doing. )
|
||||
( This node forgets the way to it, and every other node it )
|
||||
( has had born is told that n is gone: each forgets its way )
|
||||
( to n, and one that is waiting for n's answer stops. )
|
||||
( docs/v4.0.0/MESH.md 7b.5. As v3's KILL, by number. )
|
||||
: (UNLIST) ( i -- )
|
||||
(KIDS#) @ 1- DUP (KIDS#) ! (KID@) DUP @ SWAP 1+ @
|
||||
ROT (KID@) SWAP OVER 1+ ! ! ;
|
||||
( hera.4th -- what is Hera's alone, beside centre.4th, which )
|
||||
( she loads first. docs/v4.0.0/MESH.md 9a. She decides )
|
||||
( which nodes there are and which are awake: KILL, PAUSE and )
|
||||
( RESUME, by number, through the kernel's registry, are hers )
|
||||
( and no other node's, as v3's KILL is Hera's alone. )
|
||||
-10 KERNEL-WORD NODE-SLEEP -11 KERNEL-WORD NODE-WAKE
|
||||
-12 KERNEL-WORD NODE-KILL
|
||||
( n -- n flag a node there is, and not Hera herself )
|
||||
: (THERE?) DUP (ME) @ = 0= OVER NODE-PLACE 0< 0= AND ;
|
||||
: (NO-NODE) ( n -- ) DROP ." no such node" CR -1 NODE-ERROR ! ;
|
||||
( n -- KILL: node n is removed, whatever it was doing; this )
|
||||
( node forgets the way to it, and GONE goes down the graph. )
|
||||
: KILL ( n -- )
|
||||
DUP (WHICH) DUP 0< IF
|
||||
DROP DROP ." KILL: no such node" CR -1 NODE-ERROR ! THEN
|
||||
DUP (KID@) 1+ @ NODE-KILL (UNLIST)
|
||||
DUP NO-ROUTE
|
||||
(KIDS#) @ DUP IF 0 DO DUP I (KID@) @ GONE LOOP ELSE DROP THEN
|
||||
DROP ;
|
||||
(THERE?) 0= IF ." KILL: " (NO-NODE) THEN
|
||||
DUP NODE-KILL DUP NO-ROUTE GONE-DOWN ;
|
||||
Block 8001
|
||||
: PAUSE ( n -- )
|
||||
(THERE?) 0= IF ." PAUSE: " (NO-NODE) THEN NODE-SLEEP ;
|
||||
: RESUME ( n -- )
|
||||
(THERE?) 0= IF ." RESUME: " (NO-NODE) THEN NODE-WAKE ;
|
||||
( n -- a unit is removed: each of n's children, then n )
|
||||
: UNIT-KILL ( n -- )
|
||||
BEGIN DUP 0 NODE-CHILD ?DUP WHILE KILL REPEAT KILL ;
|
||||
( n -- A SECOND CENTRE, node n, from its port 6 to Hera's )
|
||||
( port 6, given centre.4th; it births its unit, n+1 to n+4. )
|
||||
: CENTRE ( n -- )
|
||||
DUP 6 6 S" v4:centre.4th" BIRTH-AS DROP
|
||||
5 1 DO DUP I + 6 ROUTE LOOP DROP
|
||||
(T0) (KID#) @ (TN) S" UNIT" (TS) (T) (TELL) ;
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,145 @@
|
||||
\ dir.f18 -- the ROM's directives, and the end of the system's source.
|
||||
\
|
||||
\ What the prebuilt nucleus's mkimage.c (gone) and text.c's header did in C
|
||||
\ is said in the source with
|
||||
\ these (MACHINE.md, the ROM's language). Each is a machine notion -- an
|
||||
\ address, a cell, a value -- and none is FORTH.
|
||||
\ constant NAME VALUE NAME is the number VALUE
|
||||
\ set NAME VALUE an assembler variable: may be set again
|
||||
\ #, VALUE one cell of data at the next word address
|
||||
\ ", TOKEN TOKEN, whatever its characters, as a counted string
|
||||
\ store ADDR VALUE ADDR := VALUE, anywhere in RAM
|
||||
\ start NAME the end: every branch must have its target; the
|
||||
\ tables the ROM used are cleared; then NAME runs
|
||||
\ A VALUE is a number, a constant, a set variable, CONST+N, here (the next
|
||||
\ word address) or &NAME of a word already defined.
|
||||
|
||||
\ ( -- v 1 | 0 0 ) the token as a VALUE; "not a value" if it is none
|
||||
: (VALUE)
|
||||
(NUMBER) if NN
|
||||
-if NUMOK drop drop ERR-BIG (FAIL) 0 0 ;
|
||||
NUMOK: drop 1 ;
|
||||
NN: drop drop
|
||||
&(RESERVED) (WALK) 8 xor if HR drop
|
||||
0 (CHAR@) 38 xor if AMPV drop
|
||||
(FIND) if NOSYM
|
||||
dup 2 + a! @ 2 xor if CV drop
|
||||
dup 2 + a! @ 4 xor if CV drop
|
||||
drop jump BAD
|
||||
CV: drop 3 + a! @ 1 ;
|
||||
NOSYM: drop
|
||||
(CONST+N) if BAD0 ;
|
||||
BAD0: drop drop
|
||||
BAD: ERR-VALUE (FAIL) 0 0 ;
|
||||
HR: drop (LABEL) 1 ;
|
||||
AMPV: drop (TOKN) a! @ -1 + if ONEV drop
|
||||
(TOK-SAVE) 1 (MLEN) a! @ -1 + (TOK-SUB)
|
||||
(FIND) if BADA
|
||||
dup 2 + a! @ 1 xor if OKA drop drop jump BADA0
|
||||
OKA: drop 3 + a! @ 1 ;
|
||||
BADA: drop
|
||||
BADA0: ERR-AMP (FAIL) 0 0 ;
|
||||
ONEV: drop jump BAD
|
||||
|
||||
\ ( -- v 1 | 0 0 ) the next token as a VALUE
|
||||
: (NEXT-VALUE)
|
||||
(NEXT-TOKEN) if MISS drop jump (VALUE)
|
||||
MISS: drop (MISSING) 0 0 ;
|
||||
|
||||
: (H-CONSTANT)
|
||||
(IN-MACRO?) if OK drop ;
|
||||
OK: drop
|
||||
(NEXT-TOKEN) if MISS drop
|
||||
(TOK) (TSAVE) 16 (COPY)
|
||||
(NEXT-TOKEN) if MISS drop
|
||||
(NUMBER) if NAN
|
||||
-if NUM drop drop ERR-BIG jump (FAIL)
|
||||
NUM: drop (NAME-BACK) 2 jump (DEFINE)
|
||||
NAN: drop drop ERR-VALUE jump (FAIL)
|
||||
MISS: drop jump (MISSING)
|
||||
|
||||
: (H-SET)
|
||||
(IN-MACRO?) if OK drop ;
|
||||
OK: drop
|
||||
(NEXT-TOKEN) if MISS drop
|
||||
(TOK) (TSAVE) 16 (COPY)
|
||||
(NEXT-VALUE) if BADV drop
|
||||
(NAME-BACK) 4 jump (DEFINE)
|
||||
BADV: drop drop ;
|
||||
MISS: drop jump (MISSING)
|
||||
|
||||
\ here alone is not something to assemble: only a VALUE
|
||||
: (H-HERE) ERR-TARGET jump (FAIL)
|
||||
|
||||
: (H-CELL)
|
||||
(IN-MACRO?) if OK drop ;
|
||||
OK: drop
|
||||
(NEXT-VALUE) if BADV drop
|
||||
(LABEL) drop jump (EMIT)
|
||||
BADV: drop drop ;
|
||||
|
||||
: (H-STRING)
|
||||
(IN-MACRO?) if OK drop ;
|
||||
OK: drop
|
||||
(RAW-TOKEN) if MISS drop
|
||||
(LABEL) drop
|
||||
(TOKN) a! @ 4 + 2/ 2/ (T1) a! ! 0 (T2) a! !
|
||||
L: (T2) a! @ (T1) a! @ xor if D drop
|
||||
(T2) a! @ (TOK) + a! @ (EMIT)
|
||||
(T2) a! @ 1 + ! jump L
|
||||
D: drop ;
|
||||
\ text.c says "without a string, or one too long" for both: missing
|
||||
MISS: drop ERR-MISSING jump (FAIL)
|
||||
|
||||
\ store ADDR VALUE: ADDR must be in RAM, as text.c requires
|
||||
: (H-STORE)
|
||||
(IN-MACRO?) if OK drop ;
|
||||
OK: drop
|
||||
(NEXT-VALUE) if BADV drop (T1) a! !
|
||||
(NEXT-VALUE) if BADV drop
|
||||
(T1) a! @ -if LO
|
||||
drop drop ERR-RANGE jump (FAIL)
|
||||
LO: RAM-WORDS inv 1 + + -if HI
|
||||
drop (T1) a! @ b! !b ;
|
||||
HI: drop drop ERR-RANGE jump (FAIL)
|
||||
BADV: drop drop ;
|
||||
|
||||
\ ( -- ) clear the tables the ROM uses only while it assembles: the symbol
|
||||
\ table in dictionary space, the branches, labels and names in the block
|
||||
\ window, the saved token and macro body in the text input buffer
|
||||
: (CLEAR)
|
||||
DICT-W a! DICT-END DICT-W inv 1 + + -1 + FOR 0 !+ NEXT
|
||||
BUF0 a! 1023 FOR 0 !+ NEXT
|
||||
TIB-W a! 259 FOR 0 !+ NEXT
|
||||
0 (RECN) a! ! 0 (POOLN) a! ! 0 (NREF) a! ! 0 (NLAB) a! !
|
||||
0 (WNP) a! ! 0 (NFOR) a! ! 0 (RDEPTH) a! ! ;
|
||||
|
||||
\ start NAME: the system's source has ended; NAME, a word, is where it starts
|
||||
: (H-START)
|
||||
(IN-MACRO?) if OK drop ;
|
||||
OK: drop
|
||||
(NEXT-TOKEN) if MISS drop
|
||||
(TOK) (TSAVE) 16 (COPY)
|
||||
(END-WORD)
|
||||
(FAILED) a! @ if F0 drop ;
|
||||
F0: drop
|
||||
(NREF) a! @ if NOREF drop
|
||||
ERR-UNDEFINED (FAIL) (REFS) 1 + a! @ (ERRLINE) a! ! ;
|
||||
NOREF: drop
|
||||
(LABEL) drop
|
||||
(NAME-BACK)
|
||||
(FIND) if NOTW
|
||||
dup 2 + a! @ 1 xor if ISW drop drop jump NOTW0
|
||||
ISW: drop 3 + a! @ (T1) a! !
|
||||
\ nothing may follow start but blanks, comments and the ends of blobs,
|
||||
\ up to the end of all
|
||||
A1: (TOKEN) if A2
|
||||
drop ERR-AFTER jump (FAIL)
|
||||
A2: drop (FAILED) a! @ if A3 drop ;
|
||||
A3: drop (EOF) a! @ if A1 drop
|
||||
(CLEAR)
|
||||
0 DSTACK-REG a! ! 0 RSTACK-REG a! !
|
||||
(T1) a! @ push ;
|
||||
NOTW: drop
|
||||
NOTW0: ERR-START jump (FAIL)
|
||||
MISS: drop jump (MISSING)
|
||||
@@ -0,0 +1,125 @@
|
||||
\ in.f18 -- the ROM's input: characters from the console, and tokens.
|
||||
\
|
||||
\ The text the ROM assembles arrives at the console's receive registers,
|
||||
\ a character at a time. Each blob of it ends with a new line and FS (28,
|
||||
\ V4_ROM_BLOB_END), where a file ends for text.c: a comment still open there
|
||||
\ is an error, and (TOKEN) gives 0 there as at the end. The end of all of
|
||||
\ it is EOT (4), which the loader sends after the last blob. A token is what v4/src/text.c's next_token makes
|
||||
\ of the same text: blanks are space, tab, CR and LF; a token is at most 63
|
||||
\ characters; `\` as a whole token skips to the end of the line, and `(` as a
|
||||
\ whole token to the next `)`.
|
||||
\
|
||||
\ State, in the ROM's area of the memory map (MACHINE.md 2.1):
|
||||
\ (TOK) the token, as a counted string: its count byte, then its
|
||||
\ characters, four to a cell, low byte first, zero-padded --
|
||||
\ the form `",` lays down and (FIND) compares; 16 cells
|
||||
\ (TOKN) its length
|
||||
\ (PEEK) a character put back, plus one; 0: none
|
||||
\ (LINE) how many new lines have been read
|
||||
\ (EOF) non-zero once EOT has been read
|
||||
\ (FAILED) 0, or the code of the error that stopped the ROM
|
||||
\ (ERRLINE) (LINE) when it failed
|
||||
\ (RAW) 1 while a token is read raw: ( and \ are then names
|
||||
\ Every routine here uses A.
|
||||
|
||||
\ ( -- c ) wait for a character, then take it
|
||||
: (KEY)
|
||||
W: CONSOLE-STATUS a! @ if Z drop CONSOLE-RX a! @ ;
|
||||
Z: drop jump W
|
||||
|
||||
\ ( -- c ) the character put back, if there is one; else the next
|
||||
: (GETC)
|
||||
(PEEK) a! @ if NONE 0 ! -1 + ;
|
||||
NONE: drop jump (KEY)
|
||||
|
||||
\ ( c -- ) put a character back, to be the next one read
|
||||
: (BACK) 1 + (PEEK) a! ! ;
|
||||
|
||||
\ ( -- ) one more new line
|
||||
: (LF+) (LINE) a! @ 1 + ! ;
|
||||
|
||||
\ ( code -- ) stop with an error, noting the line
|
||||
: (FAIL) (FAILED) a! ! (LINE) a! @ (ERRLINE) a! ! ;
|
||||
|
||||
\ ( -- ) "missing": a name, a target or a value was wanted and there is
|
||||
\ none -- unless an error came first, a token too long or a comment not
|
||||
\ closed, which stands, as text.c's first error does
|
||||
: (MISSING)
|
||||
(FAILED) a! @ if M drop ;
|
||||
M: drop ERR-MISSING jump (FAIL)
|
||||
|
||||
\ ( c -- ) one more character of the token: byte (TOKN)+1 of (TOK), into
|
||||
\ a cell whose byte there is still zero
|
||||
: (PUT)
|
||||
(TOKN) a! @ 1 +
|
||||
dup 2/ 2/ (TOK) + push
|
||||
3 and
|
||||
S: if SD push 2* 2* 2* 2* 2* 2* 2* 2* pop -1 + jump S
|
||||
SD: drop pop a! @ xor !
|
||||
(TOKN) a! @ 1 + ! ;
|
||||
|
||||
\ ( i -- c ) character i of the token, from 0
|
||||
: (CHAR@)
|
||||
1 + dup 2/ 2/ (TOK) + a! @
|
||||
push 3 and
|
||||
S: if SD -1 + pop 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ push jump S
|
||||
SD: drop pop 255 and ;
|
||||
|
||||
\ ( -- len ) the next token into (TOK), its length into (TOKN). 0: the end
|
||||
\ of a blob, the end of all ((EOF) set), or an error, which is in (FAILED).
|
||||
: (TOKEN)
|
||||
(EOF) a! @ if GO drop 0 ;
|
||||
GO: drop
|
||||
SKIP: (GETC)
|
||||
dup 4 xor if END
|
||||
drop dup 28 xor if BLOB
|
||||
drop dup 10 xor if NL
|
||||
drop dup 32 xor if SP
|
||||
drop dup 9 xor if SP
|
||||
drop dup 13 xor if SP
|
||||
drop 0 (TOKN) a! !
|
||||
(TOK) a! 15 FOR 0 !+ NEXT
|
||||
READ: (TOKN) a! @ 63 xor if LONG
|
||||
drop (PUT) (GETC)
|
||||
dup 4 xor if TEND
|
||||
drop dup 28 xor if TEND
|
||||
drop dup 10 xor if TEND
|
||||
drop dup 32 xor if TEND
|
||||
drop dup 9 xor if TEND
|
||||
drop dup 13 xor if TEND
|
||||
drop jump READ
|
||||
TEND: drop (BACK)
|
||||
(TOKN) a! @ (TOK) a! @ xor !
|
||||
(RAW) a! @ if COOKED drop (TOKN) a! @ ;
|
||||
COOKED: drop
|
||||
(TOKN) a! @ 1 xor if ONE
|
||||
drop (TOKN) a! @ ;
|
||||
ONE: drop 0 (CHAR@)
|
||||
dup 92 xor if BSL
|
||||
drop dup 40 xor if PAREN
|
||||
drop drop 1 ;
|
||||
BSL: drop drop
|
||||
B1: (GETC)
|
||||
dup 10 xor if BEND
|
||||
drop dup 28 xor if BEND
|
||||
drop dup 4 xor if BEND
|
||||
drop drop jump B1
|
||||
BEND: drop (BACK) jump SKIP
|
||||
PAREN: drop drop
|
||||
P1: (GETC)
|
||||
dup 41 xor if PCLOSE
|
||||
drop dup 10 xor if PNL
|
||||
drop dup 28 xor if PEOF
|
||||
drop dup 4 xor if PEOF
|
||||
drop drop jump P1
|
||||
PNL: drop drop (LF+) jump P1
|
||||
PCLOSE: drop drop jump SKIP
|
||||
PEOF: drop drop ERR-COMMENT (FAIL) 0 ;
|
||||
END: drop drop 1 (EOF) a! ! 0 ;
|
||||
BLOB: drop drop 0 ;
|
||||
NL: drop drop (LF+) jump SKIP
|
||||
SP: drop drop jump SKIP
|
||||
LONG: drop drop ERR-TOO-LONG (FAIL) 0 ;
|
||||
|
||||
\ ( -- len ) the next token, raw: ( and \ are names, not comments
|
||||
: (RAW-TOKEN) 1 (RAW) a! ! (TOKEN) 0 (RAW) a! ! ;
|
||||
@@ -0,0 +1,54 @@
|
||||
\ main.f18 -- the ROM's entry table.
|
||||
\
|
||||
\ docs/v4.0.0/MACHINE.md 2.1. The ROM is shared code: a payload calls its
|
||||
\ routines through this table and never to an address inside the ROM, so a
|
||||
\ rebuilt ROM breaks no payload. It is at the ROM's base, one jump a word,
|
||||
\ in a fixed order that only ever grows at its end. Entry i is at the ROM's
|
||||
\ base plus i. Entries 0-5 are the shared math, the same in a mesh node's
|
||||
\ ROM (mesh.f18, MACHINE.md 2.2). DATASHEET-F18.md lists each routine's
|
||||
\ stack effect.
|
||||
|
||||
: (ENTRIES)
|
||||
(MATH-ENTRIES) \ 0-5 the shared math (math.f18; v4/rom_entries.h)
|
||||
jump (KEY) \ 6 ( -- c )
|
||||
jump (TOKEN) \ 7 ( -- len )
|
||||
jump (NUMBER) \ 8 ( -- n flag )
|
||||
jump (FIND) \ 9 ( -- rec | 0 )
|
||||
jump (DEFINE) \ 10 ( value kind -- )
|
||||
jump (OPCODE) \ 11 ( -- op | -1 )
|
||||
jump (OP) \ 12 ( op -- )
|
||||
jump (LIT) \ 13 ( v -- )
|
||||
jump (BRANCH) \ 14 ( op target -- )
|
||||
jump (BRANCH>) \ 15 ( op -- ref )
|
||||
jump (RESOLVE) \ 16 ( ref target -- )
|
||||
jump (LABEL) \ 17 ( -- addr )
|
||||
jump (ROM) \ 18 the ROM itself: where the machine starts (V4_ROM_START)
|
||||
|
||||
\ ( -- ) the state the ROM begins from: code goes to ORIGIN, nothing read,
|
||||
\ nothing defined
|
||||
: (INIT)
|
||||
(CLEAR)
|
||||
ORIGIN (HERE) a! ! 0 (CUR) a! ! 0 (SLOT) a! ! 0 (NLIT) a! !
|
||||
0 (FAILED) a! ! 0 (ERRLINE) a! ! 0 (LINE) a! ! 0 (EOF) a! !
|
||||
0 (PEEK) a! ! 0 (RAW) a! ! ;
|
||||
|
||||
\ the ROM: assemble the system's source from the console, blob by blob,
|
||||
\ until its start runs it; on an error, stop at (ROM-FAILED) with the error's code in
|
||||
\ (FAILED) and its line in (ERRLINE), for the loader to report
|
||||
: (ROM)
|
||||
(INIT)
|
||||
L: (NEXT-TOKEN) if END drop
|
||||
(ONE)
|
||||
(FAILED) a! @ if L0 drop jump (ROM-FAILED)
|
||||
L0: drop jump L
|
||||
END: drop
|
||||
(FAILED) a! @ if NS drop jump (ROM-FAILED)
|
||||
NS: drop (EOF) a! @ if BLOB drop ERR-NO-START (FAIL) jump (ROM-FAILED)
|
||||
\ the end of a blob: the word being assembled ends, as at the end of a
|
||||
\ file for text.c
|
||||
BLOB: drop (END-WORD)
|
||||
(FAILED) a! @ if L0 drop jump (ROM-FAILED)
|
||||
|
||||
: (ROM-FAILED)
|
||||
H: jump H
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
\ math.f18 -- the ROM's shared math (docs/v4.0.0/MACHINE.md 2.2).
|
||||
\
|
||||
\ Six routines a payload calls through the ROM's entry table, as a GA144
|
||||
\ application calls its node ROM's multiply and divide steps, and their
|
||||
\ helpers. Both ROMs carry them: the host node's and a mesh node's. They
|
||||
\ were the system's (capsules/v4/sys: core.f18, numout.f18, qmath.f18) and
|
||||
\ do exactly what they did there; the system's words of those names now call
|
||||
\ these. No names, no headers, no FORTH.
|
||||
\
|
||||
\ Constants from the map (tools/mkmap.c): N-1 NODE-ERROR MSB MAXHI 2N+15
|
||||
\ N-18 N-17, and (Q/), Q./'s five scratch cells, fixed in the memory map
|
||||
\ (MACHINE.md 2.1).
|
||||
\
|
||||
\ ERRORS. Q./ by zero leaves the result D-11 gives and stores 11, "Division
|
||||
\ by zero", into NODE-ERROR (D-18).
|
||||
|
||||
macro SWAP over push push drop pop pop endmacro
|
||||
macro - push inv pop + inv endmacro \ x y -- x-y
|
||||
macro NIP push drop pop endmacro
|
||||
macro ROT push SWAP pop SWAP endmacro
|
||||
macro OR over inv and xor endmacro
|
||||
|
||||
\ ( u1 u2 -- ulo uhi ) entry 0
|
||||
: (UM*)
|
||||
over 1 and inv 1 + over 2/ and \ u1 u2 t0 t0 = u2 2/ if u1 odd
|
||||
over a! N-1 push \ A: u2 R: loop count
|
||||
push over 2/ pop \ u1 u2 s t0 s = u1 2/
|
||||
L: +* unext \ u1 u2 s hi A: lo
|
||||
push drop pop \ u1 u2 hi
|
||||
2* a -if L0 drop 1 + jump L1 L0: drop L1: push
|
||||
over -if L2 drop dup jump L3 L2: drop 0 L3: push
|
||||
dup -if L4 drop over 1 and jump L5 L4: drop 0 L5:
|
||||
pop + pop + push
|
||||
and 1 and a 2* + pop ;
|
||||
|
||||
\ ( ulo uhi ud -- urem uquot ) entry 1. One step a bit, the divisor in
|
||||
\ A. Exact for uhi < ud.
|
||||
: (UM/MOD)
|
||||
a! N-1 FOR
|
||||
-if L0
|
||||
2* over -if L1 drop 1 + jump L2
|
||||
L1: drop L2: push 2* pop
|
||||
jump SUB
|
||||
L0:
|
||||
2* over -if L3 drop 1 + jump L4
|
||||
L3: drop L4: push 2* pop
|
||||
dup a xor -if L5
|
||||
drop -if NOSUB jump SUB
|
||||
L5: drop dup inv a + inv -if L6
|
||||
drop jump NOSUB
|
||||
L6: push drop pop jump SETBIT
|
||||
SUB: inv a + inv
|
||||
SETBIT: push 1 + pop
|
||||
NOSUB:
|
||||
NEXT
|
||||
over push push drop pop pop ;
|
||||
|
||||
\ ( d1 d2 -- d3 ) entry 2
|
||||
: (D+)
|
||||
push over push push drop pop \ al bl R: bh ah
|
||||
over over xor -if L1
|
||||
drop + -if C1 jump C0
|
||||
L1: drop over -if L2
|
||||
drop + jump C1
|
||||
L2: drop +
|
||||
C0: pop pop + ;
|
||||
C1: pop pop + 1 + ;
|
||||
|
||||
\ ( d -- -d ) entry 3
|
||||
: (DNEGATE)
|
||||
inv over if L1 drop push inv 1 + pop ;
|
||||
L1: drop 1 + ;
|
||||
|
||||
\ ( q -- n ) the system's Q.TO-INT, which Q.* needs
|
||||
: (Q>INT) push a! 0 pop 15 FOR +* UNEXT drop drop a ;
|
||||
|
||||
\ ( a b -- c ) entry 4
|
||||
: (Q.*)
|
||||
SWAP push over over (UM*) drop
|
||||
push push over pop
|
||||
-if L1 SWAP jump L2 L1: SWAP drop 0 L2:
|
||||
pop SWAP - push
|
||||
push over pop (UM*) pop +
|
||||
ROT pop dup push
|
||||
over -if L3 drop dup jump L4 L3: drop 0 L4:
|
||||
push (UM*) pop - (D+)
|
||||
ROT pop (UM*)
|
||||
SWAP push 0 (D+) pop
|
||||
push over pop SWAP (Q>INT) push (Q>INT) pop SWAP ;
|
||||
|
||||
: (QERR11) NODE-ERROR b! 11 !b ;
|
||||
|
||||
: (D2*C) ( lo hi cin -- lo' hi' cout )
|
||||
a! dup -if L1 drop 1 jump L2 L1: drop 0 L2: push
|
||||
over -if L3 drop 1 jump L4 L3: drop 0 L4:
|
||||
over + +
|
||||
push 2* a + pop pop ;
|
||||
|
||||
: (UQ/) ( a0 a1 b0 b1 -- q0 q1 )
|
||||
(Q/)+2 a! SWAP !+ ! (Q/) a! SWAP !+ ! 0 0 0
|
||||
2N+15 FOR
|
||||
push (Q/) a! @+ @ pop (D2*C)
|
||||
push (Q/)+1 a! ! (Q/) a! ! pop (D2*C)
|
||||
if CMP drop jump TAKE
|
||||
CMP: drop (Q/)+3 b! @b
|
||||
over over xor if EQH -if SAMEH
|
||||
drop drop -if NT1 jump TAKE NT1: jump NOTAKE
|
||||
SAMEH: drop over SWAP push inv pop + inv
|
||||
-if T2 drop jump NOTAKE T2: drop jump TAKE
|
||||
EQH: drop drop over (Q/)+2 b! @b
|
||||
over over xor -if SAMEL
|
||||
drop drop -if NT3 drop jump TAKEL NT3: drop jump NOTAKEL
|
||||
SAMEL: drop push inv pop + inv
|
||||
-if T4 drop jump NOTAKEL T4: drop jump TAKEL
|
||||
TAKEL: drop (Q/)+2 b! @b push inv pop + inv 0 1 jump END
|
||||
NOTAKEL: 0 jump END
|
||||
TAKE: push (Q/)+2 b! @b over over push inv pop + inv push
|
||||
over over xor -if SB drop NIP -if NB drop 1 jump BD NB: drop 0 jump BD
|
||||
SB: drop push inv pop + inv -if NB2 drop 1 jump BD NB2: drop 0
|
||||
BD: pop pop (Q/)+3 b! @b push inv pop + inv
|
||||
push SWAP pop SWAP - 1 jump END
|
||||
NOTAKE: 0
|
||||
END:
|
||||
NEXT
|
||||
push (Q/) a! @+ @ pop (D2*C) drop push push drop drop pop pop ;
|
||||
|
||||
: (Q./) ( a b -- q ) \ entry 5
|
||||
over over OR if ZERO drop
|
||||
push over pop SWAP over xor (Q/)+4 b! !b
|
||||
-if L1 (DNEGATE) L1: push push -if L2 (DNEGATE) L2: pop pop
|
||||
dup if CHK drop jump DIV
|
||||
CHK: drop over -131072 and if CHK2 drop jump DIV
|
||||
CHK2: drop push push dup pop dup push N-18 FOR 2* UNEXT
|
||||
over over xor -if SAME drop drop -if NOOV jump OV
|
||||
SAME: drop push inv pop + inv -if OV
|
||||
NOOV: drop pop pop jump DIV
|
||||
OV: drop drop drop pop pop drop drop
|
||||
(Q/)+4 b! @b -if OVP drop 0 MSB ; OVP: drop -1 MAXHI ;
|
||||
DIV: (UQ/) (Q/)+4 b! @b -if L3 drop (DNEGATE) ; L3: drop ;
|
||||
ZERO: drop drop drop
|
||||
over over OR if Z0 drop -if ZP drop drop 0 MSB jump (QERR11)
|
||||
ZP: drop drop -1 MAXHI jump (QERR11)
|
||||
Z0: drop jump (QERR11)
|
||||
@@ -0,0 +1,10 @@
|
||||
\ mesh.f18 -- a mesh node's ROM: its entry table (docs/v4.0.0/MACHINE.md 2.2).
|
||||
\
|
||||
\ A mesh node's ROM is the shared math (math.f18) and nothing else. It has
|
||||
\ no start: a mesh node at reset blocks on its ports and executes what
|
||||
\ arrives (docs/v4.0.0/MESH.md 4.2 and 5). Its entries are the first of
|
||||
\ the host ROM's, at the same numbers: (MATH-ENTRIES), which tools/mkmap.c
|
||||
\ writes from v4/include/v4/rom_entries.h.
|
||||
|
||||
: (ENTRIES)
|
||||
(MATH-ENTRIES)
|
||||
@@ -0,0 +1,67 @@
|
||||
\ num.f18 -- the ROM reads numbers.
|
||||
\
|
||||
\ (NUMBER) ( -- n flag ) looks at the token (TOKEN) read, as v4/src/text.c's
|
||||
\ number_of does: decimal with an optional leading `-`, or hexadecimal after
|
||||
\ `$` (a-f in either case). flag 1: the whole token is a number, n its
|
||||
\ value; 0: it is not one; -1: it is one, and does not fit a cell, read as
|
||||
\ signed or as unsigned. A token that has a character that is not a digit
|
||||
\ is not a number, even when its digits so far did not fit.
|
||||
\
|
||||
\ State, in the ROM's area (MACHINE.md 2.1): (NBASE) 10 or 16, (NNEG) 1 after
|
||||
\ a `-`, (NI) the next character, (NU) the value so far, unsigned, (NBIG) 1
|
||||
\ once it has not fitted. Width constants from the map: MSB, the cell's top
|
||||
\ bit; DEC-LIMIT, the largest unsigned cell over 10; DEC-NLAST, minus one
|
||||
\ more than its remainder; HEX-HIGH, the top four bits. Uses A. The
|
||||
\ token's characters are read with in.f18's (CHAR@).
|
||||
|
||||
\ ( c -- d | -1 ) the digit c is in the base, or -1
|
||||
: (DIGIT)
|
||||
dup -48 + -if D1 drop drop -1 ; \ below '0'
|
||||
D1: dup -10 + -if D2 drop push drop pop ; \ '0' .. '9'
|
||||
D2: drop drop
|
||||
(NBASE) a! @ 16 xor if HEXL drop drop -1 ;
|
||||
HEXL: drop
|
||||
dup -97 + -if LOW drop
|
||||
dup -65 + -if UP drop drop -1 ; \ below 'A'
|
||||
UP: dup -6 + -if BAD drop push drop pop 10 + ;
|
||||
LOW: dup -6 + -if BAD drop push drop pop 10 + ;
|
||||
BAD: drop drop drop -1 ;
|
||||
|
||||
\ ( d -- ) (NU) := (NU) * base + d, or (NBIG) := 1 if that does not fit
|
||||
: (ACC)
|
||||
(NU) a! @
|
||||
(NBASE) a! @ 16 xor if X16 drop
|
||||
dup -if DPOS drop jump DBIG \ the top bit is set
|
||||
DPOS: drop
|
||||
dup inv 1 + DEC-LIMIT + -if DLE drop jump DBIG
|
||||
DLE: if DEQ drop jump MUL10
|
||||
DEQ: drop over DEC-NLAST + -if DBIG3 drop jump MUL10
|
||||
DBIG3: drop
|
||||
DBIG: 1 (NBIG) a! ! drop drop ;
|
||||
MUL10: 2* dup 2* 2* + + (NU) a! ! ;
|
||||
X16: drop
|
||||
dup HEX-HIGH and if HOK drop jump DBIG
|
||||
HOK: drop 2* 2* 2* 2* + (NU) a! ! ;
|
||||
|
||||
\ ( -- n flag )
|
||||
: (NUMBER)
|
||||
0 (NBIG) a! ! 0 (NNEG) a! ! 0 (NU) a! ! 0 (NI) a! ! 10 (NBASE) a! !
|
||||
0 (CHAR@)
|
||||
dup 36 xor if HEX drop
|
||||
dup 45 xor if NEG drop drop jump DIGITS
|
||||
HEX: drop drop 16 (NBASE) a! ! 1 (NI) a! ! jump DIGITS
|
||||
NEG: drop drop 1 (NNEG) a! ! 1 (NI) a! !
|
||||
DIGITS: (NI) a! @ (TOKN) a! @ xor if NONE drop
|
||||
L: (NI) a! @ (CHAR@) (DIGIT)
|
||||
-if OK drop 0 0 ;
|
||||
OK: (ACC)
|
||||
(NI) a! @ 1 + dup ! (TOKN) a! @ xor if DONE drop jump L
|
||||
DONE: drop
|
||||
(NBIG) a! @ if FITS drop 0 -1 ;
|
||||
FITS: drop (NNEG) a! @ if POS drop
|
||||
(NU) a! @ -if NEGOK
|
||||
MSB xor if EXACT drop 0 -1 ;
|
||||
EXACT: drop MSB 1 ;
|
||||
NEGOK: inv 1 + 1 ;
|
||||
POS: drop (NU) a! @ 1 ;
|
||||
NONE: drop 0 0 ;
|
||||
@@ -0,0 +1,140 @@
|
||||
\ pack.f18 -- the ROM's slot packer: how code is laid down.
|
||||
\
|
||||
\ The rules are v4/src/asm.c's, with text.c's branch placement
|
||||
\ (DATASHEET-F18.md section 6):
|
||||
\ - opcodes fill slots 0 .. 5 left to right; a full word is written out and
|
||||
\ a new one begun, unused slots padded with nop
|
||||
\ - a literal is @p in a slot and its value in the word after the
|
||||
\ instruction word, several in the order they were given
|
||||
\ - ; and ex end the word: nothing after them executes
|
||||
\ - a branch ends the word, the bits to its right being its address; it is
|
||||
\ put only in a slot that reaches the whole address space (ADDR-TOP),
|
||||
\ otherwise in a new word; a target it cannot reach is "does not fit"
|
||||
\ This is the code generator of whatever language is built on the machine
|
||||
\ (MACHINE.md 2.1). State, in the ROM's area: (HERE) the next word address,
|
||||
\ (CUR) the word being built, (SLOT) its next slot, (LITS) the (NLIT)
|
||||
\ literals it owes. (PI) (RS) (RN) are working cells. Uses A and B.
|
||||
|
||||
\ ( op -- f ) 1 if op is a branch: jump call next if -if
|
||||
: (BRANCH-OP?)
|
||||
dup -2 + if Y drop dup -3 + if Y drop dup -5 + if Y drop
|
||||
dup -6 + if Y drop dup -7 + if Y drop drop 0 ;
|
||||
Y: drop drop 1 ;
|
||||
|
||||
\ ( s -- m ) the address bits a branch in slot s replaces
|
||||
: (MASK)
|
||||
if S0 -1 + if S1 -1 + if S2 -1 + if S3 -1 + if S4 drop 3 ;
|
||||
S0: drop $7FFFFFF ;
|
||||
S1: drop $3FFFFF ;
|
||||
S2: drop $1FFFF ;
|
||||
S3: drop $FFF ;
|
||||
S4: drop $7F ;
|
||||
|
||||
\ ( w s -- op ) the opcode in slot s of the instruction word w
|
||||
: (SLOT-OP)
|
||||
dup 2* 2* + inv 1 + 27 +
|
||||
S: if SD push 2/ pop -1 + jump S
|
||||
SD: drop 31 and ;
|
||||
|
||||
\ ( op -- ) op into the next slot
|
||||
: (PUT-OP)
|
||||
(SLOT) a! @ dup 2* 2* + inv 1 + 27 +
|
||||
S: if SD push 2* pop -1 + jump S
|
||||
SD: drop (CUR) a! @ xor !
|
||||
(SLOT) a! @ 1 + ! ;
|
||||
|
||||
\ ( v -- ) v at (HERE), which then moves on; past RAM, "does not fit"
|
||||
: (EMIT)
|
||||
(HERE) a! @ dup RAM-WORDS inv 1 + + -if FULL
|
||||
drop b! !b (HERE) a! @ 1 + ! ;
|
||||
FULL: drop drop drop ERR-FIT jump (FAIL)
|
||||
|
||||
\ ( -- ) write out the word being built, padded with nop, then its literals
|
||||
: (FLUSH)
|
||||
(SLOT) a! @ if NONE drop
|
||||
P: (SLOT) a! @ 6 xor if PADDED drop 28 (PUT-OP) jump P
|
||||
PADDED: drop
|
||||
(CUR) a! @ (EMIT)
|
||||
0 (PI) a! !
|
||||
L: (PI) a! @ (NLIT) a! @ xor if LD drop
|
||||
(PI) a! @ (LITS) + a! @ (EMIT)
|
||||
(PI) a! @ 1 + ! jump L
|
||||
LD: drop
|
||||
0 (CUR) a! ! 0 (SLOT) a! ! 0 (NLIT) a! ! ;
|
||||
NONE: drop ;
|
||||
|
||||
\ ( op -- ) an opcode that is neither a branch nor @p
|
||||
: (OP)
|
||||
dup -32 + -if BAD
|
||||
drop dup 8 xor if BAD
|
||||
drop dup (BRANCH-OP?) if GOOD
|
||||
BAD: drop drop ERR-OPCODE jump (FAIL)
|
||||
GOOD: drop
|
||||
dup (PUT-OP)
|
||||
if CLOSE
|
||||
-1 + if CLOSE
|
||||
drop (SLOT) a! @ 6 xor if CLOSE drop ;
|
||||
CLOSE: drop jump (FLUSH)
|
||||
|
||||
\ ( v -- ) @p and its value
|
||||
: (LIT)
|
||||
(NLIT) a! @ (LITS) + b! !b
|
||||
(NLIT) a! @ 1 + !
|
||||
8 (PUT-OP)
|
||||
(SLOT) a! @ 6 xor if FL drop ;
|
||||
FL: drop jump (FLUSH)
|
||||
|
||||
\ ( -- ) text.c's place_branch: begin a new word unless the next slot
|
||||
\ reaches the whole address space
|
||||
: (PLACE)
|
||||
(SLOT) a! @ if NONE
|
||||
dup -4 + -if NEW drop
|
||||
(MASK) ADDR-TOP inv 1 + + -if KEEP drop jump (FLUSH)
|
||||
KEEP: drop ;
|
||||
NEW: drop drop jump (FLUSH)
|
||||
NONE: drop ;
|
||||
|
||||
\ ( -- addr ) end the word being built; the next word address
|
||||
: (LABEL) (FLUSH) (HERE) a! @ ;
|
||||
|
||||
\ ( op -- ref ) a branch whose target comes later: ref is the word it is in
|
||||
: (BRANCH>)
|
||||
dup (BRANCH-OP?) if BAD drop
|
||||
(PLACE)
|
||||
(SLOT) a! @ -4 + -if FL drop jump GO
|
||||
FL: drop (FLUSH)
|
||||
GO: (HERE) a! @ push
|
||||
(PUT-OP)
|
||||
6 (SLOT) a! !
|
||||
(FLUSH) pop ;
|
||||
BAD: drop drop ERR-OPCODE (FAIL) 0 ;
|
||||
|
||||
\ ( ref target -- ) give the branch in the word at ref its target. The
|
||||
\ branch is the first branch opcode in the word; the literals before it are
|
||||
\ what P has passed when it executes. A word with no branch in slots
|
||||
\ 0 .. 3 is not a ref, and is refused.
|
||||
: (RESOLVE)
|
||||
(FAILED) a! @ if GO drop drop drop ;
|
||||
GO: drop
|
||||
0 (RS) a! ! 0 (RN) a! !
|
||||
L: (RS) a! @ -4 + -if BADREF drop
|
||||
over a! @ (RS) a! @ (SLOT-OP)
|
||||
dup (BRANCH-OP?) if NB drop drop jump FOUND
|
||||
NB: drop 8 xor if ISLIT drop jump NXT
|
||||
ISLIT: drop (RN) a! @ 1 + !
|
||||
NXT: (RS) a! @ 1 + ! jump L
|
||||
BADREF: jump (NOB)
|
||||
FOUND:
|
||||
over 1 + (RN) a! @ +
|
||||
over xor (RS) a! @ (MASK) inv and
|
||||
if OKR drop drop drop ERR-FIT jump (FAIL)
|
||||
OKR: drop
|
||||
(RS) a! @ (MASK) and
|
||||
over a! @ (RS) a! @ (MASK) inv and
|
||||
xor over a! ! drop ;
|
||||
|
||||
\ (a word with no branch in slots 0 .. 3 is not a ref: refused)
|
||||
: (NOB) drop drop drop ERR-FIT jump (FAIL)
|
||||
|
||||
\ ( op target -- ) a branch to a known target
|
||||
: (BRANCH) push (BRANCH>) pop jump (RESOLVE)
|
||||
@@ -0,0 +1,158 @@
|
||||
\ sym.f18 -- the ROM's symbol table.
|
||||
\
|
||||
\ A name the ROM assembles is given a kind and a value: 1 a word (its
|
||||
\ address), 2 a constant, 3 a macro, 4 a set variable. Kind 0 is a name
|
||||
\ only branched to so far: a placeholder that the forward branches to it
|
||||
\ wait on (word.f18), which (DEFINE) fills in. The rules are
|
||||
\ v4/src/text.c's define: a name may not be an opcode, a reserved word, a
|
||||
\ label (NAME:), a number or start with &; nothing is defined twice, except
|
||||
\ that a set variable may be set again and a placeholder be defined.
|
||||
\
|
||||
\ The table is used only while the ROM assembles, and lives in dictionary
|
||||
\ space: 256 hash heads at (SYMH); records of four cells -- link, name,
|
||||
\ kind, value -- growing up from SYMREC; names and macro bodies, growing
|
||||
\ down from POOLTOP. When the two would meet, "too many names". (RECN) and
|
||||
\ (POOLN) count the cells used, so an empty table is all zeroes. Names are
|
||||
\ counted strings, the form the token is held in, compared a cell at a time.
|
||||
\ (REC) (CNT) (PTR) (I) (WI) are working cells. Every routine uses A; some B.
|
||||
|
||||
\ ( p q -- f ) 1 if the counted strings at p and q are the same
|
||||
: (SAME2?)
|
||||
(I) a! ! (PTR) a! !
|
||||
(PTR) a! @ a! @ 255 and 4 + 2/ 2/
|
||||
L: (PTR) a! @ b! @b (I) a! @ a! @ xor if EQ drop drop 0 ;
|
||||
EQ: drop (PTR) a! @ 1 + ! (I) a! @ 1 + !
|
||||
-1 + if DONE jump L
|
||||
DONE: drop 1 ;
|
||||
|
||||
\ ( addr -- f ) 1 if the counted string at addr is the token
|
||||
: (SAME?) (TOK) jump (SAME2?)
|
||||
|
||||
\ ( table -- i | -1 ) which counted string of a table the token is; the
|
||||
\ table ends with a zero cell
|
||||
: (WALK)
|
||||
0 (WI) a! !
|
||||
L: dup a! @ if END
|
||||
drop dup (SAME?) if NO
|
||||
drop drop (WI) a! @ ;
|
||||
NO: drop dup a! @ 255 and 4 + 2/ 2/ +
|
||||
(WI) a! @ 1 + ! jump L
|
||||
END: drop drop -1 ;
|
||||
|
||||
\ the opcodes' names, in the order of their numbers
|
||||
: (MNEMONICS)
|
||||
", ; ", ex ", jump ", call ", unext ", next ", if ", -if
|
||||
", @p ", @+ ", @b ", @ ", !p ", !+ ", !b ", !
|
||||
", +* ", 2* ", 2/ ", inv ", + ", and ", xor ", drop
|
||||
", dup ", pop ", over ", a ", nop ", push ", b! ", a!
|
||||
#, 0
|
||||
|
||||
\ the ROM's reserved words: its notation and its directives
|
||||
: (RESERVED)
|
||||
", : ", macro ", endmacro ", FOR ", NEXT ", UNEXT
|
||||
", constant ", set ", here ", #, ", ", ", store
|
||||
", start
|
||||
#, 0
|
||||
|
||||
\ ( -- op | -1 ) which opcode the token names
|
||||
: (OPCODE) &(MNEMONICS) jump (WALK)
|
||||
|
||||
\ ( -- f ) 1 if the token is a reserved word
|
||||
: (RESERVED?) &(RESERVED) (WALK) -if Y drop 0 ;
|
||||
Y: drop 1 ;
|
||||
|
||||
\ ( p -- h ) the hash, 0 .. 255, of the counted string at p, from its
|
||||
\ first cell, and its second if the name runs into it (4 characters or more:
|
||||
\ the cell after a shorter name is not its own)
|
||||
: (HASH-AT)
|
||||
a! @+ dup 255 and -4 + -if TWO drop jump MIX
|
||||
TWO: drop @ xor
|
||||
MIX: dup 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ +
|
||||
dup 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ +
|
||||
255 and ;
|
||||
|
||||
\ ( p -- rec | 0 ) the newest record whose name is the counted string at p,
|
||||
\ placeholders included
|
||||
: (FIND-AT)
|
||||
dup (T3) a! ! (HASH-AT) (SYMH) + a! @
|
||||
L: if NONE
|
||||
dup (REC) a! ! 1 + a! @ (T3) a! @ (SAME2?) if NO
|
||||
drop (REC) a! @ ;
|
||||
NO: drop (REC) a! @ a! @ jump L
|
||||
NONE: ;
|
||||
|
||||
\ ( -- rec | 0 ) the token's record, placeholders included
|
||||
: (FIND0) (TOK) jump (FIND-AT)
|
||||
|
||||
\ ( -- rec | 0 ) the token's record, if it has been defined
|
||||
: (FIND)
|
||||
(FIND0) if NONE
|
||||
dup 2 + a! @ if PH drop ;
|
||||
PH: drop drop 0 ;
|
||||
NONE: ;
|
||||
|
||||
\ ( n -- addr | 0 ) n cells of the pool, below what it holds; 0 if they
|
||||
\ would meet the records ("too many names")
|
||||
: (ALLOC)
|
||||
dup (CNT) a! !
|
||||
POOLTOP (POOLN) a! @ inv 1 + + (CNT) a! @ inv 1 + +
|
||||
dup SYMREC (RECN) a! @ + 4 + inv 1 + +
|
||||
-if ROOM drop drop drop ERR-NAMES (FAIL) 0 ;
|
||||
ROOM: drop push drop
|
||||
(POOLN) a! @ (CNT) a! @ + (POOLN) a! !
|
||||
pop ;
|
||||
|
||||
\ ( from to n -- ) copy n cells, n at least 1
|
||||
: (COPY)
|
||||
(CN) a! ! (CTO) a! ! (CFROM) a! !
|
||||
L: (CN) a! @ if D drop
|
||||
(CFROM) a! @ a! @ (CTO) a! @ b! !b
|
||||
(CFROM) a! @ 1 + ! (CTO) a! @ 1 + ! (CN) a! @ -1 + ! jump L
|
||||
D: drop ;
|
||||
|
||||
\ ( value kind p -- rec | 0 ) a new record for the counted string at p,
|
||||
\ the name copied into the pool; 0 if there is no room
|
||||
: (NEW-REC)
|
||||
dup (T3) a! !
|
||||
a! @ 255 and 4 + 2/ 2/ (ALLOC)
|
||||
if FULL
|
||||
dup (T4) a! !
|
||||
push (T3) a! @ pop (T3) a! @ a! @ 255 and 4 + 2/ 2/ (COPY)
|
||||
SYMREC (RECN) a! @ + (REC) a! !
|
||||
(T4) a! @ (REC) a! @ 1 + a! !
|
||||
(REC) a! @ 2 + a! !
|
||||
(REC) a! @ 3 + a! !
|
||||
(T4) a! @ (HASH-AT) (SYMH) + dup a! @ (REC) a! @ a! !
|
||||
(REC) a! @ over a! ! drop
|
||||
(RECN) a! @ 4 + !
|
||||
(REC) a! @ ;
|
||||
FULL: drop drop drop 0 ;
|
||||
|
||||
\ ( -- f ) 1 if the token cannot be a name
|
||||
: (BADNAME?)
|
||||
(OPCODE) -if BAD
|
||||
drop (RESERVED?) if NOTRES drop 1 ;
|
||||
NOTRES: drop (NUMBER) push drop pop if NOTNUM drop 1 ;
|
||||
NOTNUM: drop 0 (CHAR@) 38 xor if AMP
|
||||
drop (TOKN) a! @ -1 + if ONE
|
||||
(CHAR@) 58 xor if COLON drop 0 ;
|
||||
COLON: drop 1 ;
|
||||
ONE: drop 0 ;
|
||||
AMP: drop 1 ;
|
||||
BAD: drop 1 ;
|
||||
|
||||
\ ( value kind -- ) give the token a kind and a value. A placeholder is
|
||||
\ filled in, and the branches waiting on it are told (word.f18, (DEFINED)).
|
||||
: (DEFINE)
|
||||
(BADNAME?) if OKNAME drop drop drop ERR-BAD-NAME jump (FAIL)
|
||||
OKNAME: drop
|
||||
(FIND0) if NEW
|
||||
dup 2 + a! @ if FILL drop
|
||||
over 4 xor if K4 drop drop drop drop ERR-DEFINED jump (FAIL)
|
||||
K4: drop 2 + a! @ 4 xor if BOTH drop drop drop ERR-DEFINED jump (FAIL)
|
||||
BOTH: drop drop (REC) a! @ 3 + a! ! ;
|
||||
FILL: drop dup (REC) a! !
|
||||
2 + a! !
|
||||
(REC) a! @ 3 + a! !
|
||||
(REC) a! @ jump (DEFINED)
|
||||
NEW: drop (TOK) (NEW-REC) drop ;
|
||||
@@ -0,0 +1,390 @@
|
||||
\ word.f18 -- the ROM assembles words: names, labels, branches, macros, FOR.
|
||||
\
|
||||
\ The rules are v4/src/text.c's one_token, end_word and branch:
|
||||
\ : NAME a word begins at the next instruction word
|
||||
\ NAME: a label of the word being assembled
|
||||
\ jump X call X if X -if X next X
|
||||
\ a branch to X: a label of this word, before or after the
|
||||
\ branch, if it has one of that name; otherwise a word
|
||||
\ X a call to the word X, defined already or later
|
||||
\ &X the address of the word X, already defined, as a literal
|
||||
\ 123 $FF CONST CONST+N a literal
|
||||
\ a macro its tokens, read in its place
|
||||
\ FOR ... NEXT FOR ... UNEXT
|
||||
\ A branch to a label not yet seen waits, local to its word, in the table
|
||||
\ of branches (REFS); when the word ends, a name that is not a label of it
|
||||
\ must be a word, and the branch then waits on that name's symbol -- a
|
||||
\ placeholder if it has none yet (sym.f18) -- until it is defined.
|
||||
\
|
||||
\ State, in the ROM's area: (NREF) (NLAB) (WNP) (NFOR) (FORS) (RDEPTH)
|
||||
\ (RPTRS). Tables, used only while assembling: (REFS) four cells an entry
|
||||
\ -- the word, the line, a symbol record (or, while local, a name), 1 if
|
||||
\ local; (LABELS) a name and an address; (WNAMES) the word's names. Uses
|
||||
\ A and B, and the working cells (T1) .. (T6), (MLEN).
|
||||
|
||||
\ ---- reading: the console, or a macro being expanded ----------------------
|
||||
|
||||
\ ( -- len ) the next token, from the innermost macro being expanded, or
|
||||
\ from the console. A macro's body is its tokens as counted strings, then
|
||||
\ a zero cell.
|
||||
: (NEXT-TOKEN)
|
||||
L: (RDEPTH) a! @ if SRC
|
||||
-1 + (RPTRS) + dup (T1) a! ! a! @
|
||||
dup a! @ if EOM
|
||||
255 and dup (TOKN) a! !
|
||||
4 + 2/ 2/ dup (T2) a! !
|
||||
push (TOK) pop (COPY)
|
||||
(T1) a! @ a! @ (T2) a! @ + (T1) a! @ a! !
|
||||
(TOKN) a! @ ;
|
||||
EOM: drop drop (RDEPTH) a! @ -1 + ! jump L
|
||||
SRC: drop jump (TOKEN)
|
||||
|
||||
\ ---- the token, taken apart ------------------------------------------------
|
||||
|
||||
\ ( -- ) save the token's characters, a character to a cell, in (MTEMP)
|
||||
: (TOK-SAVE)
|
||||
(TOKN) a! @ (MLEN) a! ! 0 (T5) a! !
|
||||
L: (T5) a! @ (MLEN) a! @ xor if D drop
|
||||
(T5) a! @ (CHAR@) (T5) a! @ (MTEMP) + b! !b
|
||||
(T5) a! @ 1 + ! jump L
|
||||
D: drop ;
|
||||
|
||||
\ ( start len -- ) the token becomes characters start .. start+len-1 of
|
||||
\ the one saved by (TOK-SAVE)
|
||||
: (TOK-SUB)
|
||||
(T6) a! ! (T5) a! !
|
||||
(TOK) a! 15 FOR 0 !+ NEXT
|
||||
0 (TOKN) a! !
|
||||
L: (T6) a! @ if D drop
|
||||
(T5) a! @ (MTEMP) + a! @ (PUT)
|
||||
(T5) a! @ 1 + ! (T6) a! @ -1 + ! jump L
|
||||
D: drop (TOKN) a! @ (TOK) a! @ xor ! ;
|
||||
|
||||
\ ( -- f ) 1 if the token is a label's definition: NAME:
|
||||
: (LABELFORM?)
|
||||
(TOKN) a! @ -1 + if NO
|
||||
(CHAR@) 58 xor if YES drop 0 ;
|
||||
YES: drop 1 ;
|
||||
NO: drop 0 ;
|
||||
|
||||
\ ---- the word's names: labels, and names branched to before they are seen --
|
||||
|
||||
\ ( -- p | 0 ) the token, copied into the word's name area
|
||||
: (WNAME)
|
||||
(TOKN) a! @ 4 + 2/ 2/ (T6) a! !
|
||||
(WNP) a! @ (T6) a! @ + WN-SIZE inv 1 + + -1 + -if FULL drop
|
||||
(WNAMES) (WNP) a! @ +
|
||||
(TOK) over (T6) a! @ (COPY)
|
||||
(WNP) a! @ (T6) a! @ + (WNP) a! ! ;
|
||||
FULL: drop ERR-NAMES (FAIL) 0 ;
|
||||
|
||||
\ ( -- addr | -1 ) the address of the word's label named by the token
|
||||
: (LAB-FIND)
|
||||
0 (T5) a! !
|
||||
L: (T5) a! @ (NLAB) a! @ xor if NONE drop
|
||||
(T5) a! @ 2* (LABELS) + a! @ (SAME?) if NO
|
||||
drop (T5) a! @ 2* (LABELS) + 1 + a! @ ;
|
||||
NO: drop (T5) a! @ 1 + ! jump L
|
||||
NONE: drop -1 ;
|
||||
|
||||
\ ---- the branches waiting for a target -------------------------------------
|
||||
|
||||
\ ( word sym local -- ) one more branch waiting
|
||||
: (REF-ADD)
|
||||
(NREF) a! @ REFS-MAX inv 1 + + -if FULL drop
|
||||
(NREF) a! @ 2* 2* (REFS) + (T5) a! !
|
||||
(T5) a! @ 3 + a! !
|
||||
(T5) a! @ 2 + a! !
|
||||
(T5) a! @ a! !
|
||||
(LINE) a! @ (T5) a! @ 1 + a! !
|
||||
(NREF) a! @ 1 + ! ;
|
||||
FULL: drop drop drop drop ERR-REFS jump (FAIL)
|
||||
|
||||
\ ( i target -- ) the waiting branch i gets its target, and stops waiting:
|
||||
\ the last entry takes its place. A branch that cannot reach is reported
|
||||
\ at the line it was written on.
|
||||
: (REF-RESOLVE)
|
||||
(T4) a! !
|
||||
2* 2* (REFS) + dup (T3) a! !
|
||||
a! @ (T4) a! @ (RESOLVE)
|
||||
(FAILED) a! @ if OK drop
|
||||
(T3) a! @ 1 + a! @ (ERRLINE) a! ! ;
|
||||
OK: drop
|
||||
(NREF) a! @ -1 + dup (NREF) a! !
|
||||
2* 2* (REFS) + (T3) a! @ 4 (COPY) ;
|
||||
|
||||
\ ( addr -- ) a label has been defined at addr: the branches in this word
|
||||
\ waiting on its name, the token, get it
|
||||
: (LOCAL-RESOLVE)
|
||||
(T1) a! ! 0 (T2) a! !
|
||||
L: (T2) a! @ (NREF) a! @ xor if DONE drop
|
||||
(FAILED) a! @ if GO drop ;
|
||||
GO: drop
|
||||
(T2) a! @ 2* 2* (REFS) +
|
||||
dup 3 + a! @ if SKIP drop
|
||||
2 + a! @ (SAME?) if NX
|
||||
drop (T2) a! @ (T1) a! @ (REF-RESOLVE) jump L
|
||||
SKIP: drop drop jump NX1
|
||||
NX: drop
|
||||
NX1: (T2) a! @ 1 + ! jump L
|
||||
DONE: drop ;
|
||||
|
||||
\ ( rec -- ) the symbol rec has been defined (sym.f18, (DEFINE)): if it is
|
||||
\ a word, the branches waiting on it get its address
|
||||
: (DEFINED)
|
||||
dup 2 + a! @ 1 xor if W drop drop ;
|
||||
W: drop (T1) a! ! 0 (T2) a! !
|
||||
L: (T2) a! @ (NREF) a! @ xor if DONE drop
|
||||
(FAILED) a! @ if GO drop ;
|
||||
GO: drop
|
||||
(T2) a! @ 2* 2* (REFS) +
|
||||
dup 3 + a! @ if NL drop drop jump NX
|
||||
NL: drop 2 + a! @ (T1) a! @ xor if MATCH drop jump NX
|
||||
MATCH: drop (T2) a! @ (T1) a! @ 3 + a! @ (REF-RESOLVE) jump L
|
||||
NX: (T2) a! @ 1 + ! jump L
|
||||
DONE: drop ;
|
||||
|
||||
\ ( -- ) the word being assembled ends: a FOR left open is an error; the
|
||||
\ branches still local to it wait on their names' symbols, unless the name
|
||||
\ is a word, which they then get; its labels and names go.
|
||||
: (END-WORD)
|
||||
(NFOR) a! @ if F0 drop 0 (NFOR) a! ! ERR-FOR jump (FAIL)
|
||||
F0: drop
|
||||
0 (T1) a! !
|
||||
L: (T1) a! @ (NREF) a! @ xor if DONE drop
|
||||
(FAILED) a! @ if GO drop ;
|
||||
GO: drop
|
||||
(T1) a! @ 2* 2* (REFS) +
|
||||
dup 3 + a! @ if SKIP drop
|
||||
0 over 3 + a! !
|
||||
dup 2 + a! @ (FIND-AT)
|
||||
if MK
|
||||
dup 2 + a! @ 1 xor if RES drop
|
||||
over 2 + a! ! drop jump NX
|
||||
RES: drop push drop (T1) a! @ pop 3 + a! @ (REF-RESOLVE) jump L
|
||||
MK: drop dup 2 + a! @ push 0 0 pop (NEW-REC)
|
||||
over 2 + a! ! drop jump NX
|
||||
SKIP: drop drop
|
||||
NX: (T1) a! @ 1 + ! jump L
|
||||
DONE: drop
|
||||
0 (NLAB) a! ! 0 (WNP) a! ! ;
|
||||
|
||||
\ ---- branches by name ------------------------------------------------------
|
||||
|
||||
\ ( op local -- ) a branch to the name in the token. local: written after
|
||||
\ a branch mnemonic, so it may be a label of this word, before or after.
|
||||
: (BRANCH-NAME)
|
||||
(T6) a! !
|
||||
(T6) a! @ if CHK
|
||||
drop (LAB-FIND) -if TOLAB drop jump CHK1
|
||||
TOLAB: jump (BRANCH)
|
||||
CHK: drop
|
||||
(FIND) if CHK0
|
||||
dup 2 + a! @ 1 xor if NOW drop drop jump BAD
|
||||
NOW: drop 3 + a! @ jump (BRANCH)
|
||||
CHK0: drop
|
||||
CHK1:
|
||||
(FIND) if C2
|
||||
2 + a! @ 1 xor if C3 drop jump BAD
|
||||
C3: drop jump C4
|
||||
C2: drop
|
||||
C4: (OPCODE) -if BAD1 drop
|
||||
(RESERVED?) if C5 drop jump BAD
|
||||
C5: drop (LABELFORM?) if C6 drop jump BAD
|
||||
C6: drop (NUMBER) push drop pop if C7 drop jump BAD
|
||||
C7: drop
|
||||
(T6) a! @ if GLOBAL drop
|
||||
(BRANCH>) (WNAME) 1 jump (REF-ADD)
|
||||
GLOBAL: drop
|
||||
(BRANCH>) (FIND0) if NEWPH
|
||||
0 jump (REF-ADD)
|
||||
NEWPH: drop 0 0 (TOK) (NEW-REC) 0 jump (REF-ADD)
|
||||
BAD1: drop
|
||||
BAD: drop ERR-TARGET jump (FAIL)
|
||||
|
||||
\ ---- labels ----------------------------------------------------------------
|
||||
|
||||
\ ( addr -- ) a label of this word, named by the token, at addr; the
|
||||
\ branches already waiting on it get it
|
||||
: (LAB-ADD)
|
||||
(LAB-FIND) -if DUP drop
|
||||
(NLAB) a! @ -64 + -if FULL drop
|
||||
(WNAME) if FAILP
|
||||
(NLAB) a! @ 2* (LABELS) + a! !
|
||||
dup (NLAB) a! @ 2* (LABELS) + 1 + a! !
|
||||
(NLAB) a! @ 1 + !
|
||||
jump (LOCAL-RESOLVE)
|
||||
DUP: drop drop ERR-LABEL-DUP jump (FAIL)
|
||||
FULL: drop drop ERR-LABELS jump (FAIL)
|
||||
FAILP: drop drop ;
|
||||
|
||||
\ ( -- ) NAME: -- a label at the next instruction word
|
||||
: (LABEL-DEF)
|
||||
(TOK-SAVE) 0 (MLEN) a! @ -1 + (TOK-SUB)
|
||||
(LABEL) jump (LAB-ADD)
|
||||
|
||||
\ ---- FOR ... NEXT, FOR ... UNEXT --------------------------------------------
|
||||
|
||||
: (H-FOR)
|
||||
(NFOR) a! @ -8 + -if DEEP drop
|
||||
29 (OP) (LABEL) (NFOR) a! @ (FORS) + a! !
|
||||
(NFOR) a! @ 1 + ! ;
|
||||
DEEP: drop ERR-FOR jump (FAIL)
|
||||
|
||||
: (H-NEXT)
|
||||
(NFOR) a! @ if NONE
|
||||
-1 + dup (NFOR) a! ! (FORS) + a! @
|
||||
push 5 pop jump (BRANCH)
|
||||
NONE: drop ERR-FOR jump (FAIL)
|
||||
|
||||
\ unext repeats the word it is in: it must still be the word the body
|
||||
\ began, with a slot left, owing no literal
|
||||
: (H-UNEXT)
|
||||
(NFOR) a! @ if NONE
|
||||
-1 + dup (NFOR) a! ! (FORS) + a! @
|
||||
(HERE) a! @ xor if SAMEW drop jump BAD
|
||||
SAMEW: drop
|
||||
(SLOT) a! @ if BAD0
|
||||
-6 + -if BAD0 drop
|
||||
(NLIT) a! @ if OK drop jump BAD
|
||||
OK: drop 4 jump (OP)
|
||||
BAD0: drop
|
||||
BAD: ERR-UNEXT jump (FAIL)
|
||||
NONE: drop ERR-FOR jump (FAIL)
|
||||
|
||||
\ ---- macros ----------------------------------------------------------------
|
||||
|
||||
\ ( -- ) restore the name (TSAVE) holds into the token
|
||||
: (NAME-BACK) (TSAVE) (TOK) 16 (COPY) (TOK) a! @ 255 and (TOKN) a! ! ;
|
||||
|
||||
\ ( -- f ) 0 if not in a macro; else "not allowed in a macro", and 1
|
||||
: (IN-MACRO?)
|
||||
(RDEPTH) a! @ if NO drop ERR-IN-MACRO (FAIL) 1 ;
|
||||
NO: ;
|
||||
|
||||
\ macro NAME ... endmacro: the tokens between, as counted strings, then a
|
||||
\ zero cell, into the pool; NAME the macro, its value where they are. One
|
||||
\ left open is reported at the line it began on, as text.c reports it.
|
||||
: (H-MACRO)
|
||||
(IN-MACRO?) if OK drop ;
|
||||
OK: drop
|
||||
(LINE) a! @ (T4) a! !
|
||||
(NEXT-TOKEN) if NONAME drop
|
||||
(TOK) (TSAVE) 16 (COPY)
|
||||
0 (T1) a! !
|
||||
L: (NEXT-TOKEN) if EOF drop
|
||||
&(RESERVED) (WALK)
|
||||
dup -2 + if END drop
|
||||
dup if BAD2 drop
|
||||
-1 + if BAD1 drop
|
||||
(LABELFORM?) if APP drop jump BAD
|
||||
APP: drop
|
||||
(TOKN) a! @ 4 + 2/ 2/ dup (T2) a! !
|
||||
(T1) a! @ + 1 + MBODY-SIZE inv 1 + + -1 + -if FULLM drop
|
||||
(TOK) (MBODY) (T1) a! @ + (T2) a! @ (COPY)
|
||||
(T1) a! @ (T2) a! @ + (T1) a! !
|
||||
jump L
|
||||
END: drop drop
|
||||
0 (MBODY) (T1) a! @ + b! !b
|
||||
(T1) a! @ 1 + (ALLOC) if FAILP
|
||||
(MBODY) over (T1) a! @ 1 + (COPY)
|
||||
(NAME-BACK)
|
||||
3 jump (DEFINE)
|
||||
FAILP: drop ;
|
||||
BAD2: drop
|
||||
BAD1: drop
|
||||
BAD: ERR-IN-MACRO jump (FAIL)
|
||||
FULLM: drop ERR-NAMES jump (FAIL)
|
||||
EOF: drop ERR-MACRO (FAIL) (T4) a! @ (ERRLINE) a! ! ;
|
||||
NONAME: drop ERR-MACRO jump (FAIL)
|
||||
|
||||
: (H-ENDMACRO) ERR-MACRO jump (FAIL)
|
||||
|
||||
\ ( body -- ) read a macro's tokens in its place
|
||||
: (USE-MACRO)
|
||||
(RDEPTH) a! @ -8 + -if DEEP drop
|
||||
(RDEPTH) a! @ (RPTRS) + a! !
|
||||
(RDEPTH) a! @ 1 + ! ;
|
||||
DEEP: drop drop ERR-DEEP jump (FAIL)
|
||||
|
||||
\ ---- CONST+N ---------------------------------------------------------------
|
||||
|
||||
\ ( -- v 1 | 0 0 ) the token as a constant and a number after its last +;
|
||||
\ if it is not one, the token is left as it was
|
||||
: (CONST+N)
|
||||
(TOK-SAVE)
|
||||
(MLEN) a! @ -1 + (T1) a! !
|
||||
L: (T1) a! @ -if GO drop jump NOPE
|
||||
GO: (MTEMP) + a! @ 43 xor if FOUND drop
|
||||
(T1) a! @ -1 + ! jump L
|
||||
FOUND: drop
|
||||
(T1) a! @ if NOPE0 drop
|
||||
(T1) a! @ (MLEN) a! @ -1 + xor if NOPE0 drop
|
||||
0 (T1) a! @ (TOK-SUB)
|
||||
(FIND) if NOPE0
|
||||
dup 2 + a! @ 2 xor if ISC drop drop jump NOPE
|
||||
ISC: drop 3 + a! @ (T2) a! !
|
||||
(T1) a! @ 1 + (MLEN) a! @ (T1) a! @ inv 1 + + -1 + (TOK-SUB)
|
||||
(NUMBER) 1 xor if OKN drop drop jump NOPE
|
||||
OKN: drop (T2) a! @ + 1 ;
|
||||
NOPE0: drop
|
||||
NOPE: 0 (MLEN) a! @ (TOK-SUB) 0 0 ;
|
||||
|
||||
\ ---- one token -------------------------------------------------------------
|
||||
|
||||
\ the reserved words' handlers, in (RESERVED)'s order
|
||||
: (DISPATCH)
|
||||
jump (H-COLON) jump (H-MACRO) jump (H-ENDMACRO)
|
||||
jump (H-FOR) jump (H-NEXT) jump (H-UNEXT)
|
||||
jump (H-CONSTANT) jump (H-SET) jump (H-HERE)
|
||||
jump (H-CELL) jump (H-STRING) jump (H-STORE)
|
||||
jump (H-START)
|
||||
|
||||
\ : NAME end the word before, and begin NAME at the next instruction word
|
||||
: (H-COLON)
|
||||
(IN-MACRO?) if OK drop ;
|
||||
OK: drop
|
||||
(NEXT-TOKEN) if NONAME drop
|
||||
(END-WORD) (LABEL) 1 jump (DEFINE)
|
||||
NONAME: drop jump (MISSING)
|
||||
|
||||
\ ( -- ) assemble the token
|
||||
: (ONE)
|
||||
&(RESERVED) (WALK) -if RES drop
|
||||
(LABELFORM?) if NLD drop jump (LABEL-DEF)
|
||||
NLD: drop
|
||||
(OPCODE) -if OPC drop
|
||||
0 (CHAR@) 38 xor if AMP drop
|
||||
AFTERAMP:
|
||||
(NUMBER) if NN
|
||||
-if NUMOK drop drop ERR-BIG jump (FAIL)
|
||||
NUMOK: drop jump (LIT)
|
||||
NN: drop drop
|
||||
(FIND) if NOSYM
|
||||
dup 2 + a! @
|
||||
dup 3 xor if MAC drop
|
||||
dup 2 xor if CV drop
|
||||
4 xor if CV0
|
||||
drop drop 3 0 jump (BRANCH-NAME)
|
||||
MAC: drop drop 3 + a! @ jump (USE-MACRO)
|
||||
CV: drop drop 3 + a! @ jump (LIT)
|
||||
CV0: drop 3 + a! @ jump (LIT)
|
||||
NOSYM: drop
|
||||
(CONST+N) if CALL drop jump (LIT)
|
||||
CALL: drop drop 3 0 jump (BRANCH-NAME)
|
||||
RES: &(DISPATCH) + push ;
|
||||
OPC: dup 8 xor if FP drop
|
||||
dup (BRANCH-OP?) if PLAIN drop
|
||||
(NEXT-TOKEN) if NOTGT drop
|
||||
1 jump (BRANCH-NAME)
|
||||
PLAIN: drop jump (OP)
|
||||
FP: drop drop ERR-FETCH-P jump (FAIL)
|
||||
NOTGT: drop drop jump (MISSING)
|
||||
AMP: drop (TOKN) a! @ -1 + if ONECH drop
|
||||
(TOK-SAVE) 1 (MLEN) a! @ -1 + (TOK-SUB)
|
||||
(FIND) if BADA
|
||||
dup 2 + a! @ 1 xor if OKA drop drop jump BADA0
|
||||
OKA: drop 3 + a! @ jump (LIT)
|
||||
BADA: drop
|
||||
BADA0: ERR-AMP jump (FAIL)
|
||||
ONECH: drop jump AFTERAMP
|
||||
@@ -0,0 +1,14 @@
|
||||
Block 7000
|
||||
( starshipos.4th -- the StarshipOS words, in their own )
|
||||
( vocabulary, STARSHIPOS: not FORTH-79, so not in FORTH. )
|
||||
( Loaded when the system boots, after forth79.4th. )
|
||||
( Blocks 7000 up. New definitions still go into FORTH; the )
|
||||
( search starts in STARSHIPOS, then FORTH. )
|
||||
VOCABULARY STARSHIPOS STARSHIPOS DEFINITIONS
|
||||
Block 7001
|
||||
( DOE baddr u -- as S" name" DOE )
|
||||
( Intended: run the DoE of that name, from the capsule of )
|
||||
( that name. As yet it only types the name back -- asked for )
|
||||
( so, 2026-10-15; the runner is still to be built. )
|
||||
: DOE ( baddr u -- ) TYPE ;
|
||||
FORTH DEFINITIONS STARSHIPOS
|
||||
@@ -1,11 +1,11 @@
|
||||
\ acl.v4 -- word-level access control: the fields of an entry.
|
||||
\ acl.f18 -- word-level access control: the fields of an entry.
|
||||
\
|
||||
\ DECOMPOSITION.md 5.20, as v3: ACL-MODE@ ACL-MODE! ACL-TTL@ ACL-TTL! ACL-ALLOW@
|
||||
\ ACL-ALLOW! ACL-PINNED? ACL-PIN ACL-INHERIT ACL-INIT-PRIMITIVES ACL-HEAT@
|
||||
\ ACL-WORD-ID. These are all the capsule does itself; the policy -- what is
|
||||
\ strict, how long a TTL is, what is pinned -- is FORTH source, ACL.fth, as
|
||||
\ it is ACL.4th in v3. The fields and the check are described in
|
||||
\ compile.v4. Rests on compile.v4, quit.v4 and system.v4.
|
||||
\ compile.f18. Rests on compile.f18, quit.f18 and system.f18.
|
||||
\
|
||||
\ An xt of 0 is an error (code 16, "Not a word"). A pinned word's fields are
|
||||
\ not changed by the ! words: they do nothing, as in v3.
|
||||
@@ -18,25 +18,25 @@
|
||||
\ ( xt -- flag ) non-zero if it is pinned. A holds the flags' address.
|
||||
: (PINNED) -3 + a! @ 64 and ;
|
||||
|
||||
header ACL-HOOK inline : ACL-HOOK' (ACL-HOOK) ;
|
||||
set HDR-NFA here ", ACL-HOOK #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : ACL-HOOK' (ACL-HOOK) ;
|
||||
|
||||
header ACL-MODE@
|
||||
set HDR-NFA here ", ACL-MODE@ #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ACL-MODE@ ( xt -- mode ) (ACL-XT) -3 + a! @ 8/ 255 and ;
|
||||
header ACL-TTL@
|
||||
set HDR-NFA here ", ACL-TTL@ #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ACL-TTL@ ( xt -- n ) (ACL-XT) -3 + a! @ 8/ 8/ 65535 and ;
|
||||
header ACL-ALLOW@
|
||||
set HDR-NFA here ", ACL-ALLOW@ #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ACL-ALLOW@ ( xt -- flag ) (ACL-XT) -3 + a! @ 32 and if YES drop 0 ; YES: drop -1 ;
|
||||
header ACL-PINNED?
|
||||
set HDR-NFA here ", ACL-PINNED? #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ACL-PINNED? ( xt -- flag ) (ACL-XT) (PINNED) if NO drop -1 ; NO: ;
|
||||
header ACL-PIN
|
||||
set HDR-NFA here ", ACL-PIN #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ACL-PIN ( xt -- ) (ACL-XT) -3 + a! @ 64 OR ! ;
|
||||
|
||||
header ACL-MODE!
|
||||
set HDR-NFA here ", ACL-MODE! #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ACL-MODE! ( mode xt -- )
|
||||
(ACL-XT) (PINNED) if FREE drop drop ;
|
||||
FREE: drop 255 and 8* @ -65281 and + ! ;
|
||||
\ as v3: below 0 is 0. The TTL is sixteen bits here: above 65535 is 65535.
|
||||
header ACL-TTL!
|
||||
set HDR-NFA here ", ACL-TTL! #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ACL-TTL! ( n xt -- )
|
||||
(ACL-XT) (PINNED) if FREE drop drop ;
|
||||
FREE: drop
|
||||
@@ -44,7 +44,7 @@ header ACL-TTL!
|
||||
POS: dup -65536 and if SMALL drop drop 65535 jump SET
|
||||
SMALL: drop
|
||||
SET: 8* 8* @ 65535 and + ! ;
|
||||
header ACL-ALLOW!
|
||||
set HDR-NFA here ", ACL-ALLOW! #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ACL-ALLOW! ( flag xt -- )
|
||||
(ACL-XT) (PINNED) if FREE drop drop ;
|
||||
FREE: drop if DENY drop @ -33 and ! ;
|
||||
@@ -52,7 +52,7 @@ header ACL-ALLOW!
|
||||
|
||||
\ ( src dst -- ) as v3: dst takes src's mode; it is not pinned, its TTL
|
||||
\ is 0 and it is allowed. This is the one word that unpins.
|
||||
header ACL-INHERIT
|
||||
set HDR-NFA here ", ACL-INHERIT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ACL-INHERIT
|
||||
(ACL-XT) SWAP (ACL-XT) \ dst src
|
||||
-3 + a! @ $FF00 and \ dst mode
|
||||
@@ -67,7 +67,7 @@ header ACL-INHERIT
|
||||
NXT: -1 + a! @ jump L
|
||||
DONE: drop ;
|
||||
\ ( -- ) as v3: do that to every word in the dictionary, in every vocabulary
|
||||
header ACL-INIT-PRIMITIVES
|
||||
set HDR-NFA here ", ACL-INIT-PRIMITIVES #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ACL-INIT-PRIMITIVES
|
||||
(LATEST) a! @ (ACL-INIT)
|
||||
VOC-LINK a! @
|
||||
@@ -76,8 +76,8 @@ header ACL-INIT-PRIMITIVES
|
||||
|
||||
\ ( xt -- heat ) how often the word has been used. The node's heat
|
||||
\ counters are not readable from a programme yet (D-6): 0.
|
||||
header ACL-HEAT@
|
||||
set HDR-NFA here ", ACL-HEAT@ #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ACL-HEAT@ (ACL-XT) drop 0 ;
|
||||
\ ( xt -- n ) a number for the word that never changes: its address
|
||||
header ACL-WORD-ID
|
||||
set HDR-NFA here ", ACL-WORD-ID #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ACL-WORD-ID (ACL-XT) ;
|
||||
@@ -1,4 +1,4 @@
|
||||
\ blocks.v4 -- mass storage: blocks of 1024 characters, and text loaded from them.
|
||||
\ blocks.f18 -- mass storage: blocks of 1024 characters, and text loaded from them.
|
||||
\
|
||||
\ DECOMPOSITION.md 5.11, FORTH-79: BLOCK BUFFER UPDATE SAVE-BUFFERS
|
||||
\ EMPTY-BUFFERS LIST LOAD SCR BLK, and v3's FLUSH THRU and --> . Part of the
|
||||
@@ -23,10 +23,10 @@
|
||||
\ Constants the loader supplies:
|
||||
\ BLOCK# BUFFER# UPDATE# SAVE-BUFFERS# EMPTY-BUFFERS# the requests' numbers
|
||||
\ SCR word address of the variable: the block LIST showed last
|
||||
\ BLK (SRC) (SRC-HOOK) see input.v4
|
||||
\ BLK (SRC) (SRC-HOOK) see input.f18
|
||||
|
||||
header SCR inline : SCR' SCR ;
|
||||
header BLK inline : BLK' BLK ;
|
||||
set HDR-NFA here ", SCR #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : SCR' SCR ;
|
||||
set HDR-NFA here ", BLK #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : BLK' BLK ;
|
||||
|
||||
\ ( status -- ) a request that did not work is an error
|
||||
: (B-ERR)
|
||||
@@ -41,27 +41,27 @@ header BLK inline : BLK' BLK ;
|
||||
|
||||
\ ( n -- baddr ) FORTH-79: the address of a buffer assigned to block n.
|
||||
\ What the buffer holds is not read from storage.
|
||||
header BUFFER
|
||||
set HDR-NFA here ", BUFFER #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: BUFFER BUFFER# (PORT) b! !b jump (B-GOT)
|
||||
|
||||
\ ( n -- baddr ) FORTH-79: the address of a buffer that holds block n,
|
||||
\ read from storage if it is not already in one.
|
||||
header BLOCK
|
||||
set HDR-NFA here ", BLOCK #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: BLOCK BLOCK# (PORT) b! !b jump (B-GOT)
|
||||
|
||||
\ FORTH-79: mark the block most recently asked for as changed, so that it is
|
||||
\ written before its buffer is used for another.
|
||||
header UPDATE
|
||||
set HDR-NFA here ", UPDATE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: UPDATE UPDATE# (PORT) b! !b jump (B-ERR)
|
||||
|
||||
\ FORTH-79: write every block that has been UPDATEd.
|
||||
header SAVE-BUFFERS
|
||||
set HDR-NFA here ", SAVE-BUFFERS #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: SAVE-BUFFERS SAVE-BUFFERS# (PORT) b! !b jump (B-ERR)
|
||||
\ As v3: the same.
|
||||
header FLUSH
|
||||
set HDR-NFA here ", FLUSH #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: FLUSH jump SAVE-BUFFERS
|
||||
\ FORTH-79: forget what is in the buffers; nothing is written.
|
||||
header EMPTY-BUFFERS
|
||||
set HDR-NFA here ", EMPTY-BUFFERS #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: EMPTY-BUFFERS EMPTY-BUFFERS# (PORT) b! !b ;
|
||||
|
||||
\ ---- LIST ----------------------------------------------------------------------
|
||||
@@ -69,7 +69,7 @@ header EMPTY-BUFFERS
|
||||
\ characters, each after its number, and an empty line. SCR is left holding n. A character
|
||||
\ that is not printable is shown as a blank. (Q)+0 is the line, (Q)+1 the
|
||||
\ column, (Q)+2 the block's number.
|
||||
header LIST
|
||||
set HDR-NFA here ", LIST #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: LIST
|
||||
dup (Q)+2 a! ! BLOCK drop \ an error here leaves nothing behind
|
||||
(Q)+2 a! @ dup SCR a! !
|
||||
@@ -101,7 +101,7 @@ header LIST
|
||||
TERM: drop ;
|
||||
|
||||
\ ( n -- ) FORTH-79: interpret block n, then go on with what follows.
|
||||
header LOAD
|
||||
set HDR-NFA here ", LOAD #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: LOAD
|
||||
-if POS jump BAD
|
||||
POS: if BAD
|
||||
@@ -114,13 +114,13 @@ header LOAD
|
||||
|
||||
\ ( -- ) go on with the next block. Only in a block being loaded: at the
|
||||
\ terminal it is an error (code 14).
|
||||
header --> immediate
|
||||
set HDR-NFA here ", --> #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: NEXT-BLOCK
|
||||
BLK a! @ if TERM 1 + ! 0 >IN a! ! ;
|
||||
TERM: drop NODE-ERROR b! 14 !b ;
|
||||
|
||||
\ ( first last -- ) as v3: LOAD each block from first to last.
|
||||
header THRU
|
||||
set HDR-NFA here ", THRU #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: THRU
|
||||
push
|
||||
L: dup inv pop dup push + 1 + -if GO drop drop pop drop ; \ last - first
|
||||
@@ -1,4 +1,4 @@
|
||||
\ codegen.v4 -- the code generator: opcodes, literals and branches packed into
|
||||
\ codegen.f18 -- the code generator: opcodes, literals and branches packed into
|
||||
\ instruction words at HERE.
|
||||
\
|
||||
\ This is what the compiling words ( : ; IF LOOP LITERAL ... ) are built on.
|
||||
@@ -18,7 +18,7 @@
|
||||
\ An instruction word is 32 bits at every cell width (D-9): slot k is the five
|
||||
\ bits whose lowest is bit 27 - 5k, and a branch there has 27 - 5k address bits.
|
||||
\
|
||||
\ Rests on core.v4 and dict.v4. Constants the loader supplies:
|
||||
\ Rests on core.f18 and dict.f18. Constants the loader supplies:
|
||||
\ (CG) word address of fourteen cells of scratch for this file
|
||||
\ CG-BSLOTS how many slots, counted from slot 0, may hold a branch
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
\ compile.v4 -- the interpreter's inner loop, and the defining and compiling
|
||||
\ compile.f18 -- the interpreter's inner loop, and the defining and compiling
|
||||
\ words.
|
||||
\
|
||||
\ DECOMPOSITION.md 5.17 and 5.18: STATE [ ] : ; EXIT IMMEDIATE LITERAL COMPILE
|
||||
\ [COMPILE] ' EXECUTE CREATE VARIABLE CONSTANT DOES>, the control structures
|
||||
\ IF ELSE THEN BEGIN UNTIL AGAIN WHILE REPEAT DO ?DO LOOP +LOOP, and INTERPRET,
|
||||
\ which they cannot be run without. Part of the compiler capsule. Rests on
|
||||
\ core.v4, input.v4, dict.v4 and codegen.v4.
|
||||
\ core.f18, input.f18, dict.f18 and codegen.f18.
|
||||
\
|
||||
\ HOW A WORD IS COMPILED. v4 code is native: a colon definition is
|
||||
\ instruction words, and compiling a word into one lays down a call to it.
|
||||
\ Two flags on an entry (dict.v4) change that:
|
||||
\ Two flags on an entry (dict.f18) change that:
|
||||
\ inline its code is a straight run of opcodes and literals ending
|
||||
\ in ; -- that run is copied in place of a call. Everything
|
||||
\ that touches the return stack must be, since a call would
|
||||
@@ -46,9 +46,9 @@ macro ROT push SWAP pop SWAP endmacro
|
||||
\ ( -- ) give up the line: stop compiling, forget the word being built and
|
||||
\ whatever control structures were open, skip the rest of the input, and set
|
||||
\ NODE-ERROR. A definition that was under way stays hidden. It returns to
|
||||
\ whatever called INTERPRET, which is QUIT (quit.v4): QUIT sees NODE-ERROR
|
||||
\ whatever called INTERPRET, which is QUIT (quit.f18): QUIT sees NODE-ERROR
|
||||
\ and prints ERROR.
|
||||
\ (ABANDON-AS) is the same with an error code (core.v4) for the prompt to
|
||||
\ (ABANDON-AS) is the same with an error code (core.f18) for the prompt to
|
||||
\ print the message of.
|
||||
: (ABANDON-AS) ( code -- )
|
||||
(C)+9 a! !
|
||||
@@ -143,14 +143,14 @@ macro ROT push SWAP pop SWAP endmacro
|
||||
\ ( -- ) print the word WORD has just left
|
||||
: (.WORD) WBUF COUNT jump TYPE
|
||||
|
||||
header EXECUTE
|
||||
set HDR-NFA here ", EXECUTE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: EXECUTE ( xt -- ) push ;
|
||||
|
||||
\ ---- the interpreter's inner loop ---------------------------------------------
|
||||
|
||||
\ ( -- n flag ) the word WORD has just left, as a single-cell number in the
|
||||
\ current BASE, and -1; or 0 0 if it is not one. A leading minus sign is
|
||||
\ allowed. This is what the interpreter uses: NUMBER (input.v4) makes a
|
||||
\ allowed. This is what the interpreter uses: NUMBER (input.f18) makes a
|
||||
\ double and needs more of the stack than can be spared here.
|
||||
\ (P)+2 the number so far, (P)+3 where it is in the word, (P)+4 the word's
|
||||
\ length, (P)+5 the sign, (P)+6 the base.
|
||||
@@ -181,7 +181,7 @@ header EXECUTE
|
||||
\ on the stack, or compiled as a literal. What is neither, or a compile-only
|
||||
\ word met while interpreting, abandons the line, with v3's message:
|
||||
\ UNKNOWN WORD: 'xxx' xxx: compile-only
|
||||
header INTERPRET
|
||||
set HDR-NFA here ", INTERPRET #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: INTERPRET
|
||||
L: 32 WORD dup C@ if EOL
|
||||
drop (LOOKUP) if NUM
|
||||
@@ -204,25 +204,25 @@ header INTERPRET
|
||||
|
||||
\ ---- state ---------------------------------------------------------------------
|
||||
|
||||
header [ immediate
|
||||
set HDR-NFA here ", [ #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: LEFT-BRACKET 0 STATE a! ! ;
|
||||
header ]
|
||||
set HDR-NFA here ", ] #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: RIGHT-BRACKET -1 STATE a! ! ;
|
||||
|
||||
\ ( x -- ) FORTH-79: if compiling, compile x as a literal
|
||||
header LITERAL immediate
|
||||
set HDR-NFA here ", LITERAL #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: LITERAL STATE a! @ if NO drop jump (LIT,) NO: drop ;
|
||||
|
||||
\ ( -- addr ) FORTH-79: the next word's parameter field address; if
|
||||
\ compiling, compiled as a literal
|
||||
header ' immediate
|
||||
set HDR-NFA here ", ' #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: TICK (') jump LITERAL
|
||||
|
||||
\ ['] xxx the same inside a definition, whatever STATE is; and [LITERAL],
|
||||
\ which v3 has as another name for LITERAL.
|
||||
header ['] immediate compile-only
|
||||
set HDR-NFA here ", ['] #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: BRACKET-TICK (') jump (LIT,)
|
||||
header [LITERAL] immediate
|
||||
set HDR-NFA here ", [LITERAL] #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: BRACKET-LITERAL jump LITERAL
|
||||
|
||||
\ ---- colon definitions -----------------------------------------------------------
|
||||
@@ -230,7 +230,7 @@ header [LITERAL] immediate
|
||||
\ FORTH-79: start a definition; it cannot be found until ; ends it. The
|
||||
\ CONTEXT vocabulary is set to the CURRENT one.
|
||||
\ (C)+2 holds LATEST while the entry is made, to tell whether one was.
|
||||
header :
|
||||
set HDR-NFA here ", : #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: COLON
|
||||
CURRENT a! @ CONTEXT a! !
|
||||
LATEST (C)+2 a! !
|
||||
@@ -240,7 +240,7 @@ header :
|
||||
NONE: drop jump (ABANDON) \ no entry: the rest of the line is not a definition
|
||||
|
||||
\ FORTH-79: compile the return, let the word be found, stop compiling
|
||||
header ; immediate compile-only
|
||||
set HDR-NFA here ", ; #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: SEMICOLON
|
||||
0 (OP,)
|
||||
LATEST (FLAGS) a! @ -3 and !
|
||||
@@ -255,27 +255,27 @@ header ; immediate compile-only
|
||||
\ what a word that is a C function in v3 -- BIRTH, BLOCK, BYE -- is on a
|
||||
\ node. Not FORTH-79 and not in v3, where such a word is registered from C.
|
||||
\ The constant (PORT) is the port's word address.
|
||||
header KERNEL-WORD
|
||||
set HDR-NFA here ", KERNEL-WORD #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: KERNEL-WORD
|
||||
COLON (LIT,) (PORT) (LIT,) 30 (OP,) 14 (OP,) \ n port b! !b
|
||||
jump SEMICOLON
|
||||
|
||||
\ FORTH-79: return from the definition at this point
|
||||
header EXIT immediate compile-only
|
||||
set HDR-NFA here ", EXIT #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: EXIT 0 jump (OP,)
|
||||
|
||||
header IMMEDIATE
|
||||
set HDR-NFA here ", IMMEDIATE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: IMMEDIATE LATEST if NONE (FLAGS) a! @ 1 OR ! ; NONE: drop ;
|
||||
|
||||
\ COMPILE xxx FORTH-79: when the word this is in runs, xxx is compiled
|
||||
header COMPILE immediate compile-only
|
||||
set HDR-NFA here ", COMPILE #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: COMPILE
|
||||
32 WORD (LOOKUP) if MISSING
|
||||
(LIT,) &(COMPILE,) jump (CALL,)
|
||||
MISSING: drop (UNKNOWN) drop jump (ABANDON)
|
||||
|
||||
\ [COMPILE] xxx FORTH-79: compile xxx even though it is immediate
|
||||
header [COMPILE] immediate compile-only
|
||||
set HDR-NFA here ", [COMPILE] #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: BRACKET-COMPILE
|
||||
32 WORD (LOOKUP) if MISSING jump (COMPILE,)
|
||||
MISSING: drop (UNKNOWN) drop jump (ABANDON)
|
||||
@@ -303,16 +303,16 @@ header [COMPILE] immediate compile-only
|
||||
NONE: drop ;
|
||||
|
||||
\ FORTH-79: an entry whose word leaves the address of its parameter field
|
||||
header CREATE
|
||||
set HDR-NFA here ", CREATE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: CREATE &(DOVAR) (C)+3 a! ! jump (DATA)
|
||||
|
||||
\ FORTH-79: CREATE and one cell. The standard leaves its first value to the
|
||||
\ programme; here it is 0.
|
||||
header VARIABLE
|
||||
set HDR-NFA here ", VARIABLE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: VARIABLE &(DOVAR) (C)+3 a! ! (DATA) (C)+8 a! @ if NONE drop 0 jump , NONE: drop ;
|
||||
|
||||
\ ( n -- ) FORTH-79: an entry whose word leaves n
|
||||
header CONSTANT
|
||||
set HDR-NFA here ", CONSTANT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: CONSTANT &(DOCON) (C)+3 a! ! (DATA) (C)+8 a! @ if NONE drop jump , NONE: drop drop ;
|
||||
|
||||
\ FORTH-79: in : DEFINER CREATE ... DOES> ... ; the words after DOES> become
|
||||
@@ -321,7 +321,7 @@ header CONSTANT
|
||||
\ call to the code after it and leaves DEFINER; that code starts with pop,
|
||||
\ which fetches the parameter field address the call left.
|
||||
: (DOES) pop 402653184 + LATEST a! ! ; \ 402653184 is `call` in slot 0
|
||||
header DOES> immediate compile-only
|
||||
set HDR-NFA here ", DOES> #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DOES> &(DOES) (CALL,) 25 jump (OP,)
|
||||
|
||||
\ ---- control structures (5.18, section 2) ---------------------------------------------
|
||||
@@ -341,15 +341,15 @@ header DOES> immediate compile-only
|
||||
\ Native if leaves the flag, so both ways out of it drop it (section 2):
|
||||
\ IF a THEN if L1 drop a jump L2 L1: drop L2:
|
||||
\ IF a ELSE b THEN if L1 drop a jump L2 L1: drop b L2:
|
||||
header IF immediate compile-only
|
||||
set HDR-NFA here ", IF #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: IF 6 (BRANCH>) >CF 23 (OP,) 1 jump >CF
|
||||
header ELSE immediate compile-only
|
||||
set HDR-NFA here ", ELSE #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ELSE
|
||||
CF> 1 (PAIR) CF> (C)+6 a! ! \ the if
|
||||
2 (BRANCH>) >CF \ the jump over the else part
|
||||
(C)+6 a! @ (HERE!) 23 (OP,)
|
||||
2 jump >CF
|
||||
header THEN immediate compile-only
|
||||
set HDR-NFA here ", THEN #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: THEN
|
||||
CF> dup -1 + if PLAIN
|
||||
drop 2 (PAIR) CF> jump (HERE!)
|
||||
@@ -365,19 +365,19 @@ header THEN immediate compile-only
|
||||
\ BEGIN a WHILE b REPEAT jump L0 Ld: drop L0: a if Lx drop b jump L0 Lx: drop
|
||||
\ BEGIN a AGAIN jump L0 Ld: drop L0: a jump L0
|
||||
\ The control-flow stack holds Ld, L0 and 3.
|
||||
header BEGIN immediate compile-only
|
||||
set HDR-NFA here ", BEGIN #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: BEGIN
|
||||
2 (BRANCH>) (C)+6 a! !
|
||||
(LABEL) >CF 23 (OP,)
|
||||
(LABEL) dup >CF (C)+6 a! @ (RESOLVE)
|
||||
3 jump >CF
|
||||
header UNTIL immediate compile-only
|
||||
set HDR-NFA here ", UNTIL #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: UNTIL CF> 3 (PAIR) CF> drop CF> 6 (BRANCH,) 23 jump (OP,)
|
||||
header AGAIN immediate compile-only
|
||||
set HDR-NFA here ", AGAIN #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: AGAIN CF> 3 (PAIR) CF> (JUMP,) CF> drop ;
|
||||
header WHILE immediate compile-only
|
||||
set HDR-NFA here ", WHILE #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: WHILE CF> 3 (PAIR) 3 >CF 6 (BRANCH>) >CF 23 (OP,) 4 jump >CF
|
||||
header REPEAT immediate compile-only
|
||||
set HDR-NFA here ", REPEAT #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: REPEAT
|
||||
CF> 4 (PAIR) CF> (C)+6 a! ! \ the while
|
||||
CF> 3 (PAIR) CF> (JUMP,) CF> drop
|
||||
@@ -391,16 +391,16 @@ header REPEAT immediate compile-only
|
||||
\ value for, with END after it. The control-flow stack holds the jumps to
|
||||
\ END, how many there are, and 7; inside a clause, the jump to N and 8.
|
||||
: (of) over xor ;
|
||||
header CASE immediate compile-only
|
||||
set HDR-NFA here ", CASE #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: CASE 0 >CF 7 jump >CF
|
||||
header OF immediate compile-only
|
||||
set HDR-NFA here ", OF #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: OF
|
||||
CF> 7 (PAIR)
|
||||
&(of) (INLINE,) 6 (BRANCH>) (C)+6 a! ! \ if M
|
||||
23 (OP,) 2 (BRANCH>) >CF \ drop, jump N
|
||||
(C)+6 a! @ (HERE!) 23 (OP,) 23 (OP,) \ M: drop drop
|
||||
8 jump >CF
|
||||
header ENDOF immediate compile-only
|
||||
set HDR-NFA here ", ENDOF #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ENDOF
|
||||
CF> 8 (PAIR) CF> (C)+6 a! ! \ the jump to N
|
||||
CF> (C)+7 a! ! \ how many jumps to END so far
|
||||
@@ -408,7 +408,7 @@ header ENDOF immediate compile-only
|
||||
(C)+7 a! @ 1 + >CF
|
||||
(C)+6 a! @ (HERE!) \ N:
|
||||
7 jump >CF
|
||||
header ENDCASE immediate compile-only
|
||||
set HDR-NFA here ", ENDCASE #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ENDCASE
|
||||
CF> 7 (PAIR) CF> (C)+7 a! !
|
||||
23 (OP,)
|
||||
@@ -456,11 +456,11 @@ header ENDCASE immediate compile-only
|
||||
(C)+6 a! @ jump (HERE!)
|
||||
PLAIN: drop ;
|
||||
|
||||
header DO immediate compile-only
|
||||
set HDR-NFA here ", DO #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DO &(do) (INLINE,) (LABEL) >CF 5 jump >CF
|
||||
header ?DO immediate compile-only
|
||||
set HDR-NFA here ", ?DO #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ?DO &(?do) (INLINE,) 6 (BRANCH>) >CF 23 (OP,) &(do) (INLINE,) (LABEL) >CF 6 jump >CF
|
||||
header LOOP immediate compile-only
|
||||
set HDR-NFA here ", LOOP #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: LOOP &(inc) (INLINE,) 0 (C)+5 a! ! jump (LOOPS)
|
||||
header +LOOP immediate compile-only
|
||||
set HDR-NFA here ", +LOOP #, 17 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: +LOOP &(+inc) (INLINE,) &(a-xor) (C)+5 a! ! jump (LOOPS)
|
||||
@@ -1,4 +1,5 @@
|
||||
\ core.v4 -- the core words the host-node capsules rest on.
|
||||
set HDR-LINK 0 \ the newest dictionary entry: none yet
|
||||
\ core.f18 -- the core words the host-node capsules rest on.
|
||||
\
|
||||
\ Each is the definition DECOMPOSITION.md gives and the golden-model tests
|
||||
\ execute (test_foundation.c, test_strings.c, test_terminal.c, test_pictured.c),
|
||||
@@ -12,7 +13,7 @@
|
||||
\ ERRORS (D-18). A word that finds an error takes its arguments off the stack
|
||||
\ and stores a code in NODE-ERROR. On a node with a prompt that store is a
|
||||
\ trap: the word goes no further, and the prompt prints the message for the
|
||||
\ code and ERROR (quit.v4, (RAISED)). The codes:
|
||||
\ code and ERROR (quit.f18, (RAISED)). The codes:
|
||||
\ 1 Negative count 2 Not a number 3 Number too long
|
||||
\ 4 Not a character 5 Dictionary full 6 Name missing
|
||||
\ 7 Control structure mismatch 8 Control structures too deep
|
||||
@@ -31,35 +32,15 @@ macro NEGATE inv 1 + endmacro
|
||||
macro NIP push drop pop endmacro
|
||||
|
||||
\ ---- section 4: multiply ------------------------------------------------
|
||||
header UM*
|
||||
: UM* ( u1 u2 -- ulo uhi )
|
||||
over 1 and inv 1 + over 2/ and \ u1 u2 t0 t0 = u2 2/ if u1 odd
|
||||
over a! N-1 push \ A: u2 R: loop count
|
||||
push over 2/ pop \ u1 u2 s t0 s = u1 2/
|
||||
L: +* unext \ u1 u2 s hi A: lo
|
||||
push drop pop \ u1 u2 hi
|
||||
2* a -if L0 drop 1 + jump L1 L0: drop L1: push
|
||||
over -if L2 drop dup jump L3 L2: drop 0 L3: push
|
||||
dup -if L4 drop over 1 and jump L5 L4: drop 0 L5:
|
||||
pop + pop + push
|
||||
and 1 and a 2* + pop ;
|
||||
set HDR-NFA here ", UM* #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: UM* ROM-UM* push ; \ ( u1 u2 -- ulo uhi ) the ROM's entry 0 (MACHINE.md 2.2)
|
||||
|
||||
\ ---- section 5.7: doubles ------------------------------------------------
|
||||
header D+
|
||||
: D+ ( d1 d2 -- d3 )
|
||||
push over push push drop pop \ al bl R: bh ah
|
||||
over over xor -if L1
|
||||
drop + -if C1 jump C0
|
||||
L1: drop over -if L2
|
||||
drop + jump C1
|
||||
L2: drop +
|
||||
C0: pop pop + ;
|
||||
C1: pop pop + 1 + ;
|
||||
set HDR-NFA here ", D+ #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: D+ ROM-D+ push ; \ ( d1 d2 -- d3 ) the ROM's entry 2
|
||||
|
||||
header DNEGATE
|
||||
: DNEGATE ( d -- -d )
|
||||
inv over if L1 drop push inv 1 + pop ;
|
||||
L1: drop 1 + ;
|
||||
set HDR-NFA here ", DNEGATE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DNEGATE ROM-DNEGATE push ; \ ( d -- -d ) the ROM's entry 3
|
||||
|
||||
\ ---- section 5.3: bytes --------------------------------------------------
|
||||
\ The shifts are written out, eight to a line, where DECOMPOSITION.md 5.3 has
|
||||
@@ -69,7 +50,7 @@ header DNEGATE
|
||||
macro 8/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ endmacro
|
||||
macro 8* 2* 2* 2* 2* 2* 2* 2* 2* endmacro
|
||||
|
||||
header C@
|
||||
set HDR-NFA here ", C@ #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: C@ ( baddr -- c )
|
||||
dup 2/ 2/ a! 3 and
|
||||
if K0 -1 + if K1 -1 + if K2
|
||||
@@ -78,7 +59,7 @@ header C@
|
||||
K1: drop @ 8/ 255 and ;
|
||||
K0: drop @ 255 and ;
|
||||
|
||||
header C!
|
||||
set HDR-NFA here ", C! #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: C! ( c baddr -- )
|
||||
dup 2/ 2/ a! 3 and
|
||||
if K0 -1 + if K1 -1 + if K2
|
||||
@@ -88,7 +69,7 @@ header C!
|
||||
K0: drop 255 and @ -256 and + ! ;
|
||||
|
||||
\ ---- section 5.9: strings ------------------------------------------------
|
||||
header CMOVE
|
||||
set HDR-NFA here ", CMOVE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: CMOVE ( src dst u -- )
|
||||
-if OK drop drop drop NODE-ERROR b! 1 !b ;
|
||||
OK: if DONE push
|
||||
@@ -109,7 +90,7 @@ header CMOVE
|
||||
\ is the port it came on, by its number; (ME) is this node's number.
|
||||
\
|
||||
\ Characters are kept in (OUT), 256 of them, a character to a cell, and sent
|
||||
\ when it is full and when the text has been done with (quit.v4). (OUT^)
|
||||
\ when it is full and when the text has been done with (quit.f18). (OUT^)
|
||||
\ is where the next goes.
|
||||
\
|
||||
\ THE STACK. What prints may be run with the data stack all but full: EMIT
|
||||
@@ -153,7 +134,7 @@ header CMOVE
|
||||
\ list of refusals owed, and messages written and read a word at a time
|
||||
\ (MESH.md 7a, 7b, 7c.6). The ports themselves are still written a word at
|
||||
\ a time for the two things that are not messages: a newborn node's
|
||||
\ nucleus (PORT!, quit.v4) and a node's requests to its kernel.
|
||||
\ nucleus (PORT!, quit.f18) and a node's requests to its kernel.
|
||||
\
|
||||
\ THE STACKS. All of this runs on the stacks the node's text is using.
|
||||
\ (SERVE) and what it calls keep to four cells of the data stack and four
|
||||
@@ -227,7 +208,7 @@ header CMOVE
|
||||
\ words are in (IN), is refused. A refusal for this node itself -- its own
|
||||
\ message came back to it -- is counted in (REFUSED) as one that came by a
|
||||
\ wire would be; or, if it is about the node this one is waiting on,
|
||||
\ (A-SELF) is set for AWAIT to find (quit.v4).
|
||||
\ (A-SELF) is set for AWAIT to find (quit.f18).
|
||||
\ (WIRE) is not what it was afterwards: the NACK went by another.
|
||||
\ If the drop does not drop -- the wire was cut after the message was looked
|
||||
\ at, which let it go already -- nothing is counted and no one is told.
|
||||
@@ -391,7 +372,7 @@ header CMOVE
|
||||
|
||||
\ ( -- ) send what has been printed, to where (PRINT-TO) says, by the port
|
||||
\ (PRINT-PORT): a message of type 2, its characters four to a word, the
|
||||
\ first lowest. quit.v4 sets those two when text for this node arrives.
|
||||
\ first lowest. quit.f18 sets those two when text for this node arrives.
|
||||
\ It waits for room on the wire, and for the 8 cells kept as well when the
|
||||
\ wire is the one the answer goes by. The characters are made ready in
|
||||
\ (OUT-TEXT), not where they are: until the message is on the wire the
|
||||
@@ -440,7 +421,7 @@ header CMOVE
|
||||
\ next is that fault's own message: put where (OUT^) points, it would go
|
||||
\ past the buffer's end, and (OUT^) would never again be at the end to be
|
||||
\ flushed (MESH.md 7c.6).
|
||||
header EMIT
|
||||
set HDR-NFA here ", EMIT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: EMIT ( c -- )
|
||||
255 and a push push \ A, and then the character, to the return stack
|
||||
(OUT^) b! @b (OUT)+256 xor if STALE drop jump PUT
|
||||
@@ -449,18 +430,18 @@ header EMIT
|
||||
(OUT^) b! @b a! pop !+ a !b \ the character goes where (OUT^) points, which moves on
|
||||
a (OUT)+256 xor if FULL drop pop a! ;
|
||||
FULL: drop (FLUSH-OUT) pop a! ;
|
||||
header KEY
|
||||
set HDR-NFA here ", KEY #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: KEY ( -- c )
|
||||
L: CONSOLE-STATUS b! @b if WAIT drop CONSOLE-RX b! @b ;
|
||||
WAIT: drop jump L
|
||||
|
||||
header CR
|
||||
set HDR-NFA here ", CR #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: CR ( -- ) 10 jump EMIT
|
||||
header SPACE
|
||||
set HDR-NFA here ", SPACE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: SPACE ( -- ) 32 jump EMIT
|
||||
header COUNT
|
||||
set HDR-NFA here ", COUNT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: COUNT ( baddr -- baddr+1 c ) dup C@ push 1 + pop ;
|
||||
header TYPE
|
||||
set HDR-NFA here ", TYPE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: TYPE ( baddr u -- )
|
||||
-if OK drop drop NODE-ERROR b! 1 !b ;
|
||||
OK: if DONE over C@ EMIT push 1 + pop -1 + jump OK
|
||||
@@ -1,9 +1,9 @@
|
||||
\ dict.v4 -- the dictionary: its space, its entries, and looking a name up.
|
||||
\ dict.f18 -- the dictionary: its space, its entries, and looking a name up.
|
||||
\
|
||||
\ DECOMPOSITION.md 5.12 and 5.13: HERE ALIGN ALLOT , C, 2, PAD LATEST, FIND ' ,
|
||||
\ and the entry-field words >LINK LFA LINK> >NAME NFA NAME> CFA PFA >BODY
|
||||
\ TRAVERSE SMUDGE HIDDEN. Part of the compiler capsule: it runs on the host
|
||||
\ node. Rests on core.v4 and input.v4.
|
||||
\ node. Rests on core.f18 and input.f18.
|
||||
\
|
||||
\ AN ENTRY. A word's execution address (xt) is the address of its code, and
|
||||
\ everything else is found from it:
|
||||
@@ -63,15 +63,15 @@ macro OR over inv and xor endmacro
|
||||
LOW: drop dup inv DLIMIT + 1 + -if HIGH drop drop jump (DERR) \ DLIMIT - new
|
||||
HIGH: drop DP b! !b -1 ;
|
||||
|
||||
header HERE
|
||||
set HDR-NFA here ", HERE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: HERE ( -- addr ) DP b! @b 3 + 4/ ;
|
||||
header ALIGN
|
||||
set HDR-NFA here ", ALIGN #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ALIGN ( -- ) DP b! @b 3 + -4 and !b ;
|
||||
header ALLOT
|
||||
set HDR-NFA here ", ALLOT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ALLOT ( n -- ) ALIGN 4* (DP+) drop ;
|
||||
|
||||
\ , calls nothing: the code generator calls it from as deep as anything goes.
|
||||
header ,
|
||||
set HDR-NFA here ", , #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: , ( x -- )
|
||||
a!
|
||||
DP b! @b 3 + -4 and \ the next whole cell, as a byte address
|
||||
@@ -79,57 +79,57 @@ header ,
|
||||
drop drop NODE-ERROR b! 5 !b ;
|
||||
ROOM: drop dup 4 + !b \ DP is past it
|
||||
4/ b! a !b ;
|
||||
header C,
|
||||
set HDR-NFA here ", C, #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: C, ( c -- )
|
||||
a! 1 (DP+) if FULL
|
||||
drop a DP b! @b -1 + jump C!
|
||||
FULL: drop ;
|
||||
header 2,
|
||||
set HDR-NFA here ", 2, #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: 2, ( lo hi -- ) SWAP , , ; \ the low cell first, as v3
|
||||
|
||||
header LATEST
|
||||
set HDR-NFA here ", LATEST #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: LATEST ( -- xt ) CURRENT a! @ a! @ ; \ the newest entry of the CURRENT vocabulary
|
||||
|
||||
\ ---- the fields of an entry (5.13) -----------------------------------------
|
||||
|
||||
: (FLAGS) ( xt -- addr ) -3 + ;
|
||||
header >LINK
|
||||
set HDR-NFA here ", >LINK #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: >LINK ( xt -- addr ) -1 + ;
|
||||
header LFA
|
||||
set HDR-NFA here ", LFA #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: LFA ( xt -- addr ) jump >LINK
|
||||
header LINK>
|
||||
set HDR-NFA here ", LINK> #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: LINK> ( addr -- xt ) a! @ ;
|
||||
header >NAME
|
||||
set HDR-NFA here ", >NAME #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: >NAME ( xt -- baddr ) -2 + a! @ 4* ;
|
||||
header NFA
|
||||
set HDR-NFA here ", NFA #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: NFA ( xt -- baddr ) jump >NAME
|
||||
header NAME>
|
||||
set HDR-NFA here ", NAME> #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: NAME> ( baddr -- xt ) dup C@ 31 and 4 + 4/ push 4/ pop + 3 + ;
|
||||
header CFA
|
||||
set HDR-NFA here ", CFA #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: CFA ( xt -- xt ) ;
|
||||
header PFA
|
||||
set HDR-NFA here ", PFA #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: PFA ( xt -- addr ) dup (FLAGS) a! @ 4 and if CODE drop 1 + ; CODE: drop ;
|
||||
header >BODY
|
||||
set HDR-NFA here ", >BODY #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: >BODY ( xt -- addr ) jump PFA
|
||||
|
||||
\ ( baddr n -- baddr' ) as v3: for n > 0, from a name's count byte to the
|
||||
\ byte after its last character; otherwise the address unchanged.
|
||||
header TRAVERSE
|
||||
set HDR-NFA here ", TRAVERSE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: TRAVERSE
|
||||
-if NN drop ;
|
||||
NN: if ZERO drop dup C@ 31 and + 1 + ;
|
||||
ZERO: drop ;
|
||||
|
||||
header SMUDGE
|
||||
set HDR-NFA here ", SMUDGE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: SMUDGE ( -- ) LATEST if NONE (FLAGS) a! @ 2 xor ! ; NONE: drop ;
|
||||
header HIDDEN
|
||||
set HDR-NFA here ", HIDDEN #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: HIDDEN ( -- ) LATEST if NONE (FLAGS) a! @ 2 OR ! ; NONE: drop ;
|
||||
|
||||
\ ---- telling the kernel (docs/v4.0.0/ENGINE.md 3b) ------------------------------
|
||||
\ A word's code is here on the node; its accounts are a record its kernel
|
||||
\ keeps. So the kernel has to be told of every entry that is made and of
|
||||
\ every entry that goes. An entry is made in one place, (HEADER); entries go
|
||||
\ in two, FORGET and COLD (system.v4). Each tells through a variable that
|
||||
\ in two, FORGET and COLD (system.f18). Each tells through a variable that
|
||||
\ holds the xt of a word to run, or 0 for a node whose host keeps no records:
|
||||
\ (WORD-DEFINED) ( xt -- ) an entry has been made; its code will be at xt
|
||||
\ (WORD-FORGOTTEN) ( w -- ) every entry at word address w or above is gone
|
||||
@@ -216,12 +216,12 @@ header HIDDEN
|
||||
|
||||
\ ( -- xt | 0 ) FORTH-79: the compilation address of the next word in the
|
||||
\ input stream, or 0 if it is not in the dictionary.
|
||||
header FIND
|
||||
set HDR-NFA here ", FIND #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: FIND 32 WORD jump (LOOKUP)
|
||||
|
||||
\ ( -- addr ) FORTH-79: the parameter field address of the next word in the
|
||||
\ input stream. Not found is an error: 0, and NODE-ERROR is set. This is '
|
||||
\ when interpreting; compile.v4 adds what ' does when compiling.
|
||||
\ when interpreting; compile.f18 adds what ' does when compiling.
|
||||
\ ( -- 0 ) say that the word WORD has just left is not known, as v3 does:
|
||||
\ UNKNOWN WORD: 'xxx'
|
||||
: (UNKNOWN)
|
||||
@@ -0,0 +1,36 @@
|
||||
\ end.f18 -- the end of the system's source: the state it is switched on in.
|
||||
\
|
||||
\ What was set in C when the nucleus was prebuilt (v4/tools/mkimage.c, gone
|
||||
\ since the machine's ROM assembles the system), said with the
|
||||
\ ROM's directives (MACHINE.md, the ROM's language). RAM is all zeroes
|
||||
\ when the machine starts, so only what is not zero is stored. Then the
|
||||
\ image record (map: (IMG)), the addresses a host needs (v4/image.h), and
|
||||
\ start: the ROM clears what it used and the node waits for a message.
|
||||
|
||||
\ the dictionary: empty, at DBASE; the newest entry, the nucleus's last
|
||||
store DP DBASE
|
||||
store (LATEST) HDR-LINK
|
||||
\ the control-flow stack, the number base, the log level
|
||||
store (CFP) CFBASE
|
||||
store BASE 10
|
||||
store (LOG-LEVEL) 2
|
||||
\ one vocabulary, FORTH, whose head cell is LATEST; new words go into it
|
||||
store CONTEXT (LATEST)
|
||||
store CURRENT (LATEST)
|
||||
\ the text interpreted is the terminal's
|
||||
store (SRC) TIB
|
||||
\ what COLD comes back to, and the lowest FORGET goes: the nucleus as it is
|
||||
store (BOOT) DBASE
|
||||
store (BOOT)+1 HDR-LINK
|
||||
store FENCE DICT-W
|
||||
\ nothing has ended badly; nothing has been printed
|
||||
store (LINE-STATUS) 1
|
||||
store (OUT^) (OUT)
|
||||
|
||||
\ the image record: where the node waits, its fault table, KEY's code
|
||||
store (IMG) &(IDLE)
|
||||
store (IMG)+1 &(FAULTS)
|
||||
store (IMG)+2 &KEY
|
||||
store (IMG)+3 &CR
|
||||
|
||||
start (IDLE)
|
||||
@@ -1,23 +1,23 @@
|
||||
\ forth.v4 -- the first words of the FORTH vocabulary: the ones that are
|
||||
\ forth.f18 -- the first words of the FORTH vocabulary: the ones that are
|
||||
\ opcodes or short runs of them, and the variables that are in-line addresses.
|
||||
\
|
||||
\ Each is the definition DECOMPOSITION.md gives (sections 4, 5.1 - 5.5, 5.18).
|
||||
\ A word flagged inline is copied into a definition in place of a call; the
|
||||
\ ones that touch the return stack are compile-only as well. Rests on core.v4,
|
||||
\ compile.v4's loader constants, and quit.v4, which the division words leave
|
||||
\ ones that touch the return stack are compile-only as well. Rests on core.f18,
|
||||
\ compile.f18's loader constants, and quit.f18, which the division words leave
|
||||
\ through when the divisor is zero. (F) is seven cells of scratch for
|
||||
\ this file.
|
||||
|
||||
\ ---- stack ----
|
||||
header DUP inline : DUP dup ;
|
||||
header DROP inline : DROP drop ;
|
||||
header OVER inline : OVER over ;
|
||||
header SWAP inline : SWAP' SWAP ;
|
||||
header ROT inline : ROT' ROT ;
|
||||
header -ROT inline : -ROT SWAP push SWAP pop ;
|
||||
header ?DUP : ?DUP if Z dup ; Z: ;
|
||||
header 2DUP inline : 2DUP over over ;
|
||||
header 2DROP inline : 2DROP drop drop ;
|
||||
set HDR-NFA here ", DUP #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : DUP dup ;
|
||||
set HDR-NFA here ", DROP #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : DROP drop ;
|
||||
set HDR-NFA here ", OVER #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : OVER over ;
|
||||
set HDR-NFA here ", SWAP #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : SWAP' SWAP ;
|
||||
set HDR-NFA here ", ROT #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : ROT' ROT ;
|
||||
set HDR-NFA here ", -ROT #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : -ROT SWAP push SWAP pop ;
|
||||
set HDR-NFA here ", ?DUP #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : ?DUP if Z dup ; Z: ;
|
||||
set HDR-NFA here ", 2DUP #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : 2DUP over over ;
|
||||
set HDR-NFA here ", 2DROP #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : 2DROP drop drop ;
|
||||
|
||||
\ ---- the stack as a whole (D-16) ----
|
||||
\ DEPTH reads the stack register. PICK and ROLL reach under the top of a
|
||||
@@ -28,7 +28,7 @@ header 2DROP inline : 2DROP drop drop ;
|
||||
\ anything while n is still there, and never more than one cell after.
|
||||
|
||||
\ FORTH-79: how many values were on the stack before DEPTH
|
||||
header DEPTH
|
||||
set HDR-NFA here ", DEPTH #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DEPTH DSTACK-DEPTH b! @b ;
|
||||
|
||||
\ ( name -- ) "xxxx: Invalid index", and the line ends with ERROR
|
||||
@@ -60,7 +60,7 @@ header DEPTH
|
||||
|
||||
\ ( n -- x ) FORTH-79: a copy of the n-th value, not counting n itself.
|
||||
\ 1 PICK is DUP, 2 PICK is OVER. n less than one is an error.
|
||||
header PICK
|
||||
set HDR-NFA here ", PICK #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: PICK
|
||||
-if POS jump BAD
|
||||
POS: if BAD
|
||||
@@ -72,7 +72,7 @@ header PICK
|
||||
\ ( n -- ) FORTH-79: the n-th value, not counting n itself, is taken out
|
||||
\ and put on top. 3 ROLL is ROT, 2 ROLL is SWAP, 1 ROLL does nothing. n
|
||||
\ less than one is an error.
|
||||
header ROLL
|
||||
set HDR-NFA here ", ROLL #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ROLL
|
||||
-if POS jump BAD
|
||||
POS: if BAD
|
||||
@@ -82,36 +82,36 @@ header ROLL
|
||||
BAD: drop $4C4C4F52 jump (INDEX)
|
||||
|
||||
\ ---- return stack: in line, and only inside a definition ----
|
||||
header >R inline compile-only : >R push ;
|
||||
header R> inline compile-only : R> pop ;
|
||||
header R@ inline compile-only : R@ pop dup push ;
|
||||
header I inline compile-only : I pop dup push ;
|
||||
header J inline compile-only : J pop pop pop dup push a! push push a ;
|
||||
header LEAVE inline compile-only : LEAVE pop pop drop dup push push ;
|
||||
header UNLOOP inline compile-only : UNLOOP pop drop pop drop ;
|
||||
set HDR-NFA here ", >R #, 24 #, HDR-NFA #, HDR-LINK set HDR-LINK here : >R push ;
|
||||
set HDR-NFA here ", R> #, 24 #, HDR-NFA #, HDR-LINK set HDR-LINK here : R> pop ;
|
||||
set HDR-NFA here ", R@ #, 24 #, HDR-NFA #, HDR-LINK set HDR-LINK here : R@ pop dup push ;
|
||||
set HDR-NFA here ", I #, 24 #, HDR-NFA #, HDR-LINK set HDR-LINK here : I pop dup push ;
|
||||
set HDR-NFA here ", J #, 24 #, HDR-NFA #, HDR-LINK set HDR-LINK here : J pop pop pop dup push a! push push a ;
|
||||
set HDR-NFA here ", LEAVE #, 24 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LEAVE pop pop drop dup push push ;
|
||||
set HDR-NFA here ", UNLOOP #, 24 #, HDR-NFA #, HDR-LINK set HDR-LINK here : UNLOOP pop drop pop drop ;
|
||||
|
||||
\ ---- memory ----
|
||||
header @ inline : FETCH a! @ ;
|
||||
header ! inline : STORE a! ! ;
|
||||
header +! inline : +! a! @ + ! ;
|
||||
header CELLS inline : CELLS ; \ an address unit is a cell (D-1)
|
||||
set HDR-NFA here ", @ #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : FETCH a! @ ;
|
||||
set HDR-NFA here ", ! #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : STORE a! ! ;
|
||||
set HDR-NFA here ", +! #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : +! a! @ + ! ;
|
||||
set HDR-NFA here ", CELLS #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : CELLS ; \ an address unit is a cell (D-1)
|
||||
|
||||
\ ---- arithmetic ----
|
||||
header + inline : PLUS + ;
|
||||
header - inline : MINUS - ;
|
||||
set HDR-NFA here ", + #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : PLUS + ;
|
||||
set HDR-NFA here ", - #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : MINUS - ;
|
||||
\ The low cell of the product, by N steps of +* with nothing but the count on
|
||||
\ the return stack. UM* drop gives the same cell but needs two more return
|
||||
\ entries, which a word inside two DO loops does not have (D-2). The low
|
||||
\ cell is exact: what +* loses at the top of T (D-3) takes N shifts to reach
|
||||
\ the bit that moves into A, and the loop ends first.
|
||||
header * : STAR a! 0 N-1 FOR +* UNEXT drop drop a ;
|
||||
header NEGATE inline : NEGATE' NEGATE ;
|
||||
header 1+ inline : 1+ 1 + ;
|
||||
header 1- inline : 1- -1 + ;
|
||||
header 2+ inline : 2+ 2 + ;
|
||||
header 2- inline : 2- -2 + ;
|
||||
header 2* inline : TWO* 2* ;
|
||||
header 2/ inline : TWO/ 2/ ;
|
||||
set HDR-NFA here ", * #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : STAR a! 0 N-1 FOR +* UNEXT drop drop a ;
|
||||
set HDR-NFA here ", NEGATE #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : NEGATE' NEGATE ;
|
||||
set HDR-NFA here ", 1+ #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : 1+ 1 + ;
|
||||
set HDR-NFA here ", 1- #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : 1- -1 + ;
|
||||
set HDR-NFA here ", 2+ #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : 2+ 2 + ;
|
||||
set HDR-NFA here ", 2- #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : 2- -2 + ;
|
||||
set HDR-NFA here ", 2* #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : TWO* 2* ;
|
||||
set HDR-NFA here ", 2/ #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : TWO/ 2/ ;
|
||||
|
||||
\ ---- division (sections 4 and 5.6) ----
|
||||
\ Division by zero is guarded (D-15): each word tests its divisor before it
|
||||
@@ -163,11 +163,11 @@ header 2/ inline : TWO/ 2/ ;
|
||||
(F)+1 a! @ -if L2 drop push inv 1 + pop jump L3 L2: drop L3:
|
||||
(F) a! @ -if L4 drop inv 1 + ; L4: drop ;
|
||||
|
||||
header S>D
|
||||
set HDR-NFA here ", S>D #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: S>D ( n -- d ) dup -if P drop -1 ; P: drop 0 ;
|
||||
\ The product's sign waits in (F), not on the return stack, for the same
|
||||
\ reason as SM/REM's.
|
||||
header M*
|
||||
set HDR-NFA here ", M* #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: M* ( n1 n2 -- d )
|
||||
over over xor (F) a! ! -if A inv 1 + A: push -if B inv 1 + B: pop UM*
|
||||
(F) a! @ -if P drop jump DNEGATE P: drop ;
|
||||
@@ -181,49 +181,49 @@ header M*
|
||||
(F) a! @ -if P drop DNEGATE jump Q P: drop Q:
|
||||
(F)+2 a! @ jump SM/REM
|
||||
|
||||
header /MOD
|
||||
set HDR-NFA here ", /MOD #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: /MOD ( n1 n2 -- rem quot )
|
||||
if Z push S>D pop jump SM/REM
|
||||
Z: drop drop 0 $444F4D2F jump (DIV0)
|
||||
header /
|
||||
set HDR-NFA here ", / #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: / ( n1 n2 -- quot )
|
||||
if Z push S>D pop SM/REM NIP ;
|
||||
Z: drop drop 0 $2F jump (DIV0)
|
||||
header MOD
|
||||
set HDR-NFA here ", MOD #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: MOD ( n1 n2 -- rem )
|
||||
if Z push S>D pop SM/REM drop ;
|
||||
Z: drop drop 0 $444F4D jump (DIV0)
|
||||
header */MOD
|
||||
set HDR-NFA here ", */MOD #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: */MOD ( n1 n2 n3 -- rem quot )
|
||||
if Z jump (*/MOD)
|
||||
Z: drop drop drop $44 $4F4D2F2A jump (DIV0)
|
||||
header */
|
||||
set HDR-NFA here ", */ #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: */ ( n1 n2 n3 -- quot )
|
||||
if Z (*/MOD) NIP ;
|
||||
Z: drop drop drop 0 $2F2A jump (DIV0)
|
||||
header M/MOD
|
||||
set HDR-NFA here ", M/MOD #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: M/MOD ( d n -- rem quot )
|
||||
if Z jump SM/REM
|
||||
Z: drop drop drop $44 $4F4D2F4D jump (DIV0)
|
||||
|
||||
\ ---- logic and comparison ----
|
||||
header AND inline : AND and ;
|
||||
header XOR inline : XOR xor ;
|
||||
header OR inline : OR' OR ;
|
||||
header 0= : 0= if L1 drop 0 ; L1: drop -1 ;
|
||||
header 0< : 0< -if L1 drop -1 ; L1: drop 0 ;
|
||||
header NOT : NOT jump 0=
|
||||
header = : EQUALS xor jump 0=
|
||||
header < : LESS
|
||||
set HDR-NFA here ", AND #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : AND and ;
|
||||
set HDR-NFA here ", XOR #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : XOR xor ;
|
||||
set HDR-NFA here ", OR #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : OR' OR ;
|
||||
set HDR-NFA here ", 0= #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : 0= if L1 drop 0 ; L1: drop -1 ;
|
||||
set HDR-NFA here ", 0< #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : 0< -if L1 drop -1 ; L1: drop 0 ;
|
||||
set HDR-NFA here ", NOT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : NOT jump 0=
|
||||
set HDR-NFA here ", = #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : EQUALS xor jump 0=
|
||||
set HDR-NFA here ", < #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LESS
|
||||
over over xor -if SAME drop drop jump 0<
|
||||
SAME: drop - jump 0<
|
||||
header > : GREATER SWAP jump LESS
|
||||
set HDR-NFA here ", > #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : GREATER SWAP jump LESS
|
||||
|
||||
\ ---- in-line addresses and constants ----
|
||||
header BL inline : BL' BL ;
|
||||
header TIB inline : TIB' TIB ;
|
||||
header >IN inline : >IN' >IN ;
|
||||
header SPAN inline : SPAN' SPAN ;
|
||||
header BASE inline : BASE' BASE ;
|
||||
header PAD inline : PAD' PAD ;
|
||||
header STATE inline : STATE' STATE ;
|
||||
set HDR-NFA here ", BL #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : BL' BL ;
|
||||
set HDR-NFA here ", TIB #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : TIB' TIB ;
|
||||
set HDR-NFA here ", >IN #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : >IN' >IN ;
|
||||
set HDR-NFA here ", SPAN #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : SPAN' SPAN ;
|
||||
set HDR-NFA here ", BASE #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : BASE' BASE ;
|
||||
set HDR-NFA here ", PAD #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : PAD' PAD ;
|
||||
set HDR-NFA here ", STATE #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : STATE' STATE ;
|
||||
@@ -1,10 +1,10 @@
|
||||
\ input.v4 -- reading a line and splitting it into words and numbers.
|
||||
\ input.f18 -- reading a line and splitting it into words and numbers.
|
||||
\
|
||||
\ DECOMPOSITION.md 5.9: TIB >IN SPAN SOURCE BL EXPECT QUERY WORD ENCLOSE
|
||||
\ CONVERT NUMBER, and the comment words ( and \ of 5.15 (named PAREN and
|
||||
\ BACKSLASH here, since the text assembler reads those two characters as its
|
||||
\ own comments; the dictionary will give them their names). Part of the compiler
|
||||
\ capsule: it runs on the host node. Rests on core.v4.
|
||||
\ capsule: it runs on the host node. Rests on core.f18.
|
||||
\
|
||||
\ Constants the loader supplies:
|
||||
\ TIB byte address of the text input buffer; QUERY fills at most 81 bytes
|
||||
@@ -14,7 +14,7 @@
|
||||
\ WBUF byte address of WORD's buffer, 257 bytes
|
||||
\ (P) word address of eight cells of scratch for this file
|
||||
\ (SRC) word address of the variable: the byte address of the text being
|
||||
\ interpreted. QUERY makes it TIB; LOAD (blocks.v4) makes it a
|
||||
\ interpreted. QUERY makes it TIB; LOAD (blocks.f18) makes it a
|
||||
\ block buffer. >IN is an offset from it and SPAN its length.
|
||||
\ (SRC-HOOK) word address of a variable: 0, or the address of a word
|
||||
\ that WORD calls before it looks at the text, to make sure (SRC)
|
||||
@@ -27,7 +27,7 @@
|
||||
macro BL 32 endmacro
|
||||
|
||||
\ ( -- baddr u ) the input buffer and how much of it is in use
|
||||
header SOURCE
|
||||
set HDR-NFA here ", SOURCE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: SOURCE (SRC) a! @ SPAN a! @ -if P drop 0 P: ;
|
||||
|
||||
\ ( baddr n -- ) FORTH-79: characters from the terminal are stored from
|
||||
@@ -40,7 +40,7 @@ header SOURCE
|
||||
\ on the stack beneath it, so it works in (P) -- (P)+0 where the next
|
||||
\ character goes, (P)+1 how many more may come, (P)+2 where the first went --
|
||||
\ and has at most three cells of its own on the data stack (D-2).
|
||||
header EXPECT
|
||||
set HDR-NFA here ", EXPECT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: EXPECT
|
||||
-if NN drop drop ; \ n < 0
|
||||
NN: if ZERO
|
||||
@@ -57,7 +57,7 @@ header EXPECT
|
||||
ZERO: drop drop ;
|
||||
|
||||
\ ( -- ) FORTH-79: up to 80 characters, or a line, into TIB; >IN to 0.
|
||||
header QUERY
|
||||
set HDR-NFA here ", QUERY #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: QUERY TIB (SRC) a! ! TIB 80 EXPECT 0 >IN a! ! ;
|
||||
|
||||
\ ---- WORD ------------------------------------------------------------------
|
||||
@@ -122,7 +122,7 @@ macro (STEP) (P)+6 a! @ 1 + ! endmacro
|
||||
RANOUT: drop 0 (P)+2 a! @ WBUF+1 + C!
|
||||
(P)+6 a! @ >IN a! ! WBUF ;
|
||||
|
||||
header WORD
|
||||
set HDR-NFA here ", WORD #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: WORD
|
||||
(WORD-SET)
|
||||
SK: (LEFT) -if SKE drop (CH) if SKS drop jump (WORD-TAKE) \ past delimiters
|
||||
@@ -146,7 +146,7 @@ header WORD
|
||||
\ ( baddr c -- baddr n1 n2 n3 ) in the zero-terminated string at baddr:
|
||||
\ n1 the offset of the first character that is not c, n2 the offset of the
|
||||
\ first c after it, n3 the offset of the first character after that run of c.
|
||||
header ENCLOSE
|
||||
set HDR-NFA here ", ENCLOSE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ENCLOSE
|
||||
255 and (P) a! ! dup (P)+1 a! !
|
||||
0 (ESKIP) dup (ESCAN) dup (ESKIP) ;
|
||||
@@ -167,7 +167,7 @@ header ENCLOSE
|
||||
\ it is multiplied by BASE, until one is not a digit; baddr2 is its address.
|
||||
\ (P)+2 holds the digit while the double is multiplied and (P)+5 the address,
|
||||
\ so nothing waits on the return stack across the calls.
|
||||
header CONVERT
|
||||
set HDR-NFA here ", CONVERT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: CONVERT
|
||||
L: 1 + dup (P)+5 a! ! C@ (DIGIT) \ lo hi n
|
||||
-if DIG drop (P)+5 a! @ ;
|
||||
@@ -201,17 +201,17 @@ header CONVERT
|
||||
ERR0: 0 0 0 ;
|
||||
|
||||
\ ( baddr -- d ) FORTH-79. What is not a number gives 0 and sets NODE-ERROR.
|
||||
header NUMBER
|
||||
set HDR-NFA here ", NUMBER #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: NUMBER
|
||||
(NUMBER?) if BAD drop ;
|
||||
BAD: drop NODE-ERROR b! 2 !b ;
|
||||
|
||||
\ ---- comments (5.15) -------------------------------------------------------
|
||||
\ PAREN skips to the closing parenthesis; BACKSLASH skips the rest of the line.
|
||||
header ( immediate
|
||||
set HDR-NFA here ", ( #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: PAREN 41 WORD drop ;
|
||||
header \ immediate
|
||||
\ In a block a line is 64 characters: skip to the start of the next.
|
||||
set HDR-NFA here ", \ #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
|
||||
: BACKSLASH
|
||||
BLK a! @ if TERM drop >IN a! @ -64 and 64 + ! ;
|
||||
TERM: drop SPAN a! @ >IN a! ! ;
|
||||
@@ -1,10 +1,10 @@
|
||||
\ log.v4 -- logging, as v3: a message has a level, and is printed if the
|
||||
\ log.f18 -- logging, as v3: a message has a level, and is printed if the
|
||||
\ level is at or below LOG-LEVEL.
|
||||
\
|
||||
\ DECOMPOSITION.md 5.25: the level constants LOG-ERROR LOG-WARN LOG-INFO
|
||||
\ LOG-TEST LOG-DEBUG (0 .. 4), LOG-LEVEL! LOG-LEVEL@, LOG-ERROR" ... LOG-DEBUG"
|
||||
\ and LOG-ERROR-STR ... LOG-DEBUG-STR. Part of the compiler capsule; rests
|
||||
\ on core.v4, codegen.v4 and quit.v4.
|
||||
\ on core.f18, codegen.f18 and quit.f18.
|
||||
\
|
||||
\ WHAT IS PRINTED is v3's line without its time of day, which a node has
|
||||
\ not got: the level's colour, the level's name and a colon, the colour off,
|
||||
@@ -16,16 +16,16 @@
|
||||
\ Constants the loader supplies:
|
||||
\ (LOG-LEVEL) word address of the variable: 2, LOG-INFO, at switch-on
|
||||
|
||||
header LOG-ERROR inline : LOG-ERROR 0 ;
|
||||
header LOG-WARN inline : LOG-WARN 1 ;
|
||||
header LOG-INFO inline : LOG-INFO 2 ;
|
||||
header LOG-TEST inline : LOG-TEST 3 ;
|
||||
header LOG-DEBUG inline : LOG-DEBUG 4 ;
|
||||
set HDR-NFA here ", LOG-ERROR #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LOG-ERROR 0 ;
|
||||
set HDR-NFA here ", LOG-WARN #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LOG-WARN 1 ;
|
||||
set HDR-NFA here ", LOG-INFO #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LOG-INFO 2 ;
|
||||
set HDR-NFA here ", LOG-TEST #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LOG-TEST 3 ;
|
||||
set HDR-NFA here ", LOG-DEBUG #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LOG-DEBUG 4 ;
|
||||
|
||||
header LOG-LEVEL@
|
||||
set HDR-NFA here ", LOG-LEVEL@ #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: LOG-LEVEL@ ( -- n ) (LOG-LEVEL) a! @ ;
|
||||
\ ( n -- ) as v3: a level below 0 is 0, one above 4 is 4
|
||||
header LOG-LEVEL!
|
||||
set HDR-NFA here ", LOG-LEVEL! #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: LOG-LEVEL!
|
||||
-if POS drop 0 jump SET
|
||||
POS: dup -5 + -if BIG drop jump SET
|
||||
@@ -45,15 +45,15 @@ header LOG-LEVEL!
|
||||
P4: drop $34335B1B (EMIT4) $6D (EMIT4) $55424544 (EMIT4) $203A47 (EMIT4) $6D305B1B (EMIT4) jump OUT
|
||||
OUT: TYPE jump CR
|
||||
|
||||
header LOG-ERROR-STR : LOG-ERROR-STR ( baddr u -- ) 0 jump (LOG)
|
||||
header LOG-WARN-STR : LOG-WARN-STR ( baddr u -- ) 1 jump (LOG)
|
||||
header LOG-INFO-STR : LOG-INFO-STR ( baddr u -- ) 2 jump (LOG)
|
||||
header LOG-TEST-STR : LOG-TEST-STR ( baddr u -- ) 3 jump (LOG)
|
||||
header LOG-DEBUG-STR : LOG-DEBUG-STR ( baddr u -- ) 4 jump (LOG)
|
||||
set HDR-NFA here ", LOG-ERROR-STR #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LOG-ERROR-STR ( baddr u -- ) 0 jump (LOG)
|
||||
set HDR-NFA here ", LOG-WARN-STR #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LOG-WARN-STR ( baddr u -- ) 1 jump (LOG)
|
||||
set HDR-NFA here ", LOG-INFO-STR #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LOG-INFO-STR ( baddr u -- ) 2 jump (LOG)
|
||||
set HDR-NFA here ", LOG-TEST-STR #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LOG-TEST-STR ( baddr u -- ) 3 jump (LOG)
|
||||
set HDR-NFA here ", LOG-DEBUG-STR #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LOG-DEBUG-STR ( baddr u -- ) 4 jump (LOG)
|
||||
|
||||
\ ( level -- ) the run time of LOG-xxx" : the text is after the call, as
|
||||
\ for ." ; log it at that level and go on after it.
|
||||
header (LOG") compile-only
|
||||
set HDR-NFA here ", (LOG") #, 16 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: (LOG")
|
||||
pop 4* dup C@ over + 4/ 1 + push \ level baddr R: the cell after the text
|
||||
COUNT ROT jump (LOG)
|
||||
@@ -65,8 +65,8 @@ header (LOG") compile-only
|
||||
STATE a! @ if NOW
|
||||
drop (Q)+3 a! @ (LIT,) &(LOG") (CALL,) jump (STRING,)
|
||||
NOW: drop WBUF COUNT (Q)+3 a! @ jump (LOG)
|
||||
header LOG-ERROR" immediate : LOG-ERROR-QUOTE 0 jump (LOG-QUOTE)
|
||||
header LOG-WARN" immediate : LOG-WARN-QUOTE 1 jump (LOG-QUOTE)
|
||||
header LOG-INFO" immediate : LOG-INFO-QUOTE 2 jump (LOG-QUOTE)
|
||||
header LOG-TEST" immediate : LOG-TEST-QUOTE 3 jump (LOG-QUOTE)
|
||||
header LOG-DEBUG" immediate : LOG-DEBUG-QUOTE 4 jump (LOG-QUOTE)
|
||||
set HDR-NFA here ", LOG-ERROR" #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LOG-ERROR-QUOTE 0 jump (LOG-QUOTE)
|
||||
set HDR-NFA here ", LOG-WARN" #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LOG-WARN-QUOTE 1 jump (LOG-QUOTE)
|
||||
set HDR-NFA here ", LOG-INFO" #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LOG-INFO-QUOTE 2 jump (LOG-QUOTE)
|
||||
set HDR-NFA here ", LOG-TEST" #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LOG-TEST-QUOTE 3 jump (LOG-QUOTE)
|
||||
set HDR-NFA here ", LOG-DEBUG" #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here : LOG-DEBUG-QUOTE 4 jump (LOG-QUOTE)
|
||||
@@ -0,0 +1,125 @@
|
||||
\ map-32.f18 -- the memory map the system's source is assembled with, 32-bit cells.
|
||||
\ Generated by v4/tools/mkmap.c (mkmap sys) from v4/tests/host_map.h -- do not edit.
|
||||
constant N-1 31
|
||||
constant NODE-ERROR 16382
|
||||
constant CONSOLE-TX 16380
|
||||
constant CONSOLE-RX 16378
|
||||
constant CONSOLE-STATUS 16377
|
||||
constant BASE 16376
|
||||
constant TIB 63776
|
||||
constant >IN 16375
|
||||
constant SPAN 16374
|
||||
constant WBUF 64856
|
||||
constant (P) 16360
|
||||
constant DP 16373
|
||||
constant (LATEST) 16372
|
||||
constant DBASE 32768
|
||||
constant DLIMIT 55296
|
||||
constant PAD 63656
|
||||
constant (D) 16352
|
||||
constant (CG) 16336
|
||||
constant CG-BSLOTS 3
|
||||
constant STATE 16371
|
||||
constant (C) 16322
|
||||
constant (CFP) 16370
|
||||
constant (Q) 14708
|
||||
constant (F) 16279
|
||||
constant (S) 15812
|
||||
constant (W) 16285
|
||||
constant (X) 15792
|
||||
constant (BOOT) 15750
|
||||
constant (LOG-LEVEL) 14707
|
||||
constant (ACL-HOOK) 14706
|
||||
constant SCR 15742
|
||||
constant BLK 15743
|
||||
constant (SRC) 15744
|
||||
constant (SRC-HOOK) 15745
|
||||
constant (LINE-STATUS) 14703
|
||||
constant (PORT) 14572
|
||||
constant (ME) 14699
|
||||
constant (CONSOLE) 14696
|
||||
constant (ROUTE#) 14695
|
||||
constant (ROUTE-DEFAULT) 14694
|
||||
constant (LOST) 14693
|
||||
constant (PRINT-TO) 14692
|
||||
constant (PRINT-PORT) 14679
|
||||
constant (DONE-PORT) 14678
|
||||
constant (ROUTES) 14616
|
||||
constant -PORTS -8
|
||||
constant (NEAR) 14648
|
||||
constant (AWAIT-FROM) 14673
|
||||
constant (WIRE) 14584
|
||||
constant (WIRE-A) 14585
|
||||
constant (WIRE-B) 14586
|
||||
constant (WIRE-DO) 14587
|
||||
constant (WIRE-HOW) 14588
|
||||
constant (WIRE-HAVE) 14589
|
||||
constant (S-HAVE) 14677
|
||||
constant (S-MASK) 14676
|
||||
constant (S-WIRE) 14675
|
||||
constant (S-ON) 14674
|
||||
constant (KEEP) 14672
|
||||
constant (DEFER) 14671
|
||||
constant (D-MASK) 14704
|
||||
constant (IN) 14656
|
||||
constant (ONE) 14663
|
||||
constant (OUT-HDR) 14600
|
||||
constant (W-NEED) 14607
|
||||
constant (W-PORT) 14608
|
||||
constant (P-WAY) 14609
|
||||
constant (P-NEED) 14612
|
||||
constant (H-PORT) 14613
|
||||
constant (H-NEED) 14614
|
||||
constant (H-MASK) 14615
|
||||
constant (A-SELF) 14610
|
||||
constant (SEND^) 14611
|
||||
constant (OUT-TEXT) 14248
|
||||
constant (SEND-TEXT) 13912
|
||||
constant (QUIET) 14702
|
||||
constant (REFUSED) 14705
|
||||
constant (OUT^) 14698
|
||||
constant (REPLY) 14697
|
||||
constant (MSG) 14664
|
||||
constant (OUT) 14312
|
||||
constant (WORD-DEFINED) 14701
|
||||
constant (WORD-FORGOTTEN) 14700
|
||||
constant (GONE-HOOK) 14691
|
||||
constant BLOCK# -1
|
||||
constant BUFFER# -2
|
||||
constant UPDATE# -3
|
||||
constant SAVE-BUFFERS# -4
|
||||
constant EMPTY-BUFFERS# -5
|
||||
constant (Q/) 15752
|
||||
constant (QE) 15757
|
||||
constant (QR) 15765
|
||||
constant (QL) 15770
|
||||
constant (QT) 15777
|
||||
constant (QP) 15783
|
||||
constant (DP) 15787
|
||||
constant ADDR-DIGITS 8
|
||||
constant MSB -2147483648
|
||||
constant MAXHI 2147483647
|
||||
constant HIMASK 65535
|
||||
constant 2N+15 79
|
||||
constant N-18 14
|
||||
constant N-17 15
|
||||
constant MAX-INT 2147483647
|
||||
constant HLD 16359
|
||||
constant FENCE 16358
|
||||
constant CONTEXT 16320
|
||||
constant CURRENT 16321
|
||||
constant VOC-LINK 16334
|
||||
constant HEND 63248
|
||||
constant -HFLOOR -63186
|
||||
constant DSTACK-DEPTH 16369
|
||||
constant RSTACK-DEPTH 16368
|
||||
constant CFBASE 16288
|
||||
constant CFEND 16320
|
||||
constant ROM-UM* 16384
|
||||
constant ROM-UM/MOD 16385
|
||||
constant ROM-D+ 16386
|
||||
constant ROM-DNEGATE 16387
|
||||
constant ROM-Q.* 16388
|
||||
constant ROM-Q./ 16389
|
||||
constant DICT-W 8192
|
||||
constant (IMG) 14593
|
||||
@@ -0,0 +1,125 @@
|
||||
\ map-64.f18 -- the memory map the system's source is assembled with, 64-bit cells.
|
||||
\ Generated by v4/tools/mkmap.c (mkmap sys) from v4/tests/host_map.h -- do not edit.
|
||||
constant N-1 63
|
||||
constant NODE-ERROR 16382
|
||||
constant CONSOLE-TX 16380
|
||||
constant CONSOLE-RX 16378
|
||||
constant CONSOLE-STATUS 16377
|
||||
constant BASE 16376
|
||||
constant TIB 63776
|
||||
constant >IN 16375
|
||||
constant SPAN 16374
|
||||
constant WBUF 64856
|
||||
constant (P) 16360
|
||||
constant DP 16373
|
||||
constant (LATEST) 16372
|
||||
constant DBASE 32768
|
||||
constant DLIMIT 55296
|
||||
constant PAD 63656
|
||||
constant (D) 16352
|
||||
constant (CG) 16336
|
||||
constant CG-BSLOTS 3
|
||||
constant STATE 16371
|
||||
constant (C) 16322
|
||||
constant (CFP) 16370
|
||||
constant (Q) 14708
|
||||
constant (F) 16279
|
||||
constant (S) 15812
|
||||
constant (W) 16285
|
||||
constant (X) 15792
|
||||
constant (BOOT) 15750
|
||||
constant (LOG-LEVEL) 14707
|
||||
constant (ACL-HOOK) 14706
|
||||
constant SCR 15742
|
||||
constant BLK 15743
|
||||
constant (SRC) 15744
|
||||
constant (SRC-HOOK) 15745
|
||||
constant (LINE-STATUS) 14703
|
||||
constant (PORT) 14572
|
||||
constant (ME) 14699
|
||||
constant (CONSOLE) 14696
|
||||
constant (ROUTE#) 14695
|
||||
constant (ROUTE-DEFAULT) 14694
|
||||
constant (LOST) 14693
|
||||
constant (PRINT-TO) 14692
|
||||
constant (PRINT-PORT) 14679
|
||||
constant (DONE-PORT) 14678
|
||||
constant (ROUTES) 14616
|
||||
constant -PORTS -8
|
||||
constant (NEAR) 14648
|
||||
constant (AWAIT-FROM) 14673
|
||||
constant (WIRE) 14584
|
||||
constant (WIRE-A) 14585
|
||||
constant (WIRE-B) 14586
|
||||
constant (WIRE-DO) 14587
|
||||
constant (WIRE-HOW) 14588
|
||||
constant (WIRE-HAVE) 14589
|
||||
constant (S-HAVE) 14677
|
||||
constant (S-MASK) 14676
|
||||
constant (S-WIRE) 14675
|
||||
constant (S-ON) 14674
|
||||
constant (KEEP) 14672
|
||||
constant (DEFER) 14671
|
||||
constant (D-MASK) 14704
|
||||
constant (IN) 14656
|
||||
constant (ONE) 14663
|
||||
constant (OUT-HDR) 14600
|
||||
constant (W-NEED) 14607
|
||||
constant (W-PORT) 14608
|
||||
constant (P-WAY) 14609
|
||||
constant (P-NEED) 14612
|
||||
constant (H-PORT) 14613
|
||||
constant (H-NEED) 14614
|
||||
constant (H-MASK) 14615
|
||||
constant (A-SELF) 14610
|
||||
constant (SEND^) 14611
|
||||
constant (OUT-TEXT) 14248
|
||||
constant (SEND-TEXT) 13912
|
||||
constant (QUIET) 14702
|
||||
constant (REFUSED) 14705
|
||||
constant (OUT^) 14698
|
||||
constant (REPLY) 14697
|
||||
constant (MSG) 14664
|
||||
constant (OUT) 14312
|
||||
constant (WORD-DEFINED) 14701
|
||||
constant (WORD-FORGOTTEN) 14700
|
||||
constant (GONE-HOOK) 14691
|
||||
constant BLOCK# -1
|
||||
constant BUFFER# -2
|
||||
constant UPDATE# -3
|
||||
constant SAVE-BUFFERS# -4
|
||||
constant EMPTY-BUFFERS# -5
|
||||
constant (Q/) 15752
|
||||
constant (QE) 15757
|
||||
constant (QR) 15765
|
||||
constant (QL) 15770
|
||||
constant (QT) 15777
|
||||
constant (QP) 15783
|
||||
constant (DP) 15787
|
||||
constant ADDR-DIGITS 16
|
||||
constant MSB -9223372036854775808
|
||||
constant MAXHI 9223372036854775807
|
||||
constant HIMASK 281474976710655
|
||||
constant 2N+15 143
|
||||
constant N-18 46
|
||||
constant N-17 47
|
||||
constant MAX-INT 9223372036854775807
|
||||
constant HLD 16359
|
||||
constant FENCE 16358
|
||||
constant CONTEXT 16320
|
||||
constant CURRENT 16321
|
||||
constant VOC-LINK 16334
|
||||
constant HEND 63248
|
||||
constant -HFLOOR -63186
|
||||
constant DSTACK-DEPTH 16369
|
||||
constant RSTACK-DEPTH 16368
|
||||
constant CFBASE 16288
|
||||
constant CFEND 16320
|
||||
constant ROM-UM* 16384
|
||||
constant ROM-UM/MOD 16385
|
||||
constant ROM-D+ 16386
|
||||
constant ROM-DNEGATE 16387
|
||||
constant ROM-Q.* 16388
|
||||
constant ROM-Q./ 16389
|
||||
constant DICT-W 8192
|
||||
constant (IMG) 14593
|
||||
@@ -1,10 +1,10 @@
|
||||
\ numout.v4 -- printing numbers: pictured output, the . words, and .S
|
||||
\ numout.f18 -- printing numbers: pictured output, the . words, and .S
|
||||
\
|
||||
\ DECOMPOSITION.md 5.8: <# # #S HOLD SIGN #> . .R U. U.R D. D.R ? SPACES
|
||||
\ DECIMAL HEX OCTAL, each the definition given there and executed on the mesh
|
||||
\ node by test_pictured.c, test_numout.c and test_printing.c; and .S, which
|
||||
\ D-16 makes possible again. Part of the compiler capsule. Rests on core.v4
|
||||
\ and forth.v4.
|
||||
\ D-16 makes possible again. Part of the compiler capsule. Rests on core.f18
|
||||
\ and forth.f18.
|
||||
\
|
||||
\ Constants the loader supplies:
|
||||
\ HEND byte address just past the hold buffer, which is 64 bytes
|
||||
@@ -17,56 +17,38 @@
|
||||
macro (-ROT) SWAP push SWAP pop endmacro
|
||||
|
||||
\ ---- unsigned division (section 4) ----
|
||||
\ One step a bit, the divisor in A. Exact for uhi < ud.
|
||||
: UM/MOD ( ulo uhi ud -- urem uquot )
|
||||
a! N-1 FOR
|
||||
-if L0
|
||||
2* over -if L1 drop 1 + jump L2
|
||||
L1: drop L2: push 2* pop
|
||||
jump SUB
|
||||
L0:
|
||||
2* over -if L3 drop 1 + jump L4
|
||||
L3: drop L4: push 2* pop
|
||||
dup a xor -if L5
|
||||
drop -if NOSUB jump SUB
|
||||
L5: drop dup inv a + inv -if L6
|
||||
drop jump NOSUB
|
||||
L6: push drop pop jump SETBIT
|
||||
SUB: inv a + inv
|
||||
SETBIT: push 1 + pop
|
||||
NOSUB:
|
||||
NEXT
|
||||
over push push drop pop pop ;
|
||||
\ Exact for uhi < ud. The ROM's entry 1 (MACHINE.md 2.2).
|
||||
: UM/MOD ROM-UM/MOD push ; \ ( ulo uhi ud -- urem uquot )
|
||||
|
||||
\ ---- pictured output ----
|
||||
header <#
|
||||
set HDR-NFA here ", <# #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: <# ( -- ) HEND HLD b! !b ;
|
||||
header HOLD
|
||||
set HDR-NFA here ", HOLD #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: HOLD ( c -- )
|
||||
dup -256 and if OKC drop drop NODE-ERROR b! 4 !b ; \ not a character
|
||||
OKC: drop HLD b! @b -HFLOOR + -if ROOM
|
||||
drop drop NODE-ERROR b! 3 !b ; \ the buffer is full
|
||||
ROOM: drop HLD b! @b -1 + dup !b jump C!
|
||||
header SIGN
|
||||
set HDR-NFA here ", SIGN #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: SIGN ( n -- ) -if L1 drop 45 jump HOLD L1: drop ;
|
||||
header #
|
||||
set HDR-NFA here ", # #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: # ( ud1 -- ud2 )
|
||||
0 (BASE) UM/MOD (-ROT) \ qhi lo rem1
|
||||
(BASE) UM/MOD (-ROT) \ qlo qhi rem
|
||||
dup -10 + -if L1 drop 48 + jump L2 L1: drop 55 + L2: jump HOLD
|
||||
header #S
|
||||
set HDR-NFA here ", #S #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: #S ( ud -- 0 0 ) L: # over over OR if L1 drop jump L L1: drop ;
|
||||
header #>
|
||||
set HDR-NFA here ", #> #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: #> ( ud -- baddr u ) drop drop HLD b! @b HEND over push inv pop + inv ;
|
||||
|
||||
\ ---- spaces and the number base ----
|
||||
header SPACES
|
||||
set HDR-NFA here ", SPACES #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: SPACES ( n -- ) -if L drop ; L: if DONE SPACE -1 + jump L DONE: drop ;
|
||||
header DECIMAL
|
||||
set HDR-NFA here ", DECIMAL #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DECIMAL 10 BASE a! ! ;
|
||||
header HEX
|
||||
set HDR-NFA here ", HEX #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: HEX 16 BASE a! ! ;
|
||||
header OCTAL
|
||||
set HDR-NFA here ", OCTAL #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: OCTAL 8 BASE a! ! ;
|
||||
|
||||
\ ---- numbers ----
|
||||
@@ -87,28 +69,28 @@ header OCTAL
|
||||
: (D.BODY) ( d width -- )
|
||||
(W) b! !b dup push -if A DNEGATE A: <# #S pop SIGN #> jump (.TAIL)
|
||||
|
||||
header .R
|
||||
set HDR-NFA here ", .R #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DOT-R ( n width -- ) 0 (W)+1 b! !b jump (.BODY)
|
||||
header .
|
||||
set HDR-NFA here ", . #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DOT ( n -- ) -1 (W)+1 b! !b 0 jump (.BODY)
|
||||
header U.R
|
||||
set HDR-NFA here ", U.R #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: U-DOT-R ( u width -- ) 0 (W)+1 b! !b jump (U.BODY)
|
||||
header U.
|
||||
set HDR-NFA here ", U. #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: U-DOT ( u -- ) -1 (W)+1 b! !b 0 jump (U.BODY)
|
||||
header D.R
|
||||
set HDR-NFA here ", D.R #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: D-DOT-R ( d width -- ) 0 (W)+1 b! !b jump (D.BODY)
|
||||
header D.
|
||||
set HDR-NFA here ", D. #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: D-DOT ( d -- ) -1 (W)+1 b! !b 0 jump (D.BODY)
|
||||
|
||||
\ ( addr -- ) print what the cell holds
|
||||
header ?
|
||||
set HDR-NFA here ", ? #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: QUESTION a! @ jump DOT
|
||||
|
||||
\ ( -- ) as v3: the depth between < and >, then every value on the stack,
|
||||
\ the deepest first, each followed by a blank; then a new line. The stack is
|
||||
\ left as it was. It reads each value with PICK, so it needs a few cells of
|
||||
\ the stack free to work in.
|
||||
header .S
|
||||
set HDR-NFA here ", .S #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DOT-S
|
||||
60 EMIT DEPTH 0 U-DOT-R 62 EMIT SPACE
|
||||
DEPTH (W)+2 b! !b
|
||||
@@ -123,7 +105,7 @@ header .S
|
||||
\ Everything it keeps between words is in (DP): the saved BASE, the address,
|
||||
\ the count and the column. ADDR-DIGITS is two for each byte of a cell.
|
||||
: (DB) ( -- c ) (DP)+1 b! @b (DP)+3 b! @b + jump C@
|
||||
header DUMP
|
||||
set HDR-NFA here ", DUMP #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DUMP
|
||||
-if OK drop drop NODE-ERROR b! 1 !b ;
|
||||
OK: (DP)+2 b! !b (DP)+1 b! !b
|
||||
@@ -1,10 +1,10 @@
|
||||
\ qmath.v4 -- Q48.16 fixed point: a signed double with sixteen bits of
|
||||
\ qmath.f18 -- Q48.16 fixed point: a signed double with sixteen bits of
|
||||
\ fraction (D-8, D-10).
|
||||
\
|
||||
\ DECOMPOSITION.md 5.26. Each word is the definition given there and
|
||||
\ executed on the mesh node by test_foundation.c and test_printing.c, here in
|
||||
\ the host node's vocabulary. Rests on core.v4, forth.v4, numout.v4 and
|
||||
\ words.v4.
|
||||
\ the host node's vocabulary. Rests on core.f18, forth.f18, numout.f18 and
|
||||
\ words.f18.
|
||||
\
|
||||
\ ERRORS. Q./ by zero, and Q.SQRT and Q.LOG outside their domain, leave the
|
||||
\ result D-11 and D-12 give and then raise an error (D-18): codes 11,
|
||||
@@ -15,106 +15,47 @@
|
||||
\ HIMASK every bit but the top sixteen
|
||||
\ 2N+15 N-18 N-17 loop counts, N the cell width in bits
|
||||
\ (Q/) (QE) (QR) (QL) (QT) (QP) word addresses of the words' scratch
|
||||
\ cells: 5, 8, 5, 7, 6 and 4 of them
|
||||
\ cells: 5, 8, 5, 7, 6 and 4 of them; (Q/) is the ROM's Q./'s
|
||||
\ ROM-Q.* ROM-Q./ the ROM's entries (MACHINE.md 2.2)
|
||||
|
||||
\ the logical double shift right: one +* step with S = 0, the top bit cleared
|
||||
macro (UD2/) push a! 0 pop +* MAXHI and push drop a pop endmacro
|
||||
|
||||
: (QERR11) NODE-ERROR b! 11 !b ;
|
||||
: (QERR12) NODE-ERROR b! 12 !b ;
|
||||
|
||||
\ ---- conversion and constants ----
|
||||
header Q.FROM-INT
|
||||
set HDR-NFA here ", Q.FROM-INT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: Q.FROM-INT ( n -- q ) push 0 a! 0 pop N-17 FOR +* UNEXT push drop a pop ;
|
||||
header Q.TO-INT
|
||||
set HDR-NFA here ", Q.TO-INT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: Q.TO-INT ( q -- n ) push a! 0 pop 15 FOR +* UNEXT drop drop a ;
|
||||
header Q.1 inline : Q.1 65536 0 ;
|
||||
header Q.0 inline : Q.0 0 0 ;
|
||||
header Q.SCALE inline : Q.SCALE 65536 0 ;
|
||||
set HDR-NFA here ", Q.1 #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : Q.1 65536 0 ;
|
||||
set HDR-NFA here ", Q.0 #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : Q.0 0 0 ;
|
||||
set HDR-NFA here ", Q.SCALE #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : Q.SCALE 65536 0 ;
|
||||
|
||||
\ ---- the double words under other names ----
|
||||
header Q.+ : Q.+ jump D+
|
||||
header Q.- : Q.- jump D-
|
||||
header Q.ABS : Q.ABS jump DABS
|
||||
header Q.NEG : Q.NEG jump DNEGATE
|
||||
header Q.= : Q.= jump D=
|
||||
header Q.< : Q.< jump D<
|
||||
header Q.> : Q.> 2SWAP jump D<
|
||||
header Q.0= : Q.0= jump D0=
|
||||
header Q.MAX : Q.MAX jump DMAX
|
||||
header Q.MIN : Q.MIN jump DMIN
|
||||
set HDR-NFA here ", Q.+ #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : Q.+ jump D+
|
||||
set HDR-NFA here ", Q.- #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : Q.- jump D-
|
||||
set HDR-NFA here ", Q.ABS #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : Q.ABS jump DABS
|
||||
set HDR-NFA here ", Q.NEG #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : Q.NEG jump DNEGATE
|
||||
set HDR-NFA here ", Q.= #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : Q.= jump D=
|
||||
set HDR-NFA here ", Q.< #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : Q.< jump D<
|
||||
set HDR-NFA here ", Q.> #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : Q.> 2SWAP jump D<
|
||||
set HDR-NFA here ", Q.0= #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : Q.0= jump D0=
|
||||
set HDR-NFA here ", Q.MAX #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : Q.MAX jump DMAX
|
||||
set HDR-NFA here ", Q.MIN #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here : Q.MIN jump DMIN
|
||||
|
||||
\ ---- multiply ----
|
||||
header Q.*
|
||||
: Q.* ( a b -- c )
|
||||
SWAP push over over UM* drop
|
||||
push push over pop
|
||||
-if L1 SWAP jump L2 L1: SWAP drop 0 L2:
|
||||
pop SWAP - push
|
||||
push over pop UM* pop +
|
||||
ROT pop dup push
|
||||
over -if L3 drop dup jump L4 L3: drop 0 L4:
|
||||
push UM* pop - D+
|
||||
ROT pop UM*
|
||||
SWAP push 0 D+ pop
|
||||
push over pop SWAP Q.TO-INT push Q.TO-INT pop SWAP ;
|
||||
set HDR-NFA here ", Q.* #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: Q.* ROM-Q.* push ; \ ( a b -- c ) the ROM's entry 4 (MACHINE.md 2.2)
|
||||
|
||||
\ ---- divide ----
|
||||
: D2*C ( lo hi cin -- lo' hi' cout )
|
||||
a! dup -if L1 drop 1 jump L2 L1: drop 0 L2: push
|
||||
over -if L3 drop 1 jump L4 L3: drop 0 L4:
|
||||
over + +
|
||||
push 2* a + pop pop ;
|
||||
\ D2*C and (UQ/), Q./'s core, are the ROM's (capsules/v4/rom/math.f18).
|
||||
|
||||
: (UQ/) ( a0 a1 b0 b1 -- q0 q1 )
|
||||
(Q/)+2 a! SWAP !+ ! (Q/) a! SWAP !+ ! 0 0 0
|
||||
2N+15 FOR
|
||||
push (Q/) a! @+ @ pop D2*C
|
||||
push (Q/)+1 a! ! (Q/) a! ! pop D2*C
|
||||
if CMP drop jump TAKE
|
||||
CMP: drop (Q/)+3 b! @b
|
||||
over over xor if EQH -if SAMEH
|
||||
drop drop -if NT1 jump TAKE NT1: jump NOTAKE
|
||||
SAMEH: drop over SWAP push inv pop + inv
|
||||
-if T2 drop jump NOTAKE T2: drop jump TAKE
|
||||
EQH: drop drop over (Q/)+2 b! @b
|
||||
over over xor -if SAMEL
|
||||
drop drop -if NT3 drop jump TAKEL NT3: drop jump NOTAKEL
|
||||
SAMEL: drop push inv pop + inv
|
||||
-if T4 drop jump NOTAKEL T4: drop jump TAKEL
|
||||
TAKEL: drop (Q/)+2 b! @b push inv pop + inv 0 1 jump END
|
||||
NOTAKEL: 0 jump END
|
||||
TAKE: push (Q/)+2 b! @b over over push inv pop + inv push
|
||||
over over xor -if SB drop NIP -if NB drop 1 jump BD NB: drop 0 jump BD
|
||||
SB: drop push inv pop + inv -if NB2 drop 1 jump BD NB2: drop 0
|
||||
BD: pop pop (Q/)+3 b! @b push inv pop + inv
|
||||
push SWAP pop SWAP - 1 jump END
|
||||
NOTAKE: 0
|
||||
END:
|
||||
NEXT
|
||||
push (Q/) a! @+ @ pop D2*C drop push push drop drop pop pop ;
|
||||
|
||||
header Q./
|
||||
: Q./ ( a b -- q )
|
||||
over over OR if ZERO drop
|
||||
push over pop SWAP over xor (Q/)+4 b! !b
|
||||
-if L1 DNEGATE L1: push push -if L2 DNEGATE L2: pop pop
|
||||
dup if CHK drop jump DIV
|
||||
CHK: drop over -131072 and if CHK2 drop jump DIV
|
||||
CHK2: drop push push dup pop dup push N-18 FOR 2* UNEXT
|
||||
over over xor -if SAME drop drop -if NOOV jump OV
|
||||
SAME: drop push inv pop + inv -if OV
|
||||
NOOV: drop pop pop jump DIV
|
||||
OV: drop drop drop pop pop drop drop
|
||||
(Q/)+4 b! @b -if OVP drop 0 MSB ; OVP: drop -1 MAXHI ;
|
||||
DIV: (UQ/) (Q/)+4 b! @b -if L3 drop DNEGATE ; L3: drop ;
|
||||
ZERO: drop drop drop
|
||||
over over OR if Z0 drop -if ZP drop drop 0 MSB jump (QERR11)
|
||||
ZP: drop drop -1 MAXHI jump (QERR11)
|
||||
Z0: drop jump (QERR11)
|
||||
set HDR-NFA here ", Q./ #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: Q./ ROM-Q./ push ; \ ( a b -- q ) the ROM's entry 5
|
||||
|
||||
\ ---- e to the x ----
|
||||
header Q.EXP
|
||||
set HDR-NFA here ", Q.EXP #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: Q.EXP ( q -- e )
|
||||
over over OR if ONE drop
|
||||
dup (QE)+6 b! !b -if L1 DNEGATE L1:
|
||||
@@ -139,7 +80,7 @@ header Q.EXP
|
||||
ONE: drop drop drop 65536 0 ;
|
||||
|
||||
\ ---- square root ----
|
||||
header Q.SQRT
|
||||
set HDR-NFA here ", Q.SQRT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: Q.SQRT ( q -- r )
|
||||
dup -if POS drop drop drop 0 0 jump (QERR12)
|
||||
POS: drop over over OR if ZERO drop
|
||||
@@ -159,7 +100,7 @@ header Q.SQRT
|
||||
ONE: drop ;
|
||||
|
||||
\ ---- natural logarithm ----
|
||||
header Q.LOG
|
||||
set HDR-NFA here ", Q.LOG #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: Q.LOG ( x -- ln x )
|
||||
dup -if POS drop jump ERR
|
||||
POS: drop over over OR if ZERO drop 0 (QL)+2 b! !b
|
||||
@@ -218,13 +159,13 @@ header Q.LOG
|
||||
END: (QT)+3 b! @b (QT) b! @b -if PR drop inv 1 + jump SD PR: drop
|
||||
SD: dup -if SP drop -1 ; SP: drop 0 ;
|
||||
|
||||
header Q.SIN
|
||||
set HDR-NFA here ", Q.SIN #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: Q.SIN ( x -- sin x )
|
||||
(Q.REDUCE) dup (QT) b! !b -if A1 inv 1 + A1:
|
||||
dup (QT)+2 b! !b dup (QT)+3 b! !b
|
||||
0 over 0 Q.* drop (QT)+1 b! !b
|
||||
3 (QT)+4 b! !b -1 (QT)+5 b! !b jump (TRIG)
|
||||
header Q.COS
|
||||
set HDR-NFA here ", Q.COS #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: Q.COS ( x -- cos x )
|
||||
(Q.REDUCE) -if A1 inv 1 + A1:
|
||||
0 (QT) b! !b 0 over 0 Q.* drop (QT)+1 b! !b
|
||||
@@ -233,7 +174,7 @@ header Q.COS
|
||||
|
||||
\ ---- printing ----
|
||||
\ The integer part, a point, five digits, a blank; always in decimal.
|
||||
header Q.PRINT
|
||||
set HDR-NFA here ", Q.PRINT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: Q.PRINT ( q -- )
|
||||
dup (QP)+3 b! !b -if A DNEGATE A: (QP)+2 b! !b dup (QP)+1 b! !b
|
||||
BASE b! @b (QP) b! !b 10 BASE b! !b
|
||||
@@ -1,4 +1,4 @@
|
||||
\ quit.v4 -- a line of text, interpreted; how it ends; and the words that
|
||||
\ quit.f18 -- a line of text, interpreted; how it ends; and the words that
|
||||
\ print text written in the source.
|
||||
\
|
||||
\ DECOMPOSITION.md 5.15 and 5.10: QUIT ABORT ABORT" (ABORT") ." (."). Part of
|
||||
@@ -32,10 +32,10 @@
|
||||
\
|
||||
\ Constants the loader supplies:
|
||||
\ (LINE-STATUS) word address of the variable: how the last text ended
|
||||
\ (MSG) (REPLY) (ME) (OUT) (OUT^) see core.v4, "what a node prints"
|
||||
\ (MSG) (REPLY) (ME) (OUT) (OUT^) see core.f18, "what a node prints"
|
||||
\ (PORT) word address of the node's port 0
|
||||
\ (Q) word address of four cells of scratch, which system.v4 and
|
||||
\ blocks.v4 use too
|
||||
\ (Q) word address of four cells of scratch, which system.f18 and
|
||||
\ blocks.f18 use too
|
||||
\ DSTACK-DEPTH RSTACK-DEPTH word addresses of the stack registers
|
||||
|
||||
\ ( -- ) empty the return stack. `a` is only something to store: any
|
||||
@@ -80,18 +80,39 @@ macro R-CLEAR RSTACK-DEPTH b! a !b endmacro
|
||||
OK: drop 1 jump (FINISH)
|
||||
GO: drop 0 jump (FINISH)
|
||||
|
||||
\ ( -- ) a GONE has been believed: the word whose xt is in (GONE-HOOK), if
|
||||
\ there is one, is given the number of the node that is gone, in (ONE), so
|
||||
\ that the GONE goes on down the birth graph (MESH.md 9a.2, ruling 7;
|
||||
\ capsules/v4/centre.4th, GONE-DOWN). 0 there, as at switch-on: nothing.
|
||||
\ The word is called, not jumped to, and (ONE) is put back when it
|
||||
\ returns: what called this -- AWAIT, with the node it waits on -- reads
|
||||
\ (ONE) after, and a GONE the word sends writes it. (Found by the depth
|
||||
\ sweep of MESH.md 9a.6: a word that handed on a GONE about another node
|
||||
\ left AWAIT waiting for ever.)
|
||||
|
||||
\ ( n xt -- ) the word whose xt it is, given n. It returns to whoever
|
||||
\ called this, as (DEFINED) does (dict.f18).
|
||||
: (RUN) push ;
|
||||
|
||||
: (DOWN)
|
||||
(GONE-HOOK) b! @b if NONE
|
||||
drop (ONE) a! @ dup push (GONE-HOOK) b! @b (RUN)
|
||||
pop (ONE) a! ! ;
|
||||
NONE: drop ;
|
||||
|
||||
\ ( -- flag ) A GONE has been taken: its seven words are in (IN), the
|
||||
\ node it is about in (ONE), and (S-WIRE) is the wire it came by. It is
|
||||
\ believed only if it came by the port that leads to this node's centre
|
||||
\ and says it is from the centre (MESH.md 7b.4): the way to the node is
|
||||
\ then forgotten, and the flag is -1. Otherwise nothing is done, and 0.
|
||||
\ (As first built only what it said it was from was looked at, and one
|
||||
\ that came by another port was believed.)
|
||||
\ that came by another port was believed.) Believed, it is handed on:
|
||||
\ (DOWN).
|
||||
: (GONE?)
|
||||
(CENTRE) if NOT (IN)+1 a! @ xor if FROM drop 0 ;
|
||||
NOT: ;
|
||||
FROM: drop (ROUTE-DEFAULT) a! @ (PORT) - (S-WIRE) a! @ xor if YES drop 0 ;
|
||||
YES: drop (ONE) a! @ NO-ROUTE -1 ;
|
||||
YES: drop (ONE) a! @ NO-ROUTE (DOWN) -1 ;
|
||||
|
||||
\ ( -- ) WAITING (MESH.md 7d.4). A node with nothing to do passes on
|
||||
\ what has come for other nodes, (SERVE), and then goes through what has
|
||||
@@ -199,7 +220,7 @@ macro R-CLEAR RSTACK-DEPTH b! a !b endmacro
|
||||
\ Not FORTH-79 and not in v3: v3's VMs are sent to through the kernel.
|
||||
|
||||
\ ( node port -- ) the port, by its number, leads toward that node
|
||||
header ROUTE
|
||||
set HDR-NFA here ", ROUTE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ROUTE
|
||||
(ROUTE#) a! @ -16 + if FULL drop
|
||||
(PORT) + (ROUTE#) a! @ 2* (ROUTES) + a!
|
||||
@@ -211,20 +232,20 @@ header ROUTE
|
||||
\ 0: none, or a device. Whoever wires the node tells it, and tells it again
|
||||
\ when the wiring changes. It is how a node knows who its centre is, the
|
||||
\ one node whose GONE it believes: (CENTRE).
|
||||
header NEIGHBOUR
|
||||
set HDR-NFA here ", NEIGHBOUR #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: NEIGHBOUR
|
||||
dup -if POS jump BAD
|
||||
POS: -PORTS + -if BAD drop (NEAR) + a! ! ;
|
||||
BAD: drop drop drop NODE-ERROR b! 12 !b ;
|
||||
|
||||
\ ( port -- ) the port, by its number, leads toward every node not told of
|
||||
header DEFAULT-ROUTE
|
||||
set HDR-NFA here ", DEFAULT-ROUTE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DEFAULT-ROUTE (PORT) + (ROUTE-DEFAULT) a! ! ;
|
||||
|
||||
\ ( node -- ) forget the way to that node, if one is known: what is for it
|
||||
\ then goes by the way for every node not told of, if there is one. The
|
||||
\ last way in the table takes its place.
|
||||
header NO-ROUTE
|
||||
set HDR-NFA here ", NO-ROUTE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: NO-ROUTE
|
||||
(ROUTE#) a! @ if NONE -1 + (ROUTES) a!
|
||||
FOR dup @+ xor if HIT drop @+ drop NEXT
|
||||
@@ -252,11 +273,11 @@ header NO-ROUTE
|
||||
\ ( n node -- ) tell the node that node n is gone. It acts on that only
|
||||
\ if this node is its centre: it forgets the way to n, and if it is waiting
|
||||
\ for n's answer the wait ends.
|
||||
header GONE
|
||||
set HDR-NFA here ", GONE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: GONE 5 jump (SEND1)
|
||||
|
||||
\ ( -- ) forget every way: for when the wiring has changed
|
||||
header NO-ROUTES
|
||||
set HDR-NFA here ", NO-ROUTES #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: NO-ROUTES 0 (ROUTE#) a! ! 0 (ROUTE-DEFAULT) a! ! ;
|
||||
|
||||
\ ( baddr u node port -- ) send the node u characters of text to
|
||||
@@ -298,7 +319,7 @@ header NO-ROUTES
|
||||
\ ( baddr u node -- ) send the node u characters of text to interpret,
|
||||
\ by the way this node knows to it. What it prints there goes to that
|
||||
\ node's console. With no way to the node it is error 12.
|
||||
header SEND
|
||||
set HDR-NFA here ", SEND #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: SEND
|
||||
dup (WAY) -if GO drop drop drop drop NODE-ERROR b! 12 !b ;
|
||||
GO: jump (SEND-ON)
|
||||
@@ -306,7 +327,7 @@ header SEND
|
||||
\ ( baddr u node port -- ) the same by a port this node names, by its
|
||||
\ number, whatever ways it knows: for a neighbour that has no number of
|
||||
\ its own yet, to which text is sent as to node 0.
|
||||
header SEND-ON
|
||||
set HDR-NFA here ", SEND-ON #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: SEND-ON
|
||||
dup -if POS jump BAD
|
||||
POS: -PORTS + -if BAD drop jump (SEND-ON)
|
||||
@@ -356,9 +377,9 @@ header SEND-ON
|
||||
\ WHAT HAS COME ALREADY is on the wires and is found the first time
|
||||
\ through: the node looks before it sleeps. A message it left on a wire
|
||||
\ does not keep it awake.
|
||||
\ The stack what it does needs is tried first, (ROOM), core.v4: text that
|
||||
\ The stack what it does needs is tried first, (ROOM), core.f18: text that
|
||||
\ has left too little ends "Stack overflow" with nothing taken off a wire.
|
||||
header AWAIT
|
||||
set HDR-NFA here ", AWAIT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: AWAIT
|
||||
(ONE) a! ! (ROOM) \ if this faults, no one is waited for:
|
||||
(ONE) a! @ (AWAIT-FROM) a! ! 0 (A-SELF) a! ! \ (AWAIT-FROM) is set only when the stack has been tried
|
||||
@@ -391,7 +412,7 @@ header AWAIT
|
||||
\ the neighbour has taken it. This is how a node is sent a capsule of F18
|
||||
\ code (docs/v4.0.0/MESH.md section 5): the cells go as they are, not as a
|
||||
\ message, to a node that is executing from its ports.
|
||||
header PORT!
|
||||
set HDR-NFA here ", PORT! #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: PORT!
|
||||
dup -if POS jump BAD
|
||||
POS: -PORTS + -if BAD drop (PORT) + b! !b ;
|
||||
@@ -399,8 +420,8 @@ header PORT!
|
||||
|
||||
\ ( -- ) WHAT IS IN THE DICTIONARY NOW IS THE SYSTEM: COLD comes back to
|
||||
\ it and FORGET will not go below it. Whoever has loaded a node's capsules
|
||||
\ has it do this (system.v4, (BOOT) and FENCE).
|
||||
header (SEAL)
|
||||
\ has it do this (system.f18, (BOOT) and FENCE).
|
||||
set HDR-NFA here ", (SEAL) #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: (SEAL)
|
||||
DP a! @ (BOOT) a! !
|
||||
(LATEST) a! @ (BOOT)+1 a! !
|
||||
@@ -411,23 +432,24 @@ header (SEAL)
|
||||
\ NODE-ERROR, by name: how a definition written in FORTH raises an error.
|
||||
\ A store of a code that is not zero is the trap of D-18 -- the word goes no
|
||||
\ further, the message for the code is printed (-1: the word has printed
|
||||
\ its own) and the line ends with ERROR. The codes are listed in core.v4.
|
||||
header NODE-ERROR inline : NODE-ERROR' NODE-ERROR ;
|
||||
header (ME) inline : (ME)' (ME) ;
|
||||
header (CONSOLE) inline : (CONSOLE)' (CONSOLE) ;
|
||||
header (LOST) inline : (LOST)' (LOST) ;
|
||||
header (REFUSED) inline : (REFUSED)' (REFUSED) ;
|
||||
header (WORD-DEFINED) inline : (WORD-DEFINED)' (WORD-DEFINED) ;
|
||||
header (WORD-FORGOTTEN) inline : (WORD-FORGOTTEN)' (WORD-FORGOTTEN) ;
|
||||
\ its own) and the line ends with ERROR. The codes are listed in core.f18.
|
||||
set HDR-NFA here ", NODE-ERROR #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : NODE-ERROR' NODE-ERROR ;
|
||||
set HDR-NFA here ", (ME) #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : (ME)' (ME) ;
|
||||
set HDR-NFA here ", (CONSOLE) #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : (CONSOLE)' (CONSOLE) ;
|
||||
set HDR-NFA here ", (LOST) #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : (LOST)' (LOST) ;
|
||||
set HDR-NFA here ", (REFUSED) #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : (REFUSED)' (REFUSED) ;
|
||||
set HDR-NFA here ", (WORD-DEFINED) #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : (WORD-DEFINED)' (WORD-DEFINED) ;
|
||||
set HDR-NFA here ", (WORD-FORGOTTEN) #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : (WORD-FORGOTTEN)' (WORD-FORGOTTEN) ;
|
||||
set HDR-NFA here ", (GONE-HOOK) #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : (GONE-HOOK)' (GONE-HOOK) ;
|
||||
|
||||
header QUIT
|
||||
set HDR-NFA here ", QUIT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: QUIT R-CLEAR (RESET) CR 0 jump (DONE)
|
||||
|
||||
\ FORTH-79: clear the data and return stacks, set execution mode, return
|
||||
\ control to the terminal. As v3, the line it stops ends with " ok".
|
||||
\ Both are emptied before anything is called: ABORT may be run with the
|
||||
\ return stack full.
|
||||
header ABORT
|
||||
set HDR-NFA here ", ABORT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ABORT R-CLEAR DSTACK-DEPTH b! a !b (RESET) 1 jump (DONE)
|
||||
|
||||
\ ---- faults (D-14, D-16) -------------------------------------------------------
|
||||
@@ -453,7 +475,7 @@ header ABORT
|
||||
2 jump (DONE)
|
||||
|
||||
\ A word has stored an error code in NODE-ERROR (D-18; the codes are listed
|
||||
\ in core.v4). Print its message -- a negative code means the word printed
|
||||
\ in core.f18). Print its message -- a negative code means the word printed
|
||||
\ its own -- and end the line with ERROR. The return stack has been
|
||||
\ emptied; the data stack is as the word left it.
|
||||
\ (QUIET) is 1 while the node is doing something that is no text's doing:
|
||||
@@ -508,7 +530,7 @@ header ABORT
|
||||
\ The three run-time words have names, as v3's have, so that SEE can tell a
|
||||
\ string in a definition from code; they cannot be used from the prompt.
|
||||
\ ." and ABORT" take the text up to the next " , which may be none at all
|
||||
\ (input.v4's (PARSE)); with no closing " it is the rest of the line. Inside a definition they lay
|
||||
\ (input.f18's (PARSE)); with no closing " it is the rest of the line. Inside a definition they lay
|
||||
\ down a call to their run-time word and, after it, the text as a counted
|
||||
\ string: the count byte and the characters, four to a cell, the last cell
|
||||
\ filled with zeros. The run-time word finds the string by the return
|
||||
@@ -530,7 +552,7 @@ header ABORT
|
||||
\ It takes the return address off before it calls anything and keeps the
|
||||
\ count there instead, so a word that prints text goes no deeper than one
|
||||
\ that calls any other word.
|
||||
header (.") compile-only
|
||||
set HDR-NFA here ", (.") #, 16 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: (.")
|
||||
pop 4* dup C@ \ baddr n
|
||||
L: if DONE
|
||||
@@ -539,7 +561,7 @@ header (.") compile-only
|
||||
|
||||
\ FORTH-79: ." text" prints the text -- now, if interpreting; when the word
|
||||
\ it is compiled into runs, if compiling.
|
||||
header ." immediate
|
||||
set HDR-NFA here ", ." #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DOT-QUOTE
|
||||
34 (PARSE) drop
|
||||
STATE a! @ if NOW
|
||||
@@ -549,7 +571,7 @@ header ." immediate
|
||||
\ ( flag -- ) the run time of ABORT" : if the flag is not zero print the
|
||||
\ string after the call, start a new line and ABORT; otherwise go on after
|
||||
\ the string.
|
||||
header (ABORT") compile-only
|
||||
set HDR-NFA here ", (ABORT") #, 16 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: (ABORT")
|
||||
if NO
|
||||
drop pop 4* R-CLEAR COUNT TYPE CR jump ABORT
|
||||
@@ -557,7 +579,7 @@ header (ABORT") compile-only
|
||||
|
||||
\ ( flag -- ) ABORT" text" as v3 (it is FORTH-83's, not FORTH-79's): if
|
||||
\ the flag is not zero, print the text and ABORT.
|
||||
header ABORT" immediate
|
||||
set HDR-NFA here ", ABORT" #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ABORT-QUOTE
|
||||
34 (PARSE) drop
|
||||
STATE a! @ if NOW
|
||||
@@ -568,7 +590,7 @@ header ABORT" immediate
|
||||
|
||||
\ The run time of S" : leave the address and length of the string after the
|
||||
\ call, and go on after it.
|
||||
header (S") compile-only
|
||||
set HDR-NFA here ", (S") #, 16 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: (S")
|
||||
pop 4* dup C@ \ baddr n
|
||||
over over + 4/ 1 + push \ the cell after the last character
|
||||
@@ -577,7 +599,7 @@ header (S") compile-only
|
||||
\ ( -- baddr u ) S" text" as v3. In a definition the text is compiled
|
||||
\ into it. At the prompt it is copied to PAD, where it stays until PAD is
|
||||
\ used again: WORD's buffer is overwritten by the very next word of the line.
|
||||
header S" immediate
|
||||
set HDR-NFA here ", S" #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: S-QUOTE
|
||||
34 (PARSE) drop
|
||||
STATE a! @ if NOW
|
||||
@@ -1,7 +1,7 @@
|
||||
\ system.v4 -- words about the dictionary as a whole: WORDS, FORGET, FENCE.
|
||||
\ system.f18 -- words about the dictionary as a whole: WORDS, FORGET, FENCE.
|
||||
\
|
||||
\ DECOMPOSITION.md 5.13 and 5.15. Part of the compiler capsule; rests on
|
||||
\ dict.v4, quit.v4 and forth.v4.
|
||||
\ dict.f18, quit.f18 and forth.f18.
|
||||
\
|
||||
\ Constants the loader supplies:
|
||||
\ FENCE word address of the variable: FORGET will not remove an entry
|
||||
@@ -9,27 +9,27 @@
|
||||
\ VOC-LINK word address of the variable: the newest vocabulary, or 0
|
||||
\ (BOOT) word address of two cells: DP and (LATEST) as the loader left them
|
||||
|
||||
header FENCE inline : FENCE' FENCE ;
|
||||
set HDR-NFA here ", FENCE #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : FENCE' FENCE ;
|
||||
|
||||
\ ---- vocabularies (FORTH-79) ----------------------------------------------------
|
||||
\ A vocabulary is two cells: its head -- the xt of its newest entry, or 0 --
|
||||
\ and the address of the vocabulary defined before it, or 0. VOC-LINK holds
|
||||
\ the newest one's address. FORTH's head is (LATEST) and it is in no chain.
|
||||
header CONTEXT inline : CONTEXT' CONTEXT ;
|
||||
header CURRENT inline : CURRENT' CURRENT ;
|
||||
set HDR-NFA here ", CONTEXT #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : CONTEXT' CONTEXT ;
|
||||
set HDR-NFA here ", CURRENT #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : CURRENT' CURRENT ;
|
||||
|
||||
\ FORTH-79: the primary vocabulary; it becomes the CONTEXT vocabulary.
|
||||
header FORTH immediate
|
||||
set HDR-NFA here ", FORTH #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: FORTH (LATEST) CONTEXT a! ! ;
|
||||
\ FORTH-79: new definitions go into the CONTEXT vocabulary from now on.
|
||||
header DEFINITIONS
|
||||
set HDR-NFA here ", DEFINITIONS #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DEFINITIONS CONTEXT a! @ CURRENT a! ! ;
|
||||
|
||||
\ VOCABULARY xxx FORTH-79: xxx is a new, empty list of words; executing
|
||||
\ xxx makes it the CONTEXT vocabulary. When a search of it finds nothing,
|
||||
\ FORTH is searched.
|
||||
: (DOVOC) pop CONTEXT a! ! ;
|
||||
header VOCABULARY
|
||||
set HDR-NFA here ", VOCABULARY #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: VOCABULARY
|
||||
&(DOVOC) (C)+3 a! ! (DATA) (C)+8 a! @ if NONE drop
|
||||
0 , VOC-LINK a! @ , HERE -2 + VOC-LINK a! ! ;
|
||||
@@ -41,7 +41,7 @@ header VOCABULARY
|
||||
F: drop drop $54524F46 (EMIT4) $48 (EMIT4) ;
|
||||
|
||||
\ ( -- ) as v3's, but true: where names are looked for, and where new ones go
|
||||
header ORDER
|
||||
set HDR-NFA here ", ORDER #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ORDER
|
||||
$72616553 (EMIT4) $6F206863 (EMIT4) $72656472 (EMIT4) $203A (EMIT4)
|
||||
CONTEXT a! @ dup (.VOC) SPACE
|
||||
@@ -54,7 +54,7 @@ header ORDER
|
||||
\ ( -- ) the names in the CONTEXT vocabulary, the newest first, a blank after
|
||||
\ each, a new line whenever one has passed column 64. Hidden entries -- a
|
||||
\ definition under way -- are not shown. (Q)+0 is the column.
|
||||
header WORDS
|
||||
set HDR-NFA here ", WORDS #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: WORDS
|
||||
0 (Q) a! !
|
||||
CONTEXT a! @ a! @
|
||||
@@ -68,7 +68,7 @@ header WORDS
|
||||
WRAP: drop CR 0 (Q) a! !
|
||||
NXT: -1 + a! @ jump L
|
||||
DONE: drop jump CR
|
||||
header VLIST
|
||||
set HDR-NFA here ", VLIST #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: VLIST jump WORDS
|
||||
|
||||
\ ( cell -- ) take off a vocabulary's list every entry at or above the
|
||||
@@ -85,7 +85,7 @@ header VLIST
|
||||
\ goes is no longer CONTEXT or CURRENT: FORTH is. A word that is not there
|
||||
\ is an error, and so is one below FENCE, which is where the capsule's own
|
||||
\ words are (code 10, "Protected word").
|
||||
header FORGET
|
||||
set HDR-NFA here ", FORGET #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: FORGET
|
||||
32 WORD (LOOKUP) if MISSING
|
||||
-2 + a! @ \ where its name starts
|
||||
@@ -104,7 +104,7 @@ header FORGET
|
||||
C1: drop (LATEST) CONTEXT a! !
|
||||
C2: CURRENT a! @ (Q) a! @ inv + 1 + -if C3 drop jump TOLD
|
||||
C3: drop (LATEST) CURRENT a! !
|
||||
TOLD: (Q) a! @ jump (FORGOTTEN) \ the kernel's records of them go too (dict.v4)
|
||||
TOLD: (Q) a! @ jump (FORGOTTEN) \ the kernel's records of them go too (dict.f18)
|
||||
MISSING: drop (UNKNOWN) drop ;
|
||||
|
||||
\ ---- the system as a whole -------------------------------------------------------
|
||||
@@ -113,21 +113,21 @@ header FORGET
|
||||
|
||||
\ FORTH-79: execute to be sure a FORTH-79 system is there. It is: nothing
|
||||
\ happens. (v3's prints two lines and leaves a flag.)
|
||||
header 79-STANDARD
|
||||
set HDR-NFA here ", 79-STANDARD #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: 79-STANDARD ;
|
||||
|
||||
\ ( -- ) which system this is, and its cell width
|
||||
header VERSION
|
||||
set HDR-NFA here ", VERSION #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: VERSION
|
||||
$72617453 (EMIT4) $74726F46 (EMIT4) $34762068 (EMIT4) $302E302E (EMIT4) $38314620 (EMIT4) $20 (EMIT4)
|
||||
N-1 1 + 0 U-DOT-R $7469622D (EMIT4) CR ;
|
||||
|
||||
\ ( -- ) clear the screen and put the cursor at the top, as v3: ESC [2J ESC [H
|
||||
header PAGE
|
||||
set HDR-NFA here ", PAGE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: PAGE 27 EMIT 91 EMIT 50 EMIT 74 EMIT 27 EMIT 91 EMIT 72 jump EMIT
|
||||
|
||||
\ ( -- ) as v3's message, and then ABORT: both stacks emptied, the prompt
|
||||
header WARM
|
||||
set HDR-NFA here ", WARM #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: WARM
|
||||
$54524F46 (EMIT4) $39372D48 (EMIT4) $72615720 (EMIT4) $7453206D (EMIT4) $747261 (EMIT4) CR
|
||||
$74737953 (EMIT4) $72206D65 (EMIT4) $61747365 (EMIT4) $64657472 (EMIT4) $2E (EMIT4) CR
|
||||
@@ -135,15 +135,20 @@ header WARM
|
||||
|
||||
\ ( -- ) the system as it was when the capsule had just been loaded:
|
||||
\ everything defined since is gone, there is one vocabulary, numbers are
|
||||
\ decimal, the block buffers are empty. Then as WARM.
|
||||
header COLD
|
||||
\ decimal, the block buffers are empty. A word in (GONE-HOOK) that COLD
|
||||
\ forgets is taken out of it (quit.f18, (DOWN)). Then as WARM.
|
||||
set HDR-NFA here ", COLD #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: COLD
|
||||
(BOOT) a! @ DP a! !
|
||||
(BOOT)+1 a! @ (LATEST) a! !
|
||||
(BOOT) a! @ 2/ 2/ FENCE a! !
|
||||
(LATEST) CONTEXT a! ! (LATEST) CURRENT a! ! 0 VOC-LINK a! !
|
||||
10 BASE a! ! 0 SCR a! ! 2 (LOG-LEVEL) a! ! 0 (ACL-HOOK) a! ! EMPTY-BUFFERS
|
||||
(BOOT) a! @ 2/ 2/ (FORGOTTEN) \ the kernel's records of what has gone go too (dict.v4)
|
||||
(BOOT) a! @ 2/ 2/ (FORGOTTEN) \ the kernel's records of what has gone go too (dict.f18)
|
||||
(GONE-HOOK) a! @ (BOOT) b! @b 2/ 2/ inv 1 + + \ the hook's xt less the sealed HERE, in cells
|
||||
-if CLEAR drop jump KEPT \ below the sealed system: it stays (0 is below)
|
||||
CLEAR: drop 0 (GONE-HOOK) a! ! \ at or above it: forgotten with what COLD forgets
|
||||
KEPT:
|
||||
$54524F46 (EMIT4) $39372D48 (EMIT4) $6C6F4320 (EMIT4) $74532064 (EMIT4) $747261 (EMIT4) CR
|
||||
$74737953 (EMIT4) $69206D65 (EMIT4) $6974696E (EMIT4) $7A696C61 (EMIT4) $2E6465 (EMIT4) CR
|
||||
jump ABORT
|
||||
@@ -155,15 +160,15 @@ header COLD
|
||||
: (DODEFER)
|
||||
pop a! @ if UNSET push ; \ go to it: it returns to xxx's caller
|
||||
UNSET: drop NODE-ERROR b! 15 !b ;
|
||||
header DEFER
|
||||
set HDR-NFA here ", DEFER #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DEFER &(DODEFER) (C)+3 a! ! (DATA) (C)+8 a! @ if NONE drop 0 jump , NONE: drop ;
|
||||
: (is!) a! ! ;
|
||||
: (defer@) a! @ ;
|
||||
header IS immediate
|
||||
set HDR-NFA here ", IS #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: IS
|
||||
(') STATE a! @ if NOW drop (LIT,) &(is!) jump (CALL,)
|
||||
NOW: drop jump (is!)
|
||||
header DEFER@ immediate
|
||||
set HDR-NFA here ", DEFER@ #, 1 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DEFER@
|
||||
(') STATE a! @ if NOW drop (LIT,) &(defer@) jump (CALL,)
|
||||
NOW: drop jump (defer@)
|
||||
@@ -1,67 +1,67 @@
|
||||
\ words.v4 -- more of the FORTH vocabulary: the stack, comparison, double,
|
||||
\ words.f18 -- more of the FORTH vocabulary: the stack, comparison, double,
|
||||
\ mixed, shift and string words that are short runs of opcodes or small loops.
|
||||
\
|
||||
\ Each is the definition DECOMPOSITION.md gives (sections 4, 5.1 - 5.7, 5.9)
|
||||
\ and the mesh-node tests execute (test_cells.c, test_foundation.c,
|
||||
\ test_strings.c), here as words of the host node's vocabulary. Rests on
|
||||
\ core.v4, forth.v4 and numout.v4.
|
||||
\ core.f18, forth.f18 and numout.f18.
|
||||
\
|
||||
\ Constants the loader supplies:
|
||||
\ MAX-INT the largest positive number: every bit but the top one
|
||||
\ (X) word address of four cells of scratch for COMPARE and SEARCH
|
||||
|
||||
\ ---- stack ----
|
||||
header 2SWAP
|
||||
set HDR-NFA here ", 2SWAP #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: 2SWAP ( a b c d -- c d a b ) ROT push ROT pop ;
|
||||
header 2OVER
|
||||
set HDR-NFA here ", 2OVER #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: 2OVER ( a b c d -- a b c d a b ) push push over over pop pop jump 2SWAP
|
||||
header 2ROT
|
||||
set HDR-NFA here ", 2ROT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: 2ROT ( a b c d e f -- c d e f a b ) push push 2SWAP pop pop jump 2SWAP
|
||||
header 2>R inline compile-only : 2>R SWAP push push ;
|
||||
header 2R> inline compile-only : 2R> pop pop SWAP ;
|
||||
header 2R@ inline compile-only : 2R@ pop pop over over push push SWAP ;
|
||||
header NOP inline : NOP' nop ;
|
||||
header TRUE inline : TRUE -1 ;
|
||||
header FALSE inline : FALSE 0 ;
|
||||
header INVERT inline : INVERT inv ;
|
||||
set HDR-NFA here ", 2>R #, 24 #, HDR-NFA #, HDR-LINK set HDR-LINK here : 2>R SWAP push push ;
|
||||
set HDR-NFA here ", 2R> #, 24 #, HDR-NFA #, HDR-LINK set HDR-LINK here : 2R> pop pop SWAP ;
|
||||
set HDR-NFA here ", 2R@ #, 24 #, HDR-NFA #, HDR-LINK set HDR-LINK here : 2R@ pop pop over over push push SWAP ;
|
||||
set HDR-NFA here ", NOP #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : NOP' nop ;
|
||||
set HDR-NFA here ", TRUE #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : TRUE -1 ;
|
||||
set HDR-NFA here ", FALSE #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : FALSE 0 ;
|
||||
set HDR-NFA here ", INVERT #, 8 #, HDR-NFA #, HDR-LINK set HDR-LINK here : INVERT inv ;
|
||||
|
||||
\ ---- memory ----
|
||||
header 2@
|
||||
set HDR-NFA here ", 2@ #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: 2@ ( addr -- lo hi ) a! @+ @ ;
|
||||
header 2!
|
||||
set HDR-NFA here ", 2! #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: 2! ( lo hi addr -- ) a! SWAP !+ ! ;
|
||||
header -!
|
||||
set HDR-NFA here ", -! #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: -! ( n addr -- ) a! NEGATE @ + ! ;
|
||||
|
||||
\ ---- comparison ----
|
||||
header 0<>
|
||||
set HDR-NFA here ", 0<> #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: 0<> if Z drop -1 ; Z: ;
|
||||
header 0>
|
||||
set HDR-NFA here ", 0> #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: 0> -if NN drop 0 ; NN: if Z drop -1 ; Z: ;
|
||||
header <>
|
||||
set HDR-NFA here ", <> #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: <> xor jump 0<>
|
||||
header <=
|
||||
set HDR-NFA here ", <= #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: <= GREATER jump 0=
|
||||
header >=
|
||||
set HDR-NFA here ", >= #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: >= LESS jump 0=
|
||||
header U<
|
||||
set HDR-NFA here ", U< #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: U< over over xor -if SAME drop NIP jump 0<
|
||||
SAME: drop - jump 0<
|
||||
header U>
|
||||
set HDR-NFA here ", U> #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: U> SWAP jump U<
|
||||
header ABS
|
||||
set HDR-NFA here ", ABS #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ABS -if P inv 1 + P: ;
|
||||
header MAX
|
||||
set HDR-NFA here ", MAX #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: MAX over over LESS if A drop push drop pop ; A: drop drop ;
|
||||
header MIN
|
||||
set HDR-NFA here ", MIN #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: MIN over over LESS if B drop drop ; B: drop push drop pop ;
|
||||
header WITHIN
|
||||
set HDR-NFA here ", WITHIN #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: WITHIN ( n low high -- flag ) push over pop LESS push LESS inv pop and ;
|
||||
|
||||
\ ---- shifts ----
|
||||
\ As v3, a count that is negative or as large as the cell is wide is an
|
||||
\ error (code 9, "Shift count out of range").
|
||||
header LSHIFT
|
||||
set HDR-NFA here ", LSHIFT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: LSHIFT ( x n -- x' )
|
||||
-if NN jump BAD
|
||||
NN: dup N-1 inv + -if BAD2 drop
|
||||
@@ -69,7 +69,7 @@ header LSHIFT
|
||||
DONE: drop ;
|
||||
BAD2: drop
|
||||
BAD: drop drop NODE-ERROR b! 9 !b ;
|
||||
header RSHIFT
|
||||
set HDR-NFA here ", RSHIFT #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: RSHIFT ( x n -- x' ) \ zeros come in at the top
|
||||
-if NN jump BAD
|
||||
NN: dup N-1 inv + -if BAD2 drop
|
||||
@@ -79,23 +79,23 @@ header RSHIFT
|
||||
BAD: drop drop NODE-ERROR b! 9 !b ;
|
||||
|
||||
\ ---- doubles and mixed ----
|
||||
header D-
|
||||
set HDR-NFA here ", D- #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: D- DNEGATE jump D+
|
||||
header DABS
|
||||
set HDR-NFA here ", DABS #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DABS -if P jump DNEGATE P: ;
|
||||
header D0=
|
||||
set HDR-NFA here ", D0= #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: D0= OR jump 0=
|
||||
header D0<
|
||||
set HDR-NFA here ", D0< #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: D0< push drop pop jump 0<
|
||||
header D=
|
||||
set HDR-NFA here ", D= #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: D= D- jump D0=
|
||||
header D2*
|
||||
set HDR-NFA here ", D2* #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: D2* 2* over -if P drop 1 + jump J P: drop J: push 2* pop ;
|
||||
header D2/
|
||||
set HDR-NFA here ", D2/ #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: D2/ push a! 0 pop +* push drop a pop ;
|
||||
header M+
|
||||
set HDR-NFA here ", M+ #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: M+ S>D jump D+
|
||||
header M-
|
||||
set HDR-NFA here ", M- #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: M- S>D DNEGATE jump D+
|
||||
|
||||
\ ( d1 d2 -- d1 d2 flag ) the flag's top bit is set exactly when d1 < d2
|
||||
@@ -110,18 +110,18 @@ header M-
|
||||
LS: drop push inv pop + inv
|
||||
S2: -if N2 drop -1 jump D2 N2: drop 0
|
||||
D2: pop pop ROT ;
|
||||
header D<
|
||||
set HDR-NFA here ", D< #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: D< (D<) push drop drop drop drop pop ;
|
||||
header DMAX
|
||||
set HDR-NFA here ", DMAX #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DMAX (D<) if L drop push push drop drop pop pop ; L: drop drop drop ;
|
||||
header DMIN
|
||||
set HDR-NFA here ", DMIN #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: DMIN (D<) if L drop drop drop ; L: drop push push drop drop pop pop ;
|
||||
|
||||
\ ---- strings and memory ----
|
||||
header ?TERMINAL
|
||||
set HDR-NFA here ", ?TERMINAL #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ?TERMINAL ( -- flag ) CONSOLE-STATUS b! @b ;
|
||||
|
||||
header CMOVE>
|
||||
set HDR-NFA here ", CMOVE> #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: CMOVE> ( src dst u -- )
|
||||
-if OK drop drop drop NODE-ERROR b! 1 !b ;
|
||||
OK: if DONE -1 + push
|
||||
@@ -131,31 +131,31 @@ header CMOVE>
|
||||
DONE: drop drop drop ;
|
||||
|
||||
\ FORTH-79: n cells from addr1 to addr2, the cell at addr1 first.
|
||||
header MOVE
|
||||
set HDR-NFA here ", MOVE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: MOVE ( addr1 addr2 n -- )
|
||||
-if OK drop drop drop ;
|
||||
OK: if DONE push over a! @ over a! ! 1 + push 1 + pop pop -1 + jump OK
|
||||
DONE: drop drop drop ;
|
||||
|
||||
header FILL
|
||||
set HDR-NFA here ", FILL #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: FILL ( baddr u c -- )
|
||||
SWAP push SWAP pop \ c baddr u
|
||||
-if OK drop drop drop NODE-ERROR b! 1 !b ;
|
||||
OK: if DONE push over over C! 1 + pop -1 + jump OK
|
||||
DONE: drop drop drop ;
|
||||
header ERASE
|
||||
set HDR-NFA here ", ERASE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: ERASE ( baddr u -- ) 0 jump FILL
|
||||
header BLANK
|
||||
set HDR-NFA here ", BLANK #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: BLANK ( baddr u -- ) 32 jump FILL
|
||||
|
||||
header -TRAILING
|
||||
set HDR-NFA here ", -TRAILING #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: -TRAILING ( baddr u -- baddr u' )
|
||||
-if L drop 0 ;
|
||||
L: if DONE over over + -1 + C@ -32 + if SP drop ;
|
||||
SP: drop -1 + jump L
|
||||
DONE: ;
|
||||
|
||||
header COMPARE
|
||||
set HDR-NFA here ", COMPARE #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: COMPARE ( a1 u1 a2 u2 -- n )
|
||||
-if A drop 0 A: (X)+1 b! !b
|
||||
SWAP -if B drop 0 B: dup (X) b! !b
|
||||
@@ -173,7 +173,7 @@ header COMPARE
|
||||
NN: if ZZ drop 1 ;
|
||||
ZZ: ;
|
||||
|
||||
header SEARCH
|
||||
set HDR-NFA here ", SEARCH #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: SEARCH ( a1 u1 a2 u2 -- a3 u3 flag )
|
||||
-if A drop 0 A: (X)+1 b! !b (X) b! !b
|
||||
-if B drop 0 B: dup (X)+3 b! !b over (X)+2 b! !b
|
||||
@@ -186,14 +186,14 @@ header SEARCH
|
||||
SAME: drop 1 + push 1 + pop pop -1 + jump I
|
||||
MATCH: drop drop drop -1 ;
|
||||
|
||||
header SCAN
|
||||
set HDR-NFA here ", SCAN #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: SCAN ( baddr u c -- baddr' u' )
|
||||
255 and push -if L drop 0
|
||||
L: if DONE over C@ pop dup push xor if FOUND
|
||||
drop push 1 + pop -1 + jump L
|
||||
FOUND: drop
|
||||
DONE: pop drop ;
|
||||
header SKIP
|
||||
set HDR-NFA here ", SKIP #, 0 #, HDR-NFA #, HDR-LINK set HDR-LINK here
|
||||
: SKIP ( baddr u c -- baddr' u' )
|
||||
255 and push -if L drop 0
|
||||
L: if DONE over C@ pop dup push xor if SAME drop jump DONE
|
||||
@@ -1,26 +0,0 @@
|
||||
Block 4021
|
||||
( zuse-eligibility.4th - H.5/H.8 elevation grant )
|
||||
( C prims: ZUSE-ELIGIBILITY-ADD ZUSE-ELIGIBLE? )
|
||||
( NAME>XT ELEVATE-PUBKEY-UNPACK )
|
||||
( Policy word this file: ELEVATE-GRANT. Runs in )
|
||||
( Hera's own dict -- delivered here by kernel-Hermes's own )
|
||||
( drain checkpoint (FABRIC-3.6.md task 3.10), not FORTH )
|
||||
( MSG-DELIVER (messaging.4th, removed Phase 4 Stage E). )
|
||||
( FABRIC-2.md H.12 step 21, 2026-09-03. )
|
||||
CREATE ELEVATE-PK-BUF 32 ALLOT
|
||||
|
||||
Block 4022
|
||||
( ELEVATE-GRANT ( waddr wu pk0 pk1 pk2 pk3 -- ) )
|
||||
( Reconstructs the caller's pubkey, checks Zuse's )
|
||||
( eligibility list, and on match grants the named )
|
||||
( word ACL-ALLOW!/ACL-TTL! via the same reused )
|
||||
( ACL-TTL mechanism H.5 decided on. No grant, no )
|
||||
( error, on any mismatch -- silent refusal. )
|
||||
: ELEVATE-GRANT ( waddr wu pk0 pk1 pk2 pk3 -- )
|
||||
ELEVATE-PK-BUF ELEVATE-PUBKEY-UNPACK
|
||||
ELEVATE-PK-BUF ZUSE-ELIGIBLE? IF
|
||||
NAME>XT DUP IF
|
||||
1 OVER ACL-ALLOW!
|
||||
ACL-BASE-TTL SWAP ACL-TTL!
|
||||
ELSE DROP THEN
|
||||
ELSE 2DROP THEN ;
|
||||
@@ -12,8 +12,6 @@ Block 4016
|
||||
( >BODY-then-store, so a pinned CONSTANT isn't tamper-proof. )
|
||||
( Read with ZUSE-PUBKEY@ / ZUSE-CERT-INSTALLED? -- both C )
|
||||
( primitives, read-only; the seed has no FORTH access at all. )
|
||||
( ZUSE-ELIGIBILITY-ADD denied by default -- see block 4017. )
|
||||
0 ['] ZUSE-ELIGIBILITY-ADD ACL-ALLOW!
|
||||
|
||||
Block 4017
|
||||
( ACL-ZUSE-BOOT ( -- ) re-invokable: capsule_zuse_boot.c )
|
||||
@@ -25,8 +23,6 @@ Block 4017
|
||||
: ACL-ZUSE-BOOT ( -- )
|
||||
ZUSE-CERT-INSTALLED? IF
|
||||
ZUSE-AUTHENTICATE
|
||||
1 ['] ZUSE-ELIGIBILITY-ADD ACL-ALLOW!
|
||||
['] ZUSE-ELIGIBILITY-ADD ACL-PIN
|
||||
LOG-INFO" zuse: activated"
|
||||
ELSE
|
||||
LOG-INFO" zuse: NOT activated -- no cert installed"
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
# Dead ideas and revised claims
|
||||
|
||||
A register, started 2026-10-14 by the docs triage. An idea that was abandoned, or a claim that
|
||||
turned out wrong, keeps its documents (archived, with a header) — this page says, in one place,
|
||||
what is no longer true, since when, and where the decision is recorded. Add to it whenever a
|
||||
document is superseded or a claim corrected.
|
||||
|
||||
## Dead — abandoned, removed, or never adopted
|
||||
|
||||
| Idea | Since | What happened | Recorded in |
|
||||
|---|---|---|---|
|
||||
| L4Re / Fiasco.OC as a platform target | mid-2026 | Removed as an active target; LithosAnanke is its own kernel. | `.claude/CLAUDE.md` (Project Overview); docs archived in `working/archive/dead/l4re/` |
|
||||
| The `hal_*` interface contract and its migration plan | flagged 2026-10-09 | Never adopted; the kernel grew its own HAL. | `working/archive/dead/hal-target-contract/`; the HAL as built: `kernel/src/hal/README.md` |
|
||||
| ACL "Rolling Window of Truth" (`ACL-RECHECK-RW`) | removed 2026-07-08 | Dead code from the start: `acl_recheck()` only ever looked up `ACL-RECHECK`. | `fabric/FABRIC-1.md` §M–T |
|
||||
| The Hermes VM and FORTH messaging (`messaging.4th`, `MSG-TICK`) | 2026-09-22 | Messaging moved into the kernel as kernel-Hermes; the Tripod is Hera / Artemis / Hestia. | `fabric/FABRIC-3.5.md`, `FABRIC-3.6.md`; old docs in `working/archive/superseded/2026-08-tripod/` and `.claude/HERMES.md` (frozen) |
|
||||
| Running a VM's messages from Hera's idle loop (a second delivery path) | 2026-10-14 | One path: a VM takes its own messages on its own turn. | `fabric/FABRIC-3.md` §XXXVI |
|
||||
| Word-ACL elevation on request (`ELEVATE-GRANT`, `KH-ELEVATE-SEND`) and Zuse's eligibility list | 2026-10-14 | Ruled not needed: privilege comes from the drive. Removed, with the hole it carried; the list's disk area is reserved, unused. | `fabric/FABRIC-3.md` §XXXVII; `fabric/FABRIC-3.7.md` (closed) |
|
||||
| A knowledge factor for identity (PIN, passphrase) | 2026-09-23 | Built, tested, reverted: "there's only the drive." | `fabric/FABRIC-3.7.md` §4 |
|
||||
| Defending against a byte-for-byte cloned identity drive | 2026-09-23 | Accepted by design, not a gap. (Copying from *within* StarshipOS is blocked.) | `fabric/FABRIC-3.7.md` §4 |
|
||||
| The StarForth-era roadmap (VM -> kernel -> OS -> FPGA, 2025-12) | flagged 2026-08-26 | Overtaken; the architecture and terms it uses no longer exist. | `working/archive/superseded/2025-12-14-starforth-roadmap.md`; now `reference/ROADMAP.md` |
|
||||
| The complete 2^6 factorial DoE | flagged 2026-10-09 | Obsolete. | `working/archive/superseded/factorial-doe/` |
|
||||
| "Everything is a VM" system architecture, draft 0.1 | 2026-01-27 | A vision draft; what was built is in the FABRIC record. | `working/archive/historical/2026-01-27-system-architecture-draft.md` |
|
||||
|
||||
**Deferred, not dead:**
|
||||
- **The multiuser/multitasking DoE campaign** (`fabric/FABRIC-3.md` §XXXIII–XXXV). Deferred past
|
||||
bare metal, 2026-10-14. Its original 30-reps-per-cell design (about 10.3 days) had already been
|
||||
replaced, in §XXXIV.4, by a segmented per-ISA design.
|
||||
- **Keyboard VMs.** A concept only (2026-10-14), not designed.
|
||||
|
||||
## Revised — claims that were corrected
|
||||
|
||||
| Was | Is | Since | Recorded in |
|
||||
|---|---|---|---|
|
||||
| ACL overhead "+0.0054%–+0.0088%" (the "ACL-RWT" campaign) | **+0.0603%**, the live ACL-TTL mechanism, CV 0.000% | 2026-08-21 | `fabric/FABRIC-1.md` §T |
|
||||
| Kernel version 2.0.1 | rolled back to 2.0.0 on 2026-09-04 (2.0.1 names the SER5 hardware line), now **2.1.0** (tag `v2.1.0`) | 2026-09-22 | `fabric/FABRIC-3.md` §I.2; `kernel/Makefile` |
|
||||
| Capsule blocks must be in `[2048, 5120)` | **2048 or more**, no upper bound | 2026-10-05 | `v4.0.0/NUCLEUS.md` §5.2 |
|
||||
| A capsule block is a 1024-byte budget | **64 characters x 16 lines** (`mkcapsule --lint`) | 2026-09-19 | `.claude/CLAUDE.md` (block format) |
|
||||
| Parity baseline: 530 words, hash `0x08873e0f44b7cb2a` | **526 words, `0x82f4ae7cb2e2d424`** (elevation words out, `LOG-FLUSH`/`LOG-SHOW` in) | 2026-10-14 | `fabric/FABRIC-3.md` §XXXVII, §XXXVIII |
|
||||
| Identity drives attached together are dropped (§XIV) | **no longer reproduces**, all three ISAs | 2026-10-14 | `fabric/FABRIC-3.md` §XIV |
|
||||
| `THRU`/`LOAD` lose the rest of their line | **fixed** | 2026-10-14 | `fabric/FABRIC-3.md` §XXXIV.1 |
|
||||
| The log ring's growth is "safe regardless of wrap state" | **it was not**; fixed | 2026-10-14 | `fabric/FABRIC-3.md` §XXXVIII |
|
||||
| The Pi 5's GIC is under `/axi` with two-cell addresses; its framebuffer address needs `& 0x3FFFFFFF` | **under `/soc`, one cell**, read through `ranges`; the address **goes through `dma-ranges`** | 2026-10-14 | `fabric/FABRIC-3.md` §XXXIX |
|
||||
| The old elevation path passed a raw cross-VM address | **it copied text** (the narrower real gap was a `"` in a name) | 2026-09-22 | `fabric/FABRIC-3.7.md` (its own correction) |
|
||||
| Kernel builds boot v3 (v4 only with `STARFORTH_V4=1`, then v3 not at all; board images v3 unless `system=v4`) | **every build carries both and boots v4** unless `system=v3` -- v3 is being retired | 2026-10-14 | `fabric/FABRIC-3.md` XLIII (revised) |
|
||||
| `.claude/ARTEMIS.md`, `HERMES.md`, `TRIPOD.md`, `CONSOLE.md` describe the system | **frozen as record**, superseded by FABRIC-3.5/3.6 | 2026-09-22 | `.claude/CLAUDE.md` (top) |
|
||||
|
||||
**Resolved 2026-10-14:** the top-level `README.md` was titled "LithosAnanke v2.0.1" (the SER5
|
||||
hardware line's version) while the kernel is 2.1.0; Captain Bob ruled it rewritten -- it now
|
||||
describes the system as it is (Tripod Hera/Artemis/Hestia, kernel-Hermes, 1052-test POST, both
|
||||
systems on every board image, v4 the default).
|
||||
+23
-15
@@ -1,20 +1,28 @@
|
||||
# docs/DELETE-CANDIDATES.md
|
||||
|
||||
**Generated:** 2026-06-16 (docs reorg Phase 2)
|
||||
**Status:** Awaiting Bob's explicit confirmation. Nothing here has been deleted.
|
||||
**Listed:** 2026-10-14 (docs triage). **Status: deleted 2026-10-14 on Captain Bob's ruling
|
||||
("delete").** The list is kept as the record of what was removed and why; nothing is awaiting a
|
||||
ruling now. The formal tier's `%% SOURCE:` comments that named two of these were repointed at
|
||||
the maintained copies.
|
||||
|
||||
These files were tagged `DELETE` during Phase 1 triage (see `docs/INDEX.md`).
|
||||
Per the ground rules in `docs/CLAUDE.md`, they are listed here and left in place
|
||||
until Bob confirms removal. They were relocated with their parent trees during
|
||||
the Phase 2 reorganization but otherwise left unmodified (no provenance header
|
||||
was inserted into them).
|
||||
Every one is a duplicate: either byte-identical to another file in the same archive, or an older
|
||||
copy of a document whose maintained copy is named in the reason. Deleting them loses nothing.
|
||||
|
||||
| Path (current) | Original path | Reason |
|
||||
|----------------|---------------|--------|
|
||||
| docs/working/archive/quality/validation/break-me-report.md | docs/04-quality/validation/break-me-report.md | Empty (0 bytes); never written despite `break_me_tests.c` existing. |
|
||||
| docs/working/scratch/src/bug_report.adoc | docs/src/bug_report.adoc | Generic GitHub bug-report template (smartphone/browser/OS fields) auto-converted to AsciiDoc; irrelevant to a CLI FORTH VM. |
|
||||
| docs/working/scratch/src/feature_request.adoc | docs/src/feature_request.adoc | Generic GitHub feature-request template, garbled by AsciiDoc conversion; no project-specific content. |
|
||||
| docs/working/scratch/src/internal/SHARED_CLAUDE.adoc | docs/src/internal/SHARED_CLAUDE.adoc | Dated 2025-10-19 ad-hoc AI session notes/chat log; pure transient working notes. |
|
||||
(The four candidates listed 2026-06-16 -- an empty break-me report, two GitHub issue templates and
|
||||
an AI session note -- are no longer in the tree: they were removed at some point since.)
|
||||
|
||||
| Path | Why |
|
||||
|---|---|
|
||||
| `docs/lithosananke/hal/README.md` | Duplicate of docs/working/archive/dead/hal-target-contract/README.md, without that copy's 2026-10-09 "never adopted" flags. |
|
||||
| `docs/lithosananke/hal/interfaces.md` | Duplicate (older, unflagged) of docs/working/archive/dead/hal-target-contract/interfaces.md. |
|
||||
| `docs/lithosananke/hal/lithosananke-integration.md` | The same document as docs/working/archive/dead/hal-target-contract/starkernel-integration.md under the kernel's newer name, without its "obsolete" flag. |
|
||||
| `docs/lithosananke/hal/migration-plan.md` | Duplicate (older, unflagged) of docs/working/archive/dead/hal-target-contract/migration-plan.md. |
|
||||
| `docs/lithosananke/hal/overview.md` | Duplicate (older) of docs/working/archive/dead/hal-target-contract/overview.md. |
|
||||
| `docs/lithosananke/hal/platform-implementations.md` | Duplicate (older, unflagged) of docs/working/archive/dead/hal-target-contract/platform-implementations.md. |
|
||||
| `docs/working/architecture/03-architecture/word-acl/DESIGN.md` | Older copy (2026-06) of docs/reference/word-acl/DESIGN.md, which is the maintained one (status through Phase 7). |
|
||||
| `docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/02_SUPPORTING_DOCS/FORMAL_CLAIMS_FOR_REVIEWERS.txt` | Byte-identical to ../../FORMAL_CLAIMS_FOR_REVIEWERS.txt in the same archive. |
|
||||
| `docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/02_SUPPORTING_DOCS/QUICK_REFERENCE.txt` | Byte-identical to ../../QUICK_REFERENCE.txt in the same archive. |
|
||||
| `docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/03_EXPERIMENTAL_DATA/full_90_run_comprehensive/experiment_summary.txt` | Byte-identical to ../../../full_90_run_comprehensive/experiment_summary.txt in the same archive. |
|
||||
| `docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/03_EXPERIMENTAL_DATA/full_90_run_comprehensive/run_logs/test_matrix.txt` | Byte-identical to the same file in ../../../full_90_run_comprehensive/run_logs/. |
|
||||
| `docs/working/papers/ONTOLOGY.md` | Older copy (v1.0) of docs/reference/ONTOLOGY.md (v1.1, 2026-08-13). |
|
||||
|
||||
To approve deletion, tell Claude "delete the DELETE candidates" (or list specific
|
||||
ones to keep).
|
||||
|
||||
+635
-331
@@ -1,339 +1,643 @@
|
||||
# docs/INDEX.md — Documentation Triage
|
||||
# docs/INDEX.md — every document, and its status
|
||||
|
||||
> **⚠ STALE — dated snapshot (triage performed 2026-06-16; this banner added 2026-10-09).**
|
||||
> This index is maintained by hand and has not been re-run since June 2026. Do not trust its
|
||||
> status tags or file lists as current: use `.claude/CLAUDE.md` and the
|
||||
> `docs/fabric/FABRIC-*.md` documents for authoritative status, and re-run the Phase 1 triage
|
||||
> from `docs/CLAUDE.md` if a fresh inventory is needed. Paths shown here are pre-reorg
|
||||
> (`docs/03-architecture/...`, `docs/02-experiments/...`) and may have moved to
|
||||
> `docs/working/architecture/03-architecture/...` / `docs/working/experiments/02-experiments/...`.
|
||||
Generated 2026-10-14 by the docs triage (docs/CLAUDE.md, Phase 1), from the tracked tree
|
||||
after the reorganisation. Start at **[README.md](README.md)** for the map; abandoned ideas and
|
||||
revised claims are in **[DEAD-AND-REVISED.md](DEAD-AND-REVISED.md)**; files awaiting a delete
|
||||
ruling are in **[DELETE-CANDIDATES.md](DELETE-CANDIDATES.md)**. Logs (`logs/`) and DoE run
|
||||
CSVs are not listed. Bulk data folders, and the formal LaTeX tree (governed by
|
||||
`docs/formal/CLAUDE.md`), are listed one row per folder.
|
||||
|
||||
**Phase 1 triage:** 2026-06-16 · **Phase 2 reorg:** 2026-06-16 · **Phase 3 stubs:** 2026-06-16
|
||||
**Total files inventoried:** 328
|
||||
**Status tags:** CURRENT · WORKING · HISTORICAL · SUPERSEDED · OBSOLETE · DELETE
|
||||
| Status | Meaning | Rows |
|
||||
|---|---|---|
|
||||
| CURRENT | Accurate; reflects the system as it is | 96 |
|
||||
| WORKING | Living draft or record, still edited | 128 |
|
||||
| HISTORICAL | Accurate for its time; kept as record | 90 |
|
||||
| SUPERSEDED | Replaced -- its header says by what | 26 |
|
||||
| DEAD | An idea or design that was abandoned or never adopted | 12 |
|
||||
| DELETE | Proposed for deletion, awaiting a ruling | 0 |
|
||||
| RECORD | Experiment data and results | 50 |
|
||||
| FORMAL | The press-ready LaTeX tier | 19 |
|
||||
| LEGAL HOLD | Patent-adjacent; not touched without Captain Bob | 57 |
|
||||
|
||||
---
|
||||
## .claude
|
||||
|
||||
## Status Key
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| .claude/ARTEMIS.md | ARTEMIS.md — Artemis VM Architecture | SUPERSEDED | Frozen 2026-08-15 by ruling (archive as-is); see FABRIC-3.5/3.6. |
|
||||
| .claude/CLAUDE.md | CLAUDE.md | CURRENT | Project instructions and status; authoritative. |
|
||||
| .claude/CONSOLE.md | CONSOLE.md — Console VM Architecture (DRAFT) | SUPERSEDED | Frozen 2026-08-15; see FABRIC-3.5/3.6. |
|
||||
| .claude/HERMES.md | HERMES.md — Hermes VM Architecture | SUPERSEDED | Frozen 2026-08-15; describes a VM that no longer exists. See FABRIC-3.5/3.6. |
|
||||
| .claude/README.md | .claude/ | CURRENT | |
|
||||
| .claude/TRIPOD.md | TRIPOD.md — Architectural Constraints for the Tripod VMs | SUPERSEDED | Frozen 2026-08-15; see FABRIC-3.5/3.6. |
|
||||
|
||||
| Tag | Meaning |
|
||||
|-----|---------|
|
||||
| CURRENT | Accurate and up-to-date; reflects present architecture |
|
||||
| WORKING | Active draft or living document; still being edited |
|
||||
| HISTORICAL | Accurate for its time; kept as a record |
|
||||
| SUPERSEDED | Replaced by a specific newer document |
|
||||
| OBSOLETE | Describes architecture or processes that no longer exist |
|
||||
| DELETE | No value (empty, duplicate, pure noise) |
|
||||
## (root)
|
||||
|
||||
---
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| CHANGELOG.md | Changelog | CURRENT | |
|
||||
| CODE_OF_CONDUCT.md | Contributor Covenant Code of Conduct | CURRENT | |
|
||||
| CONTRIBUTING.md | Contributing to StarForth | CURRENT | |
|
||||
| NOTICE.md | NOTICE.md | CURRENT | |
|
||||
| README.md | LithosAnanke v2.1.0 | CURRENT | |
|
||||
|
||||
## Full File Index
|
||||
## boards
|
||||
|
||||
| Path | Topic | Status | Notes |
|
||||
|------|-------|--------|-------|
|
||||
| ./.claude/CLAUDE.md | Authoritative architecture/status reference | CURRENT | Self-declared authoritative reference; internally consistent (v3.0.3, LithosAnanke v1.0.8, ACL phases 1-6 done/7-8 pending); used as ground truth for this audit. |
|
||||
| ./CODE_OF_CONDUCT.md | Community conduct standards | CURRENT | Standard Contributor Covenant boilerplate, not version/architecture-dependent. |
|
||||
| ./CONTRIBUTING.md | Contribution guidelines, build/test workflow | WORKING | References "780+ tests" and points to `docs/CLAUDE.md` as project overview, while authoritative CLAUDE.md cites 936+ tests and itself (`.claude/CLAUDE.md`) as authoritative — minor staleness, but actively-useful living doc. |
|
||||
| ./NOTICE.md | License attribution notice | CURRENT | Static legal/attribution text tied to Starship License 1.0, consistent with CLAUDE.md license section. |
|
||||
| ./ONTOLOGY.md | Formal taxonomy/thermodynamic lexicon | CURRENT | Dated 2025-12-13; explicitly referenced as canonical lexicon by CLAUDE.md and README; conceptual framework, not version-dependent. |
|
||||
| ./README.md | Project overview/quick start | SUPERSEDED | Cites release tag v1.5.0-RELEASE, "800+ test suite", "21 theory files" vs CLAUDE.md's current v3.0.3, 936+ tests, 24 theory files — predates several version bumps; superseded by `.claude/CLAUDE.md`. |
|
||||
| ./ROADMAP.md | VM→Kernel→OS→FPGA phased roadmap | SUPERSEDED | Dated 2025-12-14, describes StarKernel/HAL as not yet begun, but CLAUDE.md shows LithosAnanke v1.0.8 with M0–M6 complete and M7 in progress — overtaken by progress; CLAUDE.md's embedded roadmap summary is now current. |
|
||||
| docs/working/experiments/campaigns/doe_2x7/README.md | 2^7 factorial DoE methodology guide | CURRENT | Reusable how-to-run guide for the DoE experiment class, not tied to one run; matches current 7-loop architecture. |
|
||||
| docs/working/experiments/campaigns/l8_attractor_map/SESSION_REPORT_2025-12-10.md | Narrative session report on L8 attractor debugging | HISTORICAL | Dated first-person account of one specific debugging/analysis session; accurate record of its time. |
|
||||
| docs/working/experiments/campaigns/l8_attractor_map/results_20251209_145907/analysis_output/report/TIDBITS.md | Informal findings notes from L8 attractor analysis | HISTORICAL | Informal commentary tied to one specific dataset/run (2025-12-09); a snapshot artifact. |
|
||||
| docs/working/experiments/campaigns/l8_attractor_map/results_20251209_145907/analysis_output/report/comprehensive_report.md | Statistical report on L8 heartbeat across 180 runs | HISTORICAL | Dated analysis report of one specific experiment run's results. |
|
||||
| docs/working/experiments/campaigns/l8_attractor_map/results_20251209_145907/analysis_output/report/comprehensive_report.md.pdf | Rendered PDF of comprehensive_report.md | HISTORICAL | Rendered artifact of the same dated run's report; same status as its .md source. |
|
||||
| docs/working/experiments/campaigns/l8_attractor_map/results_20251209_145907/analysis_output/report/heartbeat_analysis.md | Heartbeat statistical analysis (ANOVA, workload effects) | HISTORICAL | Dated 2025-12-09, tied to this specific 180-run dataset; a results record. |
|
||||
| docs/working/experiments/campaigns/l8_attractor_map/results_20251209_145907/analysis_output/report/mathematical_framework.md | Oscillator-inspired equations fit to heartbeat data | HISTORICAL | Speculative modeling derived from this one dataset's measured frequencies; dated analysis artifact. |
|
||||
| docs/working/experiments/campaigns/l8_attractor_map/results_20251209_145907/analysis_output/report/mathematical_framework.md.pdf | Rendered PDF of mathematical_framework.md | HISTORICAL | Rendered artifact of the same dated analysis. |
|
||||
| docs/working/experiments/campaigns/l8_attractor_map/results_20251209_145907/analysis_output/tables/NOTES.md | Notes accompanying generated data tables | HISTORICAL | Supporting notes for one run's generated tables; tied to that dated results directory. |
|
||||
| docs/working/experiments/campaigns/l8_attractor_map/results_20251209_145907/analysis_output/tables/anova_results.txt | Raw ANOVA output (tick count/duration vs workload) | HISTORICAL | Raw statistical output specific to the 2025-12-09 run. |
|
||||
| docs/working/experiments/campaigns/l8_attractor_map/results_20251209_145907/binary_2cycle_analysis_report.md | Binary 2-cycle clustering analysis of heartbeat phase space | HISTORICAL | Dated (2025-12-11) follow-on analysis of the same 180-run dataset. |
|
||||
| docs/working/experiments/campaigns/l8_attractor_map/run_log.txt | Raw execution log of L8 attractor experiment run | HISTORICAL | Raw run transcript referencing a specific results directory; record of one execution session. |
|
||||
| docs/working/experiments/campaigns/l8_validation/EXPERIMENT_SUMMARY.txt | L8 Jacquard validation experiment design summary | HISTORICAL | Fixed summary of one validation campaign ("IMPLEMENTED: 2025-11-26"), not a reusable guide (README fills that role). |
|
||||
| docs/working/experiments/campaigns/l8_validation/README.md | L8 Jacquard validation methodology guide | CURRENT | Reusable how-to/experimental-design guide for re-running this class of experiment; matches current L8 Jacquard architecture. |
|
||||
| docs/working/experiments/campaigns/l8_validation/l8_validation_20251208_102205/conditions_randomized.txt | Randomized condition matrix for one validation run | HISTORICAL | Raw generated condition list timestamped 2025-12-08; specific run's input data. |
|
||||
| docs/working/experiments/campaigns/l8_validation/l8_validation_20251208_102205/conditions_raw.txt | Unrandomized condition matrix for one validation run | HISTORICAL | Companion raw matrix for the same dated run. |
|
||||
| docs/working/experiments/campaigns/l8_validation/l8_validation_30reps_20251126_135128/conditions_randomized.txt | Randomized condition matrix, 30-rep run | HISTORICAL | Dated 2025-11-26 run's input matrix; an earlier run in the same family. |
|
||||
| docs/working/experiments/campaigns/l8_validation/l8_validation_30reps_20251126_135128/conditions_raw.txt | Unrandomized condition matrix, 30-rep run | HISTORICAL | Companion raw matrix for the same 2025-11-26 run. |
|
||||
| docs/working/experiments/campaigns/shape_validation/README.md | Workload shape validation methodology guide | CURRENT | Reusable quick-start guide for re-running the shape-validation experiment class; architecture-consistent with CLAUDE.md. |
|
||||
| docs/working/experiments/campaigns/shape_validation/shape_RAJ_run_20251127_093208/conditions_randomized.txt | Randomized condition matrix for one shape-validation run | HISTORICAL | Specific dated (2025-11-27) run's randomized input data. |
|
||||
| docs/working/experiments/campaigns/shape_validation/shape_RAJ_run_20251127_093208/conditions_raw.txt | Unrandomized condition matrix for one shape-validation run | HISTORICAL | Companion raw matrix for the same 2025-11-27 run. |
|
||||
| docs/working/experiments/campaigns/shape_validation/shape_run_20251123_083147/conditions_randomized.txt | Randomized condition matrix, earlier shape-validation run | HISTORICAL | Dated 2025-11-23, earlier run in same family. |
|
||||
| docs/working/experiments/campaigns/shape_validation/shape_run_20251123_083147/conditions_raw.txt | Unrandomized condition matrix, earlier shape-validation run | HISTORICAL | Companion raw matrix for the 2025-11-23 run. |
|
||||
| docs/working/experiments/campaigns/window_scaling/QUICK_START.md | Window-scaling (James Law) experiment quick-start steps | CURRENT | Reusable step-by-step workflow for re-running the experiment; procedural, not tied to a single completed run. |
|
||||
| docs/working/experiments/campaigns/window_scaling/README.md | Window-scaling experiment design / James Law hypothesis | CURRENT | Reusable experimental-design overview (hypothesis, expected outcomes) for the experiment class. |
|
||||
| docs/working/papers/published/James_Steady-State_Convergence_Adaptive_Runtime.pdf | Published SSRN academic paper | CURRENT | Confirmed present; explicitly named as the published SSRN paper in CLAUDE.md; a citable finished artifact. |
|
||||
| ./scripts/SCRIPT_REPAIR_LOG.md | Bug-fix log for run_ablation_study.sh | HISTORICAL | Documents specific fixes made 2025-11-20 to a script that still exists; valuable as a record but not living guidance. |
|
||||
| docs/working/papers/ACADEMIC_WORDING_GUIDELINES.md | Academic language rules for physics-metaphor claims | CURRENT | Active style guide for SSRN paper and derivatives; referenced by authors/contributors. |
|
||||
| docs/working/scratch/AGENTS.md | Repo structure and contribution rules for AI/human contributors | CURRENT | Accurate description of build, test, naming, and PR conventions; matches current codebase layout. |
|
||||
| docs/working/scratch/AI_AGENT_MANDATORY_README.md | Mandatory AI-agent pre-read for physics runtime changes | CURRENT | Governance document; rules are evergreen; references live subsystem names. |
|
||||
| docs/working/papers/ANTI_CLAIMS.md | Explicit boundary statements for SSRN/peer-review defensibility | CURRENT | Directly supports published SSRN paper; no code references that have drifted. |
|
||||
| ./docs/CLAUDE.md | Docs-root instructions for Claude Code; two-tier doc model plan | WORKING | Describes a `docs/formal/` + `docs/working/` restructure not yet executed; active planning doc, not authoritative state ref (`.claude/CLAUDE.md` is). |
|
||||
| docs/working/archive/COMPUTATIONAL_PHYSICS_FRAMEWORK.md | Expansive "physics of computation" claims framework | HISTORICAL | Contains strong over-claims ("This is not metaphor") that contradict `ANTI_CLAIMS.md` and `ACADEMIC_WORDING_GUIDELINES.md`; dates from earlier draft thinking (2025-12-10). |
|
||||
| ./docs/DARPA_SSM_Proposal_James.docx | DARPA SSM grant proposal (Word format) | WORKING | Active proposal document; companion to the PDF version. |
|
||||
| ./docs/DARPA_SSM_Proposal_James.pdf | DARPA SSM grant proposal (PDF) | WORKING | Active funding proposal; filename indicates a working/submission-ready draft. |
|
||||
| docs/working/archive/DOCUMENTATION_AUDIT.md | Docs audit from 2025-12-14; gap/inconsistency findings | HISTORICAL | Audit from a past triage pass; most findings have since changed; useful historical record. |
|
||||
| docs/working/papers/EXECUTIVE_SUMMARY.md | Plain-English summary of StarForth results for non-specialists | CURRENT | Accurate, well-calibrated summary with correct metaphor framing; audience: journalists, admins, reviewers. |
|
||||
| docs/working/papers/FINAL_REPORT/appendix_glossary.adoc | AsciiDoc glossary appendix for multi-chapter report | CURRENT | Formal, math-precise definitions consistent with current ontology; intended for book/report compilation. |
|
||||
| docs/working/papers/FORMAL_CLAIM_TABLE.md | Structured claim–evidence–reproducibility table for peer review | CURRENT | Core scientific accountability doc; tied to SSRN paper claims; still valid. |
|
||||
| docs/working/archive/GAP_ANALYSIS.md | Gap analysis: StarForth → StarKernel → StarshipOS → FPGA | SUPERSEDED | Written when StarKernel had "zero implementation"; LithosAnanke v1.0.8 has M0-M6 complete — the kernel gaps section is stale. |
|
||||
| docs/working/papers/NEGATIVE_RESULTS.md | Documented failure modes and limitations | CURRENT | Honest failure-mode catalog; still accurate and academically valuable. |
|
||||
| docs/working/papers/NULL_HYPOTHESIS.md | Formal null hypothesis and falsification criteria | CURRENT | Rigorous statistical framing for SSRN claims; no stale references. |
|
||||
| docs/working/papers/ONTOLOGY.md | Master ontology/taxonomy/lexicon for adaptive runtime concepts | CURRENT | Authoritative term definitions; referenced by root ONTOLOGY.md and docs/README.md; actively used. |
|
||||
| docs/working/papers/ONTOLOGY_README.md | Index/guide to ontology file set (md, tex, adoc) | CURRENT | Accurate pointer document for ontology artifacts; still valid. |
|
||||
| ./docs/README.md | Top-level docs directory README and navigation | WORKING | Navigation is broadly accurate but mentions HAL migration as "current active work" which is further along now. |
|
||||
| docs/working/papers/REPLICATION_INVITE.md | Formal open invitation to independent replication | CURRENT | Evergreen scientific openness statement; expected output values still match claimed results. |
|
||||
| docs/working/papers/REPRODUCIBILITY.md | One-command reproduction protocol with exact expected output | CURRENT | References valid build commands and `--doe` flag; expected output values consistent with published claims. |
|
||||
| docs/working/papers/SCIENTIFIC_DEFENSE_CHECKLIST.md | Checklist of attack vectors and defenses for peer review | WORKING | Many "missing defenses" (GPG signing, Zenodo DOI, R/Python scripts) not yet addressed; still actively relevant. |
|
||||
| docs/working/papers/SENSITIVITY_ANALYSIS.md | Parameter sweep design: robustness of 0% CV claim | CURRENT | Documents planned sensitivity experiments; scientifically sound framing; supports SSRN defensibility. |
|
||||
| ./docs/SSM_DARPA_Complete_Proposal_James_FINAL.docx | DARPA SSM complete/final proposal (Word, FINAL) | WORKING | "FINAL" in name suggests submission-ready; likely supersedes `DARPA_SSM_Proposal_James.docx` but keep both until confirmed. |
|
||||
| docs/working/papers/SSRN_companion/Math_Companion_SSRN.pdf | Compiled PDF of math companion to SSRN paper | CURRENT | Rendered output of the `.tex` source; companion to the published SSRN paper. |
|
||||
| docs/working/papers/SSRN_companion/Math_Companion_SSRN.tex | LaTeX source for math companion document | CURRENT | Source of record for comprehensive math/engineering structures reference; cross-references implementation. |
|
||||
| docs/working/papers/SSRN_companion/figures/fig1_snake_trajectory.pdf | Figure asset: snake/phase trajectory | CURRENT | Figure asset for the SSRN math companion. |
|
||||
| docs/working/papers/SSRN_companion/figures/fig2_K_vs_window.pdf | Figure asset: K vs window width | CURRENT | Figure asset for the SSRN math companion. |
|
||||
| docs/working/papers/SSRN_companion/figures/fig3_FFT_spectrum.pdf | Figure asset: FFT spectrum | CURRENT | Figure asset for the SSRN math companion. |
|
||||
| docs/working/papers/SSRN_companion/figures/fig4_golden_ratio_penalties.pdf | Figure asset: golden ratio penalties | CURRENT | Figure asset for the SSRN math companion. |
|
||||
| docs/working/papers/SSRN_companion/figures/fig5_bimodal_distributions.pdf | Figure asset: bimodal distributions | CURRENT | Figure asset for the SSRN math companion. |
|
||||
| docs/working/papers/SSRN_companion/figures/fig6_performance_vs_k.pdf | Figure asset: performance vs K | CURRENT | Figure asset for the SSRN math companion. |
|
||||
| docs/working/papers/SSRN_companion/figures/fig7_performance_by_regime.pdf | Figure asset: performance by regime | CURRENT | Figure asset for the SSRN math companion. |
|
||||
| ./docs/SYSTEM_NARRATIVE.pdf | Compiled PDF of system narrative | CURRENT | Rendered output of `SYSTEM_NARRATIVE.tex`; technical story for patent counsel and reviewers. |
|
||||
| ./docs/SYSTEM_NARRATIVE.tex | LaTeX source: technical narrative for patent/research review | CURRENT | Well-framed, correctly calibrated narrative; accurate description of the adaptive runtime and 90-run experiment. |
|
||||
| docs/working/scratch/TASK_LIST.md | AI/human task list with working rules and incremental tasks | WORKING | All tasks are unchecked; likely predates recent physics work; rules section is evergreen but specific tasks may be stale or partially done. |
|
||||
| docs/working/archive/artifacts/kanban-workflow/MANIFEST.adoc | Artifact manifest for kanban workflow validation scripts | HISTORICAL | Tracks process-tooling artifacts from a past workflow setup session; no ongoing relevance to VM or kernel. |
|
||||
| docs/working/scratch/assets/README.md | Binary assets holding area README | WORKING | Correctly flags `book-FIXED.docx` etc. as misplaced; the guidance (move to LFS/external) is still actionable. |
|
||||
| docs/working/scratch/assets/book-FIXED.docx | Book/report Word document | WORKING | Binary asset misplaced in docs/assets; should move to LFS per assets/README.md guidance. |
|
||||
| docs/working/architecture/heartbeat_csv_export.md | Heartbeat CSV export design: format, columns, TODO status | WORKING | Several columns marked `⚠️ TODO`; matches CLAUDE.md note that `heartbeat_export_csv()` is not yet implemented; active design/tracking doc. |
|
||||
| ./docs/ontology.pdf | Compiled PDF of `ontology.tex` | CURRENT | Rendered output of `ontology.tex`; self-contained reference for academic inclusion. |
|
||||
| ./docs/ontology.tex | LaTeX source for formal ontology | CURRENT | Source of record matching `ONTOLOGY.md` content; used for journal/conference paper inclusion. |
|
||||
| docs/working/archive/prog-prove.pdf | Unknown — likely Isabelle/HOL or proof-assistant tutorial PDF | HISTORICAL | Filename suggests a proof-programming reference; not authored by this project; reference material only. |
|
||||
| docs/working/architecture/getting-started/DEVELOPER.md | Dev environment setup, Isabelle install | CURRENT | Generic setup instructions still match current build system. |
|
||||
| docs/working/architecture/getting-started/README.md | Getting-started index/TOC | CURRENT | Navigation page; links resolve to existing files. |
|
||||
| docs/working/architecture/getting-started/quick-start/factorial-doe.md | Quick-start for 2^6 per-loop factorial DoE | OBSOLETE | Describes retired `ENABLE_LOOP_1..6` compile-time toggles; replaced by L8 Jacquard runtime mode selector. Hardcoded `/home/rajames/...` paths. |
|
||||
| docs/working/architecture/getting-started/quick-start/heartbeat-doe.md | Quick-start for heartbeat DoE run | HISTORICAL | Dated 2025-11-20, references a specific completed run directory and hardcoded user paths. |
|
||||
| docs/working/architecture/getting-started/quick-start/optimization-doe.md | Quick-start for 5-opportunity optimization DoE | HISTORICAL | References dated result dirs from a completed tuning campaign; superseded conceptually by L8's data-driven design. |
|
||||
| docs/working/experiments/02-experiments/L8_WIRING_CODE_REVIEW_GUIDE.md | Code review guide for L8 wiring (L2/L3/L5/L6) | HISTORICAL | Dated 2025-12-05; matches current `physics_metadata.c` — completed, accurate review record. |
|
||||
| docs/working/experiments/02-experiments/L8_WIRING_IMPLEMENTATION_SUMMARY.md | Summary of L8 gating implementation | HISTORICAL | Dated 2025-12-05, marked complete; verified consistent with current source. |
|
||||
| docs/working/experiments/02-experiments/L8_WIRING_PLAN.md | Plan for wiring loops to L8 mode selector | SUPERSEDED | Superseded by L8_WIRING_IMPLEMENTATION_SUMMARY.md and L8_WIRING_CODE_REVIEW_GUIDE.md (plan was executed and reviewed). |
|
||||
| docs/working/experiments/02-experiments/README.md | Experiments directory index | CURRENT | Accurately lists existing subdirectories. |
|
||||
| docs/working/experiments/02-experiments/factorial-doe/guide.md | Full 2^6 factorial DoE guide | OBSOLETE | Describes retired per-loop Makefile-toggle architecture, replaced by L8 Jacquard. |
|
||||
| docs/working/experiments/02-experiments/factorial-doe/incompatible-configs.md | Handling incompatible factorial loop configs | OBSOLETE | Build-time incompatibility handling for the retired 2^6 toggle experiment. |
|
||||
| docs/working/experiments/02-experiments/factorial-doe/index.md | Index for factorial DoE docs | OBSOLETE | Points to stale doc paths; describes retired architecture. |
|
||||
| docs/working/experiments/02-experiments/factorial-doe/workflow.md | Factorial DoE data pipeline workflow | HISTORICAL | Documents completed 2025-11-19 factorial campaign that produced data behind current L8 design; toggle architecture retired. |
|
||||
| docs/working/experiments/02-experiments/heartbeat-doe/corrected-design.md | Heartbeat DoE corrected metric design | SUPERSEDED | Superseded by phase2-corrected.md ("corrected and finalized" version). |
|
||||
| docs/working/experiments/02-experiments/heartbeat-doe/design.md | Original Phase 2 heartbeat DoE design | SUPERSEDED | Pre-correction draft; superseded by corrected-design.md / phase2-corrected.md. |
|
||||
| docs/working/experiments/02-experiments/heartbeat-doe/execution-guide.md | How to run Phase 2 heartbeat DoE | HISTORICAL | Dated 2025-11-20, hardcoded stale path; describes running the now-superseded design. |
|
||||
| docs/working/experiments/02-experiments/heartbeat-doe/implementation-summary.md | Deliverables summary for heartbeat DoE | HISTORICAL | Point-in-time "complete" status snapshot dated 2025-11-20 for pre-correction design. |
|
||||
| docs/working/experiments/02-experiments/heartbeat-doe/phase2-corrected.md | Final corrected heartbeat DoE design | WORKING | Latest version in the revision chain; still describes not-yet-fully-implemented work. |
|
||||
| docs/working/experiments/02-experiments/james-law/protocol.md | SSM gravitational-collapse threshold hypothesis/protocol | WORKING | Forward-looking theoretical experiment protocol, no completion markers. |
|
||||
| docs/working/experiments/02-experiments/physics-optimization/doe-guide.md | Guide for 5-opportunity progressive optimization DoE | CURRENT | Generic script-driven methodology still consistent with current physics engine. |
|
||||
| docs/working/experiments/02-experiments/physics-optimization/execution-guide.md | Guide for 90-run comprehensive physics validation | CURRENT | Underlies the "0% variance across 90 runs" claim in CLAUDE.md. |
|
||||
| docs/working/experiments/02-experiments/physics-optimization/hotwords-cache.md | Hot-words cache experiment results (1.78x speedup) | HISTORICAL | Completed-experiment results report with fixed numbers. |
|
||||
| docs/working/experiments/02-experiments/physics-optimization/proposals.md | 9 proposed future optimization opportunities | WORKING | Living forward-looking proposal doc built on hotwords-cache result. |
|
||||
| docs/working/experiments/02-experiments/physics-optimization/reproduce.md | Reproduction recipe for hotwords-cache result | CURRENT | Narrow, still-valid step-by-step reproduction guide. |
|
||||
| docs/working/architecture/03-architecture/OVERVIEW.md | Top-level architecture overview (3-layer model, physics loops, boot sequence) | WORKING | Header says "Status: Complete, 2025-12-14" but roadmap still frames StarKernel as "PLANNED"/HAL migration "IN PROGRESS," lagging CLAUDE.md's actual M0-M6-done/M7-in-progress state; needs a refresh pass. |
|
||||
| docs/working/architecture/03-architecture/README.md | Directory index/landing page for 03-architecture/ | WORKING | Shorter duplicate of OVERVIEW.md's roadmap; same staleness (treats StarKernel as not-yet-started); functions as nav index, content needs sync with CLAUDE.md. |
|
||||
| docs/working/architecture/03-architecture/adaptive-systems/adaptive-window-and-decay.md | Root-cause investigation: rolling-window shrink + decay_slope placeholder bugs | HISTORICAL | Dated 2025-11-08, "Root Cause Analysis Complete." Diagnostic/incident report; trigger doc for window-inference-redesign.md. |
|
||||
| docs/working/architecture/03-architecture/adaptive-systems/loop-5-sketch.md | Alternate Loop #5 proposal: prefetch-accuracy-driven binary-chop window tuning | SUPERSEDED | Superseded by window-inference-redesign.md. Undated draft ending in an open question to the user (never approved); the shipped Loop #5 uses Levene's test, not this mechanism. |
|
||||
| docs/working/architecture/03-architecture/adaptive-systems/multivariate-dynamics.md | Phase 2 DoE experiment design: multivariate stability fingerprinting across 7 metrics | WORKING | Dated 2025-11-20, "Status: Design Phase." Forward-looking proposal tied to still-unimplemented heartbeat instrumentation. |
|
||||
| docs/working/architecture/03-architecture/adaptive-systems/window-inference-redesign.md | Redesign of window-width inference using Levene's test on disjoint chunks | CURRENT | Dated 2025-11-19, "DESIGN (approved for implementation)." Matches the Loop #5/#6 mechanism CLAUDE.md/OVERVIEW.md describe as actually implemented (inference_engine.c). |
|
||||
| docs/working/architecture/03-architecture/hal/README.md | Index/reading-order guide for HAL doc set | WORKING | Status table claims all 5 HAL docs "Complete, 2025-12-14," but describes target architecture per overview.md's own disclaimer, not built code; misleading without that caveat. |
|
||||
| docs/working/architecture/03-architecture/hal/interfaces.md | hal_* C interface contract spec (time, interrupt, memory, console, cpu, panic) | WORKING | Normative target API design; current codebase uses sf_time_backend_t-style naming per overview.md — this HAL layer is not yet built as specified. |
|
||||
| docs/working/architecture/03-architecture/hal/migration-plan.md | 7-phase plan to migrate codebase to hal_* interfaces | WORKING | Forward plan ("Phase 2 IN PROGRESS" per roadmap); CLAUDE.md's current source tree shows this migration not yet executed. |
|
||||
| docs/working/architecture/03-architecture/hal/overview.md | HAL rationale/design-principles doc | WORKING | Contains the key disclaimer: "current codebase uses sf_time_backend_t... different naming" — explicitly flags the whole HAL doc family as target/aspirational, not current. |
|
||||
| docs/working/architecture/03-architecture/hal/platform-implementations.md | Example hal_* implementations for Linux and kernel platforms | OBSOLETE | Assumes src/platform/<platform>/hal_*.c layout; actual built StarKernel tree (per CLAUDE.md) uses src/starkernel/{arch,boot,capsule,hal,memory,...} — a different, already-implemented structure. |
|
||||
| docs/working/architecture/03-architecture/hal/starkernel-integration.md | Kernel HAL integration guide, src/platform/kernel/ layout, milestone roadmap to "ok" prompt | OBSOLETE | Describes Milestone 1 "Boot + Serial Output" as a starting point; LithosAnanke is actually at v1.0.8 with M0-M6 complete, M7 in progress, using a wholly different src/starkernel/ directory structure. |
|
||||
| docs/working/architecture/03-architecture/heartbeat-system/architecture.md | Proposes vm_tick() dispatcher centralizing Loop #3/#5 heartbeat logic | HISTORICAL | No date; ends in an open question, never confirmed adopted. Foundational rationale doc; superseded in specifics by instrumentation-plan.md's HeartbeatTickSnapshot design. |
|
||||
| docs/working/architecture/03-architecture/heartbeat-system/critical-insight.md | Discovery memo: heartbeat tick rate is variable, not fixed; Stage 1 DoE baseline was flawed | HISTORICAL | Dated 2025-11-20, "Game-changer for Phase 2 DoE." Point-in-time investigation memo that directly motivated implementation-plan.md. |
|
||||
| docs/working/architecture/03-architecture/heartbeat-system/implementation-plan.md | Plan for HeartbeatRateSample logging to capture variable tick rate | SUPERSEDED | Superseded by instrumentation-plan.md. Same date (2025-11-20) and goal, but proposes an earlier/different struct (HeartbeatRateSample) than the HeartbeatTickSnapshot design CLAUDE.md cites as the live target. |
|
||||
| docs/working/architecture/03-architecture/heartbeat-system/instrumentation-plan.md | Per-tick instrumentation plan: HeartbeatTickSnapshot, tick_buffer, heartbeat_export_csv() | WORKING | Explicitly the doc CLAUDE.md cites as current ("declared in include/vm.h, but heartbeat_export_csv() is not yet implemented"). Checklist entirely unchecked. |
|
||||
| docs/working/architecture/03-architecture/heartbeat-system/segfault-analysis.md | Root-cause analysis of heartbeat-thread/main-thread race on RollingWindowOfTruth | HISTORICAL | Dated 2025-11-19, "Identified & Ready for Fix," includes a past-tense commit-message template implying the tuning_lock fix was applied. No current doc mentions this race as open. |
|
||||
| docs/working/architecture/03-architecture/physics-engine/feedback-loops-analysis.md | Investigative bug-hunt audit of 6 feedback loops (precursor to the 7-loop model) | SUPERSEDED | Superseded by feedback-loops.md. Dated 2025-11-08, full of strikethrough "FIXED" headers; covers only 6 loops, unlike the polished current 7-loop reference. |
|
||||
| docs/working/architecture/03-architecture/physics-engine/feedback-loops.md | Canonical reference: all 7 feedback loops, tuning knobs, related source files | CURRENT | Matches CLAUDE.md's explicit citation ("all 7 loops detailed") verbatim; clean finished reference table covering Loops #1-7 including #5/#6 inference. |
|
||||
| docs/working/architecture/03-architecture/physics-engine/metrics-and-knobs.md | Gap-analysis backlog of metrics not yet collected (stack depth, bucket histograms, etc.) | WORKING | Explicitly self-titled "GAPS ONLY"; prioritized TODO backlog, not a current-state description; some gaps may have since been filled. |
|
||||
| docs/working/architecture/03-architecture/physics-engine/monitoring-principles.md | Doctrinal rules for non-perturbative monitoring instrumentation | CURRENT | Presents itself as binding/evergreen ("canonical rules for ALL AI assistants"); uses an older "four core loops (FL1-FL4)" framing that should be reconciled with the current 7-loop model, but the doctrine itself remains in force. |
|
||||
| docs/working/architecture/03-architecture/physics-engine/ssm-equations.md | Exploratory mathematical modeling of SSM via physics analogies for patent/DARPA strategy | HISTORICAL | Dated 2025-11-29, self-labeled "Status: Research Analysis - Exploratory." Predates Jacquard naming; speculates generically about future "L8" without Jacquard/attractor-bucket/mode-name vocabulary. |
|
||||
| docs/working/architecture/03-architecture/physics-engine/ssm-raw-data-analysis.md | Raw experimental data analysis from a specific Nov 22-27 2025 DoE campaign (51,840 runs) | HISTORICAL | Dated 2025-11-29; tied to specific named CSV files and a calendar-based "Next Steps" plan. Uses "L8" and 4 of 6 Jacquard mode names but never "Jacquard" — an early/transitional naming stage. |
|
||||
| docs/working/architecture/03-architecture/physics-engine/steady-state-machine.md | Formal theoretical definition of SSM as a computational model (attractor basins, axioms) | OBSOLETE | Zero mentions of "Jacquard," "L8," "attractor bucket," or the six named modes from CLAUDE.md; reads as a conceptual precursor never reconciled with the concrete ssm_jacquard.c system. |
|
||||
| docs/working/architecture/03-architecture/pipelining/context-window-and-binary-chop.md | Context-window infrastructure (Knob #6) + planned binary-chop tuning for Loop #4 | WORKING | Dated 2025-11-06, "Phase 1 Extension Complete," but binary-chop decision logic explicitly a doubling-rule stub with "Phase 2 (Next session)" unchecked; corroborated as still-unutilized by wired-not-utilized.md. |
|
||||
| docs/working/architecture/03-architecture/pipelining/design.md | Master architectural design for pipelining/speculative execution (Loop #4) | HISTORICAL | No date/status stamp; entirely aspirational ("Goal:", "Hypothesis"); Phase 3+ (actual prefetching/speculation) roadmap items remain unchecked and appear unrealized per wired-not-utilized.md. |
|
||||
| docs/working/architecture/03-architecture/pipelining/phase-1-instrumentation.md | Completed-checkpoint record of Phase 1 transition-tracking instrumentation | HISTORICAL | Dated 2025-11-06, "Phase 1 Complete," 731 tests passing — accurate closed record of one sub-phase; its Phase 2-4 TODOs were never closed per wired-not-utilized.md. |
|
||||
| docs/working/architecture/03-architecture/pipelining/wired-not-utilized.md | Critical-issue report: pipelining decision/speculation logic defined but never called | WORKING | No date/commit stamp; ends on an unactioned recommendation ("Option A: Disable") with no resolution language. Indicates Loop #4's prediction/speculation half may still be inactive in code. |
|
||||
| docs/working/architecture/03-architecture/word-acl/DESIGN.md | Full design spec for word-level ACL system (C fields, ACL.4th, zuse.4th, two-console model) | CURRENT | Explicitly the doc CLAUDE.md designates authoritative; internal 8-phase punch list (Phases 1-6 done, 7-8 remaining) matches CLAUDE.md's summary exactly. |
|
||||
| docs/working/archive/quality/README.md | Quality directory index | OBSOLETE | States "18 modules"; current is 22 categories/936+ tests per CLAUDE.md. |
|
||||
| docs/working/archive/quality/audits/codebase-audit-report.md | Full codebase audit | HISTORICAL | Dated 2025-12-03; point-in-time snapshot, paired with corrective-actions.md. |
|
||||
| docs/working/archive/quality/audits/corrective-actions.md | Resolution log for codebase audit | HISTORICAL | Dated 2025-12-03, v3.0.1, "COMPLETE" — 21/22 issues resolved; companion to codebase-audit-report.md. |
|
||||
| docs/working/archive/quality/audits/implementation-audit.md | Adaptive tuning implementation audit | HISTORICAL | Dated 2025-11-19, references 787/840 tests (now 936+); overtaken by later OPP reports. |
|
||||
| docs/working/archive/quality/audits/section-2-audit.md | Physics subsystem safety audit (full) | HISTORICAL | Dated 2025-11-20; paired with section-2-executive-summary.md. |
|
||||
| docs/working/archive/quality/audits/section-2-executive-summary.md | Physics safety audit executive summary | HISTORICAL | Dated 2025-11-20, "complete - awaiting final approval"; summary counterpart to section-2-audit.md. |
|
||||
| docs/working/archive/quality/phase-tracking/phase-2-implementation-checklist.md | Checklist for heartbeat instrumentation (tick_buffer/snapshot) | WORKING | CLAUDE.md confirms struct exists but heartbeat_export_csv() still not implemented — open, unrealized plan. |
|
||||
| docs/working/archive/quality/phase-tracking/phase-2-issues-identified.md | Float/double violations root-cause list in physics code | HISTORICAL | Dated 2025-11-08, "in progress" at the time; precedes implementation-checklist. |
|
||||
| docs/working/archive/quality/phase-tracking/phase-2a-session-summary.md | Session summary: WORD_FROZEN flag + linear decay | HISTORICAL | Dated 2025-11-07, "complete & validated"; distinct earlier "Phase 2a" thread. |
|
||||
| docs/working/archive/quality/regression/detection-framework.md | Regression detection framework design (for OPP #2+) | HISTORICAL | Dated 2025-11-19, design doc later used in opp-02-report.md. |
|
||||
| docs/working/archive/quality/regression/opp-02-report.md | OPP #2 window-width tuning experiment report | HISTORICAL | Dated 2025-11-19, "complete"; recommends a config for OPP #3 — completed dated report. |
|
||||
| docs/working/archive/quality/validation/break-me-report.md | Adversarial/fuzz testing report (intended) | DELETE | File is empty (0 bytes); never written despite break_me_tests.c existing. |
|
||||
| docs/working/archive/quality/validation/comprehensive-physics-validation.md | Triple-blind 90-run DoE physics validation protocol | HISTORICAL | Dated 2025-11-06; source protocol behind the "0% variance across 90 runs" figure cited in CLAUDE.md. |
|
||||
| docs/working/archive/quality/validation/phase-1-protocol.md | GitHub governance/document-routing validation protocol | OBSOLETE | Dated 2025-11-03; describes a governance/vault repo system absent from current architecture, unrelated to physics DoE. |
|
||||
| docs/working/archive/quality/validation/phase-2-executive-summary.md | DoE paradigm shift: factorial to multivariate dynamics (750-run plan) | HISTORICAL | Dated 2025-11-20, "design complete, ready for implementation." |
|
||||
| docs/working/archive/operations/README.md | Ops directory index / build & CI overview | CURRENT | Build/test commands match current Makefile; honestly labels CI/CD section "(Future)". |
|
||||
| docs/working/archive/operations/backlog-gatekeeper.md | Backlog governance (ECO/CAPA gatekeeper) | OBSOLETE | References a `.github/workflows/...` file that doesn't exist; no `.github/` directory in repo at all. |
|
||||
| docs/working/archive/operations/jenkins-pipeline-guide.adoc | Jenkins CI pipeline architecture | OBSOLETE | No Jenkinsfile or CI config exists anywhere in the repo. |
|
||||
| docs/working/archive/operations/qa-intake-workflow.adoc | QA defect intake / CAPA process | OBSOLETE | Cites stale version v2.0.2 (current v3.0.3); references nonexistent GitHub issue templates and Jenkins automation. |
|
||||
| docs/working/archive/operations/refinement/annotations.adoc | C/Isabelle refinement annotation guide | WORKING | "Phase 1 in-progress" header; active methodology guide for ongoing refinement work. |
|
||||
| docs/working/archive/operations/refinement/capa.adoc | C/Isabelle refinement defect tracking log | WORKING | All phases "not started," currently empty live tracking doc. |
|
||||
| docs/working/archive/operations/refinement/roadmap.adoc | C/Isabelle refinement roadmap | WORKING | All key functions listed "OPEN"; active planning doc with 6-8 month estimate. |
|
||||
| docs/working/archive/operations/workflow.md | CI/CD trunk-based branch workflow (devl/test/qual/prod) | OBSOLETE | Describes branches/Jenkins triggers that don't exist; repo only has master and feature branches. |
|
||||
| docs/working/archive/research/README.md | Research directory index | SUPERSEDED | References a patent-filing placeholder/submission package now superseded by the published SSRN paper. |
|
||||
| docs/working/archive/research/doe-metrics-schema.md | DoE CSV metrics schema (35 columns) | HISTORICAL | Dated 2025-11-19, predates the 2025-12-08 CSV-export suppression noted in CLAUDE.md. |
|
||||
| docs/working/archive/research/literature-review.md | Literature positioning for the optimization paper | SUPERSEDED | Draft feeder material for the now-published SSRN paper. |
|
||||
| docs/working/archive/research/research-outline.md | Paper outline draft ("working title" + alternatives) | SUPERSEDED | Pre-publication draft outline; paper has since been published. |
|
||||
| docs/working/archive/research/results-for-publication.md | Draft abstract targeting PLDI/ASPLOS | SUPERSEDED | Draft abstracts for venues other than where it was ultimately published (SSRN). |
|
||||
| docs/working/archive/session-logs/2025-11-20-recap.md | Dated session recap (DoE multivariate dynamics pivot) | HISTORICAL | Explicitly dated point-in-time design discussion record. |
|
||||
| docs/working/archive/session-logs/2025-11-26-worklog.md | Dated work log (L8 Jacquard integration) | HISTORICAL | Explicitly dated; documents the l8-final-integration milestone. |
|
||||
| docs/working/archive/session-logs/README.md | Session-logs directory index | CURRENT | Accurately describes folder purpose; explicitly warns logs may be outdated. |
|
||||
| docs/working/archive/session-logs/experimental-addendum.md | Mislabeled: actually a "StarForth to StarshipOS Hybrid Kernel Transformation Plan" | OBSOLETE | Early kernel design plan superseded by the actually-implemented LithosAnanke v1.0.8 architecture (M0-M7). |
|
||||
| docs/working/archive/session-logs/experimental-iteration-usage.md | Usage guide for run_doe.sh / run_experimental_iteration.sh | WORKING | Matching scripts still exist in scripts/; living usage guide, not a dated log. |
|
||||
| docs/working/archive/session-logs/serialized-questing-pike.md | Informal narrative on physics-analogy overclaiming risk | HISTORICAL | Captured point-in-time exploratory discussion, not a guide. |
|
||||
| ./docs/patent/CHANGES_SUMMARY.md | Patent revision log (title, James Law language, claim changes) dated 2025-12-10 | HISTORICAL | Records decisions made during v2 revisions; accurate for its time but describes edits already applied — not a live working document. |
|
||||
| ./docs/patent/JARGON_CHANGES.md | Term-replacement log (e.g. "Execution Heat" → "Execution Frequency Counters") dated 2025-12-10 | HISTORICAL | Records terminology decisions already baked into _v2 section files; useful audit trail but not a living document. |
|
||||
| ./docs/patent/Makefile | LaTeX build rules for `main.tex` | CURRENT | Minimal but functional; drives `pdflatex main.tex` double-pass build. |
|
||||
| ./docs/patent/README_V3.md | Overview claiming `patent_v3_complete.tex` is the master document | OBSOLETE | Describes a master file (`patent_v3_complete.tex`) that does not exist; structure does not match the actual `main.tex`-based layout. |
|
||||
| ./docs/patent/USPTO_COVER_LETTER.md | Draft USPTO provisional cover letter with placeholder contact fields | WORKING | Contact fields (`[Your email]`, `[Your phone]`) still blank; needs completion before filing. |
|
||||
| ./docs/patent/main.tex | Master LaTeX patent document; inputs _v2 section files | CURRENT | This is the live build root; actual `\input` order confirmed. |
|
||||
| ./docs/patent/sb0015a.pdf | USPTO form SB0015a (Provisional Application cover sheet) | CURRENT | Byte-identical to `final_provisional/sb0015a.pdf` (205016 bytes both); root copy is authoritative working copy. |
|
||||
| ./docs/patent/sb0016.pdf | USPTO form SB0016 (fee transmittal or declaration) | WORKING | Differs from `final_provisional/sb0016.pdf` (557654 vs 577171 bytes); root copy is smaller — likely a prior draft; the larger `final_provisional/` copy appears to be the filed version. |
|
||||
| ./docs/patent/ssm_RAJ_v1_patent_application.pdf | Compiled patent application PDF | CURRENT | Byte-identical to `final_provisional/ssm_RAJ_v1_patent_application.pdf` (1735085 bytes both); root copy is authoritative working copy. |
|
||||
| ./docs/patent/ssm_provisional_patent.tex | Standalone monolithic provisional patent LaTeX document | SUPERSEDED | Self-contained single-file precursor; superseded by the modular `main.tex` + sections/ architecture. |
|
||||
| ./docs/patent/sections/01_title_inventors.tex | Section file — title/inventors | OBSOLETE | Does not exist on disk; name never appears in any `\input` in main.tex. |
|
||||
| ./docs/patent/sections/02_cross_reference.tex | Section file — cross-references | OBSOLETE | Does not exist on disk; the 02_* slot in main.tex is `02_field_v2`, not a cross-reference section. |
|
||||
| ./docs/patent/sections/02_cross_reference_v2.tex | Section file — cross-references v2 | OBSOLETE | Does not exist on disk; main.tex uses `02_field_v2`, not a cross-reference section. |
|
||||
| ./docs/patent/sections/03_background.tex | Background of the Invention — original draft | SUPERSEDED | Exists on disk; superseded by `03_background_v2.tex` which main.tex actually inputs. |
|
||||
| ./docs/patent/sections/03_background_v2.tex | Background of the Invention — revised | CURRENT | Inputted by main.tex. |
|
||||
| ./docs/patent/sections/04_summary.tex | Summary of the Invention — original draft | SUPERSEDED | Exists on disk; superseded by `04_summary_v2.tex` which main.tex actually inputs. |
|
||||
| ./docs/patent/sections/04_summary_v2.tex | Summary of the Invention — revised | CURRENT | Inputted by main.tex. |
|
||||
| ./docs/patent/sections/05_brief_description.tex | Brief Description of Drawings — original | OBSOLETE | Does not exist on disk; the 05_* slot in main.tex is `05_drawings`. |
|
||||
| ./docs/patent/sections/05_brief_description_v2.tex | Brief Description of Drawings — v2 | OBSOLETE | Does not exist on disk; main.tex uses `05_drawings`, not this name. |
|
||||
| ./docs/patent/sections/06_detailed_description.tex | Detailed Description — original draft | SUPERSEDED | Exists on disk; superseded by `06_detailed_description_v2.tex` which main.tex actually inputs. |
|
||||
| ./docs/patent/sections/06_detailed_description_v2.tex | Detailed Description — revised | CURRENT | Inputted by main.tex. |
|
||||
| ./docs/patent/sections/07_claims.tex | Claims section — original | OBSOLETE | Does not exist on disk; the 07_* slot in main.tex is `07_embodiments`, not claims. |
|
||||
| ./docs/patent/sections/07_claims_v2.tex | Claims section — v2 | OBSOLETE | Does not exist on disk; main.tex uses `07_embodiments` and `08_claims_v2` for claims. |
|
||||
| ./docs/patent/sections/08_abstract.tex | Abstract section | OBSOLETE | Does not exist on disk; main.tex uses `11_abstract_v2` for the abstract. |
|
||||
| ./docs/patent/sections/RAJ_v1_01_title_inventors.tex | RAJ v1 title/inventors section | OBSOLETE | Does not exist on disk; entire RAJ_v1_* naming scheme not referenced in main.tex. |
|
||||
| ./docs/patent/sections/RAJ_v1_02_cross_reference.tex | RAJ v1 cross-reference section | OBSOLETE | Does not exist on disk. |
|
||||
| ./docs/patent/sections/RAJ_v1_03_background.tex | RAJ v1 background section | OBSOLETE | Does not exist on disk. |
|
||||
| ./docs/patent/sections/RAJ_v1_04_summary.tex | RAJ v1 summary section | OBSOLETE | Does not exist on disk. |
|
||||
| ./docs/patent/sections/RAJ_v1_05_brief_description.tex | RAJ v1 brief description section | OBSOLETE | Does not exist on disk. |
|
||||
| ./docs/patent/sections/RAJ_v1_06_detailed_description.tex | RAJ v1 detailed description section | OBSOLETE | Does not exist on disk. |
|
||||
| ./docs/patent/final_provisional/README.md | README for the final_provisional/ subdirectory | OBSOLETE | Does not exist on disk. |
|
||||
| ./docs/patent/final_provisional/sb0015a.pdf | USPTO form SB0015a — filed copy | SUPERSEDED | Byte-identical to root `sb0015a.pdf` (205016 bytes); root copy is the working canonical version. |
|
||||
| ./docs/patent/final_provisional/sb0016.pdf | USPTO form SB0016 — filed copy | CURRENT | Differs from root `sb0016.pdf` (577171 vs 557654 bytes); this larger copy is the filed/submitted version and is the more complete document. |
|
||||
| ./docs/patent/final_provisional/ssm_RAJ_v1_patent_application.pdf | Compiled patent application PDF — filed copy | SUPERSEDED | Byte-identical to root `ssm_RAJ_v1_patent_application.pdf` (1735085 bytes); root copy is the working canonical version. |
|
||||
| docs/working/scratch/src/INTEGRATION_NOTES.adoc | StarForth↔StarshipOS sync scripts (integrator.sh) | HISTORICAL | Describes ad-hoc integrator.sh scripts and one-day debugging session; superseded by formal capsule/build pipeline in current CLAUDE.md. Worth keeping as record of integration approach. |
|
||||
| docs/working/scratch/src/L4RE_INTEGRATION_TODO.adoc | L4Re integration checklist, hardcoded local paths | OBSOLETE | References absolute local dev paths (`/home/rajames/CLionProjects/...`) and a TODO checklist for copying platform files; current architecture has moved on. |
|
||||
| docs/working/scratch/src-index.adoc | docs/src documentation index | WORKING | Active index/TOC for the docs/src tree, but contains multiple dead links (ABI.adoc, BLOCK_STORAGE_GUIDE.adoc, WORD_DEVELOPMENT.adoc, TESTING.adoc, BREAK_ME_REPORT.adoc, GAP_ANALYSIS.adoc) — needs pruning/repair. |
|
||||
| docs/working/architecture/architecture-internals/INIT_SYSTEM.adoc | INIT system / conf/init.4th boot mechanism | CURRENT | Describes init.4th, INIT word, dictionary fence — matches current capsule/init architecture described in CLAUDE.md. |
|
||||
| docs/working/architecture/architecture-internals/MESSAGING.adoc | Thermodynamic "Message Field" model for StarshipOS IPC | WORKING | Forward-looking design doc for a not-yet-implemented StarshipOS messaging subsystem; consistent with physics/thermodynamic metaphor language. |
|
||||
| docs/working/scratch/src/bug_report.adoc | GitHub issue template (bug report) converted to AsciiDoc | DELETE | Generic GitHub bug-report template with smartphone/browser/OS fields irrelevant to a CLI FORTH VM; auto-converted from `.github/ISSUE_TEMPLATE`; no project-specific value. |
|
||||
| docs/working/architecture/build-and-tooling/BUILD_OPTIONS.adoc | Build-time flags/defines reference | CURRENT | Cross-checked flag names against Makefile; consistent catalog of build options, actively useful reference. |
|
||||
| docs/working/architecture/build-and-tooling/DOCUMENTATION_README.adoc | How docs/API docs are generated (make docs, Doxygen→AsciiDoc) | CURRENT | Describes `docs/src/appendix/` generation via `scripts/generate-doxygen-appendix.sh`, directly wired into Makefile. |
|
||||
| docs/working/architecture/build-and-tooling/INIT_TOOLS.adoc | tools/extract-init and init.4th↔disk image sync tooling | WORKING | Describes `tools/extract-init`; tool binary not confirmed in current `tools/` directory — may have been renamed; treat as living doc needing verification. |
|
||||
| docs/working/hardware/PGO_GUIDE.adoc | Profile-Guided Optimization guide | WORKING | Content matches current Makefile `pgo`/`pgo-build`/`pgo-perf`/`pgo-valgrind` targets exactly, but the document's own title line literally reads "QUARANTiNE ME MOTHERFUCKER" — self-flagged for review before being trusted as polished. |
|
||||
| docs/working/hardware/PLATFORM_BUILD_GUIDE.adoc | Cross-compilation / platform build matrix (POSIX, L4Re) | CURRENT | Matches Makefile `L4RE=1` flag and platform/time_posix.c, platform/time_l4re.c files in src/platform/. |
|
||||
| docs/working/scratch/ci-cd/FMEA_BLOCKING_GATES.adoc | FMEA gating for CAPA/ECR/ECO governance workflow | CURRENT | Dated 2025-11-03, describes active GitHub Workflows + pending Jenkins governance gate; consistent with other governance docs. |
|
||||
| docs/working/scratch/ci-cd/GITHUB_ISSUES_GOVERNANCE_FLOW.adoc | Relationship between GitHub Issues and governance in_basket | CURRENT | Same governance doc set, dated 2025-11-03, internally consistent. |
|
||||
| docs/working/scratch/ci-cd/GOVERNANCE_INPUT_AUDIT.adoc | Audit/compliance checklist for governance input routing | CURRENT | Dated 2025-11-03, "COMPLIANT" audit result; part of active governance documentation set. |
|
||||
| docs/working/scratch/ci-cd/JENKINS_GOVERNANCE_INTEGRATION.adoc | Jenkins pipeline → governance in_basket integration spec | CURRENT | Same active governance doc set, dated 2025-11-03. |
|
||||
| docs/working/scratch/src/development/AGENTS.adoc | Repository guidelines / coding conventions | DELETE | Duplicate of docs/working/scratch/AGENTS.md (the live version); older AsciiDoc precursor with stale binary path (`./build/starforth`). Archived in docs/trash/duplicates-pass4.tar.gz. |
|
||||
| docs/working/scratch/src/development/CONTRIBUTING.adoc | Generic contribution guide for "StarshipOS" | OBSOLETE | Boilerplate/templated contribution guide (placeholder `coc-contact@example.org`, generic Conventional Commits advice) not tailored to actual StarForth workflow or governance process; contradicts more specific and current ci-cd governance docs. |
|
||||
| docs/working/architecture/doxygen/DOXYGEN_QUICK_REFERENCE.adoc | Doxygen comment cheat-sheet | CURRENT | Matches `make docs`/`make docs-html` targets and Doxygen pipeline; straightforward reference card still applicable. |
|
||||
| docs/working/architecture/doxygen/DOXYGEN_STYLE_GUIDE.adoc | Doxygen documentation style guide | CURRENT | Companion to quick-reference; consistent with active Doxygen→AsciiDoc/HTML/PDF pipeline. |
|
||||
| docs/working/scratch/src/feature_request.adoc | GitHub issue template (feature request) converted to AsciiDoc | DELETE | Generic GitHub feature-request template, garbled by adoc conversion; no project-specific content. |
|
||||
| docs/working/architecture/getting-started/INSTALL.adoc | Installation guide (prerequisites, build/install) | WORKING | References `./build/starforth` run path rather than current `./build/amd64/<profile>/starforth` convention; otherwise generally accurate. |
|
||||
| docs/working/architecture/getting-started/QUICKSTART.adoc | Quick-start build/run guide | WORKING | Same stale-path issue (`./build/starforth` instead of `./build/amd64/standard/starforth`); otherwise build command list matches current Makefile targets. |
|
||||
| docs/working/scratch/governance/index.adoc | Pointer/redirect to external StarForth-Governance repo | CURRENT | Tiny stub file that redirects to the external governance repository README; still valid as a redirect. |
|
||||
| docs/working/scratch/COMMUNICATION_GUIDE.adoc | "Analogy cheat sheet" for explaining physics-driven OS concept to various audiences | WORKING | Internal communications/marketing aid; not tied to specific code, ages well, still usable living document. |
|
||||
| docs/working/scratch/GOVERNANCE_EXPORT_NOTES.adoc | Checklist of Phase 1 physics artifacts to mirror into governance repo | WORKING | Dated 2025-10-23; references HOLA_PROTOCOL.adoc and formal/Physics_*.thy files which still exist — consistent and current as an internal checklist. |
|
||||
| docs/working/specifications/HOLA_PROTOCOL.adoc | HOLA shared-memory analytics protocol spec | CURRENT | Cross-checked against `include/physics_runtime.h`: HOLA_SHARED_MAGIC, HOLA_PROTOCOL_MAJOR/MINOR, and the analytics header struct all exist verbatim in current source — accurate technical reference. |
|
||||
| docs/working/architecture/MAMA_FORTH_SUPERVISOR_ARCHITECTURE.adoc | Multi-VM supervisor architecture ("Mama Forth") | WORKING | Concept is alive in current code — `src/starkernel/capsule/mama_forth_words.c` exists and capsule birth protocol (MAMA_INIT capsule type) matches CLAUDE.md; this doc appears to be the design precursor to the now-partially-implemented capsule system. |
|
||||
| docs/working/scratch/src/internal/PHASE_2A_COMPLETION_REPORT.adoc | Completion report: Freeze flag + linear decay (Phase 2a) | HISTORICAL | Accurate closed record dated 2025-11-07; feature is shipped and stable — downgraded from CURRENT as a completion record, not a living doc. |
|
||||
| docs/working/scratch/src/internal/PHASE_2_IMPLEMENTATION_SUMMARY.adoc | Phase 2 action-item summary pointing to design + completion docs | HISTORICAL | Companion index to PHASE_2A_COMPLETION_REPORT; both docs describe a completed, closed phase — downgraded from CURRENT. |
|
||||
| docs/working/scratch/src/internal/PHASE_2_PHYSICS_DECAY_AND_FREEZE.adoc | Design spec for decay/freeze mechanisms | HISTORICAL | Marked "Design Phase" as of 2025-11-07, but the corresponding PHASE_2A_COMPLETION_REPORT.adoc shows this has since been implemented and validated — spec is now historical record of the design rationale behind the now-shipped feature. |
|
||||
| docs/working/architecture/PHYSICS_CONE_OF_INFLUENCE_DESIGN.adoc | Feedback-control architecture design ("cone of influence") | WORKING | Forward-looking architectural design note for scheduling/control; consistent with physics engine terminology still in active use. |
|
||||
| docs/working/architecture/PHYSICS_CONTROL_SYSTEM_DESIGN.adoc | Physics observables → scheduling/memory management integration design | WORKING | Design-stage architecture note, not yet fully realized; scheduling/memory integration is still aspirational per current CLAUDE.md roadmap. |
|
||||
| docs/working/scratch/src/internal/PHYSICS_HOTWORDS_CACHE_INTEGRATION.adoc | Hot-words cache integration implementation checklist | SUPERSEDED | Describes a step-by-step plan to add hot-words caching; this feature is now implemented and documented as "Loop #1 — Execution Heat" / `ENABLE_HOTWORDS_CACHE=1` / `dictionary_heat_optimization.c` in current CLAUDE.md. |
|
||||
| docs/working/scratch/src/internal/PHYSICS_IMPLEMENTATION_OPTIONS.adoc | Three implementation-path options for physics engine | HISTORICAL | "Phase 1 complete" framing with options for next steps; physics engine has since progressed well past this decision point (7 loops, L8 Jacquard). |
|
||||
| docs/working/scratch/src/internal/PHYSICS_IMPLEMENTATION_STATUS.adoc | POSIX vs L4Re porting strategy status for physics hooks | HISTORICAL | Describes early wiring state of `physics_metadata_touch()` calls; physics engine has since matured substantially — status snapshot now outdated. |
|
||||
| docs/working/scratch/src/internal/PHYSICS_SCHEDULING_PLAN.adoc | Planning note for physics-inspired scheduling metadata | HISTORICAL | Describes `DictPhysics` struct fields as stub/unpopulated placeholders; current `DictPhysics` is now populated and actively used — doc predates that implementation. |
|
||||
| docs/working/architecture/PHYSICS_SIGNAL_MAP.adoc | Telemetry signal inventory (L4Re KIP signals + VM-internal counters) | WORKING | Useful living reference of available L4Re kernel telemetry signals for future physics/scheduler work; L4Re remains a supported platform. |
|
||||
| docs/working/scratch/src/internal/SHARED_CLAUDE.adoc | Cross-project Claude-instance shared notepad (StarForth↔StarshipOS) | DELETE | Dated 2025-10-19 ad-hoc session notes/chat log between AI instances about integrator script status; pure transient working notes with no lasting reference value. |
|
||||
| docs/working/architecture/VM_FORMALIZATION_PLAN.adoc | Isabelle/HOL formalization roadmap for `docs/src/internal/formal/` theories | CURRENT | Directly describes the `docs/src/internal/formal/*.thy` files which exist on disk and are wired into the Makefile's Isabelle build targets. |
|
||||
| docs/working/hardware/performance-profiling/ARM64_OPTIMIZATIONS.adoc | ARM64 assembly optimization summary | CURRENT | Referenced headers (`include/vm_asm_opt_arm64.h`, `vm_inner_interp_arm64.h`, `arch_detect.h`) all confirmed present in current `include/` tree. |
|
||||
| docs/working/hardware/performance-profiling/ASM_OPTIMIZATIONS.adoc | x86_64 assembly optimization guide | CURRENT | Referenced headers (`vm_asm_opt.h`, `vm_inner_interp_asm.h`) confirmed present; consistent with `USE_ASM_OPT=1` build flag in current CLAUDE.md. |
|
||||
| docs/working/hardware/performance-profiling/PROFILER.adoc | Built-in word-execution profiler guide | CURRENT | Describes profiler integrated with PGO pipeline; consistent with `make test PROFILE=1` and `profiler.c` present in current src tree. |
|
||||
| docs/working/hardware/platform-integration/L4RE_DICTIONARY_ALLOCATION.adoc | Dictionary allocation strategy proposal for L4Re | WORKING | References `src/dictionary_management.c:228` (`vm_create_word()` malloc) and `defining_words.c:554` (`FORGET` free) — both locations exist; malloc/free dependency has likely not yet been replaced with L4Re-native allocator. |
|
||||
| docs/working/hardware/platform-integration/L4RE_INTEGRATION.adoc | General L4Re integration guide (IPC, dataspaces, package structure) | WORKING | Broad integration guide; L4Re remains a supported platform per CLAUDE.md tech stack diagram. |
|
||||
| docs/working/hardware/platform-integration/PLATFORM_ABSTRACTION.adoc | Platform abstraction layer (vtable pattern for POSIX/L4Re) | CURRENT | Matches actual `platform/linux/time.c` and `platform/l4re/time.c` files present in current src tree per CLAUDE.md source tree listing. |
|
||||
| docs/working/hardware/platform-integration/RASPBERRY_PI_BUILD.adoc | Raspberry Pi 4 / ARM64 build guide | CURRENT | Matches `rpi4-cross` Makefile target and ARM64 architecture support (`ARCH=raspi`) listed in current CLAUDE.md build targets. |
|
||||
| docs/working/hardware/platform-integration/l_4_re_blkio_endpoints.adoc | Block I/O L4Re porting endpoints (blkio vtable mapping) | CURRENT | Describes `blkio_open/close/read` vtable API; matches `blkio_*.c` backend files listed in current CLAUDE.md source tree. |
|
||||
| docs/working/scratch/testing-quality/KANBAN-WORKFLOW-VALIDATION.adoc | Validation procedure for GitHub Projects Kanban automation (CAPA-032) | CURRENT | Dated 2025-11-02 with explicit source commit hash; references `.github/workflows/capa-kanban-sync.yml` which is a concrete CI artifact. |
|
||||
| docs/working/archive/legacy/OPTIMIZATION_OPPORTUNITIES.md | Physics engine optimization opportunity ranking dated 2025-11-19 | SUPERSEDED | Superseded by docs/03-architecture/physics-engine/ and Loop #5/#6 implementations |
|
||||
| docs/working/archive/legacy/README.md | Index and usage guide for the docs/archive directory | CURRENT | Self-referential; accurately describes the archive's purpose and sub-structure |
|
||||
| docs/working/archive/legacy/START_HERE_HEARTBEAT_DOE.md | Phase 2 heartbeat DoE launch guide (250 runs, 5 elite configs) | SUPERSEDED | README notes this is superseded by docs/02-experiments/heartbeat-doe/ |
|
||||
| docs/working/archive/legacy/phase-1/Reference/BACKLOG_INJECTION_ANALYSIS.md | Governance model analysis of GitHub issue injection points | HISTORICAL | Nov 2025 snapshot of CI/process governance state |
|
||||
| docs/working/archive/legacy/phase-1/Reference/EXPERIMENT_QUICK_REFERENCE.txt | Quick-reference ops card for the 90-run A/B/C physics validation experiment | HISTORICAL | Raw ops card tied to a specific pre-publication experiment run |
|
||||
| docs/working/archive/legacy/phase-1/Reference/IMPLEMENTATION_SUMMARY.md | Phase 1 CI/Kanban automation implementation summary | HISTORICAL | Records CI automation decisions made during project Phase 1 |
|
||||
| docs/working/archive/legacy/phase-1/Reference/JENKINS_USER_GUIDE.md | Jenkins CI user guide | HISTORICAL | Jenkins may no longer be the active CI system; check .github/workflows/ |
|
||||
| docs/working/archive/legacy/phase-1/Reference/KANBAN-TESTING-GUIDE.md | Guide for testing GitHub Projects Kanban automation | HISTORICAL | Companion to CAPA-032 Kanban work; superseded by live workflow |
|
||||
| docs/working/archive/legacy/phase-1/Reference/KANBAN-WORKFLOW-TEST.md | Kanban workflow test procedures | HISTORICAL | Point-in-time test doc for Kanban automation validation |
|
||||
| docs/working/archive/legacy/phase-1/Reference/PHASE_1_FINAL_STATUS.md | Final status report for project Phase 1 | HISTORICAL | Closed-loop status report; accurately captures Phase 1 completion state |
|
||||
| docs/working/archive/legacy/phase-1/Reference/PHASE_1_IMPLEMENTATION_COMPLETE.md | Phase 1 implementation completion announcement | HISTORICAL | Records the Phase 1 done-condition at time of writing |
|
||||
| docs/working/archive/legacy/phase-1/Reference/PHASE_1_TESTING_RESULTS.md | Phase 1 testing results summary | HISTORICAL | Test results from Phase 1 CI/governance work |
|
||||
| docs/working/archive/legacy/phase-1/Reference/PHYSICS_EXPERIMENT_README.md | README for the 90-run physics validation experiment | HISTORICAL | Companion README to the experiment data in physics_experiment/ |
|
||||
| docs/working/archive/legacy/phase-1/Reference/RULE_1_GATES_IMPLEMENTATION.md | Implementation notes for Rule 1 CI gating | HISTORICAL | CI gate design decisions from Phase 1 |
|
||||
| docs/working/archive/legacy/phase-1/Reference/SECURITY.md | Security notes predating the ACL system | HISTORICAL | Pre-ACL security model; superseded by docs/03-architecture/word-acl/DESIGN.md |
|
||||
| docs/working/archive/legacy/phase-1/Reference/SESSION_SUMMARY.md | Transient AI session summary | HISTORICAL | Session-level notes; limited long-term value |
|
||||
| docs/working/archive/legacy/phase-1/Reference/TEST-CAPA-TEMPLATE.md | CAPA test case template | HISTORICAL | Template used during Phase 1 CAPA process |
|
||||
| docs/working/archive/legacy/phase-1/Reference/codex_audit_report.md | Codex audit report of the codebase | HISTORICAL | Point-in-time static analysis or review; may be stale |
|
||||
| docs/working/archive/legacy/phase-1/Reference/codex_capa_list.md | CAPA action items derived from Codex audit | HISTORICAL | Action items from Phase 1 audit cycle |
|
||||
| docs/working/archive/legacy/phase-1/Reference/github_backlog_items.md | GitHub backlog items list | HISTORICAL | Snapshot of backlog at Phase 1; likely stale |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/DEVIATION_REPORT_CSV_FORMATTING.md | CSV formatting deviation report for experiment output | HISTORICAL | Experiment data-hygiene note for the 90-run run |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/FORMAL_CLAIMS_FOR_REVIEWERS.txt | Formal claims document prepared for peer reviewers | HISTORICAL | Pre-publication version; superseded by published SSRN paper |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/01_MAIN_PAPER/PAPER_KEY_CONTRIBUTIONS_SUMMARY.md | Key contributions summary for peer review submission | HISTORICAL | Pre-SSRN draft; superseded by papers/James_Steady-State_Convergence_Adaptive_Runtime.pdf |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/01_MAIN_PAPER/PEER_REVIEW_PAPER_DRAFT.md | Full paper draft submitted for peer review | HISTORICAL | Pre-SSRN draft; superseded by published SSRN paper |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/02_SUPPORTING_DOCS/FORMAL_CLAIMS_FOR_REVIEWERS.txt | Formal claims for reviewers (supporting docs copy) | HISTORICAL | Duplicate of physics_experiment/FORMAL_CLAIMS_FOR_REVIEWERS.txt |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/02_SUPPORTING_DOCS/FORMAL_VERIFICATION_INTERPRETATION.md | Interpretation guide for Isabelle/HOL proofs for reviewers | HISTORICAL | Pre-publication; proof/ directory is the live source |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/02_SUPPORTING_DOCS/PEER_REVIEW_SUBMISSION_PACKAGE.md | Cover doc for the full peer review submission package | HISTORICAL | Submission metadata; superseded by SSRN publication |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/02_SUPPORTING_DOCS/QUICK_REFERENCE.txt | Quick reference for reviewers | HISTORICAL | Reviewer-facing summary; superseded by published abstract |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/02_SUPPORTING_DOCS/VARIANCE_ANALYSIS_SUMMARY.md | Variance analysis summary for the 90-run experiment | HISTORICAL | Source data for SSRN paper; keep as experimental record |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/03_EXPERIMENTAL_DATA/full_90_run_comprehensive/experiment_summary.txt | Comprehensive 90-run experiment summary | HISTORICAL | Primary experimental record; source data for SSRN paper |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/03_EXPERIMENTAL_DATA/full_90_run_comprehensive/run_logs/test_matrix.txt | Test matrix for full 90-run experiment | HISTORICAL | Experimental record; run configuration matrix |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/05_SUPPLEMENTARY/PEER_REVIEW_PAPER_OUTLINE.md | Outline used to structure the peer review paper | HISTORICAL | Pre-publication outline; superseded by final SSRN paper |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/05_SUPPLEMENTARY/WORK_COMPLETION_STATUS.md | Work completion checklist for peer review submission | HISTORICAL | Point-in-time submission checklist |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/06_ASCIIDOC/00-abstract.adoc | AsciiDoc abstract section for peer review paper | HISTORICAL | Pre-publication AsciiDoc draft; superseded by SSRN PDF |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/06_ASCIIDOC/01-introduction.adoc | AsciiDoc introduction section | HISTORICAL | Pre-publication AsciiDoc draft |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/06_ASCIIDOC/01-summary.adoc | AsciiDoc summary section | HISTORICAL | Pre-publication AsciiDoc draft |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/06_ASCIIDOC/02-formal-theorems.adoc | AsciiDoc formal theorems section | HISTORICAL | Pre-publication; proof/ directory is live source |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/06_ASCIIDOC/02-related-work.adoc | AsciiDoc related-work section | HISTORICAL | Pre-publication AsciiDoc draft |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/06_ASCIIDOC/03-experimental-methodology.adoc | AsciiDoc experimental methodology section | HISTORICAL | Pre-publication AsciiDoc draft |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/06_ASCIIDOC/03-methodology.adoc | AsciiDoc methodology section (alternate) | HISTORICAL | Pre-publication AsciiDoc draft |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/06_ASCIIDOC/04-results.adoc | AsciiDoc results section | HISTORICAL | Pre-publication AsciiDoc draft |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/06_ASCIIDOC/04-variance-analysis.adoc | AsciiDoc variance analysis section | HISTORICAL | Pre-publication AsciiDoc draft |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/06_ASCIIDOC/05-convergence-proof.adoc | AsciiDoc convergence proof section | HISTORICAL | Pre-publication; proof/ directory is live source |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/06_ASCIIDOC/05-discussion.adoc | AsciiDoc discussion section | HISTORICAL | Pre-publication AsciiDoc draft |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/06_ASCIIDOC/06-stability-proof.adoc | AsciiDoc stability proof section | HISTORICAL | Pre-publication; proof/ directory is live source |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/06_ASCIIDOC/07-predictability-bounds.adoc | AsciiDoc predictability bounds section | HISTORICAL | Pre-publication AsciiDoc draft |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/06_ASCIIDOC/08-peer-review-defense.adoc | AsciiDoc peer-review defense section | HISTORICAL | Pre-publication AsciiDoc draft |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/06_ASCIIDOC/index.adoc | AsciiDoc index/master file for the peer review paper | HISTORICAL | Pre-publication AsciiDoc draft |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/06_ASCIIDOC/paper.adoc | AsciiDoc combined paper source | HISTORICAL | Pre-publication; superseded by SSRN PDF |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/PEER_REVIEW_SUBMISSION/README.md | README for the peer review submission package | HISTORICAL | Submission index; superseded by SSRN publication |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/QUICK_REFERENCE.txt | Quick reference for the 90-run experiment | HISTORICAL | Ops-level quick card; raw experiment record |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/experiment_summary.txt | Top-level experiment summary | HISTORICAL | Primary experimental record; source data for SSRN paper |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/full_90_run_comprehensive/experiment_summary.txt | Full 90-run comprehensive experiment summary | HISTORICAL | Experimental record (duplicate path from submission tree) |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/full_90_run_comprehensive/run_logs/test_matrix.txt | Test matrix for full 90-run experiment | HISTORICAL | Run configuration matrix |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/run_logs/test_matrix.txt | Run logs test matrix (top-level) | HISTORICAL | Raw run log; experimental record |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/test_run/experiment_summary.txt | Test run experiment summary | HISTORICAL | Pre-full-run trial; experimental record |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/test_run/run_logs/test_matrix.txt | Test run matrix | HISTORICAL | Raw test matrix for trial run |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/test_run2/experiment_summary.txt | Second test run experiment summary | HISTORICAL | Pre-full-run trial #2; experimental record |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/test_run2/run_logs/test_matrix.txt | Second test run matrix | HISTORICAL | Raw test matrix for trial run #2 |
|
||||
| docs/working/archive/legacy/phase-1/Reference/toolchain/gcc.txt | GCC toolchain version/configuration notes | HISTORICAL | Point-in-time toolchain pinning record |
|
||||
| docs/working/archive/legacy/phase-1/Reference/toolchain/make.txt | Make version/configuration notes | HISTORICAL | Point-in-time toolchain pinning record |
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| boards/BRINGUP.md | Board bring-up checklist | WORKING | Bare-metal bring-up checklist and blockers. |
|
||||
| boards/README.md | boards/ | CURRENT | |
|
||||
| boards/milkv/README.md | Milk-V Mars boot media | CURRENT | |
|
||||
| boards/pc/README.md | PC boot media (generic x86-64, UEFI) | CURRENT | |
|
||||
| boards/raspi/README.md | Raspberry Pi 5 native boot media | CURRENT | |
|
||||
| boards/raspi/config.txt | LithosAnanke native (non-UEFI) boot config for Raspberry Pi 5 (BCM2712). | CURRENT | |
|
||||
| boards/zynq7020/README.md | Xilinx Zynq-7020 boot media | CURRENT | |
|
||||
|
||||
## capsules
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| capsules/BLOCK_MAP.md | Capsule Block Manifest — Auto-generated | CURRENT | |
|
||||
| capsules/MANIFEST.md | capsules/MANIFEST.md — Block Ownership Registry (justifications) | CURRENT | |
|
||||
| capsules/MANIFEST_AUTO.md | Capsule Block Manifest — Auto-generated | CURRENT | |
|
||||
| capsules/README.md | capsules/ | CURRENT | |
|
||||
| capsules/contrib/README.md | capsules/contrib/ | CURRENT | |
|
||||
| capsules/fonts/README.md | capsules/fonts/ | CURRENT | |
|
||||
|
||||
## configs
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| configs/README.md | configs/ | CURRENT | |
|
||||
|
||||
## disk
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| disk/README.md | disk/ | CURRENT | |
|
||||
|
||||
## docs
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| docs/CLAUDE.md | CLAUDE.md — StarshipOS Documentation Root | CURRENT | Rules for documentation work. |
|
||||
| docs/DEAD-AND-REVISED.md | Dead ideas and revised claims | CURRENT | Register of abandoned ideas and revised claims. |
|
||||
| docs/DELETE-CANDIDATES.md | docs/DELETE-CANDIDATES.md | CURRENT | Record of the duplicates deleted 2026-10-14. |
|
||||
| docs/INDEX.md | docs/INDEX.md — every document, and its status | CURRENT | This index. |
|
||||
| docs/README.md | StarForth / LithosAnanke documentation — the map | CURRENT | The map: start here. |
|
||||
| docs/SSM_DARPA_Summary_Slide.pptx | SSM_DARPA_Summary_Slide.pptx | CURRENT | |
|
||||
|
||||
## docs/book
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| docs/book/README.md | docs/book/ | CURRENT | |
|
||||
| docs/book/main.tex | LithosAnanke and StarForth | CURRENT | |
|
||||
|
||||
## docs/fabric
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| docs/fabric/FABRIC-0.md | FABRIC-0.md — the Stadium | HISTORICAL | Closed design record (the Stadium). |
|
||||
| docs/fabric/FABRIC-1.md | FABRIC-1.md — the Stadium, continued | HISTORICAL | Closed design record. |
|
||||
| docs/fabric/FABRIC-2.md | FABRIC-2.md — the Stadium, continued again | HISTORICAL | Closed design record. |
|
||||
| docs/fabric/FABRIC-3.5.md | FABRIC-3.5.md — the Tripod/kernel reshuffle | HISTORICAL | Closed at v2.1.0: the Tripod/kernel reshuffle, design. Authoritative for what it ruled. |
|
||||
| docs/fabric/FABRIC-3.6.md | FABRIC-3.6.md — the Tripod/kernel reshuffle: execution log | HISTORICAL | Closed at v2.1.0: the reshuffle, execution. |
|
||||
| docs/fabric/FABRIC-3.7.md | FABRIC-3.7.md — Phase 8 PKI: the elevation entrypoint | DEAD | Closed 2026-10-14: elevation ruled not needed and removed (FABRIC-3 XXXVII). |
|
||||
| docs/fabric/FABRIC-3.md | FABRIC-3.md — bare metal boot | WORKING | The living record: bare metal boot and everything since. Authoritative. |
|
||||
| docs/fabric/FABRIC-4.md | FABRIC-4.md — forward-looking design notes | WORKING | Ideas caught early, not yet scoped. |
|
||||
|
||||
## docs/formal
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| docs/formal/CLAUDE.md | docs/formal/CLAUDE.md — Authoring Conventions for the Formal Documentation Tier | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/README.md | docs/formal/ | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/common/ | 2 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/cookbook/ | 2 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/dev-guide/ | 2 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/experiments/ | 2 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/patent/ | 1 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/proofs/ | 2 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/scraps/ | 1 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/scraps/architecture/ | 49 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/scraps/archive/ | 81 files | SUPERSEDED | Flagged obsolete in its own header. |
|
||||
| docs/formal/scraps/experiments/ | 31 files | HISTORICAL | Flagged in its own header. |
|
||||
| docs/formal/scraps/hardware/ | 10 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/scraps/legal/ | 1 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/scraps/papers/ | 13 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/scraps/scratch/ | 23 files | HISTORICAL | Flagged in its own header. |
|
||||
| docs/formal/scraps/specifications/ | 1 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/ssrn/ | 2 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/user-guide/ | 2 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/vol1-vm-physics/ | 9 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/vol2-kernel/ | 8 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
| docs/formal/vol3-research/ | 11 files | FORMAL | Press tier; see docs/formal/CLAUDE.md. |
|
||||
|
||||
## docs/patent
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| docs/patent/CHANGES_SUMMARY.md | Patent Application Review and Changes | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/JARGON_CHANGES.md | Jargon Removal and Precision Language Changes | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/README_V3.md | StarForth Patent Application Version 3.0 | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/USPTO_COVER_LETTER.md | USPTO PROVISIONAL PATENT APPLICATION | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/bibliography/bibliography.tex | bibliography.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/figures/fig1_snake_trajectory.pdf | fig1_snake_trajectory.pdf | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/figures/fig2_K_vs_window.pdf | fig2_K_vs_window.pdf | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/figures/fig3_FFT_spectrum.pdf | fig3_FFT_spectrum.pdf | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/figures/fig4_golden_ratio_penalties.pdf | fig4_golden_ratio_penalties.pdf | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/figures/fig5_bimodal_distributions.pdf | fig5_bimodal_distributions.pdf | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/figures/fig6_performance_vs_k.pdf | fig6_performance_vs_k.pdf | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/figures/fig7_performance_by_regime.pdf | fig7_performance_by_regime.pdf | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/final_provisional/cover_letter.txt | cover_letter.txt | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/final_provisional/sb0015a.pdf | sb0015a.pdf | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/final_provisional/sb0016.pdf | sb0016.pdf | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/final_provisional/ssm_RAJ_v1_patent_application.pdf | ssm_RAJ_v1_patent_application.pdf | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/macros/commands.tex | commands.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/main.pdf | main.pdf | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/main.tex | main.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sb0015a.pdf | sb0015a.pdf | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sb0016.pdf | sb0016.pdf | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/00_claims_validation_v3.tex | 00_claims_validation_v3.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/00_complete_patent_v3.tex | 00_complete_patent_v3.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/01_title.tex | 01_title.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/01_title_v2.tex | 01_title_v2.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/02_field.tex | 02_field.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/02_field_v2.tex | 02_field_v2.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/03_background.tex | 03_background.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/03_background_v2.tex | 03_background_v2.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/04_summary.tex | 04_summary.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/04_summary_v2.tex | 04_summary_v2.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/05_drawings.tex | 05_drawings.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/06_detailed_description.tex | 06_detailed_description.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/06_detailed_description_v2.tex | 06_detailed_description_v2.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/07_embodiments.tex | 07_embodiments.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/08_claims.tex | 08_claims.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/08_claims_REAL.tex | 08_claims_REAL.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/08_claims_v2.tex | 08_claims_v2.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/09_validation.tex | 09_validation.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/09_validation_v2.tex | 09_validation_v2.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/10_implementation.tex | 10_implementation.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/11_abstract.tex | 11_abstract.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/11_abstract_REAL.tex | 11_abstract_REAL.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/11_abstract_v2.tex | 11_abstract_v2.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/11_appendix.tex | 11_appendix.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/12_appendix.tex | 12_appendix.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/RAJ_v1_01_background.tex | RAJ_v1_01_background.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/RAJ_v1_02_summary.tex | RAJ_v1_02_summary.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/RAJ_v1_03_drawings.tex | RAJ_v1_03_drawings.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/RAJ_v1_04_detailed_description.tex | RAJ_v1_04_detailed_description.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/RAJ_v1_05_claims.tex | RAJ_v1_05_claims.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/RAJ_v1_06_abstract.tex | RAJ_v1_06_abstract.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/sections/architecture_diagram_clean.tex | architecture_diagram_clean.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/ssm_RAJ_v1_patent_application.pdf | ssm_RAJ_v1_patent_application.pdf | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/ssm_RAJ_v1_patent_application.tex | ssm_RAJ_v1_patent_application.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/patent/ssm_provisional_patent.tex | ssm_provisional_patent.tex | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
|
||||
## docs/pptx
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| docs/pptx/01-technical-elevator-pitch.pptx | 01-technical-elevator-pitch.pptx | CURRENT | |
|
||||
| docs/pptx/02-nontechnical-elevator-pitch.pptx | 02-nontechnical-elevator-pitch.pptx | CURRENT | |
|
||||
| docs/pptx/03-academic-overview.pptx | 03-academic-overview.pptx | CURRENT | |
|
||||
| docs/pptx/04-phd-deep-dive.pptx | 04-phd-deep-dive.pptx | CURRENT | |
|
||||
| docs/pptx/README.md | docs/pptx/ | CURRENT | |
|
||||
|
||||
## docs/reference
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| docs/reference/DICTIONARY.md | LithosAnanke / StarForth — Word Dictionary Reference | CURRENT | |
|
||||
| docs/reference/L8_ADAPTIVE_CONFIG_TABLE.md | L8 Jacquard: Adaptive 128-Config Heat-Ranked Selector | CURRENT | |
|
||||
| docs/reference/M7.1.md | M7.1: Init Capsule Architecture | CURRENT | |
|
||||
| docs/reference/ONTOLOGY.md | StarForth Ontology, Taxonomy, and Lexicon | CURRENT | |
|
||||
| docs/reference/ROADMAP.md | LithosAnanke Roadmap | CURRENT | Roadmap and the ratified release-versioning policy. |
|
||||
| docs/reference/STARFORTH_PRIMITIVES.md | StarForth Primitive Word Reference | CURRENT | |
|
||||
| docs/reference/hosted-acceptance-test/README.md | Hosted StarForth — 3-Architecture Acceptance Test | CURRENT | |
|
||||
| docs/reference/kernel-args/DESIGN.md | Kernel Command-Line Arguments (KernelArgs) | CURRENT | |
|
||||
| docs/reference/kernel-args/README.md | docs/reference/kernel-args/ | CURRENT | |
|
||||
| docs/reference/word-acl/DESIGN.md | Word-Level ACL System | CURRENT | |
|
||||
| docs/reference/word-acl/README.md | docs/reference/word-acl/ | CURRENT | |
|
||||
|
||||
## docs/v4.0.0
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| docs/v4.0.0/DECOMPOSITION.md | StarForth v4.0.0 — Primitive Decomposition | CURRENT | |
|
||||
| docs/v4.0.0/ENGINE.md | StarForth v4.0.0 — The F18 engine in the VM's place | CURRENT | |
|
||||
| docs/v4.0.0/JUSTIFICATION.md | StarForth v4.0.0 — Justification | CURRENT | |
|
||||
| docs/v4.0.0/MESH.md | StarForth v4.0.0 — Talking nodes | CURRENT | |
|
||||
| docs/v4.0.0/NUCLEUS.md | StarForth v4.0.0 — Nucleus, FORTH-79 Capsule and POST | CURRENT | |
|
||||
| docs/v4.0.0/POST79.md | POST for the FORTH-79 Required Word Set: where it departs from v3 | CURRENT | |
|
||||
| docs/v4.0.0/V3-PARITY.md | StarForth v4.0.0 — Parity with v3 up to the first prompt | CURRENT | |
|
||||
| docs/v4.0.0/plans/2026-10-06-step6-storage.md | Step 6: Storage Implementation Plan (revised 2026-10-07) | HISTORICAL | An executed step plan. |
|
||||
| docs/v4.0.0/plans/2026-10-07-step6b-post.md | Step 6b: POST Is the Kernel's — Implementation Plan | HISTORICAL | An executed step plan. |
|
||||
| docs/v4.0.0/plans/2026-10-07-step6c-refusals-and-waits.md | Step 6c: Refusals and Waits — Implementation Plan | HISTORICAL | An executed step plan. |
|
||||
| docs/v4.0.0/plans/2026-10-07-step6d-the-wait.md | Step 6d: The Wait — Implementation Plan | HISTORICAL | An executed step plan. |
|
||||
| docs/v4.0.0/plans/2026-10-08-step6e-messages-on-the-wire.md | Step 6e: Messages on the Wire — Implementation Plan | HISTORICAL | An executed step plan. |
|
||||
|
||||
## docs/working
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| docs/working/README.md | docs/working/ — Living Documentation | WORKING | |
|
||||
| docs/working/architecture/03-architecture/OVERVIEW.md | StarForth Architecture Overview | WORKING | |
|
||||
| docs/working/architecture/03-architecture/README.md | Architecture | WORKING | |
|
||||
| docs/working/architecture/03-architecture/adaptive-systems/adaptive-window-and-decay.md | Adaptive Window Shrinking & Decay Slope Investigation | WORKING | |
|
||||
| docs/working/architecture/03-architecture/adaptive-systems/multivariate-dynamics.md | StarForth Multivariate Coupled Dynamics Experiment | WORKING | |
|
||||
| docs/working/architecture/03-architecture/adaptive-systems/window-inference-redesign.md | Window Width Inference Redesign - Statistically Valid Approach | WORKING | |
|
||||
| docs/working/architecture/03-architecture/heartbeat-system/architecture.md | VM Heartbeat Architecture: Centralized Time-Based Tuning | WORKING | |
|
||||
| docs/working/architecture/03-architecture/heartbeat-system/critical-insight.md | CRITICAL INSIGHT: Heartbeat Rate is Variable, Not Fixed | WORKING | |
|
||||
| docs/working/architecture/03-architecture/heartbeat-system/instrumentation-plan.md | Heartbeat Per-Tick Instrumentation Plan | WORKING | |
|
||||
| docs/working/architecture/03-architecture/heartbeat-system/segfault-analysis.md | Heartbeat Segfault Root Cause Analysis & Repair | WORKING | |
|
||||
| docs/working/architecture/03-architecture/physics-engine/feedback-loops.md | StarForth Physics Feedback Loops | WORKING | The seven feedback loops. |
|
||||
| docs/working/architecture/03-architecture/physics-engine/monitoring-principles.md | StarForth Physics Runtime | WORKING | |
|
||||
| docs/working/architecture/03-architecture/physics-engine/ssm-equations.md | Mathematical Analysis of the Steady-State Machine | WORKING | |
|
||||
| docs/working/architecture/03-architecture/physics-engine/ssm-raw-data-analysis.md | Steady-State Machine (SSM): Raw Experimental Data Analysis | WORKING | |
|
||||
| docs/working/architecture/03-architecture/pipelining/context-window-and-binary-chop.md | Phase 1 Extension: Context Window & Phase 2 Binary Chop Tuning | WORKING | |
|
||||
| docs/working/architecture/03-architecture/pipelining/design.md | FORTH VM Pipelining & Speculative Execution Design | WORKING | |
|
||||
| docs/working/architecture/03-architecture/pipelining/phase-1-instrumentation.md | Phase 1: Pipelining Instrumentation | WORKING | |
|
||||
| docs/working/architecture/03-architecture/pipelining/wired-not-utilized.md | Pipelining Feedback Loop: WIRED BUT NOT UTILIZED (Critical Issue) | WORKING | |
|
||||
| docs/working/architecture/ARTEMIS-BAM-ACCEPTANCE-20260703.md | Artemis BAM — Phase 1 Acceptance Report | WORKING | |
|
||||
| docs/working/architecture/ARTEMIS-BLOCK-PHYSICS-DESIGN-20260708.md | Artemis Block Heat Physics — Design Doc | WORKING | |
|
||||
| docs/working/architecture/ARTEMIS-FREEMAP-CAPSULE-RESERVATION-GAP-20260710.md | Artemis Free-Map Doesn't Reserve Capsule-Claimed Blocks | WORKING | |
|
||||
| docs/working/architecture/CAPSULE-BLOCK-PERSISTENCE-BOUNDARY-FINDING-20260709.md | Capsule Loader — Missing Persistence Boundary Check | WORKING | |
|
||||
| docs/working/architecture/CAPSULE-LOADER-DEFINITIONS-ONLY-DESIGN-20260709.md | Capsules Load Definitions Only — Design Doc | WORKING | |
|
||||
| docs/working/architecture/DOE-LIBRARY-HOWTO-20260819.md | DoE Library HOWTO — `capsules/doe.4th` | CURRENT | HOWTO for capsules/doe.4th. |
|
||||
| docs/working/architecture/K-PUSH-DICTIONARY-SHADOWING-BUG-20260704.md | K-PUSH Dictionary Shadowing Bug — Full Report | WORKING | |
|
||||
| docs/working/architecture/MAMA_FORTH_SUPERVISOR_ARCHITECTURE.adoc | Mama Forth: Multi-VM Supervisor Architecture | WORKING | |
|
||||
| docs/working/architecture/PHYSICS_CONE_OF_INFLUENCE_DESIGN.adoc | Physics Engine: Cone of Influence Design | WORKING | |
|
||||
| docs/working/architecture/PHYSICS_CONTROL_SYSTEM_DESIGN.adoc | Physics Control System: Observables → Scheduling & Memory Management | WORKING | |
|
||||
| docs/working/architecture/PHYSICS_SIGNAL_MAP.adoc | Physics Signal Inventory | WORKING | |
|
||||
| docs/working/architecture/README.md | docs/working/architecture/ | WORKING | |
|
||||
| docs/working/architecture/SDK-HOWTO-20260819.md | SDK HOWTO — `capsules/sdk.4th` | WORKING | |
|
||||
| docs/working/architecture/TURTLE-GRAPHICS-HOWTO-20260819.md | Turtle Graphics HOWTO — `capsules/turtle.4th` | WORKING | |
|
||||
| docs/working/architecture/VM-FLEET-ATTRACTOR-DESIGN-20260705.md | VM Fleet Attractor Experiment — Design Doc | WORKING | Fleet physics; pre-reshuffle (names the Hermes VM) but still the source for the attractor design. |
|
||||
| docs/working/architecture/VM-PHYSICS-DYNAMIC-FLEET-DESIGN-20260705.md | Dynamic VM Fleet Physics — Design Doc | WORKING | |
|
||||
| docs/working/architecture/VM_FORMALIZATION_PLAN.adoc | VM Formalization Roadmap | WORKING | |
|
||||
| docs/working/architecture/architecture-internals/INIT_SYSTEM.adoc | L4RE_TARGET | WORKING | |
|
||||
| docs/working/architecture/architecture-internals/MESSAGING.adoc | SFM_THERMO_H | WORKING | |
|
||||
| docs/working/architecture/build-and-tooling/BUILD_OPTIONS.adoc | defined(__x86_64__) // defined(_M_X64) // defined(__amd64__) | WORKING | |
|
||||
| docs/working/architecture/build-and-tooling/DOCUMENTATION_README.adoc | Generate the AsciiDoc API documentation | WORKING | |
|
||||
| docs/working/architecture/build-and-tooling/INIT_TOOLS.adoc | 1. Work in disk (using StarForth REPL) | WORKING | |
|
||||
| docs/working/architecture/doxygen/DOXYGEN_QUICK_REFERENCE.adoc | MACRO_NAME value | WORKING | |
|
||||
| docs/working/architecture/doxygen/DOXYGEN_STYLE_GUIDE.adoc | STACK_SIZE 1024 | WORKING | |
|
||||
| docs/working/architecture/getting-started/DEVELOPER.md | StarForth Developer Guide | WORKING | |
|
||||
| docs/working/architecture/getting-started/INSTALL.adoc | Build package | WORKING | |
|
||||
| docs/working/architecture/getting-started/QUICKSTART.adoc | Build the fastest version for your platform | WORKING | |
|
||||
| docs/working/architecture/getting-started/README.md | Getting Started with StarForth | WORKING | |
|
||||
| docs/working/architecture/getting-started/quick-start/heartbeat-doe.md | StarForth Heartbeat DoE – Quick Start | WORKING | |
|
||||
| docs/working/architecture/getting-started/quick-start/optimization-doe.md | Quick Start: Optimization DoE | WORKING | |
|
||||
| docs/working/architecture/heartbeat_csv_export.md | Heartbeat CSV Export - Real-Time VM Metrics | WORKING | |
|
||||
| docs/working/archive/COMPUTATIONAL_PHYSICS_FRAMEWORK.md | The Physics of Adaptive Computation | HISTORICAL | |
|
||||
| docs/working/archive/DOCUMENTATION_AUDIT.md | StarForth Documentation Audit | HISTORICAL | |
|
||||
| docs/working/archive/GAP_ANALYSIS.md | Gap Analysis: Missing Evolutionary Links | HISTORICAL | |
|
||||
| docs/working/archive/README.md | docs/working/archive/ | HISTORICAL | |
|
||||
| docs/working/archive/artifacts/kanban-workflow/MANIFEST.adoc | Kanban Workflow Artifacts Manifest | HISTORICAL | |
|
||||
| docs/working/archive/dead/hal-target-contract/README.md | Hardware Abstraction Layer (HAL) Documentation | DEAD | See the file's own header. |
|
||||
| docs/working/archive/dead/hal-target-contract/interfaces.md | HAL Interface Specifications | DEAD | See the file's own header. |
|
||||
| docs/working/archive/dead/hal-target-contract/migration-plan.md | HAL Migration Plan | DEAD | See the file's own header. |
|
||||
| docs/working/archive/dead/hal-target-contract/overview.md | Hardware Abstraction Layer (HAL) Architecture | DEAD | See the file's own header. |
|
||||
| docs/working/archive/dead/hal-target-contract/platform-implementations.md | HAL Platform Implementation Guide | DEAD | See the file's own header. |
|
||||
| docs/working/archive/dead/hal-target-contract/starkernel-integration.md | StarKernel HAL Integration Guide | DEAD | See the file's own header. |
|
||||
| docs/working/archive/dead/l4re/L4RE_DICTIONARY_ALLOCATION.adoc | STARFORTH_VM_DICT_ALLOC | DEAD | See the file's own header. |
|
||||
| docs/working/archive/dead/l4re/L4RE_INTEGRATION.adoc | Subdirectories to build | DEAD | See the file's own header. |
|
||||
| docs/working/archive/dead/l4re/L4RE_INTEGRATION_TODO.adoc | Note: Do NOT copy time_posix.c - not needed in L4Re build | DEAD | See the file's own header. |
|
||||
| docs/working/archive/dead/l4re/l_4_re_blkio_endpoints.adoc | l_4_re_blkio_endpoints.adoc | DEAD | See the file's own header. |
|
||||
| docs/working/archive/dead/metrics-and-knobs.md | StarForth Metrics & Knobs: GAPS ONLY | DEAD | See the file's own header. |
|
||||
| docs/working/archive/historical/2026-01-27-system-architecture-draft.md | LithosAnanke System Architecture | HISTORICAL | |
|
||||
| docs/working/archive/historical/2026-06-03-test-gap-audit.md | StarForth Dictionary Test Coverage — Gap Audit | HISTORICAL | |
|
||||
| docs/working/archive/historical/2026-06-10-next-session-plan.md | Next Session Plan | HISTORICAL | |
|
||||
| docs/working/archive/historical/2026-06-30-break-me-report.md | 🔥 STARFORTH BREAK-ME DIAGNOSTIC REPORT 🔥 | HISTORICAL | |
|
||||
| docs/working/archive/historical/2026-07-amd64-isr-fix/README.md | APIC Timer ISR Fix — amd64 | HISTORICAL | |
|
||||
| docs/working/archive/historical/2026-07-birthing/PLAN.md | Birthing Plan: Child VMs Born of Hera | HISTORICAL | |
|
||||
| docs/working/archive/historical/2026-07-birthing/README.md | docs/working/archive/historical/2026-07-birthing/ | HISTORICAL | |
|
||||
| docs/working/archive/historical/2026-07-birthing/STATUS.md | Birthing — Work Status and Context | HISTORICAL | |
|
||||
| docs/working/archive/historical/2026-07-birthing/acceptance-logs/README.md | docs/working/archive/historical/2026-07-birthing/acceptance-logs/ | HISTORICAL | |
|
||||
| docs/working/archive/historical/2026-07-birthing/acceptance-logs/SUMMARY.md | Birthing — Kernel QEMU Acceptance Test Summary | HISTORICAL | |
|
||||
| docs/working/archive/historical/2026-08-riscv64-stack-fix/README.md | Kernel Stack Trampoline Fix — riscv64 | HISTORICAL | |
|
||||
| docs/working/archive/historical/2026-10-lithosananke-orientation.md | LithosAnanke — StarForth Kernel Branch | HISTORICAL | |
|
||||
| docs/working/archive/legacy/OPTIMIZATION_OPPORTUNITIES.md | StarForth Optimization Opportunities | HISTORICAL | |
|
||||
| docs/working/archive/legacy/README.md | Archived Documentation | HISTORICAL | |
|
||||
| docs/working/archive/legacy/START_HERE_HEARTBEAT_DOE.md | START HERE – Heartbeat DoE Phase 2 | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/BACKLOG_INJECTION_ANALYSIS.md | Backlog Injection Points Analysis | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/EXPERIMENT_QUICK_REFERENCE.txt | Watch CSV grow in real-time | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/IMPLEMENTATION_SUMMARY.md | Physics Engine Comprehensive Validation - Complete Implementation Summary | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/JENKINS_USER_GUIDE.md | Jenkins User Guide | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/KANBAN-TESTING-GUIDE.md | Kanban Workflow Testing Guide | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/KANBAN-WORKFLOW-TEST.md | Kanban Workflow Test Guide (Phase 3) | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/PHASE_1_FINAL_STATUS.md | Phase 1 Final Status & Completion Report | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/PHASE_1_IMPLEMENTATION_COMPLETE.md | Phase 1 Implementation Complete ✅ | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/PHASE_1_TESTING_RESULTS.md | Phase 1 Testing Results | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/PHYSICS_EXPERIMENT_README.md | StarForth Physics Engine Validation Experiment | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/RULE_1_GATES_IMPLEMENTATION.md | Rule 1: Governance-First Backlog Injection Gates Implementation | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/SECURITY.md | Security Policy | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/SESSION_SUMMARY.md | Session Summary: Governance Workflow Implementation Complete ✅ | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/StarForth_Complete_Presentation.pptx | StarForth_Complete_Presentation.pptx | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/TEST-CAPA-TEMPLATE.md | Test CAPA Issue Template | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/codex_audit_report.md | StarForth Governance – Fresh Audit Report | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/codex_capa_list.md | StarForth Governance – CAPA Register (Fresh Audit) | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/github_backlog_items.md | GitHub Project Backlog Prep | HISTORICAL | |
|
||||
| docs/working/archive/legacy/phase-1/Reference/physics_experiment/ | 35 files | HISTORICAL | Grouped: bulk data or a self-governed tree. |
|
||||
| docs/working/archive/legacy/phase-1/Reference/toolchain/ | 2 files | HISTORICAL | Grouped: bulk data or a self-governed tree. |
|
||||
| docs/working/archive/operations/README.md | Operations | HISTORICAL | |
|
||||
| docs/working/archive/operations/backlog-gatekeeper.md | Backlog Gatekeeper Procedures | HISTORICAL | |
|
||||
| docs/working/archive/operations/jenkins-pipeline-guide.adoc | StarForth Jenkins Pipeline Guide | HISTORICAL | |
|
||||
| docs/working/archive/operations/qa-intake-workflow.adoc | QA Intake & CAPA Backlog Population Workflow | HISTORICAL | |
|
||||
| docs/working/archive/operations/refinement/annotations.adoc | StarForth Refinement Code Annotation Guide | HISTORICAL | |
|
||||
| docs/working/archive/operations/refinement/capa.adoc | StarForth C↔Isabelle Refinement Defect Tracking | HISTORICAL | |
|
||||
| docs/working/archive/operations/refinement/roadmap.adoc | StarForth C↔Isabelle Refinement Implementation Roadmap | HISTORICAL | |
|
||||
| docs/working/archive/operations/workflow.md | StarForth CI/CD Workflow | HISTORICAL | |
|
||||
| docs/working/archive/prog-prove.pdf | prog-prove.pdf | HISTORICAL | |
|
||||
| docs/working/archive/quality/README.md | Quality Assurance | HISTORICAL | |
|
||||
| docs/working/archive/quality/audits/codebase-audit-report.md | StarForth Codebase Audit Report | HISTORICAL | |
|
||||
| docs/working/archive/quality/audits/corrective-actions.md | StarForth Codebase Audit: Corrective Actions Report | HISTORICAL | |
|
||||
| docs/working/archive/quality/audits/implementation-audit.md | StarForth Adaptive Tuning: Implementation Audit | HISTORICAL | |
|
||||
| docs/working/archive/quality/audits/section-2-audit.md | SECTION 2 AUDIT REPORT | HISTORICAL | |
|
||||
| docs/working/archive/quality/audits/section-2-executive-summary.md | SECTION 2 EXECUTIVE SUMMARY | HISTORICAL | |
|
||||
| docs/working/archive/quality/phase-tracking/phase-2-implementation-checklist.md | Phase 2 Implementation Checklist | HISTORICAL | |
|
||||
| docs/working/archive/quality/phase-tracking/phase-2-issues-identified.md | Phase 2 Issues: Shrink/Grow, Decay Slope, Fixed-Point Violations | HISTORICAL | |
|
||||
| docs/working/archive/quality/phase-tracking/phase-2a-session-summary.md | Phase 2a Session Summary: Linear Decay & Freeze Flag Implementation | HISTORICAL | |
|
||||
| docs/working/archive/quality/regression/detection-framework.md | Optimization Regression Detection Framework | HISTORICAL | |
|
||||
| docs/working/archive/quality/regression/opp-02-report.md | OPP #2: VARIANCE-BASED WINDOW WIDTH TUNING | HISTORICAL | |
|
||||
| docs/working/archive/quality/validation/comprehensive-physics-validation.md | Comprehensive Physics Engine Validation Protocol | HISTORICAL | |
|
||||
| docs/working/archive/quality/validation/phase-1-protocol.md | Phase 1 Governance Validation Protocol | HISTORICAL | |
|
||||
| docs/working/archive/quality/validation/phase-2-executive-summary.md | Phase 2 Experiment: Executive Summary | HISTORICAL | |
|
||||
| docs/working/archive/research/README.md | Research | HISTORICAL | |
|
||||
| docs/working/archive/research/doe-metrics-schema.md | StarForth Design of Experiments (DoE) Metrics Schema | HISTORICAL | |
|
||||
| docs/working/archive/research/literature-review.md | Literature Review: Physics-Driven VM Optimization | HISTORICAL | |
|
||||
| docs/working/archive/research/research-outline.md | Research Paper Outline: Physics-Driven VM Optimization | HISTORICAL | |
|
||||
| docs/working/archive/research/results-for-publication.md | Results for Publication: Physics-Driven VM Optimization | HISTORICAL | |
|
||||
| docs/working/archive/session-logs/2025-11-20-recap.md | Session Recap: 2025-11-20 | HISTORICAL | |
|
||||
| docs/working/archive/session-logs/2025-11-26-worklog.md | Work Log: November 26, 2025 | HISTORICAL | |
|
||||
| docs/working/archive/session-logs/2026-07-05-worklog.md | Work Log: July 5, 2026 | HISTORICAL | |
|
||||
| docs/working/archive/session-logs/2026-07-24-punch-list.md | Punch List: Gaps from 2026-07-24 Session | HISTORICAL | |
|
||||
| docs/working/archive/session-logs/README.md | Session Logs | HISTORICAL | |
|
||||
| docs/working/archive/session-logs/experimental-addendum.md | Window Scaling Experiment — Validation of the James Law of Computational Dynamic | HISTORICAL | |
|
||||
| docs/working/archive/session-logs/experimental-iteration-usage.md | Experimental Iteration Runner - Usage Guide | HISTORICAL | |
|
||||
| docs/working/archive/session-logs/serialized-questing-pike.md | StarForth → StarshipOS Hybrid Kernel Transformation Plan | HISTORICAL | |
|
||||
| docs/working/archive/superseded/2025-12-14-starforth-roadmap.md | StarForth Roadmap: VM → Kernel → OS → FPGA | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/2026-07-08-hermes-message-block-storage-design.md | Hermes Message/Channel Block-Backed Storage — Design Doc | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/2026-07-08-hermes-message-channel-physics-design.md | Hermes Message/Channel Heat Physics — Design Doc | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/2026-08-02-artemis-hermes-compudynamics-plan.md | Artemis (and Hermes) Compudynamics — Implementation Plan | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/2026-08-tripod/03-architecture-README.md | docs/03-architecture/ | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/2026-08-tripod/ARTEMIS.md | ARTEMIS.md — Artemis VM Architecture | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/2026-08-tripod/HERMES.md | HERMES.md — Hermes VM Architecture | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/2026-08-tripod/README.md | docs/working/archive/superseded/2026-08-tripod/ | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/2026-08-tripod/TRIPOD.md | TRIPOD.md — Architectural Constraints for the Tripod VMs | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/L8_WIRING_PLAN.md | L8 Control Wiring Implementation Plan | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/factorial-doe/guide.md | StarForth Complete 2^6 Factorial Design of Experiments | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/factorial-doe/incompatible-configs.md | Handling Incompatible Configurations in Factorial DoE | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/factorial-doe/index.md | StarForth Complete 2^6 Factorial DoE - Documentation Index | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/factorial-doe/quick-start.md | Quick Start: Complete 2^6 Factorial DoE | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/factorial-doe/workflow.md | Factorial DoE Analysis Workflow | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/feedback-loops-analysis.md | StarForth Feedback Loops & Self-Optimization Analysis | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/heartbeat-doe-corrected-design.md | StarForth Heartbeat DoE – CORRECTED Design (Heartrate Focus) | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/heartbeat-doe-design.md | StarForth Factorial DoE with Heartbeat Integration | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/heartbeat-rate-logging-plan.md | Implementation Plan: Heartbeat Rate Logging | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/loop-5-sketch.md | Loop #5: Context-Aware Window Tuning - Design Sketch | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/archive/superseded/steady-state-machine.md | 1. Introduction | SUPERSEDED | See the file's own header for what replaces it. |
|
||||
| docs/working/experiments/02-experiments/L8_WIRING_CODE_REVIEW_GUIDE.md | L8 Wiring Code Review Guide | WORKING | |
|
||||
| docs/working/experiments/02-experiments/L8_WIRING_IMPLEMENTATION_SUMMARY.md | L8 Control Wiring Implementation Summary | WORKING | |
|
||||
| docs/working/experiments/02-experiments/README.md | Experiments | WORKING | |
|
||||
| docs/working/experiments/02-experiments/heartbeat-doe/execution-guide.md | StarForth Heartbeat DoE Experiment – Execution Guide | WORKING | |
|
||||
| docs/working/experiments/02-experiments/heartbeat-doe/implementation-summary.md | StarForth Heartbeat DoE – Implementation Summary | WORKING | |
|
||||
| docs/working/experiments/02-experiments/heartbeat-doe/phase2-corrected.md | StarForth Phase 2 Heartbeat DoE – CORRECTED AND FINALIZED | WORKING | |
|
||||
| docs/working/experiments/02-experiments/james-law/protocol.md | Critical Window Scaling Experiment | WORKING | |
|
||||
| docs/working/experiments/02-experiments/physics-optimization/doe-guide.md | StarForth Optimization DoE Guide | WORKING | |
|
||||
| docs/working/experiments/02-experiments/physics-optimization/execution-guide.md | StarForth Physics Engine - Comprehensive Validation Experiment | WORKING | |
|
||||
| docs/working/experiments/02-experiments/physics-optimization/hotwords-cache.md | Physics Engine Experiment: Hot-Words Cache Performance Analysis | WORKING | |
|
||||
| docs/working/experiments/02-experiments/physics-optimization/proposals.md | Physics-Driven Optimization Proposals for StarForth | WORKING | |
|
||||
| docs/working/experiments/02-experiments/physics-optimization/reproduce.md | Reproducing the Physics Engine Hot-Words Cache Experiment | WORKING | |
|
||||
| docs/working/experiments/README.md | docs/working/experiments/ | WORKING | |
|
||||
| docs/working/experiments/campaigns/doe_2x7/README.md | 2^7 Factorial Design of Experiments (DoE) | RECORD | Campaign data. |
|
||||
| docs/working/experiments/campaigns/l8_attractor_map/SESSION_REPORT_2025-12-10.md | L8 Attractor Map: From Crashes to Computational Physics | RECORD | Campaign data. |
|
||||
| docs/working/experiments/campaigns/l8_attractor_map/results_20251209_145907/ | 9 files | RECORD | Campaign data. |
|
||||
| docs/working/experiments/campaigns/l8_attractor_map/run_log.txt | run_log.txt | RECORD | Campaign data. |
|
||||
| docs/working/experiments/campaigns/l8_validation/EXPERIMENT_SUMMARY.txt | Quick test (10 reps, ~8 min) | RECORD | Campaign data. |
|
||||
| docs/working/experiments/campaigns/l8_validation/README.md | L8 Jacquard Mode Selector Validation Experiment | RECORD | Campaign data. |
|
||||
| docs/working/experiments/campaigns/l8_validation/l8_validation_20251208_102205/ | 2 files | RECORD | Campaign data. |
|
||||
| docs/working/experiments/campaigns/l8_validation/l8_validation_30reps_20251126_135128/ | 2 files | RECORD | Campaign data. |
|
||||
| docs/working/experiments/campaigns/shape_validation/README.md | Workload Shape Validation Experiment | RECORD | Campaign data. |
|
||||
| docs/working/experiments/campaigns/shape_validation/shape_RAJ_run_20251127_093208/ | 2 files | RECORD | Campaign data. |
|
||||
| docs/working/experiments/campaigns/shape_validation/shape_run_20251123_083147/ | 2 files | RECORD | Campaign data. |
|
||||
| docs/working/experiments/campaigns/window_scaling/QUICK_START.md | Window Scaling Experiment - Quick Start Guide | RECORD | Campaign data. |
|
||||
| docs/working/experiments/campaigns/window_scaling/README.md | Window Scaling Experiment — James Law Validation | RECORD | Campaign data. |
|
||||
| docs/working/hardware/PGO_GUIDE.adoc | Interactive TUI | WORKING | |
|
||||
| docs/working/hardware/PLATFORM_BUILD_GUIDE.adoc | POSIX Build (Linux/macOS/BSD) - DEFAULT | WORKING | |
|
||||
| docs/working/hardware/README.md | docs/working/hardware/ | HISTORICAL | Flagged in its own header. |
|
||||
| docs/working/hardware/performance-profiling/ARM64_OPTIMIZATIONS.adoc | Detect architecture | WORKING | |
|
||||
| docs/working/hardware/performance-profiling/ASM_OPTIMIZATIONS.adoc | Add to CFLAGS | WORKING | |
|
||||
| docs/working/hardware/performance-profiling/PROFILER.adoc | Run your typical Forth program with profiling | WORKING | |
|
||||
| docs/working/hardware/platform-integration/PLATFORM_ABSTRACTION.adoc | POSIX build (default - Linux/macOS/BSD) | WORKING | |
|
||||
| docs/working/hardware/platform-integration/RASPBERRY_PI_BUILD.adoc | Install dependencies | WORKING | |
|
||||
| docs/working/legal/README.md | docs/working/legal/ — Patent-Adjacent Material (HOLD) | LEGAL HOLD | Not touched without Captain Bob. |
|
||||
| docs/working/papers/ACADEMIC_WORDING_GUIDELINES.md | Academic Wording Guidelines for StarForth | WORKING | |
|
||||
| docs/working/papers/ANTI_CLAIMS.md | Anti-Claims: What This Work Does NOT Claim | WORKING | |
|
||||
| docs/working/papers/EXECUTIVE_SUMMARY.md | Executive Summary: StarForth in Plain English | WORKING | |
|
||||
| docs/working/papers/FINAL_REPORT/appendix_glossary.adoc | appendix_glossary.adoc | WORKING | |
|
||||
| docs/working/papers/FORMAL_CLAIM_TABLE.md | Formal Claim Table: StarForth Adaptive Runtime | WORKING | |
|
||||
| docs/working/papers/NEGATIVE_RESULTS.md | Negative Results: Where StarForth Fails | WORKING | |
|
||||
| docs/working/papers/NULL_HYPOTHESIS.md | Null Hypothesis and Falsification Criteria | WORKING | |
|
||||
| docs/working/papers/ONTOLOGY_README.md | StarForth Ontology Documentation | WORKING | |
|
||||
| docs/working/papers/README.md | docs/working/papers/ | WORKING | |
|
||||
| docs/working/papers/REPLICATION_INVITE.md | Invitation to Independent Replication | WORKING | |
|
||||
| docs/working/papers/REPRODUCIBILITY.md | Reproducibility: One-Command Experiment Reproduction | WORKING | |
|
||||
| docs/working/papers/SCIENTIFIC_DEFENSE_CHECKLIST.md | Scientific Defense Checklist | WORKING | |
|
||||
| docs/working/papers/SENSITIVITY_ANALYSIS.md | Sensitivity Analysis: Parameter Robustness | WORKING | |
|
||||
| docs/working/papers/SSRN_companion/Math_Companion_SSRN.pdf | Math_Companion_SSRN.pdf | WORKING | |
|
||||
| docs/working/papers/SSRN_companion/Math_Companion_SSRN.tex | | WORKING | |
|
||||
| docs/working/papers/SSRN_companion/figures/fig1_snake_trajectory.pdf | fig1_snake_trajectory.pdf | WORKING | |
|
||||
| docs/working/papers/SSRN_companion/figures/fig2_K_vs_window.pdf | fig2_K_vs_window.pdf | WORKING | |
|
||||
| docs/working/papers/SSRN_companion/figures/fig3_FFT_spectrum.pdf | fig3_FFT_spectrum.pdf | WORKING | |
|
||||
| docs/working/papers/SSRN_companion/figures/fig4_golden_ratio_penalties.pdf | fig4_golden_ratio_penalties.pdf | WORKING | |
|
||||
| docs/working/papers/SSRN_companion/figures/fig5_bimodal_distributions.pdf | fig5_bimodal_distributions.pdf | WORKING | |
|
||||
| docs/working/papers/SSRN_companion/figures/fig6_performance_vs_k.pdf | fig6_performance_vs_k.pdf | WORKING | |
|
||||
| docs/working/papers/SSRN_companion/figures/fig7_performance_by_regime.pdf | fig7_performance_by_regime.pdf | WORKING | |
|
||||
| docs/working/papers/SYSTEM_NARRATIVE.pdf | SYSTEM_NARRATIVE.pdf | WORKING | |
|
||||
| docs/working/papers/SYSTEM_NARRATIVE.tex | StarForth System Narrative}\\ | WORKING | |
|
||||
| docs/working/papers/ontology.pdf | ontology.pdf | WORKING | |
|
||||
| docs/working/papers/ontology.tex | StarForth Ontology: Formal Conceptual Framework for\\ | WORKING | |
|
||||
| docs/working/papers/proposals/DARPA_SSM_Proposal_James.docx | DARPA_SSM_Proposal_James.docx | WORKING | |
|
||||
| docs/working/papers/proposals/DARPA_SSM_Proposal_James.pdf | DARPA_SSM_Proposal_James.pdf | WORKING | |
|
||||
| docs/working/papers/proposals/SSM_DARPA_Complete_Proposal_James_FINAL.docx | SSM_DARPA_Complete_Proposal_James_FINAL.docx | WORKING | |
|
||||
| docs/working/papers/published/James_ACL_Security_Invariant_TTL_Mitigation.tex | % | WORKING | |
|
||||
| docs/working/papers/published/James_Steady-State_Convergence_Adaptive_Runtime.pdf | James_Steady-State_Convergence_Adaptive_Runtime.pdf | WORKING | |
|
||||
| docs/working/scratch/AGENTS.md | Repository Guidelines | WORKING | |
|
||||
| docs/working/scratch/AI_AGENT_MANDATORY_README.md | AI_AGENT_MANDATORY_README.md | WORKING | |
|
||||
| docs/working/scratch/COMMUNICATION_GUIDE.adoc | StarshipOS Analogy Cheat Sheet | WORKING | |
|
||||
| docs/working/scratch/GOVERNANCE_EXPORT_NOTES.adoc | Governance Export Notes (Physics Phase 1) | WORKING | |
|
||||
| docs/working/scratch/README.md | docs/working/scratch/ | WORKING | |
|
||||
| docs/working/scratch/TASK_LIST.md | StarForth Physics Runtime — TASK_LIST.md | WORKING | |
|
||||
| docs/working/scratch/assets/README.md | Binary Assets | WORKING | |
|
||||
| docs/working/scratch/assets/book-FIXED.docx | book-FIXED.docx | WORKING | |
|
||||
| docs/working/scratch/ci-cd/FMEA_BLOCKING_GATES.adoc | FMEA Blocking Gates Implementation | WORKING | |
|
||||
| docs/working/scratch/ci-cd/GITHUB_ISSUES_GOVERNANCE_FLOW.adoc | GitHub Issues & Governance Integration | WORKING | |
|
||||
| docs/working/scratch/ci-cd/GOVERNANCE_INPUT_AUDIT.adoc | Governance Input Audit & Compliance Checklist | WORKING | |
|
||||
| docs/working/scratch/ci-cd/JENKINS_GOVERNANCE_INTEGRATION.adoc | Jenkins Governance Integration Guide | WORKING | |
|
||||
| docs/working/scratch/governance/index.adoc | Governance | WORKING | |
|
||||
| docs/working/scratch/src-index.adoc | StarForth Documentation Index | WORKING | |
|
||||
| docs/working/scratch/src/INTEGRATION_NOTES.adoc | This blocks EVERYTHING because of empty line: | WORKING | |
|
||||
| docs/working/scratch/src/development/CONTRIBUTING.adoc | 1) Fork and clone | WORKING | |
|
||||
| docs/working/scratch/src/internal/PHASE_2A_COMPLETION_REPORT.adoc | Phase 2a Completion Report: Freeze Flag & Linear Decay | WORKING | |
|
||||
| docs/working/scratch/src/internal/PHASE_2_IMPLEMENTATION_SUMMARY.adoc | Phase 2 Implementation Summary & Action Items | WORKING | |
|
||||
| docs/working/scratch/src/internal/PHASE_2_PHYSICS_DECAY_AND_FREEZE.adoc | Phase 2: Physics Model Extensions — Decay & Freeze Mechanisms | WORKING | |
|
||||
| docs/working/scratch/src/internal/PHYSICS_HOTWORDS_CACHE_INTEGRATION.adoc | Hot-Words Cache Integration Guide | WORKING | |
|
||||
| docs/working/scratch/src/internal/PHYSICS_IMPLEMENTATION_OPTIONS.adoc | Physics Engine Implementation Options: Three Paths Forward | WORKING | |
|
||||
| docs/working/scratch/src/internal/PHYSICS_IMPLEMENTATION_STATUS.adoc | Physics Engine Implementation Status: POSIX vs L4Re Porting Strategy | WORKING | |
|
||||
| docs/working/scratch/src/internal/PHYSICS_SCHEDULING_PLAN.adoc | Physics-Driven Scheduling Metadata Plan | WORKING | |
|
||||
| docs/working/scratch/testing-quality/KANBAN-WORKFLOW-VALIDATION.adoc | Kanban Workflow Validation Procedure | WORKING | |
|
||||
| docs/working/specifications/HOLA_PROTOCOL.adoc | HOLA Shared Memory Protocol (Phase 1) | WORKING | |
|
||||
| docs/working/specifications/README.md | docs/working/specifications/ | WORKING | |
|
||||
|
||||
## experiments
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| experiments/README.md | experiments/ | RECORD | Experiment design, data or result. |
|
||||
|
||||
## experiments/artemis_stress
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| experiments/artemis_stress/analysis/ | 6 files | RECORD | Experiment design, data or result. |
|
||||
|
||||
## experiments/bare_metal
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| experiments/bare_metal/README.md | Bare-Metal DoE Experiment | RECORD | Experiment design, data or result. |
|
||||
| experiments/bare_metal/analysis/ | 130 files | RECORD | Experiment design, data or result. |
|
||||
|
||||
## experiments/std79-doe
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| experiments/std79-doe/README.md | std79 DoE — 3(architecture) × 9(identity) × 3(replicate) randomized full-factori | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/analysis-20260912/ | 2 files | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/README.md | std79-doe LaTeX report: the fleet conservation invariant K | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/actual_window_size_dark.pdf | actual_window_size_dark.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/actual_window_size_light.pdf | actual_window_size_light.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/apic_delta_dark.pdf | apic_delta_dark.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/apic_delta_light.pdf | apic_delta_light.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/artemis_heat_dark.pdf | artemis_heat_dark.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/artemis_heat_light.pdf | artemis_heat_light.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/avg_word_heat_dark.pdf | avg_word_heat_dark.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/avg_word_heat_light.pdf | avg_word_heat_light.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/fleet_k_dark.pdf | fleet_k_dark.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/fleet_k_light.pdf | fleet_k_light.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/hera_heat_dark.pdf | hera_heat_dark.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/hera_heat_light.pdf | hera_heat_light.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/hermes_heat_dark.pdf | hermes_heat_dark.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/hermes_heat_light.pdf | hermes_heat_light.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/hot_word_count_dark.pdf | hot_word_count_dark.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/hot_word_count_light.pdf | hot_word_count_light.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/jitter_ns_dark.pdf | jitter_ns_dark.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/jitter_ns_light.pdf | jitter_ns_light.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/time_trust_dark.pdf | time_trust_dark.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/time_trust_light.pdf | time_trust_light.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/variance_dark.pdf | variance_dark.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/variance_light.pdf | variance_light.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/vm_call_depth_max_dark.pdf | vm_call_depth_max_dark.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/vm_call_depth_max_light.pdf | vm_call_depth_max_light.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/window_width_dark.pdf | window_width_dark.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/figures/window_width_light.pdf | window_width_light.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/std79_doe_report.pdf | std79_doe_report.pdf | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-doe/report-20260912/report/std79_doe_report.tex | % | RECORD | Experiment design, data or result. |
|
||||
|
||||
## experiments/std79-exerciser
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| experiments/std79-exerciser/README.md | FORTH-79 Standard-Dictionary Cross-ISA Exerciser | RECORD | Experiment design, data or result. |
|
||||
| experiments/std79-exerciser/results-20260910/ | 27 files | RECORD | Experiment design, data or result. |
|
||||
|
||||
## img
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| img/README.md | img/ | CURRENT | |
|
||||
|
||||
## kernel
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| kernel/include/starkernel/README.md | include/starkernel/ | CURRENT | |
|
||||
| kernel/include/starkernel/freestanding/README.md | include/starkernel/freestanding/ | CURRENT | |
|
||||
| kernel/include/starkernel/freestanding/sys/README.md | include/starkernel/freestanding/sys/ | CURRENT | |
|
||||
| kernel/include/starkernel/hal/README.md | include/starkernel/hal/ | CURRENT | |
|
||||
| kernel/include/starkernel/vm/README.md | include/starkernel/vm/ | CURRENT | |
|
||||
| kernel/include/starkernel/vm/bootstrap/README.md | include/starkernel/vm/bootstrap/ | CURRENT | |
|
||||
| kernel/linker/README.md | linker/ | CURRENT | |
|
||||
| kernel/src/README.md | src/starkernel/ | CURRENT | |
|
||||
| kernel/src/arch/aarch64/README.md | src/starkernel/arch/aarch64/ | CURRENT | |
|
||||
| kernel/src/arch/amd64/README.md | src/starkernel/arch/amd64/ | CURRENT | |
|
||||
| kernel/src/arch/riscv64/README.md | src/starkernel/arch/riscv64/ | CURRENT | |
|
||||
| kernel/src/boot/README.md | src/starkernel/boot/ | CURRENT | |
|
||||
| kernel/src/capsule/README.md | src/starkernel/capsule/ | CURRENT | |
|
||||
| kernel/src/hal/README.md | src/starkernel/hal/ | CURRENT | |
|
||||
| kernel/src/hash/README.md | src/starkernel/hash/ | CURRENT | |
|
||||
| kernel/src/math/README.md | src/starkernel/math/ | CURRENT | |
|
||||
| kernel/src/memory/README.md | src/starkernel/memory/ | CURRENT | |
|
||||
| kernel/src/pci/README.md | src/starkernel/pci/ | CURRENT | |
|
||||
| kernel/src/virtio/README.md | src/starkernel/virtio/ | CURRENT | |
|
||||
| kernel/src/vm/README.md | src/starkernel/vm/ | CURRENT | |
|
||||
| kernel/src/vm/bootstrap/README.md | src/starkernel/vm/bootstrap/ | CURRENT | |
|
||||
| kernel/src/vm/host/README.md | src/starkernel/vm/host/ | CURRENT | |
|
||||
|
||||
## lfs
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| lfs/README.md | lfs/ | CURRENT | |
|
||||
|
||||
## mk
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| mk/README.md | mk/ | CURRENT | |
|
||||
|
||||
## proof
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| proof/COVERAGE.md | Isabelle/HOL Proof Suite — Coverage & Purpose | CURRENT | |
|
||||
| proof/FINDINGS.md | Isabelle/HOL Word-Source Sweep — Aggregated Architectural Findings | CURRENT | |
|
||||
| proof/README.md | proof/ | CURRENT | |
|
||||
|
||||
## scripts
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| scripts/README.md | scripts/ | CURRENT | |
|
||||
| scripts/SCRIPT_REPAIR_LOG.md | Ablation Study Script Repair Log | CURRENT | |
|
||||
|
||||
## tools
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| tools/README.md | tools/ | CURRENT | |
|
||||
| tools/capsule-reserved.txt | capsule-reserved.txt — human-authored, git-tracked block ranges NOT | CURRENT | |
|
||||
| tools/kconfig/README.md | tools/kconfig — vendored Linux kernel Kconfig tooling | CURRENT | |
|
||||
|
||||
## v3
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| v3/include/README.md | include/ | CURRENT | |
|
||||
| v3/src/README.md | src/ | CURRENT | |
|
||||
| v3/src/platform/README.md | src/platform/ | CURRENT | |
|
||||
| v3/src/platform/l4re/README.md | src/platform/l4re/ | HISTORICAL | Flagged in its own header. |
|
||||
| v3/src/platform/linux/README.md | src/platform/linux/ | CURRENT | |
|
||||
| v3/src/test_runner/README.md | src/test_runner/ | CURRENT | |
|
||||
| v3/src/test_runner/include/README.md | src/test_runner/include/ | CURRENT | |
|
||||
| v3/src/test_runner/modules/README.md | src/test_runner/modules/ | CURRENT | |
|
||||
| v3/src/word_source/README.md | src/word_source/ | CURRENT | |
|
||||
| v3/src/word_source/include/README.md | src/word_source/include/ | CURRENT | |
|
||||
|
||||
## v4
|
||||
|
||||
| Path | Title | Status | Notes |
|
||||
|---|---|---|---|
|
||||
| v4/README.md | v4/ | CURRENT | |
|
||||
|
||||
+65
-53
@@ -1,59 +1,71 @@
|
||||
# StarForth / LithosAnanke Documentation
|
||||
# StarForth / LithosAnanke documentation — the map
|
||||
|
||||
This is the `lithosananke` branch: the bare-metal StarKernel side of the project
|
||||
(contrast `master`, which is the hosted-VM-only side). Documentation follows the
|
||||
two-tier model described in `docs/CLAUDE.md`: **`formal/`** is the polished,
|
||||
citable LaTeX tier; **`working/`** is living design notes and drafts that feed it.
|
||||
Everything else in this directory is branch- or subsystem-specific material that
|
||||
doesn't fit either tier.
|
||||
Start here. This page says where each kind of document lives and which one to believe.
|
||||
Reorganised 2026-10-14 (the docs triage): one place for current reference, one archive for
|
||||
everything kept as record, and every superseded or abandoned document labelled as such in
|
||||
its own header.
|
||||
|
||||
- **[INDEX.md](INDEX.md)** — every document in the repository, with its status.
|
||||
- **[DEAD-AND-REVISED.md](DEAD-AND-REVISED.md)** — the ideas that were abandoned, and the claims
|
||||
that were revised, each with the date and where the decision is recorded.
|
||||
- **[DELETE-CANDIDATES.md](DELETE-CANDIDATES.md)** — what was deleted as duplicate, and why
|
||||
(2026-10-14).
|
||||
|
||||
## What to believe
|
||||
|
||||
| For | Authoritative | Where |
|
||||
|---|---|---|
|
||||
| How to work in this repo, and current status | `.claude/CLAUDE.md` | repo root |
|
||||
| What was decided, and why; work as it happened | the FABRIC record | [fabric/](fabric/) — `FABRIC-3.md` is the living one |
|
||||
| StarForth v4 (the F18-derived engine) | the v4 design | [v4.0.0/](v4.0.0/) and `../v4/README.md` |
|
||||
| Roadmap and release-versioning policy | `ROADMAP.md` | [reference/](reference/) |
|
||||
| Getting onto the boards | the bring-up checklist | `../boards/BRINGUP.md` |
|
||||
| A word, a primitive, a term | the dictionaries and the ontology | [reference/](reference/) |
|
||||
| What the code does | the code, and its folder's `README.md` | `../kernel/`, `../v3/`, `../v4/` |
|
||||
|
||||
Where two documents disagree, the one higher in this table wins, and code wins over all.
|
||||
|
||||
## Layout
|
||||
|
||||
- **[formal/](formal/)** — Three-volume LaTeX documentation set (research volumes,
|
||||
practitioner books, standalone reports) plus the `scraps/` fragment library it's
|
||||
assembled from. Audience: patent counsel, SSRN reviewers, licensees, hobbyists
|
||||
with hardware in hand. See `formal/CLAUDE.md` for authoring conventions.
|
||||
- **[working/](working/)** — Living documents: architecture design notes, DoE
|
||||
experiment logs, hardware/platform notes, draft specs, academic-paper source
|
||||
material, and an archive of superseded docs. Source material for `formal/`.
|
||||
- **[03-architecture/](03-architecture/)** — Tripod VM architecture constraints and the
|
||||
word-level ACL system design. (Note: the fleet is now **Hera/Artemis/Hestia** post-
|
||||
reshuffle; the old Hera/Hermes/Artemis framing in older docs is historical. The older,
|
||||
triaged copy of this tree is `working/architecture/03-architecture/`.)
|
||||
- **[lithosananke/](lithosananke/)** — LithosAnanke kernel branch documentation:
|
||||
milestone roadmap, system architecture, HAL reference, kernel command-line argument
|
||||
design, and the amd64 APIC-timer ISR postmortem.
|
||||
- **[birthing/](birthing/)** — VM birthing plan and status for the Hera-spawns-
|
||||
Hermes/Artemis constellation, plus three-architecture QEMU acceptance logs.
|
||||
- **[patent/](patent/)** — Provisional patent application source. **Legal hold —
|
||||
ask Bob before touching anything in this directory.**
|
||||
- **[api/](api/)** — Generated Doxygen tag file and warnings log (gitignored;
|
||||
not part of the tracked doc tree).
|
||||
- **[pptx/](pptx/)** — Elevator-pitch and deep-dive slide decks for different
|
||||
audiences (technical, non-technical, academic, PhD-level).
|
||||
- **[fabric/](fabric/)** — the design and work record, numbered in order. `FABRIC-3.md`
|
||||
(bare-metal boot and everything since) is open; the others are closed:
|
||||
- FABRIC-0, -1 and -2 are history;
|
||||
- FABRIC-3.5 and -3.6 are the Tripod/kernel reshuffle, still authoritative for what they ruled;
|
||||
- FABRIC-3.7 (elevation) is closed as not needed;
|
||||
- FABRIC-4 holds ideas caught early, not yet scoped.
|
||||
- **[v4.0.0/](v4.0.0/)** — StarForth v4: justification, engine, decomposition, nucleus, mesh,
|
||||
parity with v3. `plans/` holds the step plans, all executed.
|
||||
- **[reference/](reference/)** — current reference material:
|
||||
- `ROADMAP.md` (roadmap and the ratified versioning policy);
|
||||
- `M7.1.md` (init capsules and birth);
|
||||
- `word-acl/` (the word-level ACL design);
|
||||
- `kernel-args/` (the boot command line);
|
||||
- `hosted-acceptance-test/`;
|
||||
- `DICTIONARY.md` and `STARFORTH_PRIMITIVES.md` (the words);
|
||||
- `ONTOLOGY.md` (the lexicon);
|
||||
- `L8_ADAPTIVE_CONFIG_TABLE.md`.
|
||||
- **[working/](working/)** — living material and the source for `formal/`:
|
||||
- `architecture/` (design notes and HOWTOs);
|
||||
- `experiments/` (DoE designs and campaign data);
|
||||
- `papers/` (academic sources, the system narrative, proposals);
|
||||
- `hardware/`, `specifications/` and `scratch/`;
|
||||
- **`archive/`**, which has four parts:
|
||||
- `historical/`: finished work, kept as record;
|
||||
- `superseded/`: replaced, and each file's header names what replaced it;
|
||||
- `dead/`: abandoned or never adopted;
|
||||
- the older `legacy/`, `quality/`, `operations/`, `research/` and `session-logs/`.
|
||||
- **[formal/](formal/)** — the press-ready LaTeX tier (three volumes, books, standalone
|
||||
reports). Governed by `formal/CLAUDE.md`.
|
||||
- **[book/](book/)** — the LithosAnanke and StarForth book build.
|
||||
- **[pptx/](pptx/)** — slide decks for different audiences.
|
||||
- **[patent/](patent/)** — provisional patent material. **Legal hold: ask Captain Bob before
|
||||
touching anything here** (also `formal/patent/`, `formal/scraps/legal/`, `working/legal/`).
|
||||
|
||||
## Current Active Work
|
||||
## Adding a document
|
||||
|
||||
> **⚠ `INDEX.md` is a dated triage snapshot (2026-06-16) and is stale.** The authoritative
|
||||
> current status lives in `.claude/CLAUDE.md` and `docs/fabric/FABRIC-2.md` /
|
||||
> `FABRIC-3.md` / `FABRIC-3.5.md` / `FABRIC-3.6.md` — not in the status tags in `INDEX.md`.
|
||||
|
||||
- **LithosAnanke M7.1 — live** — init capsules, the Tripod fleet, Stadium physics-economy,
|
||||
and word-level ACL (Phases 1–7 complete; Phase 8 Ed25519 PKI pending). See
|
||||
`lithosananke/ROADMAP.md` and the FABRIC documents above.
|
||||
- **Tripod VMs (post-reshuffle)** — Hera (governor), Artemis (memory/block storage),
|
||||
Hestia; the Hermes VM was removed and messaging moved into the kernel as kernel-Hermes.
|
||||
See `.claude/CLAUDE.md`.
|
||||
- **StarForth v4** — the F18-derived 32-opcode engine with the node/mesh design. See
|
||||
`v4.0.0/` and `../v4/README.md`.
|
||||
- **Word-level ACL system** — see `03-architecture/word-acl/` and `lithosananke/ROADMAP.md`.
|
||||
|
||||
## Contributing
|
||||
|
||||
- Place new material in `working/` first; promote to `formal/` only when it's
|
||||
ready to be cited (see `formal/CLAUDE.md` for promotion criteria).
|
||||
- Never touch `patent/`, `formal/patent/`, `formal/scraps/legal/`, or
|
||||
`working/legal/` without Bob's explicit instruction.
|
||||
- Add a `README.md` to any new category-level subdirectory, following the
|
||||
format used throughout this tree: orientation paragraph + bullet list of
|
||||
real files with one-line descriptions.
|
||||
- Draft in `working/`; promote to `formal/` when it is ready to be cited (`formal/CLAUDE.md`).
|
||||
Reference material that describes the system as it is goes in `reference/`.
|
||||
- When a document is overtaken, do not delete it: `git mv` it into `working/archive/superseded/`
|
||||
or `dead/` with a header saying why and what replaces it, and add a line to
|
||||
`DEAD-AND-REVISED.md`.
|
||||
- Rules for documentation work: [CLAUDE.md](CLAUDE.md).
|
||||
|
||||
+2
-2
@@ -30,8 +30,8 @@ PANDOC_FLAGS := -f gfm -t latex --top-level-division=chapter --wrap=preserve \
|
||||
|
||||
# fragment name : Markdown source. The order of \input lines is main.tex's.
|
||||
CHAPTERS := \
|
||||
ontology:docs/ONTOLOGY.md \
|
||||
roadmap:docs/ROADMAP.md \
|
||||
ontology:docs/reference/ONTOLOGY.md \
|
||||
roadmap:docs/working/archive/superseded/2025-12-14-starforth-roadmap.md \
|
||||
boards:boards/README.md \
|
||||
justification:docs/v4.0.0/JUSTIFICATION.md \
|
||||
decomposition:docs/v4.0.0/DECOMPOSITION.md \
|
||||
|
||||
+2
-2
@@ -122,8 +122,8 @@ are reproduced as written, including their struck-through corrections.
|
||||
Chapter & Source \\
|
||||
\midrule
|
||||
\endhead
|
||||
Ontology & \texttt{docs/ONTOLOGY.md} \\
|
||||
Roadmap & \texttt{docs/ROADMAP.md} \\
|
||||
Ontology & \texttt{docs/reference/ONTOLOGY.md} \\
|
||||
Roadmap & \texttt{docs/working/archive/superseded/2025-12-14-starforth-roadmap.md} \\
|
||||
Boot targets & \texttt{boards/README.md} \\
|
||||
v4 justification & \texttt{docs/v4.0.0/JUSTIFICATION.md} \\
|
||||
v4 decomposition & \texttt{docs/v4.0.0/DECOMPOSITION.md} \\
|
||||
|
||||
@@ -34,7 +34,7 @@ an unrelated structure. The document has been swept; "arena" now survives only i
|
||||
quotes that reproduce an earlier section verbatim, and in §12's preserved question list,
|
||||
which several sections quote.
|
||||
|
||||
**On `docs/lithosananke/ROADMAP.md`.** As of 2026-08-11, Captain Bob stated this document
|
||||
**On `docs/reference/ROADMAP.md`.** As of 2026-08-11, Captain Bob stated this document
|
||||
superseded ROADMAP.md entirely. That still holds, transitively, through `FABRIC-1.md` now.
|
||||
|
||||
---
|
||||
@@ -4425,7 +4425,7 @@ document and committing that amendment as its own item.*
|
||||
> `#ifdef __STARKERNEL__`, or elsewhere is an open question for that later item, not
|
||||
> decided here.
|
||||
>
|
||||
> **Now scoped, 2026-08-11 — resolved in `docs/lithosananke/ROADMAP.md`'s M8 section,
|
||||
> **Now scoped, 2026-08-11 — resolved in `docs/reference/ROADMAP.md`'s M8 section,
|
||||
> not here.** M8 is "tracked outside Stadium" per §27.5, and its console-facing pieces
|
||||
> don't change this document's own scope, so the resolution lives there rather than as
|
||||
> new 4.3.x items. Short answer to the open question above: `io_words.c` under
|
||||
@@ -4999,7 +4999,7 @@ document and committing that amendment as its own item.*
|
||||
> decision #4 -- both text paths coexist. Per this item's own posture (matching 4.3.6g),
|
||||
> stopping here before scoping REPL wiring (M8).
|
||||
>
|
||||
> **M8 scoped 2026-08-11 in `docs/lithosananke/ROADMAP.md`, not here** -- per §27.5, M8 is
|
||||
> **M8 scoped 2026-08-11 in `docs/reference/ROADMAP.md`, not here** -- per §27.5, M8 is
|
||||
> tracked outside Stadium, so its design decisions live in that roadmap's own M8 section
|
||||
> rather than as new 4.3.x items. Key finding from that scoping pass, worth recording in
|
||||
> this document too since it bears on §27.6's CANVAS/REPL-strip framing: the REPL's
|
||||
@@ -5939,7 +5939,7 @@ document and committing that amendment as its own item.*
|
||||
exactly that — no scancode-to-ASCII translation table exists, and no code path connects the
|
||||
keyboard ring buffer to the REPL's line-read loop. The hardware/interrupt layer is done; the
|
||||
bridge from that layer into text the REPL can act on is not. This is the same conclusion
|
||||
`docs/lithosananke/ROADMAP.md`'s M8 section and this document's own 4.3.5-series entries
|
||||
`docs/reference/ROADMAP.md`'s M8 section and this document's own 4.3.5-series entries
|
||||
already recorded ("no keyboard path into the VM on any architecture, confirmed by reading
|
||||
the code") — restated here specifically so 4.4u's TAB-toggle has an accurate prerequisite,
|
||||
not because the earlier conclusion was in doubt.
|
||||
@@ -5957,7 +5957,7 @@ document and committing that amendment as its own item.*
|
||||
keyboard event injected via QEMU's own input-send-event monitor command (not socat/serial),
|
||||
screendump showing the typed text landed in the REPL strip; three-arch QEMU boot + logs per
|
||||
CLAUDE.md.
|
||||
*Refs:* §27.8, 4.3.5 series, 4.4r, 4.4u, `docs/lithosananke/ROADMAP.md` M8 section.
|
||||
*Refs:* §27.8, 4.3.5 series, 4.4r, 4.4u, `docs/reference/ROADMAP.md` M8 section.
|
||||
|
||||
> **DONE 2026-08-12.** Reused item 4.3.5f's `KEY-EVENT` convergence work rather than building
|
||||
> two per-arch tables from scratch (`kbw_key_event`'s FORTH-word logic was refactored into a
|
||||
@@ -7549,7 +7549,7 @@ direct-arena reference — 4.3.7b's own call) behind that lookup.
|
||||
|
||||
### 27.8 REPL: prompt, text path, CANVAS geometry (4.4–4.4s)
|
||||
|
||||
Scoped 2026-08-11, in conversation with Captain Bob, replacing `docs/lithosananke/ROADMAP.md`'s
|
||||
Scoped 2026-08-11, in conversation with Captain Bob, replacing `docs/reference/ROADMAP.md`'s
|
||||
M8 section entirely (marked OBSOLETE there, kept for history only). Original visual reference:
|
||||
[`repl-mockup.png`](repl-mockup.png).
|
||||
|
||||
|
||||
@@ -1425,14 +1425,14 @@ evidence nothing regressed.
|
||||
`docs/CLAUDE.md`'s own correction, made in the same pass, for the doc-toolchain findings —
|
||||
`doxygen` installed, `docs/Makefile` pointer corrected — and this section's own proof-count
|
||||
reconciliation above for the Isabelle/HOL findings):
|
||||
- [ ] `docs/lithosananke/ROADMAP.md` and `M7.1.md` — stale `Branch: lithosananke` (no such
|
||||
- [ ] `docs/reference/ROADMAP.md` and `M7.1.md` — stale `Branch: lithosananke` (no such
|
||||
branch exists post-split), `M7.1.md`'s "Status: Design Complete" (shipped and live, not
|
||||
just designed), `ROADMAP.md`'s self-contradiction (M8 marked OBSOLETE in one place,
|
||||
still a live success criterion in another), and its stale "AHCI driver" claim for M9
|
||||
(real implementation is `virtio_blk.c`) — not fixed this pass, flagged.
|
||||
- [ ] Top-level `ROADMAP.md` (StarForth-era, "Phase 0 Complete... Phase 1 Starting," dated
|
||||
2025-12-14) — badly stale, no historical/superseded banner to warn a reader. Not fixed.
|
||||
- [ ] `docs/03-architecture/word-acl/DESIGN.md` says ACL Phase 7 (LithosAnanke kernel parity)
|
||||
- [ ] `docs/reference/word-acl/DESIGN.md` says ACL Phase 7 (LithosAnanke kernel parity)
|
||||
is still "remaining" — direct contradiction with `.claude/CLAUDE.md`, which states
|
||||
Phase 7 is independently verified complete. Not fixed.
|
||||
- [ ] `VM-FLEET-ATTRACTOR-DESIGN-20260705.md` claims `doe-campaign.4th` is "broken and being
|
||||
|
||||
@@ -102,7 +102,7 @@ decisions get added here, not to `FABRIC-1.md`. Follow the same discipline `FABR
|
||||
### From FABRIC-1.md §J — Maintainability sweep (2026-08-18)
|
||||
|
||||
- [x] **Fixed 2026-08-26 (commit `cbe7b49`), stale carry-forward closed 2026-08-28.**
|
||||
`docs/lithosananke/ROADMAP.md` and `M7.1.md` — stale `Branch: lithosananke` (no such
|
||||
`docs/reference/ROADMAP.md` and `M7.1.md` — stale `Branch: lithosananke` (no such
|
||||
branch exists post-split), `M7.1.md`'s "Status: Design Complete" (shipped and live, not
|
||||
just designed), `ROADMAP.md`'s self-contradiction (M8 marked OBSOLETE in one place, still
|
||||
a live success criterion in another), and its stale "AHCI driver" claim for M9 (real
|
||||
@@ -112,10 +112,10 @@ decisions get added here, not to `FABRIC-1.md`. Follow the same discipline `FABR
|
||||
- [x] **Fixed 2026-08-26 (commit `cbe7b49`), stale carry-forward closed 2026-08-28.** Top-level
|
||||
`ROADMAP.md` (StarForth-era, "Phase 0 Complete... Phase 1 Starting," dated
|
||||
2025-12-14) — marked OBSOLETE by `cbe7b49` (Captain Bob's call: more than stale), pointing
|
||||
to `docs/lithosananke/ROADMAP.md` and `FABRIC*.md` for current status.
|
||||
to `docs/reference/ROADMAP.md` and `FABRIC*.md` for current status.
|
||||
|
||||
- [x] **Fixed 2026-08-26 (commit `cbe7b49`), stale carry-forward closed 2026-08-28.**
|
||||
`docs/03-architecture/word-acl/DESIGN.md` says ACL Phase 7 (LithosAnanke kernel parity)
|
||||
`docs/reference/word-acl/DESIGN.md` says ACL Phase 7 (LithosAnanke kernel parity)
|
||||
is still "remaining" — direct contradiction with `.claude/CLAUDE.md`, which states Phase 7
|
||||
is independently verified complete. Phase 7 restated as independently-verified complete and
|
||||
the stale lithosananke-branch-parity framing removed by `cbe7b49`.
|
||||
@@ -3434,7 +3434,7 @@ hardware), the **release-gate recommendation**, and the **punch lists to complet
|
||||
each.
|
||||
|
||||
**The versioning split, decided 2026-08-28 — now standing policy, see
|
||||
`docs/lithosananke/ROADMAP.md` "Release Versioning Policy" for the authoritative form.**
|
||||
`docs/reference/ROADMAP.md` "Release Versioning Policy" for the authoritative form.**
|
||||
v2.0.0 is the **QEMU release** — the point
|
||||
where the QEMU-only story is complete and defensible on its own terms. v2.5.0 is the
|
||||
**real-hardware release** — the point where the same story transfers to bare metal on a real
|
||||
|
||||
@@ -2489,13 +2489,13 @@ describe are stripped** (§XXII.5), so the manifest never describes a file that
|
||||
|
||||
**Superseded subsystem docs** — `.claude/TRIPOD.md`, `HERMES.md`, `ARTEMIS.md`, `CONSOLE.md`
|
||||
already carry superseded headers, but after this reshuffle they describe a fleet that no longer
|
||||
exists. Same for `docs/03-architecture/tripod/{TRIPOD,HERMES,ARTEMIS,README}.md`, which
|
||||
exists. Same for `docs/working/archive/superseded/2026-08-tripod/{TRIPOD,HERMES,ARTEMIS,README}.md`, which
|
||||
`.claude/CLAUDE.md` still lists as current for Tripod. **Decide deliberately: update, or mark
|
||||
archival and point at `FABRIC-3.5.md`.** Not a silent edit either way.
|
||||
|
||||
**Also in scope:** `capsules/README.md` (lists `hermes/init.4th` as a live personality),
|
||||
`ROADMAP.md` / `docs/lithosananke/ROADMAP.md`, `CHANGELOG.md`, `README.md`,
|
||||
`docs/lithosananke/SYSTEM_ARCHITECTURE.md` and `M7.1.md`, and `proof/COVERAGE.md` (after the
|
||||
`ROADMAP.md` / `docs/reference/ROADMAP.md`, `CHANGELOG.md`, `README.md`,
|
||||
`docs/working/archive/historical/2026-01-27-system-architecture-draft.md` and `M7.1.md`, and `proof/COVERAGE.md` (after the
|
||||
§XXV pass — and per §XXV.3 its *boundary* statement matters more than its file count).
|
||||
`capsules/BLOCK_MAP.md` is a generated artifact; regenerate, don't hand-edit.
|
||||
|
||||
@@ -2705,7 +2705,7 @@ the version number (§XXVI.3).** No code is authorized.
|
||||
table in `Makefile.starkernel` itself (lines ~74–82), which is more specific:
|
||||
|
||||
```
|
||||
# Roadmap (per docs/lithosananke/ROADMAP.md "Release Versioning Policy" and
|
||||
# Roadmap (per docs/reference/ROADMAP.md "Release Versioning Policy" and
|
||||
# FABRIC-2.md §G — X.0.0 = QEMU release, X.5.0 = hardware bare-metal release):
|
||||
# v1.0.x — serial-only production (released)
|
||||
# v1.5.x — framebuffer VT100 terminal/console milestone (released)
|
||||
@@ -2736,7 +2736,7 @@ will step 2.0.1 → 2.2.0 with a released `v2.1.0` tag sitting in a gap the tabl
|
||||
mention. **Add the line wherever the table lives:**
|
||||
|
||||
1. `Makefile.starkernel` (the copy above, beside the `LITHOS_VERSION` edit itself).
|
||||
2. `docs/lithosananke/ROADMAP.md`, "Release Versioning Policy" — the comment names it as the
|
||||
2. `docs/reference/ROADMAP.md`, "Release Versioning Policy" — the comment names it as the
|
||||
upstream source.
|
||||
3. `FABRIC-2.md` §G is the origin of the scheme but is **CLOSED/ARCHIVAL** — **cite it, do not
|
||||
edit it.** Amending a closed document to match a later decision is exactly what this series'
|
||||
@@ -3011,7 +3011,7 @@ removed 2026-08-15 as non-functional and must not be resurrected.
|
||||
- ✅ **Versioning policy — CLOSED** (§XXX). All three §XXIX.3 conflicts resolved; LTS criteria
|
||||
ratified; engine `VERSION` closed as a rule.
|
||||
- ✅ **This release is `2.1.0`** (§XXVIII), even major, working line.
|
||||
- ⬜ **Carry §XXX.1–XXX.6 into `Makefile.starkernel` and `docs/lithosananke/ROADMAP.md`**
|
||||
- ⬜ **Carry §XXX.1–XXX.6 into `Makefile.starkernel` and `docs/reference/ROADMAP.md`**
|
||||
(§XXVIII.2), replacing the old roadmap table. `FABRIC-2.md` §G is cited, never edited.
|
||||
- ⬜ Engine `VERSION` applied at tag time per §XXX.6's rule.
|
||||
|
||||
|
||||
@@ -1484,7 +1484,7 @@ opposite of what per-task commits are for. Tasks 5.5–5.7 return to one-commit-
|
||||
`PLOT`/`FB-*` relocated to Hestia; no FORTH-79 word semantics changed). The stale
|
||||
version-comment block in `Makefile.starkernel` (which still said "even major = LTS" —
|
||||
backwards relative to the ratified §XXX.1 odd/even rule — and had no `v2.1.0` entry)
|
||||
replaced with the real ladder. `docs/lithosananke/ROADMAP.md`'s own "Release Versioning
|
||||
replaced with the real ladder. `docs/reference/ROADMAP.md`'s own "Release Versioning
|
||||
Policy" section (the second of the two live places) was still the full retired
|
||||
2026-08-28 policy, not just a stale table — replaced with the ratified §XXX policy text,
|
||||
the old text kept struck-through in a `<details>` block for traceability, and the
|
||||
|
||||
@@ -1,6 +1,18 @@
|
||||
# FABRIC-3.7.md — Phase 8 PKI: the elevation entrypoint
|
||||
|
||||
**Status: OPEN — design only, no code written or authorized.**
|
||||
**Status: CLOSED 2026-10-14 — not needed; elevation removed, not built.** Captain Bob, asked
|
||||
"is it even a necessary capability?": privilege comes from the drive (Zuse's drive, or the
|
||||
personality an identity is minted with), so a runtime request-and-grant channel only adds attack
|
||||
surface — and the old one was a live hole: `KH-ELEVATE-SEND` let any identity have arbitrary
|
||||
FORTH run as Zuse. `ELEVATE-GRANT` granted automatically on eligibility-list membership (no
|
||||
human approves), into Hera's own dictionary (never the requester's), and could never reach a
|
||||
FORTH-79-locked identity's words (pinned, and pins are one-way). Removed: `KH-ELEVATE-SEND`,
|
||||
message type 8, `zuse-eligibility.4th`, `ZUSE-ELIGIBLE?`/`ZUSE-ELIGIBILITY-ADD`/
|
||||
`ELEVATE-PUBKEY-UNPACK`, the eligibility list itself and Part B's gate in `zuse.4th`;
|
||||
`devblock_from_top` 1–63 on Artemis's disk stay reserved, unused (his ruling). See
|
||||
`FABRIC-3.md` §XXXVII. Everything below is kept as the record of the design.
|
||||
|
||||
**Former status: OPEN — design only, no code written or authorized.**
|
||||
|
||||
**CORRECTION (2026-09-22, before any code was written against this document): §2's central
|
||||
claim — that the old `SEND-ELEVATE-REQUEST` passed a raw cross-VM address into `ELEVATE-GRANT`'s
|
||||
|
||||
+414
-5
@@ -2461,6 +2461,29 @@ the existing xHCI multi-device history (§VII, and the 2026-09-05/06/07 fixes re
|
||||
-- possibly a recurrence or a related gap in the same per-slot attach-pending scan, given the
|
||||
similar shape ("several ports become pending at once, only some get serviced").
|
||||
|
||||
**No longer reproduces, 2026-10-14 -- checked on all three ISAs, closed.** Both reproductions
|
||||
above were rerun against a freshly minted, matched set: a scratch `artemis.img` and Zuse drive,
|
||||
and five identity drives (`00`-`04`) minted at a live `zuse@Hera` prompt by `MINT`, one hot-plug
|
||||
at a time (`logs/20261014-082526`). Not against the committed images: every image under
|
||||
`disk/thumbdrives/`, and `disk/artemis.img`, is all zeros since `e56974e0` bleached them ahead of
|
||||
§XXXV.6's re-mint, which has not been done. A blank drive is correctly passed over in silence
|
||||
(its home-blocks check reads BLANK, logged at debug level only), so a first attempt today with
|
||||
copies of the committed images (`logs/20261014-062249`) showed no WIREBIND lines and proved
|
||||
nothing either way.
|
||||
|
||||
| ISA | five drives present at power-on | five drives hot-plugged ~1 s apart over QMP |
|
||||
|---|---|---|
|
||||
| amd64 | 5/5 attached (`logs/20261014-082755`) | 5/5 attached (`logs/20261014-083236`) |
|
||||
| aarch64 | 5/5 attached (`logs/20261014-083415`) | 5/5 attached (`logs/20261014-083917`) |
|
||||
| riscv64 | 5/5 attached (`logs/20261014-084134`) | 5/5 attached (`logs/20261014-084624`) |
|
||||
|
||||
Zuse's own drive was confirmed in every boot as well. No code changed for this. What closed the
|
||||
gap is most likely the xHCI driver's per-port connect queue (`kernel/src/usb/xhci.c`,
|
||||
`dev->pending_events[]`: a connect event that arrives while a command is in flight is held and
|
||||
handled once the command ring is idle, not dropped); when that landed cannot be traced past the
|
||||
source-tree reorganisation (`a8b70e88`), so this is inference, not proven. The one-at-a-time
|
||||
attach rule of §XV and §XXXI is no longer needed.
|
||||
|
||||
## XV. 3(architecture) × 9(identity) × 3(replicate) randomized full-factorial DoE — self-contained
|
||||
FORTH capsule, replacing the ad hoc exerciser-feeding process (2026-09-11)
|
||||
|
||||
@@ -3969,7 +3992,7 @@ are attached reliably in the first place, including under the "already plugged i
|
||||
case §XIV's own second reproduction showed failing.
|
||||
|
||||
**Bug 2 -- the MSG-TICK/Stage-3-switch dual-ownership rough edge (§XXVIII's own admission,
|
||||
never revisited).** Both MSG-TICK's idle-pump dispatch and the Stage 3 timer-driven switcher can
|
||||
never revisited).** *Closed 2026-10-14: one delivery path, built -- §XXXVI.* Both MSG-TICK's idle-pump dispatch and the Stage 3 timer-driven switcher can
|
||||
independently move control between the same VMs; not reconciled, not observed to interact badly
|
||||
so far, but never proven safe under all interleavings either. Directly relevant to Stage 4 for
|
||||
the same reason as Bug 1: WIREBIND VMs bring a second population of dynamically-birthed contexts
|
||||
@@ -4579,7 +4602,7 @@ call sites (`repl.c` has 18); most are direct interactive replies already correc
|
||||
this rule -- reclassifying the specific sites that aren't is Stage D's job (the same files Stage
|
||||
C's triage already walks), not repeated here.
|
||||
|
||||
**Decision on the two §XXVII gaps: fix eviction now, defer `LOG-FLUSH` again.**
|
||||
**Decision on the two §XXVII gaps: fix eviction now, defer `LOG-FLUSH` again.** *`LOG-FLUSH` built 2026-10-14 -- §XXXVIII.*
|
||||
`LOG-FLUSH` needs real new machinery first -- the per-VM log buffer its own doc comment already
|
||||
presumes (`vm_log_buffer.h`) does not exist anywhere in the tree, confirmed by grep; building it
|
||||
means designing that buffer format and the flush word together, genuine feature work deserving
|
||||
@@ -5197,6 +5220,19 @@ sequence at all until/unless this is fixed at the source -- the interactive two-
|
||||
(typed live over the serial socket) sidesteps the bug, it does not fix it. Flagged here as a
|
||||
real, reproducible defect worth its own fix later, out of scope for this section.
|
||||
|
||||
**Fixed 2026-10-14.** The mechanism, traced: `vm_interpret()` (`kernel/src/vm/vm_core.c`, and
|
||||
the hosted `v3/src/vm.c`) copies each text it runs into the VM's one `input_buffer` and resets
|
||||
`input_pos`. `LOAD` runs its block by calling it, so the block took the place of the line `LOAD`
|
||||
was on, and when the block was done the outer loop found nothing left to read. The same held
|
||||
for every word that runs text from inside a line: `-->`, a capsule's `EXEC`, a message
|
||||
kernel-Hermes delivers. `vm_interpret()` now keeps what the outer text had not yet read when it
|
||||
is called from inside another, and puts it back afterwards, as FORTH-79's `LOAD` keeps the
|
||||
input stream it interrupts. Two POST cases, `LOAD.rest_of_line` (`1 LOAD 0 0 /`) and
|
||||
`THRU.rest_of_line` (`1 2 THRU 0 0 /`), fail without the fix (`logs/20261014-061222`) and pass
|
||||
with it; three-ISA acceptance `logs/20261014-061508` (amd64), `-061624` (aarch64), `-061837`
|
||||
(riscv64): 1052 tests, none failed, hash `0x08873e0f44b7cb2a` unchanged. So a `THRU`-then-call
|
||||
line now works as one `SK_CMD`; that use itself was not re-run.
|
||||
|
||||
### XXXIV.2 -- A cross-session QEMU collision killed the first real relaunch at 0 trials
|
||||
|
||||
Once running for real (via the two-line workaround), the campaign was silently killed a fourth
|
||||
@@ -5463,7 +5499,7 @@ device it was minted on.
|
||||
- Build a **new, blank 1 GiB `disk/artemis.img`** from scratch -- not a resize of the current
|
||||
file. No migration code written or needed.
|
||||
- **Zuse re-minted fresh** on the new image (genesis marker, root CA placement, per
|
||||
`docs/03-architecture/word-acl/DESIGN.md`'s Phase 8 design and
|
||||
`docs/reference/word-acl/DESIGN.md`'s Phase 8 design and
|
||||
`project_phase8_milestone6_complete.md`'s already-verified entropy/signing/block-fence chain --
|
||||
same mechanism, new device, not new code).
|
||||
- **All 8 thumbdrive identities re-minted** (`project_thumbdrive_identities_minted_20260906.md`:
|
||||
@@ -5476,8 +5512,8 @@ device it was minted on.
|
||||
### XXXV.7 -- Genuinely open, not decided here
|
||||
|
||||
- **Exact v2 decimation factor**, if/when v2 is built at all (§XXXV.4).
|
||||
- Whether `THRU`'s own line-swallowing defect (§XXXIV.1, still un-root-caused at the C level) gets
|
||||
fixed before or after this work -- it blocks true single-command `SK_STARTUP_FORTH` autolaunch
|
||||
- ~~Whether `THRU`'s own line-swallowing defect (§XXXIV.1, still un-root-caused at the C level) gets
|
||||
fixed before or after this work~~ Fixed 2026-10-14, before it (§XXXIV.1) -- it blocks true single-command `SK_STARTUP_FORTH` autolaunch
|
||||
of the campaign regardless of persistence format; the two-line interactive workaround still
|
||||
applies either way.
|
||||
- Disposal of the two stale partial amd64 runs' data (§XXXIV.5's own still-open item) is unrelated
|
||||
@@ -5488,3 +5524,376 @@ device it was minted on.
|
||||
design/decision only, no capsule/C code, no new disk image, and no re-mint actually performed
|
||||
or committed for the drive resize, the persistence region, or the N=2 campaign shape.
|
||||
|
||||
|
||||
## XXXVI. One delivery path: a VM takes its own messages, on its own turn -- built (2026-10-14)
|
||||
|
||||
Closes the MSG-TICK/Stage-3 dual-ownership item (§XXVIII, §XXIX bug 2, §XXXI), as ruled in
|
||||
`FABRIC-3.5.md` §XXXII ("one mover"); Captain Bob, 2026-10-14: collapse it before the bare-metal
|
||||
builds. **The state before:** the MSG-TICK pump was gone (FABRIC-3.6 Stage E), but two paths
|
||||
still ran a VM's kernel-Hermes messages -- the VM's own outermost colon-word checkpoint, and
|
||||
Hera's idle beat, which walked every live VM and ran each one's messages *for* it, on Hera's
|
||||
stack. The second was the only path for a VM nothing else drives (a WIREBIND identity's `~user`
|
||||
VM, FABRIC-3.6 task 3.9). It was guarded (parked VMs are not LIVE and were skipped) but it was
|
||||
two paths.
|
||||
|
||||
**What changed.**
|
||||
- `sk_hermes_send_one()` marks the receiver as having work for the switch signal.
|
||||
- What a VM runs on its own native stack (`sk_vm_switch_entry()`, until now a placeholder that
|
||||
only yielded) now takes its own messages, then yields. Not while its interpreter is mid-line on
|
||||
some other, parked, stack (new per-VM `interpret_depth`, counted in `vm_interpret()`): then
|
||||
they wait and it asks for another turn.
|
||||
- Hera's idle beat no longer runs anyone's messages but her own; it makes the switch the switch
|
||||
signal has pending (`sk_vm_switch_service_pending()`, shared with the colon-word checkpoint),
|
||||
so a message still arrives while she sits at her prompt.
|
||||
- Every VM is registered with the switch signal at its birth (idempotent; the Tripod and
|
||||
WIREBIND registrations stay) and unregistered when killed or reaped.
|
||||
- `sk_hermes_drain_checkpoint()` refuses, with "Kernel-Hermes: message held -- its VM is not the
|
||||
one running", any call not in the VM's own context: its interpreter running at the outermost
|
||||
text, or it is the VM switched in and not mid-line elsewhere. This is the test: it failed
|
||||
first, holding every relayed line (`logs/20261014-092558`), and never fires now.
|
||||
- A VM yielding from the top of its own loop stays LIVE; only a VM switched out mid-line is
|
||||
SWITCHED_OUT. Found by the test: with every yield SWITCHED_OUT, the console stopped relaying
|
||||
to an identity after its first message (it relays only to a LIVE one) and KILL would have
|
||||
refused every VM that had ever taken a message (`logs/20261014-095904`).
|
||||
|
||||
**A real defect found on the way, amd64 only:** `sk_vm_switch_prime()` (`arch/amd64/switch.S`)
|
||||
built a first-entry frame that left `rsp` a multiple of 16 at `sk_vm_switch_entry()`'s entry; the
|
||||
SysV ABI wants `rsp + 8` to be. Harmless while that function only switched back; a #GP (an
|
||||
aligned SSE store to the stack) the first time it ran the interpreter there
|
||||
(`logs/20261014-093823`). The frame is now 64 bytes with a null return address above the entry
|
||||
address. aarch64 (160) and riscv64 (208) frames were already 16-aligned. This may also be what
|
||||
stopped the 2026-09-14 attempt (`vm_interpret(self, "MSG-TICK")` in the same function, reverted
|
||||
after a stall never root-caused) -- not proven.
|
||||
|
||||
**`FABRIC-3.5.md` §XXXII.5's three build questions, as answered here:** (1) the payload waits in
|
||||
the receiver's kernel-Hermes queue and is run by the receiver on its own stack on its turn; (2)
|
||||
Hera's special case stays only in this sense -- her messages run at her own idle beat, which is
|
||||
her own context; (3) `g_mama_interpreting` and `g_idle_pump_active` stay, still guarding Hera's
|
||||
own drain.
|
||||
|
||||
**Verified.** A WIREBIND identity (`S" 00" USE`, then four plain lines: `1 2 + .`, an unknown
|
||||
word, `5 6 * .`, `7 8 + .`) receives and runs all four on its own stack -- `3`, the unknown-word
|
||||
error, `30`, `15` -- with nothing held and no fault, on amd64 (`logs/20261014-101933`), aarch64
|
||||
(`logs/20261014-102701`) and riscv64 (`logs/20261014-100948`). Five identity drives hot-plugged a
|
||||
second apart at the prompt all attach (their attach acknowledgements are messages to Hera)
|
||||
(`logs/20261014-102525`). Standard acceptance, committed disks: all three ISAs to `zuse@Hera`,
|
||||
POST 1052 tests passed, `PARITY:M7.1a ... hash=0x08873e0f44b7cb2a` unchanged, no unknown word
|
||||
(`logs/20261014-103248`, `-103409`, `-103616`). Superseded attempts, kept: `-092406` (wrong `USE`
|
||||
syntax), `-094908` (before the LIVE-on-yield fix, one line only).
|
||||
|
||||
## XXXVII. Any identity could run FORTH as Zuse; a message could run twice; elevation removed (2026-10-14)
|
||||
|
||||
Found while building FABRIC-3.7's elevation entrypoint, proven live, fixed test first.
|
||||
|
||||
**1. Two words let any VM have Hera run any text, in her own dictionary -- Zuse's.**
|
||||
`KH-ELEVATE-SEND ( paddr plen -- ok? )` and `KH-BLK-ATTACH-SEND ( paddr plen -- ok? )`
|
||||
(`repl.c`) are registered in every VM (`word_registry.c`), and each sent whatever text it was
|
||||
handed to Hera as a kernel-Hermes message, which Hera interprets. From a WIREBIND identity's
|
||||
console: `S" 777 ." KH-ELEVATE-SEND .` and `S" 778 ." KH-BLK-ATTACH-SEND .` -- Hera printed
|
||||
`777` and `778` (`logs/20261014-105930`, `-110937`). A line holding `"` is run on the identity's
|
||||
console VM instead of relayed (`repl.c`'s own v1 limitation), which is what reached them.
|
||||
|
||||
**2. One message could run twice.** `sk_hermes_drain_checkpoint()` popped a message only after
|
||||
running it; a payload that runs a colon word reaches the checkpoint in `execute_colon_word()`,
|
||||
which drains the same VM again -- and found the same message at the head. A relayed `T3`
|
||||
(`: T3 333 . ;`) printed `333 333`; `778` above printed twice (`logs/20261014-110937`).
|
||||
|
||||
**3. Elevation itself: not needed (Captain Bob, 2026-10-14).** Asked whether it was even a
|
||||
necessary capability, given (1): privilege comes from the drive -- Zuse's, or the personality an
|
||||
identity is minted with -- and a runtime request-and-grant channel only adds attack surface.
|
||||
`ELEVATE-GRANT` granted on eligibility-list membership alone (no human approves), into Hera's own
|
||||
dictionary (never the requester's), and could never reach a FORTH-79-locked identity's words (all
|
||||
pinned; pins are one-way). Its only caller had been gone since 2026-09-22 and nothing missed it.
|
||||
`FABRIC-3.7.md` is closed as not needed.
|
||||
|
||||
**Fixes.**
|
||||
- Removed: `KH-ELEVATE-SEND`; message type 8 (retired, not reused); `capsules/zuse-eligibility.4th`
|
||||
(`ELEVATE-GRANT`, blocks 4021-4022) and its `EXEC` in `init.4th`; the C words `ZUSE-ELIGIBLE?`,
|
||||
`ZUSE-ELIGIBILITY-ADD`, `ELEVATE-PUBKEY-UNPACK`; the eligibility list (`zuse_eligibility.c`,
|
||||
`zuse_eligibility.h`, `zuse_eligibility_list.h`); FABRIC-3.7 Part B's gate on
|
||||
`ZUSE-ELIGIBILITY-ADD` in `zuse.4th`. `devblock_from_top` 1-63 on Artemis's disk stay reserved,
|
||||
unused (his ruling). `NAME>XT` stays: general-purpose.
|
||||
- `KH-BLK-ATTACH-SEND` is now `( dev-addr ok? -- sent? )`, refused unless Artemis calls it; the
|
||||
kernel writes `<dev-addr> <0|1> BLK-ATTACH-ACK` itself. Artemis's `HERA-BLK-ATTACH-REQ` is now
|
||||
`DUP BLK-ATTACH KH-BLK-ATTACH-SEND DROP` (its text builder is gone, and with it Artemis's one
|
||||
"Unterminated comment" warning, a nested-paren comment).
|
||||
- `BLK-ATTACH-ACK` is refused unless Hera runs it.
|
||||
- The drain pops a message before running it; the message, and so its payload, is still held
|
||||
until released after.
|
||||
|
||||
**Verified.** The same session after the fix (`logs/20261014-112514`): `333` once,
|
||||
`KH-BLK-ATTACH-SEND: refused -- only Artemis replies to a storage attach`, `UNKNOWN WORD:
|
||||
'KH-ELEVATE-SEND'`, identity `00` attaches. Five identities hot-plugged at the prompt all attach
|
||||
(`logs/20261014-113615`). Standard acceptance, all three ISAs: `zuse@Hera`, POST 1052 passed, no
|
||||
unknown word, **`PARITY:M7.1a word_count=523 ... hash=0xb73b58052d591638` -- a deliberate new
|
||||
baseline** (was 530 / `0x08873e0f44b7cb2a`: the four C words and `zuse-eligibility.4th`'s
|
||||
definitions are gone from Hera's dictionary) (`logs/20261014-113112`, `-113232`, `-113450`). A first attempt (`-111859`) broke
|
||||
attach two ways, both mine: nested parens in the new capsule comment, and `%lld`, which the
|
||||
kernel's freestanding `snprintf` does not do.
|
||||
|
||||
**Found, not fixed (pre-existing, unrelated):** Hera prints two and Hestia three `( Unterminated
|
||||
comment` warnings at every boot, in logs from before this work too.
|
||||
|
||||
## XXXVIII. `LOG-FLUSH` built: a VM's log records reach Artemis's log ring (2026-10-14)
|
||||
|
||||
Deferred in §XXXII.4 as its own initiative; Captain Bob, 2026-10-14: build it before the
|
||||
bare-metal builds. His rulings: **everything the VM logs** goes in its buffer (at or above the
|
||||
log level -- the one, global `LOG-LEVEL!` setting, the same filter `log_message()` applies);
|
||||
it goes to disk **on `LOG-FLUSH`, when the buffer fills, and at once on an ERROR record**.
|
||||
|
||||
**Built.**
|
||||
- Each VM has a buffer of its own (`VM.log_buf`, 900 bytes, packed records: level, timestamp,
|
||||
length, text; `vm_log_buffer.c`/`.h`). `log_message()` (`shim.c`) adds every record it prints
|
||||
to the buffer of the VM it is attributed to (`vm_log_attributed_vm()`); a record made outside
|
||||
any VM's text -- the kernel's own -- belongs to none and is not kept.
|
||||
- A flush is one kernel-Hermes message to Artemis, type `SK_HERMES_MSG_TYPE_LOG_BATCH` (10), the
|
||||
one message type that is not FORTH text: `sk_hermes_drain_checkpoint()` hands it to
|
||||
`vm_log_batch_deliver()`, which writes each record with `log_region_append()` -- in Artemis's
|
||||
own context, on her turn (§XXXVI). The record's source is the sender the kernel stamped on the
|
||||
message, never a name the sender gives: a VM cannot write under another's name.
|
||||
- Nothing is lost silently: records that cannot go (Artemis not yet live -- all of Hera's POST --
|
||||
or the send refused) are counted, and the next flush that can be sent leads with "N log
|
||||
records not sent: Artemis not ready" (175 at a normal boot).
|
||||
- `LOG-FLUSH ( -- )`, every VM. `LOG-SHOW ( n -- )`, Hera only: the newest n records, oldest of
|
||||
them first, as source, level, text -- added because the ring had no reader at all, so nothing
|
||||
written there could be read or checked (`log_region_read_recent()`). Hera only because it shows
|
||||
every VM's records, and Hera's console is Zuse's.
|
||||
|
||||
**A real defect in the ring, found by the first test that filled it:** growth
|
||||
(`log_region_append()`) claimed to be "safe regardless of wrap state" and was not. The ring is
|
||||
full when it grows, so head == tail; nothing moved and tail stayed put, so the next write
|
||||
overwrote the oldest record and the new, blank slots read back as records inside the live
|
||||
range. 30 records written to a fresh ring read back as 28 of them and 12 blank
|
||||
(`logs/20261014-115648`; also `-115434` on a ring already damaged by an earlier test). Fixed:
|
||||
the records from head on move up by the slots added, and the next write goes into the gap (with
|
||||
head at 0 -- the only case growth meets, since nothing is evicted before the ring is at its full
|
||||
size -- simply at the old end). §XXXII.4 had flagged eviction as never live-exercised.
|
||||
|
||||
**Verified.** Test first: `LOG-FLUSH` and `LOG-SHOW` unknown (`logs/20261014-114028`). Then:
|
||||
Hera's WARN probe and her boot warnings, under source `Hera`, after `LOG-FLUSH`; identity `00`'s
|
||||
ERROR probe, sent by itself at once, under source `00` (`-114847`); the lost-records notice
|
||||
(`-115434`); 30 records through a growth, in order, no blank, on amd64 (`-115841`), aarch64
|
||||
(`-120526`) and riscv64 (`-120746`). Standard acceptance, all three ISAs: `zuse@Hera`, POST 1052
|
||||
passed, no unknown word, **new baseline `word_count=526 ... hash=0x82f4ae7cb2e2d424`**
|
||||
(deliberate: Hera's new words) (`logs/20261014-120027`, `-120148`, `-120356`).
|
||||
|
||||
## XXXIX. The Pi 5's native path: MMU and caches on before any C, bounded mailbox, framebuffer address from the devicetree -- and a rehearsal on QEMU that found three more (2026-10-14)
|
||||
|
||||
Captain Bob, 2026-10-14: "fix the pi 5 problems" -- the three from the Friday review (`boards/BRINGUP.md`
|
||||
R2, R3).
|
||||
|
||||
**1. MMU and caches off (R2).** The firmware enters at EL2 with the MMU off: every access is
|
||||
Device memory, where an unaligned access or an exclusive faults and nothing is cached. The
|
||||
aarch64 kernel had never needed to turn the MMU on -- under UEFI it runs on the firmware's map
|
||||
(`arch_mmu_init()` is a stub; `vmm.c` builds x86-shaped tables it never loads on aarch64).
|
||||
`native_rpi5_entry.S` now: cleans and invalidates the data cache over the whole image first
|
||||
(so nothing the firmware left there lands on top of what follows); builds an identity map, the
|
||||
image's GiB Normal write-back in 2 MiB blocks, every other GiB Device-nGnRE and never executable;
|
||||
sets MAIR, TCR and TTBR0 and turns on M, C and I at whichever EL it was entered at (EL2 on the
|
||||
Pi 5, EL1 handled too), with WXN and alignment checking off. In C, `rpi5_mmu.c` then makes every
|
||||
further GiB the devicetree's `/memory` covers entirely Normal, and makes the framebuffer Normal
|
||||
non-cacheable (the display reads it straight from RAM), each change break-before-make.
|
||||
|
||||
**2. Unbounded mailbox waits (R3).** Every wait now gives up after one second by the
|
||||
architectural counter (`-5`); before any console exists a silent VideoCore must cost a missing
|
||||
framebuffer, not a hang. With the caches on, the request buffer is cleaned to RAM before it is
|
||||
sent and invalidated before the answer is read: the VideoCore does not see the ARM's caches.
|
||||
|
||||
**3. The framebuffer address (R3).** `& 0x3FFFFFFF` was the Pi 4's rule. The address the firmware
|
||||
returns is now carried through the devicetree's `dma-ranges` from the firmware node up: on the
|
||||
Pi 5 (the real `bcm2712-rpi-5-b.dtb`) the firmware node's is empty and `/soc` has none, so it is
|
||||
already physical; on a Pi 4 `/soc` maps bus `0xC0000000` onto 0, and that is handled too. An
|
||||
address no entry holds is refused (`-6`). Still unverified: the allocate tag's size field.
|
||||
|
||||
**The rehearsal.** There is no QEMU model of the Pi 5, but QEMU's virt machine with
|
||||
`virtualization=on` enters a raw image exactly as the Pi 5's firmware does: at EL2, MMU off,
|
||||
devicetree in x0. New `make -f kernel/Makefile ARCH=aarch64 RPI5_NATIVE_BASE=0x40080000
|
||||
rpi5-rehearsal` links the same native image at virt's address (the linker script's base is now
|
||||
`RPI5_NATIVE_BASE`, 0x80000 by default) and boots it, Cortex-A76, one QEMU, foreground. It found
|
||||
three more, each of which would have stopped the Pi 5:
|
||||
- **The PL011's register shift**, mine (`c9519173`): `fdt_uart.c` gave a devicetree PL011 a shift
|
||||
of 0, but `console.c` numbers its registers by word -- the flag register was read at +6, not
|
||||
+0x18: an alignment fault on Device memory at the first character. The UEFI path never met it
|
||||
(it uses a built-in default with the right shift), and the host test asserted the wrong value.
|
||||
Shift 2 now; the test expects it.
|
||||
- **The GIC's address**: `apic.c` read the GIC's `reg` as two 64-bit cells with no translation --
|
||||
right only where the GIC is a child of the root. On the Pi 5 it is on `/soc` (one cell,
|
||||
`0x7fff9000`), `0x107fff9000` to the CPU. New `fdt_reg_address()` (`fdt.c`) reads a node's `reg`
|
||||
entry in its parent's cells and carries it up through every bus's `ranges`; the GIC lookup uses
|
||||
it, and accepts virt's `arm,cortex-a15-gic` too. Checked against the real Pi 5 devicetree:
|
||||
`tools/fdt_uart_test.c <dtb> pl011 0x107d001000 2 4 arm,gic-400 0x107fff9000 0x107fffa000`.
|
||||
- **No timer interrupt at EL2**: with `HCR_EL2.IMO/FMO/AMO` clear an IRQ targets EL1 and is never
|
||||
taken while the CPU runs at EL2 -- "Heartbeat: 0 ticks". The entry stub sets them at EL2. The
|
||||
UEFI path runs at EL1 and never met it.
|
||||
|
||||
**Verified.** Rehearsal, final: POST 1052 passed, `PARITY:M7.1a word_count=526 ...
|
||||
hash=0x82f4ae7cb2e2d424` -- the same as the UEFI build -- the Tripod born, the heartbeat ticking,
|
||||
no exception (`logs/20261014-124530/aarch64-rpi5/`). Earlier rehearsal and the hand-run QEMU
|
||||
sessions that found the three are not logged (`-d int` to a scratch file); `logs/20261014-123129`
|
||||
is the first, silent, run. Not rehearsed: the mailbox and framebuffer (virt has neither), the Pi
|
||||
5's own UART and GIC addresses (the host test checks them against its devicetree), PCI (virt's
|
||||
needs ACPI; the Pi 5's is R4). The board image (`make boot_image TARGET=RASPI`) links at 0x80000
|
||||
and ends at 0x834000. Standard acceptance, all three ISAs: POST 1052 passed, same hash
|
||||
(`logs/20261014-125305`, `-125427`, `-125635`).
|
||||
|
||||
## XL. The USB controller found as real hardware has it (`boards/BRINGUP.md` A1, 2026-10-14)
|
||||
|
||||
Captain Bob, 2026-10-14: "start on A1". The xHCI driver matched QEMU's own controller only --
|
||||
vendor and device `1B36:000D`, on PCI bus 0, function 0 -- so no real board's controller was ever
|
||||
found, and with it no thumbdrive, no login, no keyboard to come.
|
||||
|
||||
**What a real controller needs, done:**
|
||||
- **Found by class**, `0x0C/0x03/0x30`, from any vendor: new `pci_find_class()` (`pci.c`) reads
|
||||
every bus, slot and function the configuration space reaches (port I/O on amd64, all 256 buses;
|
||||
through ECAM, the MCFG entry's bus range, now recorded). Real controllers sit behind bridges.
|
||||
- **Mapped at its real size**: new `pci_bar_size()` (the standard all-ones probe, decoding off
|
||||
meanwhile); never less than the old fixed 64 KiB.
|
||||
- **Taken from the firmware** (xHCI 1.2 section 4.22.1): through the USB Legacy Support extended
|
||||
capability, OS-owned set and BIOS-owned waited out for a second (taken regardless after, as
|
||||
Linux does), every SMI enable off and SMI status cleared. QEMU's controller has no such
|
||||
capability; a PC's BIOS, driving USB for its own setup screen, does.
|
||||
- **64-byte contexts** (`HCCPARAMS1.CSZ=1`) laid out, not refused: every context is 32 or 64 bytes
|
||||
apart (`xhci_ctx_bytes()`); a 64-byte context holds the same fields in its first 32 bytes, so the
|
||||
existing structs stand.
|
||||
- `XHCI_QEMU_ARGS` (`kernel/Makefile`) replaces the QEMU controller, to rehearse one placed as real
|
||||
hardware places it.
|
||||
|
||||
**Verified.** Test first: QEMU's NEC controller (`nec-usb-xhci`, vendor 1033) behind a PCIe root
|
||||
port on bus 1, Zuse's drive on it -- before, nothing attached and no `zuse@Hera` prompt
|
||||
(`logs/20261014-131238`); after, the drive attaches and Zuse is minted, on amd64 (`-131934`),
|
||||
aarch64 (`-132056`) and riscv64 (`-132257`). Standard acceptance with the usual controller, all
|
||||
three: POST 1052 passed, hash `0x82f4ae7cb2e2d424` unchanged (`-132431`, `-132548`, `-132746`);
|
||||
five identities hot-plugged, all attached (`-132912`).
|
||||
|
||||
**Not rehearsable, so unproven until the SER5:** the firmware handoff and 64-byte contexts --
|
||||
QEMU's controller has neither. **Still open:** one controller only -- the first found. A PC with
|
||||
several (the SER5 has more than one) drives that one's ports alone; the stick and keyboard must be
|
||||
in them until the driver runs several (`xhci_get_dev()` is a single controller throughout).
|
||||
|
||||
## XLI. A USB keyboard, a full one (`boards/BRINGUP.md` A3) -- and a hang on any PC without PS/2 (S3) (2026-10-14)
|
||||
|
||||
Captain Bob, 2026-10-14: "start on A3", then, mid-way: "use this keyboard as a target. for example
|
||||
include caps lock, numlock, keypad and arrow ... Note for `later`, let's build keyboard VM's"
|
||||
(recorded as a concept, nothing built).
|
||||
|
||||
**Built.**
|
||||
- **The device** (`xhci.c`): a configuration whose interface is HID / boot / keyboard (3/1/1) is
|
||||
taken as a keyboard, not refused as "not a drive": its first interrupt IN endpoint is configured
|
||||
(`xhci_cmd_configure_hid_endpoint()` -- interval converted from bInterval for full/low and high
|
||||
speed), `SET_CONFIGURATION`, then `SET_PROTOCOL(boot)` (a keyboard starts in report protocol),
|
||||
then one Normal TRB at a time on its ring; each report is read and the next queued, deferred like
|
||||
every doorbell in this driver. Unplugging forgets it. "USB keyboard ready" on the console.
|
||||
- **The keys** (`usb_kbd.c`): a boot report says which keys are held; the difference from the one
|
||||
before is the presses and releases, modifiers included, ErrorRollOver ignored. HID usage IDs
|
||||
become Linux keycodes -- the namespace the PS/2 and virtio keyboards already use -- for a full
|
||||
keyboard: the main block, F1-F12, Print Screen/Scroll Lock/Pause, the navigation block, arrows,
|
||||
Num Lock and the whole keypad. `sk_key_event_poll()` (`keyboard_words.c`) reads them first, on
|
||||
every ISA.
|
||||
- **What a key means** (`repl.c`, every keyboard alike): Caps Lock and Num Lock are toggles (Num
|
||||
Lock on at start); Caps Lock acts on letters, Shift reverses it; the keypad types `/ * - +` and
|
||||
Enter always, digits and `.` with Num Lock on, nothing with it off (navigation -- this REPL's
|
||||
line editor appends and backspaces only, so arrows and Home/End type nothing either); the 102nd
|
||||
key types `\` `|`. The lock state goes to a USB keyboard's lights by `SET_REPORT` on its next
|
||||
report.
|
||||
- **Speed**: one report at a time, serviced only on the once-a-second idle beat, lost keys -- the
|
||||
keyboard's own queue overflowed at typing speed (found by the test: of a typed line, only `1`
|
||||
arrived). While a USB keyboard runs, the console now services the event ring on every timer
|
||||
tick as it waits for a key.
|
||||
|
||||
**S3, found on the way -- a hang.** To have the USB keyboard be QEMU's only keyboard on amd64 the
|
||||
test turned the PS/2 controller off (`-machine i8042=off`), and the kernel hung at boot just after
|
||||
the I/O APIC: with no controller port 0x64 reads 0xFF, "output full" for ever, and `i8042_init()`'s
|
||||
drain never ended (nor would `i8042_drain_stale()`'s). A legacy-free PC -- quite possibly the SER5 --
|
||||
would have stopped there. Now: 0xFF means no controller, "i8042: no PS/2 controller -- keyboard by
|
||||
USB only", nothing more done to it; every drain bounded. With a controller, unchanged.
|
||||
|
||||
**Verified.** amd64 with the USB keyboard the only keyboard, typed over QMP (`logs/20261014-135243`):
|
||||
`1 2 + .` on the main keys and again on the keypad with keypad Enter -- `3` both times; Caps Lock,
|
||||
then `s" ab" type` typed in lower case -- the line reads `S" AB" TYPE` and prints `AB`; Num Lock
|
||||
off, keypad 7, Enter -- nothing typed. aarch64 and riscv64 (`-135420`, `-135629`): "USB keyboard
|
||||
ready" and the same three results -- there QEMU also has a virtio keyboard, so those runs show the
|
||||
USB keyboard configured, not which keyboard each key came through. The hang and its fix:
|
||||
`-134410` (stops after the I/O APIC), `-135022` (boots). Standard acceptance, all three ISAs: POST
|
||||
1052 passed, hash unchanged, PS/2 initialised as before on amd64 (`-135808`, `-135918`, `-140123`);
|
||||
five identities hot-plugged, all attached (`-140240`). Test first? No: this time the test was
|
||||
written after the code, its "before" being no keyboard support at all (`-134213`, where QMP could
|
||||
not reach the device, records the enumeration working).
|
||||
|
||||
**Limits, not hidden:** the first xHCI controller only (§XL); a keyboard whose first interface is
|
||||
not its keyboard is not used; no key repeat (a boot keyboard does not repeat, and nothing here
|
||||
does it for it); the lights are sent on the next report after a lock key, not at once.
|
||||
|
||||
## XLII. Every USB controller, not the first (`boards/BRINGUP.md` A1, the rest) (2026-10-14)
|
||||
|
||||
Captain Bob, 2026-10-14: "do multiple controllers" -- §XL's open item. A PC has several xHCI
|
||||
controllers, each with its own ports; only the first found was driven, so a stick or keyboard in
|
||||
another's ports was never seen.
|
||||
|
||||
**What assumed one controller, and now does not:**
|
||||
- `xhci.c`: one latched `g_xhci_dev` → a table of up to `XHCI_MAX_CONTROLLERS` (8);
|
||||
`xhci_poll_events()` services each in turn; `xhci_get_dev()` → `xhci_dev_count()` /
|
||||
`xhci_dev_at(i)`; `xhci_find_and_map(dev, index)` finds the index-th controller (1 when there is
|
||||
none). Everything per device was already per controller (`msc_slots`, the rings, the connect
|
||||
state machine, the BOT state).
|
||||
- `kernel_main.c`: brings up controller 0, 1, ... until there is none; one that fails is skipped.
|
||||
- `repl.c` and `blkio_usb.c`: their per-slot arrays were indexed by slot ID alone -- but a slot ID is
|
||||
a controller's own, so slot 1 on two controllers would have been one entry. Now one set per
|
||||
controller (`g_usb_ctrl[]`; `blkio_usb.c` finds its set by the controller's pointer); the attach
|
||||
acknowledgement looks the device up across all of them.
|
||||
- `usb_kbd.c`: one "previous report" and one "lights sent" for every keyboard would have diffed two
|
||||
keyboards against each other. Both are each keyboard's own now (in its slot); a keyboard that
|
||||
goes releases whatever it still held (no Shift stuck down after unplugging).
|
||||
|
||||
**Verified.** Test first: amd64, no PS/2, Zuse's drive on the usual controller, a second (NEC,
|
||||
behind a root port) with the USB keyboard and identity `00` -- before, only Zuse attached
|
||||
(`logs/20261014-140826`); after, the keyboard types (`3`, `3`, `AB`), `00` attaches, Zuse is confirmed
|
||||
(`-141442`) -- both controllers with a device in slot 1, the collision case. Four identities
|
||||
hot-plugged onto the second controller all attach, and unplugging one detaches that one
|
||||
(`-141621`). aarch64 and riscv64, the same two-controller boot: all the same results (`-141756`,
|
||||
`-141953`). Standard acceptance, all three: POST 1052, hash unchanged (`-142120`, `-142237`,
|
||||
`-142449`); five identities hot-plugged on the first controller, all attached (`-142606`).
|
||||
|
||||
## XLIII. Both systems on every board image, chosen at boot (`boards/BRINGUP.md` A6) (2026-10-14)
|
||||
|
||||
Captain Bob, 2026-10-13, ruled the boards carry "both, switchable"; asked 2026-10-14 where the
|
||||
switch is: **at boot, one image** -- a word in the boot configuration, v3 as built.
|
||||
|
||||
**Built.**
|
||||
- `STARFORTH_V4=1` already compiled the v4 engine in; `kernel_main` then ran v4 unconditionally.
|
||||
Now it runs v4 only if the boot arguments say `system=v4`, or say nothing and the build's
|
||||
default is v4 (`SK_V4_DEFAULT`, from `kernel/Makefile`'s `V4_DEFAULT`: 1 for a plain
|
||||
`STARFORTH_V4=1` build, as before, so every v4 QEMU boot and test is unchanged). Otherwise v3,
|
||||
which is compiled in alongside, runs. A kernel without v4 asked for it says so and runs v3. The
|
||||
boot prints the choice and why: "System: StarForth v4 (system=v4)", "... (this build's
|
||||
default)", ...
|
||||
- `cmdline.c`: `system=v3` / `system=v4` (also `--system=`), a later one winning; anything else is
|
||||
ignored, as every unknown argument is.
|
||||
- `make boot_image`: `STARFORTH_V4=1 V4_DEFAULT=0` -- both systems, v3 unless asked -- and the
|
||||
boot arguments file always written, `system=v3` first: `starforth.cfg` on the ESP (SER5, Mars),
|
||||
`cmdline.txt` on the Pi 5's card (the firmware hands it over as the devicetree's `bootargs`).
|
||||
- `make boot_image` also cleans its ISA's kernel objects first: they are shared with `make qemu`
|
||||
and make does not see changed compile flags. Found doing it: the clean was handed the root's
|
||||
`TARGET=SER5` and removed `build/amd64/SER5`, nothing -- the first SER5 image carried the v4
|
||||
engine but a `kernel_main` compiled without it. Now `TARGET=kernel`; all three images checked to
|
||||
carry both.
|
||||
|
||||
**Verified.** Board-style build (both, v3 default), each ISA: no argument -- v3, POST 1052, hash
|
||||
unchanged; `system=v4` -- v4, `PARITY:V4_POST tests=538 pass=538`, `dict_hash=0xe5a57f3eb72ff94a`
|
||||
(amd64 `logs/20261014-144027`, `-144141`; aarch64 `-144411`, `-144604`; riscv64 `-144934`,
|
||||
`-145108`). A plain `STARFORTH_V4=1` build still boots v4 by default (`-145331`); a v3-only kernel
|
||||
asked for v4 says so and runs v3 (`-145550`). The SER5 image itself, booted from its own disk under
|
||||
OVMF (`logs/20261014-ser5-image/`): v3 as built; after changing the one word in `starforth.cfg` on
|
||||
it, v4. The Pi 5 and Mars images: built, their `cmdline.txt` / `starforth.cfg` read back from the
|
||||
image, both systems found in their kernels; not booted (no QEMU model for either). Standard
|
||||
acceptance, all three ISAs: unchanged (`-150651`, `-150801`, `-151007`).
|
||||
|
||||
**XLIII, revised the same day -- v4 is the default build.** Captain Bob, 2026-10-14: "v4 is the
|
||||
default build", then "no, qemu to v4 too ... we are effectively trying to retire v3". Every kernel
|
||||
build now carries v4 and v3 and boots **v4**: `STARFORTH_V4` defaults on (Kconfig `default y`),
|
||||
`V4_DEFAULT=1` everywhere, and the board images write `system=v4` into `starforth.cfg` /
|
||||
`cmdline.txt`. `system=v3` is the one word that boots v3; `STARFORTH_V4=0` builds v3 alone. The
|
||||
acceptance rule (`.claude/CLAUDE.md`) became: the three ISAs as built (v4), and the 32-bit build,
|
||||
`make -C v4 test-32` ("the 32 bit build needs to go into the acceptance test too"). v3 is not part
|
||||
of it ("i don't care about v3"); it stays in the tree, `system=v3` still boots it. Verified: the three images rebuilt with `system=v4` in their boot files; the
|
||||
SER5 image under OVMF as built boots v4, and after changing the word, v3 (`logs/20261014-ser5-image/`).
|
||||
|
||||
|
||||
@@ -104,3 +104,66 @@ addressable VM other patrons talk to, rather than a bare C primitive anyone can
|
||||
- How this interacts with §IV.1's own still-open native-boot-flow work — a GPIO VM needs GPIO
|
||||
register addresses from the DTB the same way the rest of that bring-up does, so this idea
|
||||
isn't independent of that work, just downstream of it.
|
||||
|
||||
## 3. Information state over information moment (2026-10-16)
|
||||
|
||||
Raised in conversation with Captain Bob during MESH step 7 (`docs/v4.0.0/MESH.md` §9a) --
|
||||
theory stage, no code, no scope, deliberately not punch-listed yet.
|
||||
|
||||
**The idea, in his words:** "I actually have a theory about what information actually is; the
|
||||
temporal existence and not a moment." And: "What we have is a 'information state' over
|
||||
information moment. The question I will answer is that is there any advantage to this over a
|
||||
conventional OS." Said after "simple is the object."
|
||||
|
||||
**Where it came from.** Step 7 first handed a believed GONE on from inside the node that believed
|
||||
it, at that instant, on the stacks of whatever text it was in -- information as a moment. The final
|
||||
review found it could be lost at depth, and a node between texts could lose its values to a fault.
|
||||
The fix that was ruled (2026-10-16) makes the GONE a state: the kernel puts it on each node's
|
||||
wire, where it waits until the node takes it. The moment version needed depth sweeps and stack
|
||||
constants; the state version needs neither. The same shape runs through the design already:
|
||||
messages that wait on wires, not in nodes (7d); patrons that arrive and depart over time (the
|
||||
Stadium, `FABRIC-0.md`); K conserved, not sampled.
|
||||
|
||||
**The question he will answer:** is there any advantage to this over a conventional OS?
|
||||
|
||||
**As a null hypothesis** (phrased at his request, 2026-10-16; a starting form, to be sharpened
|
||||
before any experiment):
|
||||
|
||||
> **H0:** Delivering information to a computing element as *state* -- a fact that persists where
|
||||
> the element will take it, when it has the means to -- confers **no advantage** over delivering
|
||||
> it as a *moment* -- an event the element must act on at the instant it arrives, with whatever
|
||||
> resources it has then -- as a conventional OS does with signals and interrupts.
|
||||
>
|
||||
> **H1:** Delivery as state gives a measurable advantage on at least one of the measures below,
|
||||
> at a cost in the others that does not outweigh it.
|
||||
|
||||
Measures that would decide it, each the same for both forms on the same workload:
|
||||
1. **Loss:** events delivered that never took effect (believed but not acted on, coalesced,
|
||||
dropped).
|
||||
2. **Corruption under pressure:** faults, and state lost to them, when the receiver is short of the
|
||||
resources the event needs (here: stack depth; in general memory, time).
|
||||
3. **Variance:** the coefficient of variation of outcomes over repeated runs, and agreement of
|
||||
state hashes across machines.
|
||||
4. **Cost:** latency from delivery to effect, and the memory held by facts waiting.
|
||||
|
||||
H0 is rejected if state is better on 1, 2 or 3 beyond the measurement floor, with 4 within a bound
|
||||
fixed before the run. It stands if not. Either result is a result.
|
||||
|
||||
**Contrasts noted in the conversation, as starting points, not conclusions:**
|
||||
- A conventional OS delivers much information as moments: Unix signals run a handler at whatever
|
||||
instant they land, on the interrupted code's stack, may call only async-signal-safe functions,
|
||||
and plain signals arriving together coalesce -- the failure step 7's hand-on had. Interrupts,
|
||||
preemption points and callbacks share the shape.
|
||||
- What state may buy: no reentrancy class of bug (nothing runs on borrowed stack); nothing silently
|
||||
lost to timing (a fact persists until taken, or is refused at once and its sender told, 7d.1);
|
||||
reproducibility (state can be hashed and compared across machines, as `dict_hash` and K are);
|
||||
verifiability (state is what Isabelle reasons about; interleavings of moments are what make
|
||||
conventional kernels hard to prove).
|
||||
- What it costs: latency (a fact waits until it is taken), memory for the queues, and a policy for
|
||||
a full wire (today: refusal, or for the kernel's GONE, not told).
|
||||
- How it could be answered with evidence: the DoE apparatus -- the same workload with facts
|
||||
delivered as state and as interrupt-style moments, measuring lost events, variance (CV), and
|
||||
behaviour under pressure.
|
||||
|
||||
**Explicitly not decided:** what "information" means formally in this theory; whether it bears on
|
||||
the patent work; any experiment design. Captain Bob's question to answer, not yet scoped.
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
\part{Security and ACL Recipes}
|
||||
|
||||
\chapter{Word-Level ACL Basics}
|
||||
%% SOURCE: docs/working/architecture/03-architecture/word-acl/DESIGN.md
|
||||
%% SOURCE: docs/reference/word-acl/DESIGN.md
|
||||
%% TODO(bob): promote ACL recipe: loading ACL.4th, granting/revoking modes,
|
||||
%% TTL-based expiry. Do NOT draft independent claim language.
|
||||
\input{../scraps/architecture/03-architecture/word-acl/DESIGN}
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
\part{$2^7$ Factorial Campaign}
|
||||
|
||||
\chapter{Campaign Design}
|
||||
%% SOURCE: docs/working/experiments/02-experiments/factorial-doe/guide.md
|
||||
%% SOURCE: docs/working/archive/superseded/factorial-doe/guide.md
|
||||
%% docs/working/experiments/campaigns/doe_2x7/README.md
|
||||
\input{../scraps/experiments/02-experiments/factorial-doe/guide}
|
||||
\input{../scraps/experiments/02-experiments/factorial-doe/workflow}
|
||||
@@ -57,7 +57,7 @@
|
||||
\input{../scraps/experiments/campaigns/shape_validation/README}
|
||||
|
||||
\chapter{Incompatible Configurations}
|
||||
%% SOURCE: docs/working/experiments/02-experiments/factorial-doe/incompatible-configs.md
|
||||
%% SOURCE: docs/working/archive/superseded/factorial-doe/incompatible-configs.md
|
||||
\input{../scraps/experiments/02-experiments/factorial-doe/incompatible-configs}
|
||||
|
||||
\chapter{Campaign Results — 90 Runs}
|
||||
@@ -146,8 +146,8 @@
|
||||
\part{Supplementary Campaigns}
|
||||
|
||||
\chapter{Heartbeat DoE}
|
||||
%% SOURCE: docs/working/experiments/02-experiments/heartbeat-doe/design.md
|
||||
%% docs/working/experiments/02-experiments/heartbeat-doe/corrected-design.md
|
||||
%% SOURCE: docs/working/archive/superseded/heartbeat-doe-design.md
|
||||
%% docs/working/archive/superseded/heartbeat-doe-corrected-design.md
|
||||
\input{../scraps/experiments/02-experiments/heartbeat-doe/design}
|
||||
\input{../scraps/experiments/02-experiments/heartbeat-doe/corrected-design}
|
||||
\input{../scraps/experiments/02-experiments/heartbeat-doe/implementation-summary}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: architecture/03-architecture/adaptive-systems/loop-5-sketch
|
||||
%% SOURCE: docs/working/architecture/03-architecture/adaptive-systems/loop-5-sketch.md
|
||||
%% SOURCE: docs/working/archive/superseded/loop-5-sketch.md
|
||||
%% STATUS: WORKING
|
||||
%% FITS: dev-guide/ch-physics
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: architecture/03-architecture/hal/README
|
||||
%% SOURCE: docs/working/architecture/03-architecture/hal/README.md
|
||||
%% SOURCE: docs/working/archive/dead/hal-target-contract/README.md
|
||||
%% STATUS: WORKING
|
||||
%% FITS: dev-guide/ch-platform
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: architecture/03-architecture/hal/interfaces
|
||||
%% SOURCE: docs/working/architecture/03-architecture/hal/interfaces.md
|
||||
%% SOURCE: docs/working/archive/dead/hal-target-contract/interfaces.md
|
||||
%% STATUS: WORKING
|
||||
%% FITS: dev-guide/ch-platform
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: architecture/03-architecture/hal/migration-plan
|
||||
%% SOURCE: docs/working/architecture/03-architecture/hal/migration-plan.md
|
||||
%% SOURCE: docs/working/archive/dead/hal-target-contract/migration-plan.md
|
||||
%% STATUS: WORKING
|
||||
%% FITS: dev-guide/ch-platform
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: architecture/03-architecture/hal/overview
|
||||
%% SOURCE: docs/working/architecture/03-architecture/hal/overview.md
|
||||
%% SOURCE: docs/working/archive/dead/hal-target-contract/overview.md
|
||||
%% STATUS: WORKING
|
||||
%% FITS: dev-guide/ch-platform
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: architecture/03-architecture/hal/platform-implementations
|
||||
%% SOURCE: docs/working/architecture/03-architecture/hal/platform-implementations.md
|
||||
%% SOURCE: docs/working/archive/dead/hal-target-contract/platform-implementations.md
|
||||
%% STATUS: WORKING
|
||||
%% FITS: dev-guide/ch-platform
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: architecture/03-architecture/hal/starkernel-integration
|
||||
%% SOURCE: docs/working/architecture/03-architecture/hal/starkernel-integration.md
|
||||
%% SOURCE: docs/working/archive/dead/hal-target-contract/starkernel-integration.md
|
||||
%% STATUS: WORKING
|
||||
%% FITS: dev-guide/ch-platform
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: architecture/03-architecture/heartbeat-system/implementation-plan
|
||||
%% SOURCE: docs/working/architecture/03-architecture/heartbeat-system/implementation-plan.md
|
||||
%% SOURCE: docs/working/archive/superseded/heartbeat-rate-logging-plan.md
|
||||
%% STATUS: HISTORICAL
|
||||
%% FITS: dev-guide/ch-heartbeat
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: architecture/03-architecture/physics-engine/feedback-loops-analysis
|
||||
%% SOURCE: docs/working/architecture/03-architecture/physics-engine/feedback-loops-analysis.md
|
||||
%% SOURCE: docs/working/archive/superseded/feedback-loops-analysis.md
|
||||
%% STATUS: HISTORICAL
|
||||
%% FITS: dev-guide/ch-physics
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: architecture/03-architecture/physics-engine/metrics-and-knobs
|
||||
%% SOURCE: docs/working/architecture/03-architecture/physics-engine/metrics-and-knobs.md
|
||||
%% SOURCE: docs/working/archive/dead/metrics-and-knobs.md
|
||||
%% STATUS: WORKING
|
||||
%% FITS: dev-guide/ch-physics, cookbook/ch-physics
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: architecture/03-architecture/physics-engine/steady-state-machine
|
||||
%% SOURCE: docs/working/architecture/03-architecture/physics-engine/steady-state-machine.md
|
||||
%% SOURCE: docs/working/archive/superseded/steady-state-machine.md
|
||||
%% STATUS: CURRENT
|
||||
%% FITS: dev-guide/ch-physics
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: architecture/03-architecture/word-acl/DESIGN
|
||||
%% SOURCE: docs/working/architecture/03-architecture/word-acl/DESIGN.md
|
||||
%% SOURCE: docs/reference/word-acl/DESIGN.md
|
||||
%% STATUS: CURRENT
|
||||
%% FITS: dev-guide/ch-acl, cookbook/ch-acl
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: architecture/getting-started/quick-start/factorial-doe
|
||||
%% SOURCE: docs/working/architecture/getting-started/quick-start/factorial-doe.md
|
||||
%% SOURCE: docs/working/archive/superseded/factorial-doe/quick-start.md
|
||||
%% STATUS: CURRENT
|
||||
%% FITS: cookbook/ch-doe
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -36,7 +36,7 @@ The audit assigned priority as follows.
|
||||
\begin{itemize}
|
||||
\item Add missing \texttt{README} files to all numbered directories.
|
||||
\item Update \texttt{CLAUDE.md} to reflect HAL and StarKernel vision.
|
||||
\item Create \texttt{docs/03-architecture/README.md} as a system overview.
|
||||
\item Create \texttt{docs/working/archive/superseded/2026-08-tripod/03-architecture-README.md} as a system overview.
|
||||
\end{itemize}
|
||||
|
||||
\textbf{Medium priority:}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: experiments/02-experiments/L8_WIRING_PLAN
|
||||
%% SOURCE: docs/working/experiments/02-experiments/L8_WIRING_PLAN.md
|
||||
%% SOURCE: docs/working/archive/superseded/L8_WIRING_PLAN.md
|
||||
%% STATUS: HISTORICAL
|
||||
%% FITS: experiments/ch-l8
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: experiments/02-experiments/factorial-doe/guide
|
||||
%% SOURCE: docs/working/experiments/02-experiments/factorial-doe/guide.md
|
||||
%% SOURCE: docs/working/archive/superseded/factorial-doe/guide.md
|
||||
%% STATUS: CURRENT
|
||||
%% FITS: experiments/ch-factorial, cookbook/ch-doe
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: experiments/02-experiments/factorial-doe/incompatible-configs
|
||||
%% SOURCE: docs/working/experiments/02-experiments/factorial-doe/incompatible-configs.md
|
||||
%% SOURCE: docs/working/archive/superseded/factorial-doe/incompatible-configs.md
|
||||
%% STATUS: CURRENT
|
||||
%% FITS: experiments/ch-factorial
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: experiments/02-experiments/factorial-doe/index
|
||||
%% SOURCE: docs/working/experiments/02-experiments/factorial-doe/index.md
|
||||
%% SOURCE: docs/working/archive/superseded/factorial-doe/index.md
|
||||
%% STATUS: CURRENT
|
||||
%% FITS: experiments/ch-factorial
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: experiments/02-experiments/factorial-doe/workflow
|
||||
%% SOURCE: docs/working/experiments/02-experiments/factorial-doe/workflow.md
|
||||
%% SOURCE: docs/working/archive/superseded/factorial-doe/workflow.md
|
||||
%% STATUS: CURRENT
|
||||
%% FITS: experiments/ch-factorial, cookbook/ch-doe
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: experiments/02-experiments/heartbeat-doe/corrected-design
|
||||
%% SOURCE: docs/working/experiments/02-experiments/heartbeat-doe/corrected-design.md
|
||||
%% SOURCE: docs/working/archive/superseded/heartbeat-doe-corrected-design.md
|
||||
%% STATUS: WORKING
|
||||
%% FITS: experiments/ch-heartbeat
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: experiments/02-experiments/heartbeat-doe/design
|
||||
%% SOURCE: docs/working/experiments/02-experiments/heartbeat-doe/design.md
|
||||
%% SOURCE: docs/working/archive/superseded/heartbeat-doe-design.md
|
||||
%% STATUS: WORKING
|
||||
%% FITS: experiments/ch-heartbeat
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: hardware/platform-integration/L4RE_DICTIONARY_ALLOCATION
|
||||
%% SOURCE: docs/working/hardware/platform-integration/L4RE_DICTIONARY_ALLOCATION.adoc
|
||||
%% SOURCE: docs/working/archive/dead/l4re/L4RE_DICTIONARY_ALLOCATION.adoc
|
||||
%% STATUS: WORKING
|
||||
%% FITS: dev-guide/ch-l4re
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: hardware/platform-integration/L4RE_INTEGRATION
|
||||
%% SOURCE: docs/working/hardware/platform-integration/L4RE_INTEGRATION.adoc
|
||||
%% SOURCE: docs/working/archive/dead/l4re/L4RE_INTEGRATION.adoc
|
||||
%% STATUS: WORKING
|
||||
%% FITS: dev-guide/ch-l4re
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: hardware/platform-integration/l_4_re_blkio_endpoints
|
||||
%% SOURCE: docs/working/hardware/platform-integration/l_4_re_blkio_endpoints.adoc
|
||||
%% SOURCE: docs/working/archive/dead/l4re/l_4_re_blkio_endpoints.adoc
|
||||
%% STATUS: WORKING
|
||||
%% FITS: dev-guide/ch-l4re
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -40,7 +40,7 @@ They are deferred to a later, build-verified pass.
|
||||
\toprule
|
||||
Path & Description \\
|
||||
\midrule
|
||||
\texttt{docs/ontology.tex} / \texttt{.pdf} & Formal ontology source and compiled PDF; candidate for \texttt{formal/}. \\
|
||||
\texttt{docs/working/papers/ontology.tex} / \texttt{.pdf} & Formal ontology source and compiled PDF; candidate for \texttt{formal/}. \\
|
||||
\texttt{docs/ontology\_diagrams.dot} & Graphviz source for ontology diagrams. \\
|
||||
\texttt{docs/fig\_*.png} / \texttt{.svg} & Shared figure assets referenced by ontology and system narrative LaTeX. \\
|
||||
\bottomrule
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: papers/ONTOLOGY
|
||||
%% SOURCE: docs/working/papers/ONTOLOGY.md
|
||||
%% SOURCE: docs/reference/ONTOLOGY.md
|
||||
%% STATUS: CURRENT
|
||||
%% FITS: ssrn/ch-ontology, vol3-research/ch-ontology
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice; thermodynamic-as-metaphor framing preserved throughout
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% SCRAP: scratch/src/L4RE_INTEGRATION_TODO
|
||||
%% SOURCE: docs/working/scratch/src/L4RE_INTEGRATION_TODO.adoc
|
||||
%% SOURCE: docs/working/archive/dead/l4re/L4RE_INTEGRATION_TODO.adoc
|
||||
%% STATUS: HISTORICAL
|
||||
%% FITS: dev-guide/ch-l4re
|
||||
%% EDITORIAL: lifted — prose rewritten to press voice
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
%% SOURCE: docs/working/papers/published/James_Steady-State_Convergence_Adaptive_Runtime.pdf
|
||||
%% docs/working/papers/SSRN_companion/Math_Companion_SSRN.tex
|
||||
%% docs/working/papers/FORMAL_CLAIM_TABLE.md
|
||||
%% docs/working/papers/ONTOLOGY.md
|
||||
%% docs/reference/ONTOLOGY.md
|
||||
%% NOTE: The SSRN paper itself is a published PDF — it is NOT re-typeset here.
|
||||
%% This volume collects the companion material: Math Companion (full LaTeX),
|
||||
%% formal claim tables, ontology, and academic wording guidelines.
|
||||
@@ -84,7 +84,7 @@ The canonical paper PDF is at:
|
||||
\part{Ontology of Terms}
|
||||
|
||||
\chapter{Thermodynamic Metaphor Ontology}
|
||||
%% SOURCE: docs/working/papers/ONTOLOGY.md
|
||||
%% SOURCE: docs/reference/ONTOLOGY.md
|
||||
%% NOTE: Thermodynamic terms are modeling tools, not physics claims.
|
||||
%% Always introduce with domain qualifier: "using X as a proxy for Y, …"
|
||||
\input{../scraps/papers/ONTOLOGY}
|
||||
|
||||
@@ -22,7 +22,7 @@ Built via `make -C docs/formal vol2`; output lands at
|
||||
|
||||
## See also
|
||||
|
||||
- [`docs/lithosananke/README.md`](../../lithosananke/README.md) — the
|
||||
- [`docs/working/archive/historical/2026-10-lithosananke-orientation.md`](../../lithosananke/README.md) — the
|
||||
living kernel-branch documentation this volume draws from.
|
||||
- [`docs/formal/README.md`](../README.md) — the three research volumes
|
||||
this belongs to (with `vol1-vm-physics/` and `vol3-research/`).
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% Vol II, Chapter 3 — ACL and Security Model
|
||||
%% SOURCE: docs/working/architecture/03-architecture/word-acl/DESIGN.md
|
||||
%% SOURCE: docs/reference/word-acl/DESIGN.md
|
||||
%% .claude/CLAUDE.md (Word-Level ACL System section)
|
||||
%% capsules/ACL.4th, capsules/zuse.4th
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
\section{Two-Console Model}
|
||||
\label{vol2:sec:acl:consoles}
|
||||
|
||||
%% SOURCE: docs/working/architecture/03-architecture/word-acl/DESIGN.md
|
||||
%% SOURCE: docs/reference/word-acl/DESIGN.md
|
||||
%% TODO(bob): describe the two permanent console layers:
|
||||
%% - emergency console (ok>) — fault handler active
|
||||
%% - zuse console (zuse)ok>) — superuser authenticated
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%% Vol II, Chapter 4 — Platform Support
|
||||
%% SOURCE: docs/working/scratch/src/platform-integration/ (multiple .adoc files)
|
||||
%% docs/working/architecture/03-architecture/hal/ (HAL design — aspirational)
|
||||
%% docs/working/archive/dead/hal-target-contract/ (HAL design — aspirational)
|
||||
%% .claude/CLAUDE.md (Platform abstraction, build targets)
|
||||
|
||||
\chapter{Platform Support}
|
||||
@@ -43,7 +43,7 @@
|
||||
\section{Platform Abstraction Layer (HAL Target)}
|
||||
\label{vol2:sec:platforms:hal}
|
||||
|
||||
%% SOURCE: docs/working/architecture/03-architecture/hal/overview.md
|
||||
%% SOURCE: docs/working/archive/dead/hal-target-contract/overview.md
|
||||
%% IMPORTANT: the hal_* API described in the hal/ doc family is the TARGET
|
||||
%% design, not the current codebase. Current code uses sf_time_backend_t-style
|
||||
%% naming. This section describes the planned migration.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%% Vol III, Chapter 6 — Ontology of Thermodynamic Terms
|
||||
%% SOURCE: docs/working/papers/ONTOLOGY.md
|
||||
%% SOURCE: docs/reference/ONTOLOGY.md
|
||||
%% docs/working/papers/ONTOLOGY_README.md
|
||||
|
||||
\chapter{Ontology of Thermodynamic Terms}
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
# LithosAnanke Hardware Abstraction Layer (HAL)
|
||||
|
||||
This directory contains HAL documentation for the LithosAnanke kernel branch.
|
||||
|
||||
> **HISTORICAL — L4Re/Fiasco.OC**: L4Re references throughout this directory's docs describe a target that was a supported platform through mid-2026. L4Re support has since been removed as an active target — `src/platform/l4re/time.c` and related `#ifdef __l4__` code are retained for reference but no longer wired into any build.
|
||||
|
||||
---
|
||||
|
||||
## Document Overview
|
||||
|
||||
| Document | Purpose |
|
||||
|----------|---------|
|
||||
| [overview.md](overview.md) | HAL architecture and design principles |
|
||||
| [interfaces.md](interfaces.md) | HAL function specifications and contracts |
|
||||
| [lithosananke-integration.md](lithosananke-integration.md) | Kernel-specific HAL implementation |
|
||||
| [platform-implementations.md](platform-implementations.md) | How to implement HAL for a platform |
|
||||
| [migration-plan.md](migration-plan.md) | Migration from hosted to kernel |
|
||||
|
||||
---
|
||||
|
||||
## Reading Order
|
||||
|
||||
1. **overview.md** — Understand why HAL exists
|
||||
2. **interfaces.md** — Learn the contracts
|
||||
3. **lithosananke-integration.md** — See kernel implementation
|
||||
4. **platform-implementations.md** — Reference implementations
|
||||
|
||||
---
|
||||
|
||||
## HAL Subsystems
|
||||
|
||||
```
|
||||
hal_time.h — Monotonic time, timers
|
||||
hal_interrupt.h — IRQ management, ISR registration
|
||||
hal_memory.h — Allocation, page mapping
|
||||
hal_console.h — Character I/O (UART, framebuffer)
|
||||
hal_cpu.h — CPU ID, relax/halt, SMP
|
||||
hal_panic.h — Fatal error handling
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Current State (lithosananke branch)
|
||||
|
||||
The HAL is **partially implemented** in LithosAnanke:
|
||||
|
||||
| Subsystem | Status | Location |
|
||||
|-----------|--------|----------|
|
||||
| Time | Implemented | `src/starkernel/arch/amd64/timer.c` |
|
||||
| Interrupts | Implemented | `src/starkernel/arch/amd64/interrupts.c` |
|
||||
| Memory | Implemented | `src/starkernel/memory/` |
|
||||
| Console | Implemented | `src/starkernel/hal/console.c` |
|
||||
| CPU | Partial | `src/starkernel/arch/amd64/apic.c` |
|
||||
| Panic | Implemented | `src/starkernel/hal/hal.c` |
|
||||
|
||||
---
|
||||
|
||||
## Relationship to Hosted StarForth
|
||||
|
||||
The HAL enables the same VM code to run on:
|
||||
|
||||
- **Linux** (hosted, POSIX)
|
||||
- **LithosAnanke** (freestanding, bare metal)
|
||||
- **L4Re** (microkernel, optional)
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ StarForth VM + Physics Subsystems │
|
||||
│ (platform-agnostic) │
|
||||
├─────────────────────────────────────┤
|
||||
│ HAL Layer │
|
||||
├──────────┬──────────┬───────────────┤
|
||||
│ Linux │ L4Re │ LithosAnanke │
|
||||
│ (POSIX) │ (micro) │ (kernel) │
|
||||
└──────────┴──────────┴───────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## See Also
|
||||
|
||||
- [../README.md](../README.md) — LithosAnanke overview
|
||||
- [../ROADMAP.md](../ROADMAP.md) — Milestone roadmap
|
||||
- [../M7.1.md](../M7.1.md) — Init Capsule Architecture
|
||||
@@ -1,703 +0,0 @@
|
||||
# HAL Interface Specifications
|
||||
|
||||
## Overview
|
||||
|
||||
This document defines the **contract** for each HAL subsystem. These interfaces are platform-agnostic and must be implemented identically (semantically) on all platforms.
|
||||
|
||||
> **HISTORICAL — L4Re/Fiasco.OC**: L4Re references below describe a target that was a supported platform through mid-2026. L4Re support has since been removed as an active target — `src/platform/l4re/time.c` and related `#ifdef __l4__` code are retained for reference but no longer wired into any build.
|
||||
|
||||
**Critical:** These are not optional "convenience wrappers"—they are the **only** way VM and physics code access platform resources.
|
||||
|
||||
---
|
||||
|
||||
## 1. Time & Timers (`include/hal/hal_time.h`)
|
||||
|
||||
### Purpose
|
||||
Provide monotonic time, periodic/oneshot timers, and calibration for physics subsystems.
|
||||
|
||||
### Interface
|
||||
|
||||
```c
|
||||
#ifndef HAL_TIME_H
|
||||
#define HAL_TIME_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* Initialize time subsystem.
|
||||
* Must be called before any other hal_time_* functions.
|
||||
*
|
||||
* Responsibilities:
|
||||
* - Calibrate high-resolution timer (TSC, HPET, etc.)
|
||||
* - Validate monotonicity
|
||||
* - Set up timer interrupt sources (if needed)
|
||||
*
|
||||
* Error handling:
|
||||
* - hal_panic() if no suitable time source available
|
||||
* - hal_panic() if calibration fails
|
||||
*/
|
||||
void hal_time_init(void);
|
||||
|
||||
/**
|
||||
* Get current monotonic time in nanoseconds.
|
||||
*
|
||||
* Guarantees:
|
||||
* - MUST be monotonic (never goes backward)
|
||||
* - SHOULD have sub-microsecond resolution
|
||||
* - MUST be callable from interrupt context (ISR-safe)
|
||||
* - MUST be callable concurrently (thread-safe)
|
||||
*
|
||||
* Performance:
|
||||
* - Target: < 50 cycles on x86_64
|
||||
* - Acceptable: < 200 cycles
|
||||
*
|
||||
* Returns:
|
||||
* - Nanoseconds since arbitrary epoch (typically boot time)
|
||||
*/
|
||||
uint64_t hal_time_now_ns(void);
|
||||
|
||||
/**
|
||||
* Busy-wait delay for specified nanoseconds.
|
||||
* Used for calibration and short delays.
|
||||
*
|
||||
* Guarantees:
|
||||
* - MUST delay for at least `ns` nanoseconds
|
||||
* - MAY delay longer (but not by more than 10%)
|
||||
* - MUST be callable from interrupt context
|
||||
*
|
||||
* Parameters:
|
||||
* - ns: Nanoseconds to delay (0 = no delay)
|
||||
*
|
||||
* Notes:
|
||||
* - This is a busy-wait, not a sleep
|
||||
* - For delays > 1ms, prefer hal_timer_oneshot()
|
||||
*/
|
||||
void hal_time_delay_ns(uint64_t ns);
|
||||
|
||||
/**
|
||||
* Timer callback function type.
|
||||
*
|
||||
* Parameters:
|
||||
* - ctx: User-provided context pointer
|
||||
*
|
||||
* Context:
|
||||
* - MAY be called from interrupt context (ISR)
|
||||
* - MUST NOT block or sleep
|
||||
* - MUST complete quickly (< 10µs target)
|
||||
*/
|
||||
typedef void (*hal_timer_callback_t)(void *ctx);
|
||||
|
||||
/**
|
||||
* Schedule a oneshot timer to fire after specified nanoseconds.
|
||||
*
|
||||
* Guarantees:
|
||||
* - Callback will fire at least `ns` nanoseconds in the future
|
||||
* - MAY fire up to 10% late (jitter allowed)
|
||||
* - Callback runs in interrupt context (ISR)
|
||||
*
|
||||
* Parameters:
|
||||
* - ns: Nanoseconds until callback fires (0 = ASAP)
|
||||
* - callback: Function to call when timer fires
|
||||
* - ctx: User context passed to callback
|
||||
*
|
||||
* Error handling:
|
||||
* - Returns 0 on success
|
||||
* - Returns -1 if timer resources exhausted
|
||||
*
|
||||
* Concurrency:
|
||||
* - Thread-safe (can be called from multiple threads)
|
||||
* - NOT reentrant from same timer callback
|
||||
*/
|
||||
int hal_timer_oneshot(uint64_t ns, hal_timer_callback_t callback, void *ctx);
|
||||
|
||||
/**
|
||||
* Schedule a periodic timer to fire every `period_ns` nanoseconds.
|
||||
*
|
||||
* Guarantees:
|
||||
* - Callback will fire repeatedly at ~period_ns intervals
|
||||
* - Jitter: < 10% of period (target: < 1%)
|
||||
* - Callback runs in interrupt context (ISR)
|
||||
* - Timer continues until hal_timer_cancel() called
|
||||
*
|
||||
* Parameters:
|
||||
* - period_ns: Period in nanoseconds (minimum: 1000ns = 1µs)
|
||||
* - callback: Function to call on each period
|
||||
* - ctx: User context passed to callback
|
||||
*
|
||||
* Returns:
|
||||
* - Timer ID (> 0) on success
|
||||
* - -1 if timer resources exhausted
|
||||
* - -2 if period_ns < minimum
|
||||
*
|
||||
* Notes:
|
||||
* - This is the PRIMARY mechanism for heartbeat ISR
|
||||
* - Platform MUST minimize jitter for experimental validity
|
||||
*/
|
||||
int hal_timer_periodic(uint64_t period_ns, hal_timer_callback_t callback, void *ctx);
|
||||
|
||||
/**
|
||||
* Cancel a periodic timer.
|
||||
*
|
||||
* Parameters:
|
||||
* - timer_id: ID returned from hal_timer_periodic()
|
||||
*
|
||||
* Guarantees:
|
||||
* - Callback will not fire after this call returns
|
||||
* - Safe to call even if timer already fired or was cancelled
|
||||
*
|
||||
* Returns:
|
||||
* - 0 on success
|
||||
* - -1 if timer_id invalid
|
||||
*/
|
||||
int hal_timer_cancel(int timer_id);
|
||||
|
||||
/**
|
||||
* Get timer frequency in Hz.
|
||||
* Used for diagnostics and experiment metadata.
|
||||
*
|
||||
* Returns:
|
||||
* - Frequency of underlying time source (e.g., TSC frequency)
|
||||
* - 0 if frequency is variable or unknown
|
||||
*/
|
||||
uint64_t hal_time_frequency_hz(void);
|
||||
|
||||
#endif /* HAL_TIME_H */
|
||||
```
|
||||
|
||||
### Platform Implementation Notes
|
||||
|
||||
**Linux (`platform/linux/hal_time.c`):**
|
||||
- `hal_time_now_ns()` → `clock_gettime(CLOCK_MONOTONIC)`
|
||||
- `hal_timer_periodic()` → `timer_create()` with `SIGRTMIN` + signal handler
|
||||
- Challenge: Signal-based timers have ~1-10µs latency jitter
|
||||
|
||||
**L4Re (`platform/l4re/hal_time.c`):**
|
||||
- `hal_time_now_ns()` → `l4re_kip_clock()`
|
||||
- `hal_timer_periodic()` → L4Re IPC-based timer + IRQ object
|
||||
- Challenge: IPC overhead, but lower jitter than Linux
|
||||
|
||||
**Kernel (`platform/kernel/hal_time.c`):**
|
||||
- `hal_time_now_ns()` → `rdtsc()` calibrated against HPET
|
||||
- `hal_timer_periodic()` → APIC timer interrupt
|
||||
- Challenge: TSC drift on old hardware, calibration complexity
|
||||
|
||||
---
|
||||
|
||||
## 2. Interrupts (`include/hal/hal_interrupt.h`)
|
||||
|
||||
### Purpose
|
||||
Enable/disable interrupts, register ISRs, query interrupt context.
|
||||
|
||||
### Interface
|
||||
|
||||
```c
|
||||
#ifndef HAL_INTERRUPT_H
|
||||
#define HAL_INTERRUPT_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* Initialize interrupt subsystem.
|
||||
* Must be called before any other hal_interrupt_* functions.
|
||||
*
|
||||
* Responsibilities:
|
||||
* - Set up interrupt controller (PIC/APIC on x86_64)
|
||||
* - Initialize IDT (on kernel platforms)
|
||||
* - Prepare for ISR registration
|
||||
*
|
||||
* Error handling:
|
||||
* - hal_panic() if interrupt controller unavailable
|
||||
*/
|
||||
void hal_interrupt_init(void);
|
||||
|
||||
/**
|
||||
* Enable interrupts globally.
|
||||
*
|
||||
* Guarantees:
|
||||
* - Interrupts will be delivered after this call
|
||||
* - Safe to call multiple times (idempotent)
|
||||
* - NOT callable from interrupt context
|
||||
*
|
||||
* Notes:
|
||||
* - On x86_64 kernel: sti
|
||||
* - On Linux: no-op (interrupts always enabled)
|
||||
*/
|
||||
void hal_irq_enable(void);
|
||||
|
||||
/**
|
||||
* Disable interrupts globally.
|
||||
*
|
||||
* Guarantees:
|
||||
* - Interrupts will NOT be delivered after this call
|
||||
* - Safe to call multiple times (idempotent)
|
||||
* - Callable from interrupt context
|
||||
*
|
||||
* Returns:
|
||||
* - Previous interrupt state (for hal_irq_restore)
|
||||
*
|
||||
* Notes:
|
||||
* - On x86_64 kernel: cli
|
||||
* - On Linux: no-op (interrupts always enabled)
|
||||
*/
|
||||
unsigned long hal_irq_disable(void);
|
||||
|
||||
/**
|
||||
* Restore previous interrupt state.
|
||||
*
|
||||
* Parameters:
|
||||
* - state: Value returned from hal_irq_disable()
|
||||
*
|
||||
* Use case:
|
||||
* unsigned long flags = hal_irq_disable();
|
||||
* // critical section
|
||||
* hal_irq_restore(flags);
|
||||
*/
|
||||
void hal_irq_restore(unsigned long state);
|
||||
|
||||
/**
|
||||
* Interrupt service routine function type.
|
||||
*
|
||||
* Parameters:
|
||||
* - irq: IRQ number that triggered
|
||||
* - ctx: User-provided context pointer
|
||||
*
|
||||
* Context:
|
||||
* - ALWAYS called from interrupt context
|
||||
* - MUST NOT block or sleep
|
||||
* - MUST complete quickly (< 10µs target, < 100µs acceptable)
|
||||
* - MUST NOT call non-ISR-safe HAL functions
|
||||
*/
|
||||
typedef void (*hal_isr_t)(unsigned int irq, void *ctx);
|
||||
|
||||
/**
|
||||
* Register an interrupt service routine.
|
||||
*
|
||||
* Parameters:
|
||||
* - irq: IRQ number to register (platform-specific numbering)
|
||||
* - isr: Function to call when IRQ fires
|
||||
* - ctx: User context passed to ISR
|
||||
*
|
||||
* Guarantees:
|
||||
* - ISR will be called when IRQ fires
|
||||
* - Only one ISR per IRQ (replaces previous if registered)
|
||||
* - ISR runs with interrupts disabled (not reentrant)
|
||||
*
|
||||
* Returns:
|
||||
* - 0 on success
|
||||
* - -1 if IRQ number invalid
|
||||
* - -2 if ISR registration failed
|
||||
*
|
||||
* Notes:
|
||||
* - Used by hal_timer_periodic() internally
|
||||
* - Used by device drivers for hardware IRQs
|
||||
*/
|
||||
int hal_irq_register(unsigned int irq, hal_isr_t isr, void *ctx);
|
||||
|
||||
/**
|
||||
* Unregister an interrupt service routine.
|
||||
*
|
||||
* Parameters:
|
||||
* - irq: IRQ number to unregister
|
||||
*
|
||||
* Returns:
|
||||
* - 0 on success
|
||||
* - -1 if IRQ was not registered
|
||||
*/
|
||||
int hal_irq_unregister(unsigned int irq);
|
||||
|
||||
/**
|
||||
* Check if currently executing in interrupt context.
|
||||
*
|
||||
* Returns:
|
||||
* - 1 if in interrupt context (ISR)
|
||||
* - 0 if in normal execution context
|
||||
*
|
||||
* Use case:
|
||||
* - Validate ISR-only functions (e.g., heartbeat sampling)
|
||||
* - Conditional behavior (ISR vs. normal path)
|
||||
*
|
||||
* Performance:
|
||||
* - MUST be fast (< 10 cycles)
|
||||
* - Often implemented as checking a per-CPU flag
|
||||
*/
|
||||
int hal_in_interrupt_context(void);
|
||||
|
||||
#endif /* HAL_INTERRUPT_H */
|
||||
```
|
||||
|
||||
### Platform Implementation Notes
|
||||
|
||||
**Linux:**
|
||||
- `hal_irq_enable/disable()` → no-op (can't disable signals)
|
||||
- `hal_irq_register()` → `sigaction()` + signal handler
|
||||
- `hal_in_interrupt_context()` → thread-local flag set by signal handler
|
||||
|
||||
**Kernel:**
|
||||
- `hal_irq_enable/disable()` → `sti`/`cli` (x86_64)
|
||||
- `hal_irq_register()` → IDT entry + APIC configuration
|
||||
- `hal_in_interrupt_context()` → check per-CPU interrupt nesting count
|
||||
|
||||
---
|
||||
|
||||
## 3. Memory (`include/hal/hal_memory.h`)
|
||||
|
||||
### Purpose
|
||||
Allocate/free memory, map pages, manage heap.
|
||||
|
||||
### Interface
|
||||
|
||||
```c
|
||||
#ifndef HAL_MEMORY_H
|
||||
#define HAL_MEMORY_H
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* Initialize memory subsystem.
|
||||
* Must be called before any other hal_mem_* functions.
|
||||
*
|
||||
* Responsibilities:
|
||||
* - Set up heap allocator
|
||||
* - Initialize page tables (kernel platforms)
|
||||
* - Parse memory map (kernel platforms)
|
||||
*
|
||||
* Error handling:
|
||||
* - hal_panic() if insufficient memory
|
||||
*/
|
||||
void hal_mem_init(void);
|
||||
|
||||
/**
|
||||
* Allocate memory from heap.
|
||||
*
|
||||
* Parameters:
|
||||
* - size: Bytes to allocate (0 = returns NULL)
|
||||
*
|
||||
* Guarantees:
|
||||
* - Returns aligned pointer (at least 8-byte aligned)
|
||||
* - Memory is zero-initialized
|
||||
* - Thread-safe (can be called concurrently)
|
||||
* - NOT callable from interrupt context
|
||||
*
|
||||
* Returns:
|
||||
* - Pointer to allocated memory
|
||||
* - NULL if allocation failed
|
||||
*
|
||||
* Notes:
|
||||
* - On Linux: wrapper around malloc()
|
||||
* - On kernel: custom heap allocator (kmalloc)
|
||||
*/
|
||||
void *hal_mem_alloc(size_t size);
|
||||
|
||||
/**
|
||||
* Free memory allocated by hal_mem_alloc().
|
||||
*
|
||||
* Parameters:
|
||||
* - ptr: Pointer returned from hal_mem_alloc() (NULL = no-op)
|
||||
*
|
||||
* Guarantees:
|
||||
* - Thread-safe
|
||||
* - NOT callable from interrupt context
|
||||
* - Safe to call with NULL
|
||||
*/
|
||||
void hal_mem_free(void *ptr);
|
||||
|
||||
/**
|
||||
* Allocate contiguous physical pages.
|
||||
* Used for DMA buffers, page tables, large allocations.
|
||||
*
|
||||
* Parameters:
|
||||
* - count: Number of pages to allocate (page size is platform-specific)
|
||||
*
|
||||
* Returns:
|
||||
* - Physical address of first page
|
||||
* - 0 if allocation failed
|
||||
*
|
||||
* Notes:
|
||||
* - Pages are NOT mapped into virtual address space
|
||||
* - Caller must call hal_mem_map() to access
|
||||
* - On Linux: may use mmap() with MAP_ANONYMOUS
|
||||
* - On kernel: physical memory manager (PMM)
|
||||
*/
|
||||
uint64_t hal_mem_alloc_pages(size_t count);
|
||||
|
||||
/**
|
||||
* Free physical pages allocated by hal_mem_alloc_pages().
|
||||
*
|
||||
* Parameters:
|
||||
* - paddr: Physical address returned from hal_mem_alloc_pages()
|
||||
* - count: Number of pages to free
|
||||
*/
|
||||
void hal_mem_free_pages(uint64_t paddr, size_t count);
|
||||
|
||||
/**
|
||||
* Map physical memory into virtual address space.
|
||||
*
|
||||
* Parameters:
|
||||
* - vaddr: Virtual address to map (must be page-aligned)
|
||||
* - paddr: Physical address to map (must be page-aligned)
|
||||
* - size: Size in bytes (must be page-multiple)
|
||||
* - flags: Mapping flags (HAL_MEM_*)
|
||||
*
|
||||
* Returns:
|
||||
* - 0 on success
|
||||
* - -1 if mapping failed
|
||||
*
|
||||
* Flags:
|
||||
* - HAL_MEM_READ: Readable
|
||||
* - HAL_MEM_WRITE: Writable
|
||||
* - HAL_MEM_EXEC: Executable
|
||||
* - HAL_MEM_NOCACHE: Uncached (for MMIO)
|
||||
*
|
||||
* Notes:
|
||||
* - On Linux: no-op (identity mapping assumed)
|
||||
* - On kernel: update page tables, flush TLB
|
||||
*/
|
||||
int hal_mem_map(uint64_t vaddr, uint64_t paddr, size_t size, unsigned int flags);
|
||||
|
||||
/* Mapping flags */
|
||||
#define HAL_MEM_READ (1 << 0)
|
||||
#define HAL_MEM_WRITE (1 << 1)
|
||||
#define HAL_MEM_EXEC (1 << 2)
|
||||
#define HAL_MEM_NOCACHE (1 << 3)
|
||||
|
||||
/**
|
||||
* Get page size in bytes.
|
||||
*
|
||||
* Returns:
|
||||
* - Page size (typically 4096 on x86_64)
|
||||
*/
|
||||
size_t hal_mem_page_size(void);
|
||||
|
||||
#endif /* HAL_MEMORY_H */
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Console (`include/hal/hal_console.h`)
|
||||
|
||||
### Purpose
|
||||
Character I/O for REPL and diagnostics.
|
||||
|
||||
### Interface
|
||||
|
||||
```c
|
||||
#ifndef HAL_CONSOLE_H
|
||||
#define HAL_CONSOLE_H
|
||||
|
||||
/**
|
||||
* Initialize console subsystem.
|
||||
* Must be called before any other hal_console_* functions.
|
||||
*
|
||||
* Responsibilities:
|
||||
* - Initialize UART (kernel platforms)
|
||||
* - Set up framebuffer (if available)
|
||||
* - Configure terminal settings (Linux)
|
||||
*
|
||||
* Error handling:
|
||||
* - hal_panic() if no console available
|
||||
*/
|
||||
void hal_console_init(void);
|
||||
|
||||
/**
|
||||
* Write a single character to console.
|
||||
*
|
||||
* Parameters:
|
||||
* - c: Character to write
|
||||
*
|
||||
* Guarantees:
|
||||
* - Character will be visible on console
|
||||
* - Blocking (waits if output buffer full)
|
||||
* - Callable from interrupt context (for panic messages)
|
||||
*
|
||||
* Performance:
|
||||
* - May be slow (UART is ~1µs per char)
|
||||
* - Buffering recommended for bulk output
|
||||
*/
|
||||
void hal_console_putc(char c);
|
||||
|
||||
/**
|
||||
* Write a null-terminated string to console.
|
||||
*
|
||||
* Parameters:
|
||||
* - s: String to write (NULL = no-op)
|
||||
*
|
||||
* Notes:
|
||||
* - Convenience wrapper around hal_console_putc()
|
||||
*/
|
||||
void hal_console_puts(const char *s);
|
||||
|
||||
/**
|
||||
* Read a single character from console.
|
||||
*
|
||||
* Guarantees:
|
||||
* - Blocking (waits until character available)
|
||||
* - NOT callable from interrupt context
|
||||
*
|
||||
* Returns:
|
||||
* - Character read (0-255)
|
||||
* - -1 on error or EOF
|
||||
*/
|
||||
int hal_console_getc(void);
|
||||
|
||||
/**
|
||||
* Check if input is available (non-blocking).
|
||||
*
|
||||
* Returns:
|
||||
* - 1 if character available (hal_console_getc() will not block)
|
||||
* - 0 if no character available
|
||||
*/
|
||||
int hal_console_has_input(void);
|
||||
|
||||
#endif /* HAL_CONSOLE_H */
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. CPU (`include/hal/hal_cpu.h`)
|
||||
|
||||
### Purpose
|
||||
CPU identification, relax/halt, SMP coordination.
|
||||
|
||||
### Interface
|
||||
|
||||
```c
|
||||
#ifndef HAL_CPU_H
|
||||
#define HAL_CPU_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* Initialize CPU subsystem.
|
||||
* Must be called before any other hal_cpu_* functions.
|
||||
*
|
||||
* Responsibilities:
|
||||
* - Detect CPU features (SSE, AVX, etc.)
|
||||
* - Set up per-CPU storage
|
||||
* - Bring up secondary CPUs (SMP)
|
||||
*
|
||||
* Error handling:
|
||||
* - hal_panic() if CPU unsupported
|
||||
*/
|
||||
void hal_cpu_init(void);
|
||||
|
||||
/**
|
||||
* Get current CPU ID.
|
||||
*
|
||||
* Returns:
|
||||
* - CPU ID (0 = boot processor, 1+ = application processors)
|
||||
*
|
||||
* Guarantees:
|
||||
* - Callable from interrupt context
|
||||
* - Fast (< 10 cycles)
|
||||
*
|
||||
* Notes:
|
||||
* - On x86_64 kernel: APIC ID
|
||||
* - On Linux: thread ID (not true CPU ID)
|
||||
*/
|
||||
unsigned int hal_cpu_id(void);
|
||||
|
||||
/**
|
||||
* Hint to CPU to relax (pause in spin-wait loop).
|
||||
*
|
||||
* Guarantees:
|
||||
* - Callable from interrupt context
|
||||
* - No functional effect (pure performance hint)
|
||||
*
|
||||
* Notes:
|
||||
* - On x86_64: pause instruction
|
||||
* - On ARM: yield instruction
|
||||
* - On Linux: sched_yield()
|
||||
*/
|
||||
void hal_cpu_relax(void);
|
||||
|
||||
/**
|
||||
* Halt CPU until next interrupt.
|
||||
*
|
||||
* Guarantees:
|
||||
* - CPU enters low-power state
|
||||
* - Wakes on next interrupt
|
||||
* - NOT callable from interrupt context
|
||||
*
|
||||
* Notes:
|
||||
* - On x86_64 kernel: hlt instruction
|
||||
* - On Linux: select() or nanosleep()
|
||||
*/
|
||||
void hal_cpu_halt(void);
|
||||
|
||||
/**
|
||||
* Get number of CPUs in system.
|
||||
*
|
||||
* Returns:
|
||||
* - Number of CPUs (1 = single-core, 2+ = multi-core)
|
||||
*/
|
||||
unsigned int hal_cpu_count(void);
|
||||
|
||||
#endif /* HAL_CPU_H */
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. Panic/Error Handling (`include/hal/hal_panic.h`)
|
||||
|
||||
### Purpose
|
||||
Fatal error handling (system halt or abort).
|
||||
|
||||
### Interface
|
||||
|
||||
```c
|
||||
#ifndef HAL_PANIC_H
|
||||
#define HAL_PANIC_H
|
||||
|
||||
/**
|
||||
* Fatal error: print message and halt system.
|
||||
*
|
||||
* Parameters:
|
||||
* - msg: Error message (NULL = "panic")
|
||||
*
|
||||
* Guarantees:
|
||||
* - NEVER returns
|
||||
* - Message printed to console (if available)
|
||||
* - System halted (kernel) or abort() (hosted)
|
||||
* - Callable from interrupt context
|
||||
*
|
||||
* Notes:
|
||||
* - Use for unrecoverable errors only
|
||||
* - On kernel: disable interrupts + hlt loop
|
||||
* - On Linux: fprintf(stderr) + abort()
|
||||
*/
|
||||
void hal_panic(const char *msg) __attribute__((noreturn));
|
||||
|
||||
#endif /* HAL_PANIC_H */
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Interface Summary
|
||||
|
||||
| Subsystem | Key Functions | ISR-Safe | Thread-Safe |
|
||||
|-----------|---------------|----------|-------------|
|
||||
| **Time** | `hal_time_now_ns()` | ✅ | ✅ |
|
||||
| | `hal_timer_periodic()` | ❌ | ✅ |
|
||||
| **Interrupt** | `hal_in_interrupt_context()` | ✅ | ✅ |
|
||||
| | `hal_irq_disable()` | ✅ | ✅ |
|
||||
| **Memory** | `hal_mem_alloc()` | ❌ | ✅ |
|
||||
| | `hal_mem_map()` | ❌ | ⚠️ |
|
||||
| **Console** | `hal_console_putc()` | ✅ | ⚠️ |
|
||||
| | `hal_console_getc()` | ❌ | ❌ |
|
||||
| **CPU** | `hal_cpu_id()` | ✅ | ✅ |
|
||||
| | `hal_cpu_relax()` | ✅ | ✅ |
|
||||
|
||||
**Legend:**
|
||||
- ✅ = Safe
|
||||
- ❌ = Unsafe
|
||||
- ⚠️ = Platform-dependent
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
See companion documentation:
|
||||
- `platform-implementations.md` - How to implement HAL for a platform
|
||||
- `migration-plan.md` - Refactoring existing code to use HAL
|
||||
- `lithosananke-integration.md` - LithosAnanke-specific HAL implementation
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user