1
0
This commit is contained in:
Aiden
2026-05-27 21:37:50 +10:00
parent 21f0e455ee
commit 4364d0ed48
54 changed files with 30241 additions and 191 deletions

View File

@@ -0,0 +1,78 @@
# PT2 IRIS/M.BLACK LINK ROM Trace
This note records the ROM evidence for the bench-visible
`IRIS/M.BLACK LINK` lamp.
## Confirmed Host Trigger
The isolated bench trigger is:
```text
00 00 13 40 00 09 ; command 0, selector 0x0013, value 0x4000
```
Command 0 mirrors nonzero selector writes into both `E000[selector]` and
`E800[selector]`, then queues the selector for internal processing. For this
frame that means:
```text
E000[0x0013] = 0x4000
E800[0x0013] = 0x4000
```
The current-table word is `E800 + 2 * 0x0013 = H'E826`.
## Selector Handler
The selector dispatch table maps selector `0x0013` to `H'2E06`.
Focused linear decode:
```text
H'2E06 BTST.W #15, @H'E826
set/clear F791.6 and F713.4
H'2E1E BTST.W #14, @H'E826
set/clear F791.5 and F716.7
```
Bench labels:
| Selector value | ROM latch bits | Visible result |
| --- | --- | --- |
| `0x8000` | `F791.6`, `F713.4` | far-right `SLAVE` lamp |
| `0x4000` | `F791.5`, `F716.7` | `IRIS/M.BLACK LINK` lamp |
| `0x0000` | clears both bit groups through `H'2E06` | both latch groups clear |
## Other Trigger Path
There is also a local panel-input path:
```text
F006.7 / F6DB.7 -> H'200E -> H'E826 bit14 -> loc_3E54 queues selector 0x0013
```
At `H'200E`, the ROM checks `F6DB.7` and requires `F731 <= 3`. It then uses
`F791.5` as a current-state toggle:
- if `F791.5` is clear, it sets `H'E826.14`,
- if `F791.5` is set, it clears `H'E826.14`,
- in both cases it calls `loc_3E54` with selector `0x0013`.
This is not a separate lamp driver. It feeds the same `E800[0x0013].14`
state consumed by the selector handler.
## Practical Meaning
The strongest current model is:
- CCU/host can drive the lamp directly by sending selector `0x0013` value
`0x4000` through command 0.
- The panel can also toggle/report the same state through a local input lane,
but only when the relevant session/page gate is open.
- No other decoded selector currently appears to directly set the same
`F791.5` plus `F716.7` latch pair.
Generated semantics now label selector `0x0013`, `E800[0x0013]`, and the
`IRIS/M.BLACK LINK` / `SLAVE` bit meanings so pseudo-code output does not leave
this as a generic table write.

View File

