From 6451b739bd685636923080be286085cc06525048 Mon Sep 17 00:00:00 2001 From: Cyd Date: Sat, 18 Jul 2026 01:17:13 -0500 Subject: [PATCH] IGC decode: colour-instr layout (5-word Gouraud planes) + SCMEMA lead for the bars Co-Authored-By: Claude Opus 4.8 --- .../IGC-ENCODING-DERIVATION.md | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/emulator/firmware-decomp/IGC-ENCODING-DERIVATION.md b/emulator/firmware-decomp/IGC-ENCODING-DERIVATION.md index 7f6f71bf..7e8d229b 100644 --- a/emulator/firmware-decomp/IGC-ENCODING-DERIVATION.md +++ b/emulator/firmware-decomp/IGC-ENCODING-DERIVATION.md @@ -229,6 +229,26 @@ the ramp/eof machinery (the stubbed ops). NEXT: name the 11 stubbed ops from the builder disasm (writer pcs in builder_trace2.log, builder = 0xf041ee30-f7b0 straight-line) + implement the texture/ramp lookup; then bars. +## Colour instruction layout (this firmware rev) + SCMEMA lead (2026-07-18) + +Triangle-packet colour instr = **5 words**: {clmp-hdr(op 0x5a, addr 118/126/134), +pword 0x00080000, A.f32, B.f32, C.f32} — a full Gouraud plane per channel (the +death-cam object is genuinely red: G/B planes are -0.0). render_wide30 with +z-scan + relative colour offsets: 85 packets, colours 0-255 correct. + +eof-colour builder tail (0xf041f684+): op words constant; OPERANDS loaded from +globals (eofr background value @0x1f788, 0x6c operand @0x1f784) = per-frame +background/fog colours are firmware globals, not per-tile data. + +**SCMEMA lead:** op 0x39 (the 0x3e013991/0xec00 pair in the SEND(4)/33 blocks) +is likely I_SCMEMA (P_SCMEMA(LSB,LEN,ADDR) exists in ADDR/SUPCODES) = select +pixels by SCREEN-ADDRESS bits — the coordinate-variation mechanism that can +paint x-banded patterns (bars!) without tree coefficients; 0xec00 -> x=236 +immediate (=.8 fixed 236.0, the old "edge constant" reading). NEXT: pin +SCMEMA's exact field semantics (LSB/LEN/ADDR) from PXPL5TST.S (the test source +that printed DUMP) and implement; that + the eof globals should produce the +bars pattern. + ## NEXT (the miner) Write `eofs_mine.py`: parse EOF.S per function; track `st.l`/`fst.l` stores through the coeff pointer; recover, in order, each emitted word (int literals