1
0
Files
h8-536-decoder/docs/pt2-continuation-command-trace.md
2026-05-27 11:50:10 +10:00

9.1 KiB

PT2 Continuation Command Trace

This note enumerates the command paths that are active after the ROM sees FAA2 != 0.

Dispatcher Shape

RX command dispatch starts after six-byte frame validation at H'BBD6-H'BC67.

Important gates:

  • F9C3 == 6.
  • SCI/RX physical error latch FAA4.7 == 0.
  • Checksum matches 0x5A ^ F860 ^ F861 ^ F862 ^ F863 ^ F864 == F865.
  • Command number is F860 & 0x07.
  • F861.7 rejects normal command handling.
  • FAA2 == 0 enters the initial dispatcher.
  • FAA2 != 0 enters the continuation dispatcher.

Continuation split:

Incoming command bits Path Meaning
command & 0x04 != 0 H'BC3A-H'BC56 explicit continuation commands 4/5/6/7
command & 0x04 == 0, FAA2.3 == 0 H'BC5C -> H'BE6F ignored/returns
command & 0x04 == 0, FAA2.3 == 1 H'BC5C-H'BC67 -> H'BC15 clears queued-report continuation bit and re-enters initial command handling

That last row is easy to miss: command 0/1/2/3 can consume the report-continuation latch when FAA2.3 was set by an autonomous report, then command 0/1/2 can run as an initial command. Command 3 still has no recognized initial handler and falls to the clear/return path.

Selector bytes are packed from F861:F862, mapped by loc_622B, then doubled into R4 = selector * 2 before the command handlers use the selector as a word-table offset.

Explicit Continuation Commands

Command Handler Table writes Queue/report behavior Cleanup
4 H'BD0E writes E000; selector zero also writes E800; sets EC00.7 calls BE70 to append selector to F970; if FAA2.3 set, advances F9B5 clears FAA3, clears FAA2
5 H'BD80 none special selectors may append to F970 or clear latches; if FAA2.3 set, advances F9B5 clears FAA3, clears FAA2
6 H'BDDB writes E400; sets EC00.6 does not append to F970; if FAA2.3 set, advances F9B5 clears FAA3, clears FAA2
7 H'BE05 none copies previous finalized TX frame from F858-F85C to F850-F854 and retransmits does not clear FAA2/FAA3 in this handler

BE70: Selector Processing Queue Append

BE70 is the shared helper used by command 0, command 4, and selected command-5 cases.

Path H'BE70-H'BE9D:

  • Scans the F970 word ring from consumer cursor F9B9 to producer cursor F9B4.
  • If the selector is already present, returns without appending a duplicate.
  • If absent, writes the selector to F970 + 2*F9B4.
  • Increments F9B4 and clears bit 5, making the queue a 32-entry ring.

Practical meaning:

  • F970 means "process this selector internally".
  • It is separate from the serial-visible report queue at F870.
  • Re-sending the same selector may refresh table values without creating another queued selector entry if the old entry has not been consumed yet.

Command 4: Continuation Primary Write

Selector zero branch:

  • H'BD12-H'BD18: builds value from F863 and forces low byte 0x80.
  • H'BD1A: writes E000[0].
  • H'BD1E: writes E800[0].
  • H'BD22: sets EC00[0].7.
  • H'BD26: calls BE70, appending selector zero to F970.

Nonzero selector branch:

  • H'BD2B-H'BD35: builds value from F863/F864 and writes E000[selector].
  • H'BD39: sets EC00[selector].7.
  • H'BD3D-H'BD45: if the selector has a mapped shadow slot, writes the value into the F400 shadow area.
  • H'BD49-H'BD5F: if F76E.7 is set, uses the mapped shadow offset plus the F76E page nibble and calls BFE0, the EEPROM/persistent-write path.
  • H'BD64: calls BE70, appending the selector to F970.

Persistent-write detail:

  • If the selector-to-shadow map entry is zero, the mirror/persist path is skipped.
  • BFE0 seeds retry timer F840=0x0A, writes via the P9/X24164 helper path, reads back for verification, and sets F841.7 on timeout/failure.

Report consumption:

  • H'BD67-H'BD71: if FAA2.3 was set by a queued report, increments F9B5 and clears F9B5.7.
  • H'BD75-H'BD79: clears FAA3 and FAA2.

Practical meaning:

  • Command 4 is a continuation write/update, not a generic always-live command.
  • Command 4 selector zero can refresh both the primary/current table and queue the CONNECT selector.
  • Nonzero command 4 does not directly refresh E800; autonomous report values still come from the older/current E800 value unless another path updates it.

Command 5: ACK-Like / Special Selector Command

Command 5 reaches H'BD80 only from the continuation dispatcher:

  • FAA2 != 0.
  • command & 0x04 != 0.
  • F861.7 == 0.
  • F860 & 0x07 == 5.