@@ -0,0 +1,193 @@
# PT2 IRIS/M.BLACK LINK State Machine
Date: 2026-05-27
This note records the bench-proven closed loop for the `IRIS/M.BLACK LINK`
button/lamp path.
## Short Answer
There is no current evidence that the CCU first sends a separate
"this function exists" capability command for `IRIS/M.BLACK LINK`.
The stronger model is:
1. The CCU/RCP session must be awake/active.
2. The CCU must service the RCP report queue.
3. The CCU is the authoritative owner of selector state.
4. When the RCP reports a local button intent, the CCU ACKs the report and
mirrors the resulting selector value back to the RCP.
For this control, selector `0x0013` bit `0x4000` is the
`IRIS/M.BLACK LINK` state.
## Proven Frames
Selector value frames:
```text
00 00 13 40 00 09 ; command 0, selector 0x0013, value 0x4000, active
00 00 13 00 00 49 ; command 0, selector 0x0013, value 0x0000, clear
```
Report ACK:
```text
05 00 13 00 00 4C ; command 5 ACK/continuation for selector 0x0013
```
Readback request:
```text
01 00 13 00 00 48 ; command 1 read selector 0x0013
```
Observed readback shapes:
```text
04 00 13 40 00 0D ; command-0 write response, selector 0x0013 active
04 00 13 00 00 4D ; command-0 write response, selector 0x0013 clear
04 13 00 40 00 0D ; command-1 readback response, selector 0x0013 active
04 13 00 00 00 4D ; command-1 readback response, selector 0x0013 clear
```
## Successful Closed Loop
Capture:
```text
captures/iris-mblack-link-mirror-state-machine.txt
captures/iris-mblack-link-mirror-state-machine-result.json
```
Scenario:
```text
scenarios/iris-mblack-link-mirror-state-machine.json
```
The visible panel behavior was:
```text
press 1: lamp on
press 2: lamp off
press 3: lamp on
```
The serial behavior matched that cycle.
### Baseline Clear
```text
TX 00 00 13 00 00 49
RX 04 00 13 00 00 4D
```
### Press 1: Active
```text
RX 00 00 13 40 00 09
TX 05 00 13 00 00 4C ; ACK report
TX 00 00 13 40 00 09 ; mirror active back
RX 04 00 13 40 00 0D
TX 01 00 13 00 00 48 ; readback
RX 04 13 00 40 00 0D
```
### Press 2: Clear
```text
RX 00 00 13 00 00 49
TX 05 00 13 00 00 4C ; ACK report
TX 00 00 13 00 00 49 ; mirror clear back
RX 04 00 13 00 00 4D
TX 01 00 13 00 00 48 ; readback
RX 04 13 00 00 00 4D
```
### Press 3: Active Again
```text
RX 00 00 13 40 00 09
TX 05 00 13 00 00 4C
TX 00 00 13 40 00 09
RX 04 00 13 40 00 0D
TX 01 00 13 00 00 48
RX 04 13 00 40 00 0D
```
## Interpretation
The RCP does not appear to treat the local button press as final local state.
It reports local intent to the CCU.
The CCU then:
1. ACKs the selector report with command `5`.
2. Applies the chosen state back to the RCP with command `0`.
The RCP uses the mirrored/current selector state to decide the next toggle
direction. This explains the earlier failed/incomplete behavior:
- Without mirroring `0x0013=0x4000` back, repeated presses could keep reporting
active because the RCP still believed the selector was clear.
- Once the CCU mirrored active back, the next press reported clear.
- Once the CCU mirrored clear back, the next press reported active again.
## Wakeup Versus Capability
The successful test also had active session traffic:
```text
00 00 00 80 80 5A ; active selector-zero keepalive/report
05 00 00 00 00 5F ; ACK for selector zero
```
That traffic looks like general session/connected behavior, not a
per-function enable for `IRIS/M.BLACK LINK`.
So the current working model is:
- `CONNECT: OK` / active rhythm opens the report path and keeps the panel from
falling back to `CONNECT: NOT ACT`.
- Selector `0x0013` state tells the RCP the current value of this specific
control/lamp.
- There may still be feature-specific gates for other controls, but this test
did not require a distinct `IRIS/M.BLACK LINK exists` command.
## ROM Correlation
The ROM trace in `docs/pt2-iris-mblack-link-rom-trace.md` matches the bench
behavior:
```text
F006.7 / F6DB.7 -> H'200E -> H'E826 bit14 -> loc_3E54 queues selector 0x0013
```
At `H'200E`, the ROM reads `F791.5` as the current `IRIS/M.BLACK LINK` state:
- if `F791.5` is clear, the local press queues/set reports `0x0013=0x4000`;
- if `F791.5` is set, the local press queues/clear reports `0x0013=0x0000`.
The selector handler for `0x0013` updates `F791.5` from `E800[0x0013].14`.
That is why mirroring command-0 selector state back to the RCP completes the
toggle loop.
## Implications
For a CCU emulator:
- Maintain an authoritative selector table.
- Treat RCP button reports as requested state changes, not just notifications.
- ACK each report with command `5`.
- Write the accepted selector value back with command `0`.
- Keep the selector-zero/session rhythm alive separately.
For other latched buttons:
- The same pattern is likely: RCP emits a selector report, then expects the CCU
to mirror the accepted state back.
- A button that only reports "active" repeatedly may not be broken; it may be
waiting for the CCU to update the selector state that controls its next
toggle direction.

View File

