feat(v4.0.0): a node is sent text as a message and sends back what it prints

MESH.md step 3.  The ports are the transport; the message is what is
transported: to, from, type, heat and TTL, ACL tag, sequence, length, then
text four characters to a word.

- quit.v4: a node with nothing to do is blocked reading "any port"; text
  for it is interpreted; (FINISH) sends what it printed and then how the
  text ended, and it waits again
- core.v4: EMIT keeps what is printed, (FLUSH-OUT) and (HDR) send it to the
  sender on the port the message came on.  EMIT still needs one free data
  cell and no more; it works on the return stack and in A and B
- message.h/.c: the same format for whatever is on a port and is not a node
- boot.c: the boot is the node's console on port 1 and its kernel on port 0
- the prompt tests are a console that speaks messages
- gone: v4_line_begin, v4_line_done, v4_line_status; writing a node's input
  buffer and setting its P from outside; any use of CONSOLE-TX

Verified: make -C v4 test (test_host_quit.c 1283 checks, the full-stack
figures unchanged) and make -C v4 sanitize pass; hosted-check passes on
three ISAs with POST 550 of 550; clean qemu with STARFORTH_V4=1 passes POST
and answers lines typed at each prompt on amd64, aarch64 and riscv64
(logs/20261006-110551, -111621, -111341).  -110837 is an aarch64 run ended
by the test wrapper's limit while still in UEFI firmware; it shows nothing
about v4.

Not done: KEY, EXPECT and QUERY still read the console's input registers;
a message not for this node is let go (step 4).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
rajames
2026-10-06 11:19:46 -04:00
co-authored by Claude Opus 5.5
parent 42610e844f
commit a041b401ea
24 changed files with 844 additions and 178 deletions
+23
View File
@@ -287,6 +287,29 @@ Each is tested, committed and pushed before the next.
6).
3. **Messages (section 6):** a StarForth node that reads messages when
idle; the console as a device; a line typed is a message.
**Done 2026-10-06, but for the keyboard.** A node with nothing to do is
blocked reading "any port" (`(IDLE)`, `v4/capsule/quit.v4`). What
arrives is a message; text for this node is interpreted; what it prints
is kept and sent back as messages to the sender, on the port the
message came on, and then a message saying how the text ended (`EMIT`,
`(FLUSH-OUT)`, `(HDR)` in `core.v4`; `(FINISH)` in `quit.v4`).
`v4/src/message.c` is the same format for whatever is on the other end
of a port and is not a node. The boot is that, on the node's port 1, as
the console (`v4_boot_line`); the prompt tests are too. Handing a node a
line by writing its input buffer and setting its `P` is gone
(`v4_line_begin` and the rest). Nothing reads the `CONSOLE-TX` register
any more.
`EMIT` still needs one free cell of the data stack and no more, as
before; it keeps its working values on the return stack. The full-stack
tests hold at the same figures as before.
All v4 tests pass at both widths and under ASan and UBSan;
`hosted-check` on three ISAs; bare metal `logs/20261006-110551` (amd64),
`-111621` (aarch64), `-111341` (riscv64). `-110837` is an aarch64 run
that was ended by the test wrapper's limit while still in UEFI firmware,
before the kernel had started; it shows nothing about v4.
**Not done:** `KEY`, `EXPECT` and `QUERY` still read the console's two
input registers, not a message. A message not for this node, or not
text, is let go: passing it on is step 4.
4. **Finding the way (section 7).**
5. **Birth and Hera's requests (section 9); the unit of five.**
6. **Storage (section 8).**