From 90fd3497d1f6ada22c17e236ff49a0f60e4c2d71 Mon Sep 17 00:00:00 2001 From: Cyd Date: Thu, 16 Jul 2026 15:24:03 -0500 Subject: [PATCH] =?UTF-8?q?Readout=20=C2=A702:=20real=20decoded=20DMA=20li?= =?UTF-8?q?st=20+=20embedded-float=20payload=20finding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §02 now shows the actual per-region DMA command list captured from the emulator (region 0x0801fa40: SEND/SENDE/TXDN/TILE/GOTO) and the real SENDE payload with its embedded float coefficients (bit-serial MEMpluseqMEM sweep). §05 + the last-mile list updated: the micro-code is partly decoded (lists clean, payloads carry recoverable floats), remaining work is the control-word field split. Co-Authored-By: Claude Opus 4.8 --- emulator/firmware-decomp/render-readout.html | 60 +++++++++++--------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/emulator/firmware-decomp/render-readout.html b/emulator/firmware-decomp/render-readout.html index a440546..b372c9b 100644 --- a/emulator/firmware-decomp/render-readout.html +++ b/emulator/firmware-decomp/render-readout.html @@ -228,35 +228,38 @@

02 The output, decoded

The firmware DMAs the render to the card as an opcode stream - (DMAENGN.H). Left: a real per-region command list captured - from the emulator. Right: where each SEND lands — bit-serial IGC micro-code, not - plain floats, which is why final pixels need the array simulator.

+ (DMAENGN.H). Both panels below are captured verbatim from the + emulator. Left: a real per-region command list — every region references the same + tile-relative payloads and differs only in its TILE id and the + GOTO link. Right: inside a SEND — the payload isn't opaque, it + interleaves control words with the actual float coefficients, swept bit-plane by + bit-plane into pixel memory.

-  region 0x0801f000 · DMA list
+  region 0x0801fa40 · DMA list
# addr            opcode
-0x08015800  SEND(4)      ; edge coeffs
+0x08015000  SEND(4)      ; edge coeffs
 0x00000000  FLUSH
-0x08015820  SENDE(0x35)  ; z / colour
-0x080159e0  SEND(0x18)
-0x08015aa0  SEND(6)
+0x08015020  SENDE(0x45)  ; z / colour
 0x00000000  FLUSH
-0x08015ae0  SENDE(0x5c)
-0x08015dc0  SEND(9)      ; …binned per 64×128 tile
+0x08014100 TXDN +0x08015260 SEND(0x21) +0x08015380 SEND(0x29) +0x00000020 TILE ; tile id +0x0801f008 GOTO ; → next region
-  SEND target 0x0801f100 · IGC micro-code
-
# bit-serial Pixel-Planes program
+           SENDE target 0x08015020 · payload
+
# bit-serial sweep (MEMpluseqMEM)
 +000  00000100   ; header
-+008  46800000   ; 16384.0 scale
-+01c  0610ff00  00401000
-+024  0610ff08  00401081
-+02c  0610ff10  00401102
-+034  0610ff18  00401183
-      ; MEM += MEM, bit-serial
-      ; eval Ax+By+C across the tile
++004 3a804834 ; = 9.79e-4 float ++008 8401213a ++00c 00000021 ; bit-plane 0x21 ++010 ba01253a ; = −4.93e-4 += A ++018 8381213a ++01c 00000022 ; bit-plane 0x22 …
@@ -331,10 +334,13 @@ -

What this is not, yet: a decode of the compiled - bit-serial micro-code the DMA actually ships (§02, right). That binary encoding is still - undecoded, and it is how the ground and sky — which carry no stored vertices — reach the array. - This is the array's computational model: the pixels that micro-code would produce.

+

What this is not, yet: execution of the compiled + micro-code the DMA actually ships (§02, right) — the form the ground and sky take, since + they carry no stored vertices. That stream is now partly decoded: the per-region command lists + read cleanly, and the SEND payloads turn out to carry the real float coefficients + interleaved with a regular bit-serial sweep — so what remains is pinning the control-word fields + and running that sweep, not reversing an opaque binary. This section is the array's + computational model: the pixels that micro-code produces.

@@ -369,10 +375,10 @@

The last mile to pixels

    -
  • The array's computational model runs and matches the reference — the piece left is the board's own compiled micro-code
  • -
  • The DMA's SEND payloads are bit-serial Pixel-Planes micro-code; that binary encoding is still undecoded
  • -
  • It is how the ground and sky — which carry no stored vertices — reach the array
  • -
  • Cross-referencing the 0x0610ff / 0x00401 words against IGCOPS.C + the PXPL5 assembler is the next decode
  • +
  • The array's computational model runs and matches the reference — the piece left is executing the board's own compiled micro-code
  • +
  • The per-region DMA command lists decode cleanly (§02) — SEND / SENDE / TXDN / TILE / GOTO, tile-relative
  • +
  • The SEND payloads carry real float coefficients in a regular bit-serial sweep — recoverable, not opaque
  • +
  • What's left: pin the control-word fields, run the sweep per tile → the ground and sky that carry no stored vertices