@@ -71,6 +71,69 @@ Follow-up `lamp-isolate-neighbor-single-boot` result:
This confirms that the host/CCU can directly drive panel lamps through selector-table writes. It also validates using the ROM dispatch-neighbor list around `0x0007` and `0x0015` as a high-value lamp map.
Follow-up `panel-atlas-standard-master-*` webcam runs:
- `0x0012`, `0x0013`, and `0x0014` high-nibble/selected-bit sweeps did not
produce a clean STANDARD or MASTER lamp trigger. The `0x0013=0x8000` SLAVE
positive control still worked.
- `0x0010`, `0x0011`, `0x0015`, `0x0016`, `0x0017`, `0x0018`, `0x0019`, and
`0x001A` high-nibble sweeps did not produce a clean STANDARD or MASTER lamp
trigger.
- `0x0008` through `0x000F` high-nibble sweeps did not produce a clean
STANDARD or MASTER lamp trigger.
- `0x0017=0x4000` lit the same far-right bottom BARS lamp/latch as the known
`0x0017=0x8000` family. Later `0x0018` rows in that run were latch-contaminated
and need fresh-boot isolation before assigning a separate meaning.
Current implication: STANDARD and MASTER are probably not simple direct
command-0 high-nibble writes in the `0x0008`-`0x001A` pocket, despite the older
broad run that made MASTER flash. Treat that older observation as a real
bench-visible event but not yet an isolated selector mapping.
### `panel-atlas-big-visual-sweep-0001-017f-highbits`
The broad webcam sweep and fresh-boot isolation pass produced these confirmed
or near-confirmed panel-output mappings:
| Selector/value | Current meaning |
| --- | --- |
| `0x0013 = 0x4000` | `IRIS/M.BLACK LINK` lamp |
| `0x0024 = 0x8000` | LCD selector-button lamp |
| `0x0024 = 0x0000` | LCD selector-button lamp remained visible at 0.5 s; not a simple clear in this timing window |
| `0x0082 = 0x8000` | IRIS readout `OP` |
| `0x0082 = 0x4000` | IRIS readout `1.4` |
| `0x0082 = 0x0000` | IRIS readout blank |
| `0x0083 = 0x8000` | MASTER GAIN `-3`, SHUTTER `OFF`, and IRIS AUTO |
| `0x0083 = 0x0000` | same visible state remained at 0.5 s; likely latched/copied elsewhere |
| `0x0093 = 0x8000` | BLACK/FLARE MANUAL plus white-balance PRESET |
| `0x0093 = 0x4000` | BLACK/FLARE MANUAL plus white-balance AUTO |
| `0x0093 = 0x2000` | BLACK/FLARE MANUAL plus white-balance MANUAL |
| `0x0093 = 0x0000` | BLACK/FLARE MANUAL plus white-balance MANUAL |
Run health was good: no resync events, no dropped bytes, and command-4
readbacks appeared for the listed writes.
ROM trace now confirms the `0x0013` bit split:
- `E800[0x0013]` is `H'E826`.
- Selector `0x0013` dispatches to `H'2E06`.
- `H'E826.15` sets/clears `F791.6` and `F713.4`, matching SLAVE.
- `H'E826.14` sets/clears `F791.5` and `F716.7`, matching
`IRIS/M.BLACK LINK`.
- Local handler `H'200E` can also toggle `H'E826.14` from panel input
`F006.7/F6DB.7` when its session gate allows it.
Interpretation:
- `0x0082` is the cleanest direct readout lane found so far: set values update
the IRIS display and `0x0000` blanks it.
- `0x0083` appears to be a combined status/display lane rather than only the
MASTER GAIN display. Its `0x8000` state also brings up SHUTTER `OFF` and IRIS
AUTO, and the clear write did not visually clear it at 0.5 s.
- `0x0093` selects white-balance mode. In this run, `0x2000` and `0x0000` both
presented white-balance MANUAL, so bit 13 may be redundant in this context or
may need another gate to show a distinct state.
### `lamp-broad-status-selector-sweep`
Visible result:

285
docs/pt2-panel-atlas.md Normal file
View File