Special enqueue selectors:

Selector Branch Later selector dispatch Current meaning
0x006C H'BD80 -> H'BDBF H'2FAF COPY completion/exit sibling when copy flags are live
0x006D H'BD85 -> H'BDBF H'3015 COPY in-progress/start refresh
0x006E H'BD8A/H'BD8F -> H'BDBF H'2CA6 special-accepted but selector dispatch is currently no-op

The duplicate 0x006E compare at H'BD8A and H'BD8F appears redundant in the current decode.

Selector-table math for the special group:

  • Table base is H'28A6.
  • 0x006C indexes H'297E, whose pointer is H'2FAF.
  • 0x006D indexes H'2980, whose pointer is H'3015.
  • 0x006E indexes H'2982, whose pointer is H'2CA6.
  • H'2CA6 clears F769.7 and returns.

Latch-clear selectors:

Selector Gate Effect
0x006B only if F731.7 set clears F731.7 and F790.7
0x0096 only if F731.7 set clears F731.7 and F790.7
0x0097 only if F731.7 set clears F731.7 and F790.7
0x00C6 only if F731.7 set clears F731.7 and F790.7
0x00F8 only if F731.7 set clears F731.7 and F790.7

Report consumption and cleanup:

  • H'BDC2-H'BDCC: if FAA2.3 was set by a queued report, increments F9B5 and clears F9B5.7.
  • H'BDD0-H'BDD4: clears FAA3 and FAA2.

Practical meaning:

  • Command 5 is the closest thing to an ACK, but only inside the continuation side.
  • Most command-5 selectors do not have selector-specific meaning; they just consume/clear the continuation state if one is live.
  • 0x006C/0x006D/0x006E are command-5 special cases because they enter the F970 selector-processing queue.
  • 0x006E is accepted as special by the command handler, but its current selector-table target is 2CA6, the no-op return path.

Command 6: Continuation Secondary Write

Path H'BDDB-H'BE03:

  • H'BDDB-H'BDE5: builds value from F863/F864 and writes E400[selector].
  • H'BDE9: sets EC00[selector].6.
  • H'BDED-H'BDF7: if FAA2.3 was set by a queued report, increments F9B5 and clears F9B5.7.
  • H'BDFB-H'BDFF: clears FAA3 and FAA2.

Practical meaning:

  • Command 6 is the secondary feature/status table write used by menu visibility and gate code.
  • It does not append the selector to F970, so it changes later decisions but does not itself force immediate selector dispatch.

Command 7: Retransmit

Path H'BE05-H'BE25:

  • Copies previous finalized TX bytes F858-F85C into staging bytes F850-F854.
  • Loads F9C0=0x1F.
  • Calls BA26 to finalize/send again.
  • BA26 then waits for F9C0 == 0, reloads F9C0=0x64, reloads F9C4=0x07, copies staging bytes back to F858-F85C, recomputes the checksum into F85D, and starts SCI1 TX.

Practical meaning:

  • Command 7 repeats the previous finalized TX frame.
  • It is valid from both initial and continuation dispatch.
  • It does not acknowledge/consume F870 report queue entries by itself and does not clear FAA2/FAA3 in this handler.
  • The copied old checksum byte is not trusted; BA26 recomputes the checksum.

Distinct 07 Error Echo Path

The ROM also emits 07... frames from an error/retry path that is separate from explicit command 7.

Triggers:

  • SCI/RX physical error latched in FAA4.7.
  • Checksum mismatch at H'BBF0.

Path H'BE29-H'BE6A:

  • Clears FAA4.7.
  • Requires FAA5.7; if the session gate is absent, no echo is sent.
  • Increments retry counter FAA6.
  • For the first two retry attempts, stages:
byte0 = 0x07
byte1 = RX[1]
byte2 = RX[2]
byte3 = RX[3]
byte4 = RX[4]
  • Calls BA26 to send the error echo.
  • After too many retries, loads F9C0=0x1F and clears FAA3/FAA2 instead of sending another echo.

Practical meaning:

  • A 07 ... frame is not automatically a normal command-7 retransmit.
  • Old captures made with the wrong serial parity can easily be retry/error echoes.
  • Valid frames clear FAA6 at H'BBF3.

Bench Implications

  • To update active selector state during a report window, use command 4 or 6 while FAA2 != 0.
  • To consume a queued report without changing tables, command 5 is the cleanest continuation ACK shape.
  • To trigger COPY side effects, command 5 with 0x006D starts/refreshes COPY IN PROGRESS, and command 5 with 0x006C completes/exits only while the copy flags are live.
  • Do not treat command 7 as an ACK. It is a repeat probe.
  • A low command 0/1/2 sent while FAA2.3 is live may clear the report continuation and then run as an initial command, which can make timing-sensitive bench traces look like an ACK plus a new command in one frame.