FABRIC.md/ROADMAP.md/ttf_words.c: scope console REPL (4.4), obsolete M8, flip TTF to Cartesian y

FABRIC.md: renumber Artemis-last boundary 4.4 -> 4.5, add new 4.4 REPL item
(console visual design scoped this session -- CANVAS is one shared region
above the REPL strip, 640x480 scroll box centered within it, stroke font,
ANSI color, VM-identity + ACL-identity prompt segments, ~1000-line
scrollback), linked to repl-mockup.png.

ROADMAP.md: mark M8 section OBSOLETE -- replaced by FABRIC.md 4.4, kept for
history only.

ttf_words.c: TTF-TEXT's y argument now Cartesian (origin bottom-left of the
physical framebuffer, y increasing upward) instead of raw framebuffer
coordinates, translated once via fb_height() - y. Verified via amd64
screendump (logs/20260811-070418/), text renders right-side-up with
increasing y moving up the screen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Robert Allan James
2026-08-11 07:08:32 -04:00
co-authored by Claude Sonnet 5
parent 8e2c5dae5f
commit 20801ded72
6 changed files with 18180 additions and 11 deletions
+21 -7
View File
@@ -4367,8 +4367,9 @@ document and committing that amendment as its own item.*
> note below: glyph rendering (stroke-based font capsules), not yet scoped. > note below: glyph rendering (stroke-based font capsules), not yet scoped.
> **Sequencing noted 2026-08-07, not yet scoped:** keyboard input (4.3.54.3.5f) → > **Sequencing noted 2026-08-07, not yet scoped:** keyboard input (4.3.54.3.5f) →
> glyph rendering (stroke-based font capsules) → REPL — in that order, before the 4.4 > glyph rendering (stroke-based font capsules) → REPL — in that order, before the 4.5
> Artemis boundary. Recorded so the order is not lost between sessions; neither glyph > Artemis boundary (renumbered from 4.4, 2026-08-11 — REPL now has its own 4.4 section).
> Recorded so the order is not lost between sessions; neither glyph
> rendering nor REPL has *Done when* criteria yet. Per §25.0 rule 2, each gets scoped in > rendering nor REPL has *Done when* criteria yet. Per §25.0 rule 2, each gets scoped in
> detail at its own checkpoint, not now. > detail at its own checkpoint, not now.
@@ -4973,11 +4974,23 @@ document and committing that amendment as its own item.*
> `KEY-EVENT` (4.3.5f) isn't yet wired into the REPL's character source > `KEY-EVENT` (4.3.5f) isn't yet wired into the REPL's character source
> (`console_getc()`), and `KEY`/`?TERMINAL` remain the dead stubs already noted above. > (`console_getc()`), and `KEY`/`?TERMINAL` remain the dead stubs already noted above.
⋯ *(4.3.x is open-ended — more items get appended here as Console work is scoped item by* ⋯ *(4.3.x is open-ended — more items get appended here as framebuffer/keyboard Console work*
*item, developed on the fly per §25.0. 4.4 below is unaffected by anything added above* *is scoped item by item, developed on the fly per §25.0. 4.4 below is a new, independent*
*this marker.)* *section for the REPL itself — separate because the REPL is independent of the screen-output*
*and keyboard work above. 4.5 (renumbered from 4.4, 2026-08-11) is unaffected by anything*
*added above this marker.)*
- [ ] **4.4 — Artemis last.** It works today; it is the thing that cannot be broken. - [ ] **4.4 — REPL.** *(Scoped 2026-08-11; independent of the 4.3.x framebuffer/keyboard work.*
*This item replaces `docs/lithosananke/ROADMAP.md`'s M8 section entirely — M8 is marked*
*OBSOLETE there as of 2026-08-11, kept for history only. Detailed spec and punch-list*
*sub-items to be written up in the same style as 4.3.x.)*
*Refs:* §25.5, §27.6.
Original visual mockup (Captain Bob, 2026-08-11): [`repl-mockup.png`](repl-mockup.png) —
CANVAS label, scrollable output region, separate REPL input strip with cursor at the
bottom. Source image for the CANVAS/REPL-strip geometry described below.
- [ ] **4.5 — Artemis last.** It works today; it is the thing that cannot be broken.
*Refs:* §10. *Refs:* §10.
--- ---
@@ -5484,7 +5497,8 @@ of slot.
### 27.6 Glyph rendering, UTF-8 Latin, capsule-loaded (4.3.64.3.6g) ### 27.6 Glyph rendering, UTF-8 Latin, capsule-loaded (4.3.64.3.6g)
Scoped 2026-08-09, next after the 4.3.5f checkpoint, per the 2026-08-07 sequencing note Scoped 2026-08-09, next after the 4.3.5f checkpoint, per the 2026-08-07 sequencing note
(§25.5): keyboard input → glyph rendering → REPL, before the 4.4 Artemis boundary. (§25.5): keyboard input → glyph rendering → REPL, before the 4.5 Artemis boundary (renumbered
from 4.4, 2026-08-11 — REPL now has its own 4.4 section).
**Purpose and boundary.** Render text onto the CANVAS region of the Stadium UI (per the **Purpose and boundary.** Render text onto the CANVAS region of the Stadium UI (per the
reviewed mockup: a fixed REPL strip at the bottom of the screen, a separate large CANVAS reviewed mockup: a fixed REPL strip at the bottom of the screen, a separate large CANVAS
+1 -1
View File
@@ -1,5 +1,5 @@
# Capsule Block Manifest — Auto-generated # Capsule Block Manifest — Auto-generated
<!-- Generated by mkcapsule --manifest 2026-08-11T03:17:24Z --> <!-- Generated by mkcapsule --manifest 2026-08-11T11:02:46Z -->
<!-- DO NOT EDIT — re-run mkcapsule --manifest to refresh. --> <!-- DO NOT EDIT — re-run mkcapsule --manifest to refresh. -->
<!-- Hand-written justifications and immutability notes live --> <!-- Hand-written justifications and immutability notes live -->
<!-- in MANIFEST.md alongside this auto-generated index. --> <!-- in MANIFEST.md alongside this auto-generated index. -->
+6 -1
View File
@@ -17,7 +17,7 @@ M5 Timer ██████████████████
M6 Heap ████████████████████ COMPLETE M6 Heap ████████████████████ COMPLETE
M7 VM Parity ████████████████████ COMPLETE M7 VM Parity ████████████████████ COMPLETE
M7.1 Capsules ████████████░░░░░░░░ DESIGN COMPLETE M7.1 Capsules ████████████░░░░░░░░ DESIGN COMPLETE
M8 REPL ░░░░░░░░░░░░░░░░░░░░ PLANNED M8 REPL ░░░░░░░░░░░░░░░░░░░░ OBSOLETE — see FABRIC.md §25.5 item 4.4
M9 Block I/O ░░░░░░░░░░░░░░░░░░░░ PLANNED M9 Block I/O ░░░░░░░░░░░░░░░░░░░░ PLANNED
M10 Networking ░░░░░░░░░░░░░░░░░░░░ FUTURE M10 Networking ░░░░░░░░░░░░░░░░░░░░ FUTURE
``` ```
@@ -234,6 +234,11 @@ APIC Timer: started
## Phase 4: Interactive Forth (M8) ## Phase 4: Interactive Forth (M8)
> **⚠ OBSOLETE (2026-08-11).** This entire M8 section is superseded by
> `FABRIC.md` §25.5 item 4.4 (REPL). The console/REPL design has moved past
> what's scoped here — do not use this section as a source for REPL or
> CANVAS design decisions. Kept in place for history only.
### M8: REPL + Interactive Forth ### M8: REPL + Interactive Forth
**Status:** Scoped 2026-08-11 (this section). Substrate (interrupt-driven keyboard **Status:** Scoped 2026-08-11 (this section). Substrate (interrupt-driven keyboard
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

+7 -2
View File
@@ -94,7 +94,7 @@ static void ttf_word_text(VM *vm) {
cell_t color, size, y, x, u, addr_cell; cell_t color, size, y, x, u, addr_cell;
vaddr_t a; vaddr_t a;
cell_t remaining; cell_t remaining;
uint32_t pen_x; uint32_t pen_x, baseline_y;
q48_16_t scale; q48_16_t scale;
if (vm->dsp < 5) { if (vm->dsp < 5) {
@@ -123,6 +123,11 @@ static void ttf_word_text(VM *vm) {
a = VM_ADDR(addr_cell); a = VM_ADDR(addr_cell);
remaining = u; remaining = u;
pen_x = (uint32_t) x; pen_x = (uint32_t) x;
/* Caller-facing (x,y) is Cartesian: origin at the bottom-left of the physical
* framebuffer, y increasing upward. fb_put_pixel() takes framebuffer coordinates
* (origin top-left, y increasing downward), so flip once here per-call rather
* than at every blit site. */
baseline_y = fb_height() - (uint32_t) y;
scale = q48_div(q48_from_u64((uint32_t) size), q48_from_u64(g_ttf_font.units_per_em)); scale = q48_div(q48_from_u64((uint32_t) size), q48_from_u64(g_ttf_font.units_per_em));
while (remaining > 0) { while (remaining > 0) {
@@ -138,7 +143,7 @@ static void ttf_word_text(VM *vm) {
for (px = 0; px < bmp.width; px++) { for (px = 0; px < bmp.width; px++) {
if (bmp.pixels[py * bmp.width + px]) { if (bmp.pixels[py * bmp.width + px]) {
fb_put_pixel(pen_x + px - TTF_CACHE_MARGIN, fb_put_pixel(pen_x + px - TTF_CACHE_MARGIN,
(uint32_t) y + py - (uint32_t) size - TTF_CACHE_MARGIN, baseline_y + py - (uint32_t) size - TTF_CACHE_MARGIN,
(uint32_t) color); (uint32_t) color);
} }
} }