@@ -0,0 +1,285 @@
# PT2 Panel Atlas
This note tracks bench tests that intentionally drive visible panel outputs from
PT2/command-0 table writes.
## Scenario Files
Current compact atlas scenarios:
```text
scenarios/panel-atlas-operator-lamps-v1.json
scenarios/panel-atlas-readout-status-v1.json
scenarios/panel-atlas-right-stack-isolation-v1.json
scenarios/panel-atlas-right-stack-fresh-latch-v1.json
scenarios/panel-atlas-standard-master-bit-sweep-v1.json
scenarios/panel-atlas-standard-master-neighbor-sweep-v2.json
scenarios/panel-atlas-standard-master-lower-neighbor-sweep-v3.json
```
Both are designed for webcam capture with the calibrated bench settings:
```text
--parity E --camera-index 4 --snapshot-delays 0.5
```
## Run: 2026-05-27
Logs:
```text
captures/panel-atlas-operator-lamps-v1-webcam.txt
captures/panel-atlas-readout-status-v1-webcam.txt
captures/panel-atlas-right-stack-isolation-v1-webcam.txt
captures/panel-atlas-right-stack-fresh-latch-v1-webcam.txt
captures/panel-atlas-standard-master-bit-sweep-v1-webcam.txt
captures/panel-atlas-standard-master-neighbor-sweep-v2-webcam.txt
captures/panel-atlas-standard-master-lower-neighbor-sweep-v3-webcam.txt
```
Snapshots:
```text
captures/panel-atlas-operator-lamps-v1-webcam-shots/
captures/panel-atlas-readout-status-v1-webcam-shots/
captures/panel-atlas-right-stack-isolation-v1-webcam-shots/
captures/panel-atlas-right-stack-fresh-latch-v1-webcam-shots/
captures/panel-atlas-standard-master-bit-sweep-v1-webcam-shots/
captures/panel-atlas-standard-master-neighbor-sweep-v2-webcam-shots/
captures/panel-atlas-standard-master-lower-neighbor-sweep-v3-webcam-shots/
```
Serial health:
| Run | RX frames | TX frames | Resync | Dropped bytes |
| --- | ---: | ---: | ---: | ---: |
| operator lamps | 82 | 19 | 0 | 0 |
| readout/status | 76 | 16 | 0 | 0 |
| right-stack isolation | 115 | 26 | 0 | 0 |
| right-stack fresh latch | 20 | 12 | 0 | 0 |
| standard/master bit sweep v1 | 144 | 34 | 0 | 0 |
| standard/master neighbor sweep v2 | 188 | 47 | 0 | 0 |
| standard/master lower-neighbor sweep v3 | 188 | 47 | 0 | 0 |
The compact and isolation runs stayed in the expected table-readback plus
`02 00 02 00 00 5A` CONNECT-OK response rhythm.
The fresh-latch run ended with one trailing unframed byte after the final send.
There were no resync events or dropped bytes; this is consistent with the run
ending while the next response frame was just beginning.
## Confirmed Visible Effects
## Far-Right Stack Reference
The physical far-right stack, top to bottom, is:
```text
TALLY light, with camera number
STANDARD
MASTER
SLAVE
CAM POWER
BARS
```
Use these names instead of generic "right-side status" labels when reviewing
webcam crops.
Readout/status run:
| Frame | Selector/value | Visible effect |
| --- | --- | --- |
| `00 01 0F 08 00 5C` | `E000[0x008F]=0x0800` | SHUTTER display shows `EUS`/likely `EVS`; iris AUTO lamp is lit |
| `00 01 0F 10 00 44` | `E000[0x008F]=0x1000` | SHUTTER display shows `OFF`; iris AUTO lamp remains lit |
| `00 01 13 80 00 C8` | `E000[0x0093]=0x8000` | white-balance / black-flare lamp cluster changes, consistent with prior preset/manual observation |
| `00 01 13 90 20 F8` | `E000[0x0093]=0x9020` | black-flare manual-context candidate remains visible |
| `00 01 13 90 FF 27` | `E000[0x0093]=0x90FF` | black-flare auto-context candidate remains visible |
| `00 01 90 80 00 4B` | `E000[0x0110]=0x8000` | KNEE AUTO lamp lights |
The `0x00B9` gate writes in this compact run did not light KNEE AUTO by
themselves at the 0.5 s snapshot point. That matches the ROM model where
`0x00B9.13` is more of a report-path gate, while `0x0110.15` is the stronger
visible KNEE AUTO source.
Operator-lamp run:
| Frame | Selector/value | Visible effect |
| --- | --- | --- |
| `00 00 13 80 00 C9` | `E000[0x0013]=0x8000` | far-right SLAVE lamp lights, based on stack order and crop position |
| `00 00 17 80 00 CD` | `E000[0x0017]=0x8000` | far-right bottom white BARS lamp lights |
| `00 00 1A 80 00 C0` | `E000[0x001A]=0x8000` | lower right white lamp appeared lit in the compact run, later refined as likely `0x0017` carryover |
Right-stack isolation/fresh-latch refinement:
| Frame | Selector/value | Visible effect |
| --- | --- | --- |
| `00 00 15 80 00 CF` | `E000[0x0015]=0x8000` | CALL lamp lights |
| `00 00 15 00 00 4F` | `E000[0x0015]=0x0000` | CALL lamp clears |
| `00 00 13 80 00 C9` | `E000[0x0013]=0x8000` | far-right SLAVE lamp lights |
| `00 00 13 00 00 49` | `E000[0x0013]=0x0000` | SLAVE lamp clears |
| `00 00 17 80 00 CD` | `E000[0x0017]=0x8000` | far-right bottom white BARS lamp lights |
| `00 00 17 00 00 4D` | `E000[0x0017]=0x0000` | lamp remains lit; low write does not clear it |
| `00 00 1A 80 00 C0` | `E000[0x001A]=0x8000` | no independent BARS-lamp effect from fresh boot |
| `00 00 07 80 00 DD` / `00 00 07 00 00 5D` | `E000[0x0007]` high/low | no clear visible delta from CONNECT-OK baseline |
So `0x0017` is currently the strongest BARS lamp-on/latch selector.
`0x001A` should not be labeled as the same lamp source from the prior compact
run; that was likely carryover after `0x0017` had latched the white lamp on.
`0x0007` is still protocol-relevant because the real panel emits the matching
CAM POWER event frame, but the host-write visible lamp mapping is not separated
from the CONNECT-OK baseline yet.
ROM trace refinement: selector `0x0013` dispatches to `H'2E06`, reads current
table word `E800[0x0013]` at `H'E826`, and maps bit 15 to SLAVE while bit 14
maps to `IRIS/M.BLACK LINK`. See `docs/pt2-iris-mblack-link-rom-trace.md`.
STANDARD/MASTER hunt:
| Run | Tested selector/value pocket | Result |
| --- | --- | --- |
| `panel-atlas-standard-master-bit-sweep-v1` | `0x0012`, `0x0013`, `0x0014` with high-bit/high-nibble candidates | no clean STANDARD or MASTER lamp trigger; positive SLAVE control worked |
| `panel-atlas-standard-master-neighbor-sweep-v2` | `0x0010`, `0x0011`, `0x0015`, `0x0016`, `0x0017`, `0x0018`, `0x0019`, `0x001A` high-nibble candidates | no clean STANDARD or MASTER trigger |
| `panel-atlas-standard-master-lower-neighbor-sweep-v3` | `0x0008` through `0x000F` high-nibble candidates | no clean STANDARD or MASTER trigger |
The `v2` sweep did show the far-right bottom BARS lamp/latch from the
`0x0017` family when using non-`0x8000` high-nibble values. The clearest
transition is `00 00 17 40 00 0D` (`E000[0x0017]=0x4000`) lighting the same
bottom white BARS lamp that `0x0017=0x8000` can light. The lamp persisted after
`0x0017=0x0000`, matching the existing BARS latch behavior. Later `0x0018`
rows are contaminated by that latch and need a fresh-boot isolation run before
labeling `0x0018` as a separate BARS source.
## Next Atlas Step
The next useful run is still a clear/ack/state-transition probe for the
`0x0017` BARS latch, now including `0x0017=0x4000`:
- test likely sibling selectors around `0x0016`, `0x0018`, `0x0019`, and `0x001A`
from a fresh boot after `0x0017` has latched on,
- try command-7 repeat/ack and selector-zero refreshes to see whether the lamp
clears through a state-machine transition rather than a simple low write,
- test `0x0007` with an alternate baseline, because CONNECT OK already lights
CAM POWER and masks any host-write lamp delta.
- do not re-run `0x0008` through `0x0014` high-nibble values for
STANDARD/MASTER unless the ROM trace points back there; the webcam sweeps did
not show those lamps in that pocket.
## ROM-Derived Button Output Sweep
To skip the physical RCP button-press side and directly test likely "on" states
from ROM handlers, use:
```powershell
.\.venv\Scripts\python.exe scripts\build_rom_button_output_sweep.py
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\panel-atlas-rom-button-output-candidates-v1.json --parity E --quiet-console --log captures\panel-atlas-rom-button-output-candidates-v1-webcam.txt --result-json captures\panel-atlas-rom-button-output-candidates-v1-webcam-result.json --snapshot-dir captures\panel-atlas-rom-button-output-candidates-v1-webcam-shots --camera-index 4 --snapshot-delays 0.5
```
This scenario power-cycles before every candidate, seeds `CONNECT: OK`, sends
one command-0 selector/value from the ROM-derived candidate list, and captures a
single webcam image 0.5 s later. It is intentionally slower than a continuous
sweep but should avoid most latch/carryover ambiguity.
## Broad Visual Sweep Workflow
For exploratory lamp/readout mining, use the generated big sweep rather than
hand-writing thousands of frames:
```powershell
.\.venv\Scripts\python.exe scripts\build_panel_visual_sweep.py scenarios\panel-atlas-big-visual-sweep-0001-017f-highbits.json --start 0x0001 --end 0x017F --values 0x8000,0x4000,0x2000,0x1000,0x0800 --power-cycle-every 32 --ok-every 8 --listen 0.65 --clear-listen 0.15 --ok-listen 0.30
```
Run the generated scenario with webcam snapshots:
```powershell
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\panel-atlas-big-visual-sweep-0001-017f-highbits.json --parity E --quiet-console --log captures\panel-atlas-big-visual-sweep-0001-017f-highbits-webcam.txt --result-json captures\panel-atlas-big-visual-sweep-0001-017f-highbits-webcam-result.json --snapshot-dir captures\panel-atlas-big-visual-sweep-0001-017f-highbits-webcam-shots --camera-index 4 --snapshot-delays 0.5
```
The generated high-bit sweep covers selectors `0x0001` through `0x017F` with
five candidate values per selector, for 1,915 candidate snapshots. It power
cycles every 32 selectors to reduce latch contamination. Selector zero is
omitted because it controls the CONNECT OK baseline.
After the run, create labeled review sheets:
```powershell
.\.venv\Scripts\python.exe scripts\make_panel_sweep_contact_sheets.py captures\panel-atlas-big-visual-sweep-0001-017f-highbits-webcam-shots --output-dir captures\panel-atlas-big-visual-sweep-0001-017f-highbits-sheets --only-candidates --crop panel --cols 4 --rows 5 --thumb-width 360
```
If a sheet shows a visible change, the image label has the exact trigger form:
`candidate_XXXX_YYYY` means command-0 wrote `E000[0xXXXX]=0xYYYY`. Use that
selector/value in a smaller fresh-boot isolation scenario.
## Broad Sweep Findings
Run:
```text
captures/panel-atlas-big-visual-sweep-0001-017f-highbits-webcam.txt
captures/panel-atlas-big-visual-sweep-0001-017f-highbits-webcam-result.json
captures/panel-atlas-big-visual-sweep-0001-017f-highbits-webcam-shots/
```
Serial health:
| RX frames | TX frames | Resync | Dropped bytes | Snapshots |
| ---: | ---: | ---: | ---: | ---: |
| 706 | 2372 | 0 | 0 | 1916 |
User-reviewed new visible hits from the broad sweep:
| Candidate label | Frame | Selector/value | Reported visible effect |
| --- | --- | --- | --- |
| `candidate_0013_4000` | `00 00 13 40 00 09` | `E000[0x0013]=0x4000` | `IRIS/M.BLACK LINK` area/lamp |
| `candidate_0024_8000` | `00 00 24 80 00 FE` | `E000[0x0024]=0x8000` | LCD selector button/lamp |
| `candidate_0082_8000` | `00 01 02 80 00 D9` | `E000[0x0082]=0x8000` | IRIS readout shows `OP` |
| `candidate_0082_4000` | `00 01 02 40 00 19` | `E000[0x0082]=0x4000` | IRIS readout shows `1.4` |
| `candidate_0083_8000` | `00 01 03 80 00 D8` | `E000[0x0083]=0x8000` | MASTER GAIN readout shows `-3` |
| `candidate_0093_8000` | `00 01 13 80 00 C8` | `E000[0x0093]=0x8000` | white-balance PRESET lamp |
| `candidate_0093_4000` | `00 01 13 40 00 08` | `E000[0x0093]=0x4000` | white-balance AUTO lamp |
| `candidate_0093_2000` | `00 01 13 20 00 68` | `E000[0x0093]=0x2000` | white-balance MANUAL lamp |
The serial log shows immediate command-4 table readback frames for these writes,
so the RCP accepted the selector updates.
Fresh-boot isolation scenario:
```powershell
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\panel-atlas-big-hits-isolation-v1.json --parity E --quiet-console --log captures\panel-atlas-big-hits-isolation-v1-webcam.txt --result-json captures\panel-atlas-big-hits-isolation-v1-webcam-result.json --snapshot-dir captures\panel-atlas-big-hits-isolation-v1-webcam-shots --camera-index 4 --snapshot-delays 0.5
```
Create review sheets for that isolation run:
```powershell
.\.venv\Scripts\python.exe scripts\make_panel_sweep_contact_sheets.py captures\panel-atlas-big-hits-isolation-v1-webcam-shots --output-dir captures\panel-atlas-big-hits-isolation-v1-sheets --crop panel --cols 3 --rows 4 --thumb-width 420
```
Fresh-boot isolation results:
| Frame | Selector/value | Confirmed visible effect |
| --- | --- | --- |
| `00 00 13 40 00 09` | `E000[0x0013]=0x4000` | `IRIS/M.BLACK LINK` lamp |
| `00 00 24 80 00 FE` | `E000[0x0024]=0x8000` | LCD selector-button lamp |
| `00 00 24 00 00 7E` | `E000[0x0024]=0x0000` | same LCD selector-button lamp remained visible at 0.5 s |
| `00 01 02 80 00 D9` | `E000[0x0082]=0x8000` | IRIS readout `OP` |
| `00 01 02 40 00 19` | `E000[0x0082]=0x4000` | IRIS readout `1.4` |
| `00 01 02 00 00 59` | `E000[0x0082]=0x0000` | IRIS readout blank |
| `00 01 03 80 00 D8` | `E000[0x0083]=0x8000` | IRIS AUTO lamp, SHUTTER `OFF`, MASTER GAIN `-3` |
| `00 01 03 00 00 58` | `E000[0x0083]=0x0000` | same IRIS AUTO / SHUTTER `OFF` / MASTER GAIN `-3` state remained visible at 0.5 s |
| `00 01 13 80 00 C8` | `E000[0x0093]=0x8000` | BLACK/FLARE MANUAL plus white-balance PRESET |
| `00 01 13 40 00 08` | `E000[0x0093]=0x4000` | BLACK/FLARE MANUAL plus white-balance AUTO |
| `00 01 13 20 00 68` | `E000[0x0093]=0x2000` | BLACK/FLARE MANUAL plus white-balance MANUAL |
| `00 01 13 00 00 48` | `E000[0x0093]=0x0000` | BLACK/FLARE MANUAL plus white-balance MANUAL |
Interpretation:
- `0x0082` is a direct IRIS display/status selector. Clearing it blanks the IRIS
readout, so this one behaves like a simple display source.
- `0x0083=0x8000` drives a combined state: MASTER GAIN `-3`, SHUTTER `OFF`, and
IRIS AUTO. Clearing the selector did not visibly clear that state in the
isolation run, so it may be latched or copied into another display bank.
- `0x0093` is now a confirmed white-balance mode selector with
`0x8000=PRESET`, `0x4000=AUTO`, and `0x0000/0x2000=MANUAL` under this test
context. BLACK/FLARE MANUAL was also present for all tested `0x0093` states.
- `0x0024=0x8000` lights an LCD selector-button lamp, but `0x0024=0x0000` did
not clear it in this timing window.