From fa300ef4c69d51acef6b4b4eb900a197ea4495d8 Mon Sep 17 00:00:00 2001 From: Robert Allan James Date: Fri, 7 Aug 2026 15:29:04 -0400 Subject: [PATCH] starkernel: item 4.3.4 -- checkpoint, draw a cube (no new bugs) Adds VERT/EDGE/CUBE to capsules/fabric.4th (blocks 4913-4915). VERT ( n -- x y z ) reads bits 0/1/2 of a corner index as the X/Y/Z sign (+-CS from center), so all 8 cube corners come from one word. EDGE resolves both corners via VERT and calls LINE; CUBE is 12 EDGE calls (4 bottom, 4 top, 4 vertical). First item in the 4.3.3.x sequence with no new bug found -- a small signal that Q.TO-INT, the VARIABLE alignment fix, and the LINE-STUCK? cap were the real gaps rather than something still lurking in LINE/PROJECT/CART-Y. Verified live on amd64: a centered, half-size-100 cube renders correctly -- front/back face squares, back face offset diagonally up-right by exactly the 45-degree cavalier projection's depth term, all 12 edges connecting at the right corners. All three architectures boot clean to ok> with the DoE completing; dict_hash identical across all three and unchanged from 4.3.3a/4.3.3b. FABRIC.md item 4.3.4 marked done. This is the checkpoint -- 4.3.x groundwork stops here for review per this item's own acceptance criterion. --- FABRIC.md | 22 +++++++++++++++++++++- capsules/BLOCK_MAP.md | 33 ++++++++++++++++++--------------- capsules/fabric.4th | 27 +++++++++++++++++++++++++++ fb/amd64/cube-4.3.4.png | Bin 0 -> 10475 bytes 4 files changed, 66 insertions(+), 16 deletions(-) create mode 100644 fb/amd64/cube-4.3.4.png diff --git a/FABRIC.md b/FABRIC.md index 8152693..b771a9d 100644 --- a/FABRIC.md +++ b/FABRIC.md @@ -3797,10 +3797,30 @@ document and committing that amendment as its own item.* > than tall, matching unequal radii), and the earlier diagonal `LINE` test. > `fb/amd64/geom-test-circle-fixed.png`, `fb/amd64/geom-test-full-wordset.png`. -- [ ] **4.3.4 — Checkpoint: draw a cube.** First real exercise of the 4.3.3/4.3.3a/4.3.3b +- [x] **4.3.4 — Checkpoint: draw a cube.** First real exercise of the 4.3.3/4.3.3a/4.3.3b coordinate/projection/geometry machinery — cube edges use `LINE`. Stop and review here before scoping the next 4.3.x item — not expected to be fast. *Refs:* §27.4. + > **Done, 2026-08-07.** Block 4913–4915. Vertices are bit-coded: `VERT ( n -- x y z )` + > reads bits 0/1/2 of `n` as the sign of the X/Y/Z offset from center (`±CS`), so all 8 + > corners come from one word instead of 8 hand-written coordinate triples. `EDGE + > ( n1 n2 color -- )` resolves both corners via `VERT` and calls `LINE`. `CUBE + > ( cx cy cz s color -- )` is 12 `EDGE` calls — 4 bottom, 4 top, 4 vertical — grouped by + > face for readability, not because the grouping means anything to the machinery. + > + > No new bugs this item — first time in the 4.3.3.x sequence that's been true, which is + > itself a small signal that `Q.TO-INT`/the `VARIABLE` alignment fix/the `LINE-STUCK?` + > cap were the real gaps, not something still lurking in `LINE`/`PROJECT`/`CART-Y`. + > + > **Verified live on amd64**: `640 400 0 100 16777215 CUBE` (white, half-size 100, + > centered mid-screen) completed cleanly, no errors, no `LINE-STUCK?` trips. Screendump + > (`fb/amd64/cube-4.3.4.png`) shows a correct wireframe cube — front face square, back + > face square offset diagonally up-right by exactly the 45° cavalier projection's + > depth term, all 12 edges connecting at the right corners, no crossed or broken lines. + > + > **This is the checkpoint** — 4.3.x groundwork stops here for review per this item's own + > acceptance criterion, before scoping whatever comes next. + ⋯ *(4.3.x is open-ended — more items get appended here as Console work is scoped item by* *item, developed on the fly per §25.0. 4.4 below is unaffected by anything added above* *this marker.)* diff --git a/capsules/BLOCK_MAP.md b/capsules/BLOCK_MAP.md index d85a40e..e93cd97 100644 --- a/capsules/BLOCK_MAP.md +++ b/capsules/BLOCK_MAP.md @@ -1,5 +1,5 @@ # Capsule Block Manifest — Auto-generated - + @@ -13,7 +13,7 @@ | `common:msg.4th` | 4055 | `0xa99c5bcd3877f80e` | | `doe-campaign.4th` | 4060, 4061, 4062, 4063, 4064, 4065 | `0x3d4549142d91ec20` | | `doe.4th` | 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107 | `0xb6ecf5374e8ee77c` | -| `fabric.4th` | 4900, 4901, 4902, 4903, 4904, 4905, 4906, 4907, 4908, 4909, 4910, 4911, 4912 | `0x355ccc154aac15b3` | +| `fabric.4th` | 4900, 4901, 4902, 4903, 4904, 4905, 4906, 4907, 4908, 4909, 4910, 4911, 4912, 4913, 4914, 4915 | `0x339aa4c724b95879` | | `hermes:init.4th` | 4100, 4101, 4102, 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4114, 4115, 4116, 4117, 4118, 4119, 4120, 4121, 4142, 4143, 4144, 4145, 4146, 4147, 4148, 4149, 4150, 4151, 4152, 4153, 4154, 4155, 4156, 4157, 4158, 4159, 4175, 4176 | `0x85c7b311d1e5bf97` | | `init-0.4th` | 2200, 2201 | `0xd0a9550baf786bb3` | | `init-1.4th` | 4406, 4415, 4425, 4435 | `0x63e251adb0a03613` | @@ -225,19 +225,22 @@ | 4842 | `init-l8-transition.4th` | `0xbcc1a81976f0a4c9` | ok | | 4851 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok | | 4852 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok | -| 4900 | `fabric.4th` | `0x355ccc154aac15b3` | ok | -| 4901 | `fabric.4th` | `0x355ccc154aac15b3` | ok | -| 4902 | `fabric.4th` | `0x355ccc154aac15b3` | ok | -| 4903 | `fabric.4th` | `0x355ccc154aac15b3` | ok | -| 4904 | `fabric.4th` | `0x355ccc154aac15b3` | ok | -| 4905 | `fabric.4th` | `0x355ccc154aac15b3` | ok | -| 4906 | `fabric.4th` | `0x355ccc154aac15b3` | ok | -| 4907 | `fabric.4th` | `0x355ccc154aac15b3` | ok | -| 4908 | `fabric.4th` | `0x355ccc154aac15b3` | ok | -| 4909 | `fabric.4th` | `0x355ccc154aac15b3` | ok | -| 4910 | `fabric.4th` | `0x355ccc154aac15b3` | ok | -| 4911 | `fabric.4th` | `0x355ccc154aac15b3` | ok | -| 4912 | `fabric.4th` | `0x355ccc154aac15b3` | ok | +| 4900 | `fabric.4th` | `0x339aa4c724b95879` | ok | +| 4901 | `fabric.4th` | `0x339aa4c724b95879` | ok | +| 4902 | `fabric.4th` | `0x339aa4c724b95879` | ok | +| 4903 | `fabric.4th` | `0x339aa4c724b95879` | ok | +| 4904 | `fabric.4th` | `0x339aa4c724b95879` | ok | +| 4905 | `fabric.4th` | `0x339aa4c724b95879` | ok | +| 4906 | `fabric.4th` | `0x339aa4c724b95879` | ok | +| 4907 | `fabric.4th` | `0x339aa4c724b95879` | ok | +| 4908 | `fabric.4th` | `0x339aa4c724b95879` | ok | +| 4909 | `fabric.4th` | `0x339aa4c724b95879` | ok | +| 4910 | `fabric.4th` | `0x339aa4c724b95879` | ok | +| 4911 | `fabric.4th` | `0x339aa4c724b95879` | ok | +| 4912 | `fabric.4th` | `0x339aa4c724b95879` | ok | +| 4913 | `fabric.4th` | `0x339aa4c724b95879` | ok | +| 4914 | `fabric.4th` | `0x339aa4c724b95879` | ok | +| 4915 | `fabric.4th` | `0x339aa4c724b95879` | ok | ## Conflicts diff --git a/capsules/fabric.4th b/capsules/fabric.4th index e6ae8c7..eb7e424 100644 --- a/capsules/fabric.4th +++ b/capsules/fabric.4th @@ -150,3 +150,30 @@ Block 4912 CZ @ CCOLOR @ LINE LOOP ; + +Block 4913 +( CUBE: wireframe, 8 vertices via bit-coded corner index n ) +( (bit0=x, bit1=y, bit2=z; set=+CS, clear=-CS from center). ) +VARIABLE CS +: VERT ( n -- x y z ) + DUP 1 AND IF CS @ ELSE CS @ NEGATE THEN CX @ + + SWAP DUP 2 AND IF CS @ ELSE CS @ NEGATE THEN CY @ + + SWAP DUP 4 AND IF CS @ ELSE CS @ NEGATE THEN CZ @ + + SWAP DROP ; + +Block 4914 +( EDGE: draws one cube edge between vertex indices n1,n2. ) +VARIABLE EN2 +: EDGE ( n1 n2 color -- ) + >R EN2 ! VERT EN2 @ VERT R> LINE ; + +Block 4915 +( CUBE: 12 edges -- 4 bottom, 4 top, 4 vertical. ) +: CUBE ( cx cy cz s color -- ) + CCOLOR ! CS ! CZ ! CY ! CX ! + 0 1 CCOLOR @ EDGE 1 3 CCOLOR @ EDGE + 3 2 CCOLOR @ EDGE 2 0 CCOLOR @ EDGE + 4 5 CCOLOR @ EDGE 5 7 CCOLOR @ EDGE + 7 6 CCOLOR @ EDGE 6 4 CCOLOR @ EDGE + 0 4 CCOLOR @ EDGE 1 5 CCOLOR @ EDGE + 2 6 CCOLOR @ EDGE 3 7 CCOLOR @ EDGE ; diff --git a/fb/amd64/cube-4.3.4.png b/fb/amd64/cube-4.3.4.png new file mode 100644 index 0000000000000000000000000000000000000000..f5d5d2df6fa0de18d7f6eef9c8f62af77224aa42 GIT binary patch literal 10475 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 KCYW>XcmD$#zYlT% literal 0 HcmV?d00001