diff --git a/build/rom_ccu_seed_hints.json b/build/rom_ccu_seed_hints.json index 7606295..ab65a51 100644 --- a/build/rom_ccu_seed_hints.json +++ b/build/rom_ccu_seed_hints.json @@ -858,6 +858,31 @@ "value": 8192, "value_hex": "0x2000" }, + { + "cmd0_frame": "00 01 13 10 20 78", + "value": 4128, + "value_hex": "0x1020" + }, + { + "cmd0_frame": "00 01 13 40 40 48", + "value": 16448, + "value_hex": "0x4040" + }, + { + "cmd0_frame": "00 01 13 80 40 88", + "value": 32832, + "value_hex": "0x8040" + }, + { + "cmd0_frame": "00 01 13 00 20 68", + "value": 32, + "value_hex": "0x0020" + }, + { + "cmd0_frame": "00 01 13 00 40 08", + "value": 64, + "value_hex": "0x0040" + }, { "cmd0_frame": "00 01 13 00 00 48", "value": 0, @@ -1066,6 +1091,75 @@ "current_value_table_candidate" ] }, + { + "accesses": [], + "cmd1_read_frame": "01 00 6B 00 00 30", + "dispatch_target": { + "decoded_code": false, + "dispatch_index": 107, + "dispatch_index_hex": "0x06B", + "entry_address_hex": "H'297C", + "selector": 107, + "selector_hex": "0x06B", + "target": 12146, + "target_hex": "H'2F72", + "target_label_or_hex": "H'2F72" + }, + "name": "standard_lamp_lane", + "reasons": [ + "when F731.7 is set, command 5 on this selector clears F731.7/F790.7", + "Bench-visible STANDARD lamp lane found from ROM-derived F6D4.6 handler candidate.", + "selector dispatches to H'2F72" + ], + "score": 11, + "seed_frames": [ + { + "cmd0_frame": "00 00 6B 80 00 B1", + "value": 32768, + "value_hex": "0x8000" + } + ], + "selector": 107, + "selector_hex": "0x06B", + "tables": [] + }, + { + "accesses": [], + "cmd1_read_frame": "01 00 15 00 00 4E", + "dispatch_target": { + "decoded_code": false, + "dispatch_index": 21, + "dispatch_index_hex": "0x015", + "entry_address_hex": "H'28D0", + "selector": 21, + "selector_hex": "0x015", + "target": 11833, + "target_hex": "H'2E39", + "target_label_or_hex": "H'2E39" + }, + "name": "call_and_red_tally_lamp_lane", + "reasons": [ + "observed RCP autonomous report frame(s): 00 00 15 80 00 CF, 00 00 15 00 00 4F", + "Bench-visible CALL lamp and red tally lane; local CALL handler mirrors F6DB.5 into E800[0x0015].15.", + "selector dispatches to H'2E39" + ], + "score": 9, + "seed_frames": [ + { + "cmd0_frame": "00 00 15 80 00 CF", + "value": 32768, + "value_hex": "0x8000" + }, + { + "cmd0_frame": "00 00 15 00 00 4F", + "value": 0, + "value_hex": "0x0000" + } + ], + "selector": 21, + "selector_hex": "0x015", + "tables": [] + }, { "accesses": [ { @@ -1146,31 +1240,6 @@ "current_value_table_candidate" ] }, - { - "accesses": [], - "cmd1_read_frame": "01 00 6B 00 00 30", - "dispatch_target": { - "decoded_code": false, - "dispatch_index": 107, - "dispatch_index_hex": "0x06B", - "entry_address_hex": "H'297C", - "selector": 107, - "selector_hex": "0x06B", - "target": 12146, - "target_hex": "H'2F72", - "target_label_or_hex": "H'2F72" - }, - "name": "connection_latch_clear_candidate", - "reasons": [ - "when F731.7 is set, command 5 on this selector clears F731.7/F790.7", - "selector dispatches to H'2F72" - ], - "score": 7, - "seed_frames": [], - "selector": 107, - "selector_hex": "0x06B", - "tables": [] - }, { "accesses": [], "cmd1_read_frame": "01 00 6C 00 00 37", @@ -1221,6 +1290,36 @@ "selector_hex": "0x06D", "tables": [] }, + { + "accesses": [ + { + "access": "read", + "address_hex": "H'17A7", + "function": "loc_1795", + "instruction": "BTST.W #15, @H'E220", + "table": "primary_value_table_candidate" + } + ], + "cmd1_read_frame": "01 01 90 00 00 CA", + "name": "knee_auto_lamp_or_page_status_lane", + "reasons": [ + "primary_value_table_candidate read in loc_1795: BTST.W #15, @H'E220", + "Bench-visible KNEE AUTO source; ROM notes indicate timed KNEE/detail page interaction." + ], + "score": 7, + "seed_frames": [ + { + "cmd0_frame": "00 01 90 80 00 4B", + "value": 32768, + "value_hex": "0x8000" + } + ], + "selector": 272, + "selector_hex": "0x110", + "tables": [ + "primary_value_table_candidate" + ] + }, { "accesses": [], "cmd1_read_frame": "01 00 13 00 00 48", @@ -1264,6 +1363,93 @@ "selector_hex": "0x013", "tables": [] }, + { + "accesses": [], + "cmd1_read_frame": "01 00 17 00 00 4C", + "dispatch_target": { + "decoded_code": false, + "dispatch_index": 23, + "dispatch_index_hex": "0x017", + "entry_address_hex": "H'28D4", + "selector": 23, + "selector_hex": "0x017", + "target": 11909, + "target_hex": "H'2E85", + "target_label_or_hex": "H'2E85" + }, + "name": "bars_lamp_lane", + "reasons": [ + "Bench-visible BARS lamp/latch lane; low writes do not reliably clear the visible latch.", + "selector dispatches to H'2E85" + ], + "score": 6, + "seed_frames": [ + { + "cmd0_frame": "00 00 17 80 00 CD", + "value": 32768, + "value_hex": "0x8000" + }, + { + "cmd0_frame": "00 00 17 40 00 0D", + "value": 16384, + "value_hex": "0x4000" + }, + { + "cmd0_frame": "00 00 17 00 00 4D", + "value": 0, + "value_hex": "0x0000" + } + ], + "selector": 23, + "selector_hex": "0x017", + "tables": [] + }, + { + "accesses": [], + "cmd1_read_frame": "01 00 1A 00 00 41", + "dispatch_target": { + "decoded_code": false, + "dispatch_index": 26, + "dispatch_index_hex": "0x01A", + "entry_address_hex": "H'28DA", + "selector": 26, + "selector_hex": "0x01A", + "target": 11972, + "target_hex": "H'2EC4", + "target_label_or_hex": "H'2EC4" + }, + "name": "monitor_selector_lamps", + "reasons": [ + "Bench-visible MONITOR selector cluster found from ROM-derived button-output sweep.", + "selector dispatches to H'2EC4" + ], + "score": 6, + "seed_frames": [ + { + "cmd0_frame": "00 00 1A 08 08 40", + "value": 2056, + "value_hex": "0x0808" + }, + { + "cmd0_frame": "00 00 1A 20 20 40", + "value": 8224, + "value_hex": "0x2020" + }, + { + "cmd0_frame": "00 00 1A 40 40 40", + "value": 16448, + "value_hex": "0x4040" + }, + { + "cmd0_frame": "00 00 1A 80 80 40", + "value": 32896, + "value_hex": "0x8080" + } + ], + "selector": 26, + "selector_hex": "0x01A", + "tables": [] + }, { "accesses": [], "cmd1_read_frame": "01 00 24 00 00 7F", @@ -1325,31 +1511,6 @@ "selector_hex": "0x007", "tables": [] }, - { - "accesses": [], - "cmd1_read_frame": "01 00 15 00 00 4E", - "dispatch_target": { - "decoded_code": false, - "dispatch_index": 21, - "dispatch_index_hex": "0x015", - "entry_address_hex": "H'28D0", - "selector": 21, - "selector_hex": "0x015", - "target": 11833, - "target_hex": "H'2E39", - "target_label_or_hex": "H'2E39" - }, - "name": "call_button_report_candidate", - "reasons": [ - "observed RCP autonomous report frame(s): 00 00 15 80 00 CF, 00 00 15 00 00 4F", - "selector dispatches to H'2E39" - ], - "score": 5, - "seed_frames": [], - "selector": 21, - "selector_hex": "0x015", - "tables": [] - }, { "accesses": [ { @@ -1493,6 +1654,21 @@ "value": 32768, "value_hex": "0x8000" }, + { + "cmd0_frame": "00 01 03 40 00 18", + "value": 16384, + "value_hex": "0x4000" + }, + { + "cmd0_frame": "00 01 03 20 00 78", + "value": 8192, + "value_hex": "0x2000" + }, + { + "cmd0_frame": "00 01 03 00 04 5C", + "value": 4, + "value_hex": "0x0004" + }, { "cmd0_frame": "00 01 03 00 00 58", "value": 0, @@ -1503,6 +1679,40 @@ "selector_hex": "0x083", "tables": [] }, + { + "accesses": [], + "cmd1_read_frame": "01 01 0F 00 00 55", + "name": "shutter_display_status_lane", + "reasons": [ + "Bench-visible shutter/status display lane; local F6D0.6/F6D0.7 handlers also queue this selector." + ], + "score": 4, + "seed_frames": [ + { + "cmd0_frame": "00 01 0F 80 00 D4", + "value": 32768, + "value_hex": "0x8000" + }, + { + "cmd0_frame": "00 01 0F 20 00 74", + "value": 8192, + "value_hex": "0x2000" + }, + { + "cmd0_frame": "00 01 0F 08 00 5C", + "value": 2048, + "value_hex": "0x0800" + }, + { + "cmd0_frame": "00 01 0F 10 00 44", + "value": 4096, + "value_hex": "0x1000" + } + ], + "selector": 143, + "selector_hex": "0x08F", + "tables": [] + }, { "accesses": [ { @@ -1595,29 +1805,6 @@ "primary_value_table_candidate" ] }, - { - "accesses": [ - { - "access": "read", - "address_hex": "H'17A7", - "function": "loc_1795", - "instruction": "BTST.W #15, @H'E220", - "table": "primary_value_table_candidate" - } - ], - "cmd1_read_frame": "01 01 90 00 00 CA", - "name": "state_selector_candidate", - "reasons": [ - "primary_value_table_candidate read in loc_1795: BTST.W #15, @H'E220" - ], - "score": 3, - "seed_frames": [], - "selector": 272, - "selector_hex": "0x110", - "tables": [ - "primary_value_table_candidate" - ] - }, { "accesses": [], "cmd1_read_frame": "01 00 12 00 00 49", @@ -1666,30 +1853,6 @@ "selector_hex": "0x016", "tables": [] }, - { - "accesses": [], - "cmd1_read_frame": "01 00 17 00 00 4C", - "dispatch_target": { - "decoded_code": false, - "dispatch_index": 23, - "dispatch_index_hex": "0x017", - "entry_address_hex": "H'28D4", - "selector": 23, - "selector_hex": "0x017", - "target": 11909, - "target_hex": "H'2E85", - "target_label_or_hex": "H'2E85" - }, - "name": "state_selector_candidate", - "reasons": [ - "selector dispatches to H'2E85" - ], - "score": 2, - "seed_frames": [], - "selector": 23, - "selector_hex": "0x017", - "tables": [] - }, { "accesses": [], "cmd1_read_frame": "01 00 18 00 00 43", @@ -1714,30 +1877,6 @@ "selector_hex": "0x018", "tables": [] }, - { - "accesses": [], - "cmd1_read_frame": "01 00 1A 00 00 41", - "dispatch_target": { - "decoded_code": false, - "dispatch_index": 26, - "dispatch_index_hex": "0x01A", - "entry_address_hex": "H'28DA", - "selector": 26, - "selector_hex": "0x01A", - "target": 11972, - "target_hex": "H'2EC4", - "target_label_or_hex": "H'2EC4" - }, - "name": "state_selector_candidate", - "reasons": [ - "selector dispatches to H'2EC4" - ], - "score": 2, - "seed_frames": [], - "selector": 26, - "selector_hex": "0x01A", - "tables": [] - }, { "accesses": [], "cmd1_read_frame": "01 00 25 00 00 7E", @@ -2004,7 +2143,7 @@ } ], "summary": { - "candidate_count": 43, + "candidate_count": 44, "confidence": "medium", "core_model": "The RCP likely waits for the CCU to seed mirrored state tables, then uses those selector values to update LCD text, panel lamps, and report state changes." }, diff --git a/build/rom_ccu_seed_hints.txt b/build/rom_ccu_seed_hints.txt index 39f2273..64d03e2 100644 --- a/build/rom_ccu_seed_hints.txt +++ b/build/rom_ccu_seed_hints.txt @@ -43,6 +43,18 @@ Highest-Value Selector Candidates: - ROM default table writes E000/E800 selector 0x040 to 0xFFFF and bench tests repeatedly touched the 0x40 family seed frames: 0xFFFF -> 00 00 40 FF FF 1A; 0x4030 -> 00 00 40 40 30 6A readback frame: 01 00 40 00 00 1B +- 0x06B standard_lamp_lane: score=11 tables=none + - when F731.7 is set, command 5 on this selector clears F731.7/F790.7 + - Bench-visible STANDARD lamp lane found from ROM-derived F6D4.6 handler candidate. + - selector dispatches to H'2F72 + seed frames: 0x8000 -> 00 00 6B 80 00 B1 + readback frame: 01 00 6B 00 00 30 +- 0x015 call_and_red_tally_lamp_lane: score=9 tables=none + - observed RCP autonomous report frame(s): 00 00 15 80 00 CF, 00 00 15 00 00 4F + - Bench-visible CALL lamp and red tally lane; local CALL handler mirrors F6DB.5 into E800[0x0015].15. + - selector dispatches to H'2E39 + seed frames: 0x8000 -> 00 00 15 80 00 CF; 0x0000 -> 00 00 15 00 00 4F + readback frame: 01 00 15 00 00 4E - 0x081 state_selector_candidate: score=9 tables=primary_value_table_candidate, current_value_table_candidate - primary_value_table_candidate read in vec_ad_adi_3D99: MOV:G.W @H'E102, R0 - primary_value_table_candidate read in vec_ad_adi_3D99: CMP:G.W @H'E102, R1 @@ -53,10 +65,6 @@ Highest-Value Selector Candidates: - primary_value_table_candidate read in loc_2650: CMP:G.W @H'E124, R0 - current_value_table_candidate write in loc_2650: MOV:G.W R0, @H'E924 readback frame: 01 01 12 00 00 48 -- 0x06B connection_latch_clear_candidate: score=7 tables=none - - when F731.7 is set, command 5 on this selector clears F731.7/F790.7 - - selector dispatches to H'2F72 - readback frame: 01 00 6B 00 00 30 - 0x06C command5_be70_candidate: score=7 tables=none - continuation command 5 calls BE70 for selector 0x006C - selector dispatches to H'2FAF @@ -65,6 +73,11 @@ Highest-Value Selector Candidates: - continuation command 5 calls BE70 for selector 0x006D - selector dispatches to H'3015 readback frame: 01 00 6D 00 00 36 +- 0x110 knee_auto_lamp_or_page_status_lane: score=7 tables=primary_value_table_candidate + - primary_value_table_candidate read in loc_1795: BTST.W #15, @H'E220 + - Bench-visible KNEE AUTO source; ROM notes indicate timed KNEE/detail page interaction. + seed frames: 0x8000 -> 00 01 90 80 00 4B + readback frame: 01 01 90 00 00 CA - 0x013 slave_and_iris_mblack_link_lamps: score=6 tables=none - Selector 0x0013 is a two-bit lamp/status word. ROM dispatch H'2E06 reads current table word H'E826 and fans bit 15 and bit 14 into panel latch RAM. - 0x8000 SLAVE lamp: sets F791.6 and F713.4 @@ -72,6 +85,16 @@ Highest-Value Selector Candidates: - selector dispatches to H'2E06 seed frames: 0x8000 -> 00 00 13 80 00 C9; 0x4000 -> 00 00 13 40 00 09; 0x0000 -> 00 00 13 00 00 49 readback frame: 01 00 13 00 00 48 +- 0x017 bars_lamp_lane: score=6 tables=none + - Bench-visible BARS lamp/latch lane; low writes do not reliably clear the visible latch. + - selector dispatches to H'2E85 + seed frames: 0x8000 -> 00 00 17 80 00 CD; 0x4000 -> 00 00 17 40 00 0D; 0x0000 -> 00 00 17 00 00 4D + readback frame: 01 00 17 00 00 4C +- 0x01A monitor_selector_lamps: score=6 tables=none + - Bench-visible MONITOR selector cluster found from ROM-derived button-output sweep. + - selector dispatches to H'2EC4 + seed frames: 0x0808 -> 00 00 1A 08 08 40; 0x2020 -> 00 00 1A 20 20 40; 0x4040 -> 00 00 1A 40 40 40 + readback frame: 01 00 1A 00 00 41 - 0x024 lcd_selector_button_lamp: score=6 tables=none - Bench-visible LCD selector-button lamp lane. - selector dispatches to H'2F0C @@ -81,10 +104,6 @@ Highest-Value Selector Candidates: - observed RCP autonomous report frame(s): 00 00 07 80 00 DD - selector dispatches to H'2DC3 readback frame: 01 00 07 00 00 5C -- 0x015 call_button_report_candidate: score=5 tables=none - - observed RCP autonomous report frame(s): 00 00 15 80 00 CF, 00 00 15 00 00 4F - - selector dispatches to H'2E39 - readback frame: 01 00 15 00 00 4E - 0x023 state_selector_candidate: score=5 tables=primary_value_table_candidate - primary_value_table_candidate write in loc_400C: CLR.W @H'E046 - selector dispatches to H'2EE6 @@ -108,16 +127,6 @@ Highest-Value Selector Candidates: - Bench-visible IRIS seven-segment/display lane. seed frames: 0x8000 -> 00 01 02 80 00 D9; 0x4000 -> 00 01 02 40 00 19; 0x0000 -> 00 01 02 00 00 59 readback frame: 01 01 02 00 00 58 -- 0x083 combined_iris_shutter_master_gain_status_lane: score=4 tables=none - - Bench-visible combined status/readout lane; clear behavior appears latched or copied elsewhere. - seed frames: 0x8000 -> 00 01 03 80 00 D8; 0x0000 -> 00 01 03 00 00 58 - readback frame: 01 01 03 00 00 59 -- 0x002 state_selector_candidate: score=3 tables=primary_value_table_candidate - - primary_value_table_candidate read in loc_2650: BTST.W #13, @H'E004 - readback frame: 01 00 02 00 00 59 -- 0x0A7 state_selector_candidate: score=3 tables=primary_value_table_candidate - - primary_value_table_candidate read in loc_1705: BTST.W #15, @H'E14E - readback frame: 01 01 27 00 00 7D Display Text Hints: - CONNECT: 0 hit(s) diff --git a/build/rom_serial_pseudocode.c b/build/rom_serial_pseudocode.c index 1a03dd4..9d7cd05 100644 --- a/build/rom_serial_pseudocode.c +++ b/build/rom_serial_pseudocode.c @@ -204,18 +204,26 @@ extern volatile u8 MEM8[0x10000]; * frames: active report 00 00 13 40 00 09; clear report 00 00 13 00 00 49; ACK 05 00 13 00 00 4C; mirror active 00 00 13 40 00 09; mirror clear 00 00 13 00 00 49 * local trigger candidates: provisional_iris_mblack_link_button_toggle_report F006.7 / F6DB.7: When F6DB.7 is asserted and F731 <= 3, the ROM toggles current-table bit 14 at H'E826 based on F791.5, then queues selector 0x0013 through loc_3E54.; H'1FE8/H'1FFB: Adjacent local helpers set or clear current-table bit 15 at H'E826 and queue selector 0x0013. * evidence: bench: 00 00 13 80 00 C9 lights far-right SLAVE lamp, bench: 00 00 13 40 00 09 lights IRIS/M.BLACK LINK lamp, ROM: H'2E06-H'2E32 tests H'E826 bits 15/14 and sets/clears F791/F713/F716 latch bits + * - 0x0015 call_and_red_tally_lamp_lane: Bench-visible CALL lamp and red tally lane; local CALL handler mirrors F6DB.5 into E800[0x0015].15. + * current word: H'E82A; dispatch: handler unknown + * observed values: 0x8000 CALL lamp and red tally on; 0x0000 CALL inactive/clear report + * evidence: bench: 00 00 15 80 00 CF lights CALL and red tally, ROM: H'20A1-H'20BA reads F6DB.5, writes H'E82A, and queues selector 0x0015 + * - 0x0017 bars_lamp_lane: Bench-visible BARS lamp/latch lane; low writes do not reliably clear the visible latch. + * current word: H'E82E; dispatch: handler unknown + * observed values: 0x8000 BARS lamp on; 0x4000 BARS lamp/latch on; 0x0000 BARS low write; visible latch may remain + * evidence: bench: 00 00 17 80 00 CD lights BARS, bench: 00 00 17 40 00 0D also lights the BARS latch in neighbor sweep, ROM: H'1EDE can queue selector 0x0017 from F6D4.2 + * - 0x001A monitor_selector_lamps: Bench-visible MONITOR selector cluster found from ROM-derived button-output sweep. + * current word: H'E834; dispatch: handler unknown + * observed values: 0x0808 MONITOR ENC lamp; 0x2020 MONITOR B lamp; 0x4040 MONITOR G lamp; 0x8080 MONITOR R lamp + * evidence: bench: 00 00 1A 08 08 40 lights MONITOR ENC, bench: 00 00 1A 20 20 40 lights MONITOR B, bench: 00 00 1A 40 40 40 lights MONITOR G, bench: 00 00 1A 80 80 40 lights MONITOR R, ROM: H'1CB2-H'1D56 writes packed values to H'E834 and queues selector 0x001A * - 0x0024 lcd_selector_button_lamp: Bench-visible LCD selector-button lamp lane. * current word: H'E848; dispatch: dispatch unknown * observed values: 0x8000 LCD selector-button lamp visible; 0x0000 lamp remained visible at 0.5 s in isolation run - * - 0x0082 iris_readout_lane: Bench-visible IRIS seven-segment/display lane. - * current word: H'E904; dispatch: dispatch unknown - * observed values: 0x8000 IRIS display OP; 0x4000 IRIS display 1.4; 0x0000 IRIS display blank - * - 0x0083 combined_iris_shutter_master_gain_status_lane: Bench-visible combined status/readout lane; clear behavior appears latched or copied elsewhere. - * current word: H'E906; dispatch: dispatch unknown - * observed values: 0x8000 IRIS AUTO, SHUTTER OFF, MASTER GAIN -3; 0x0000 same visible state remained at 0.5 s - * - 0x0093 white_balance_black_flare_mode_lane: Bench-visible white-balance and black/flare lamp lane. - * current word: H'E926; dispatch: dispatch unknown - * observed values: 0x8000 BLACK/FLARE MANUAL plus white-balance PRESET; 0x4000 BLACK/FLARE MANUAL plus white-balance AUTO; 0x2000 BLACK/FLARE MANUAL plus white-balance MANUAL; 0x0000 BLACK/FLARE MANUAL plus white-balance MANUAL + * - 0x006B standard_lamp_lane: Bench-visible STANDARD lamp lane found from ROM-derived F6D4.6 handler candidate. + * current word: H'E8D6; dispatch: handler unknown + * observed values: 0x8000 STANDARD lamp on + * evidence: bench: 00 00 6B 80 00 B1 lights STANDARD, ROM: H'2048 can write H'E8D6=0x8000 and queue selector 0x006B from F6D4.6 + * - ... 5 more panel selector annotations * state variable candidates: * - event_queue_read_cursor_candidate H'F9B4: reads 1, writes 2; bits 5 * evidence: H'BE78, H'BE95, H'BE99 @@ -406,6 +414,42 @@ static void sci1_candidate_panel_selector_annotation(u16 logical_index, u16 valu /* SLAVE and IRIS/M.BLACK LINK latch bits clear through H'2E06. */ } break; + case 0x0015u: + /* 0x0015 call_and_red_tally_lamp_lane; current word H'E82A; handler unknown. */ + if (value == 0x8000u) { + /* CALL lamp and red tally on. */ + } + if (value == 0x0000u) { + /* CALL inactive/clear report. */ + } + break; + case 0x0017u: + /* 0x0017 bars_lamp_lane; current word H'E82E; handler unknown. */ + if (value == 0x8000u) { + /* BARS lamp on. */ + } + if (value == 0x4000u) { + /* BARS lamp/latch on. */ + } + if (value == 0x0000u) { + /* BARS low write; visible latch may remain. */ + } + break; + case 0x001Au: + /* 0x001A monitor_selector_lamps; current word H'E834; handler unknown. */ + if (value == 0x0808u) { + /* MONITOR ENC lamp. */ + } + if (value == 0x2020u) { + /* MONITOR B lamp. */ + } + if (value == 0x4040u) { + /* MONITOR G lamp. */ + } + if (value == 0x8080u) { + /* MONITOR R lamp. */ + } + break; case 0x0024u: /* 0x0024 lcd_selector_button_lamp; current word H'E848; dispatch unknown. */ if (value == 0x8000u) { @@ -415,6 +459,12 @@ static void sci1_candidate_panel_selector_annotation(u16 logical_index, u16 valu /* lamp remained visible at 0.5 s in isolation run. */ } break; + case 0x006Bu: + /* 0x006B standard_lamp_lane; current word H'E8D6; handler unknown. */ + if (value == 0x8000u) { + /* STANDARD lamp on. */ + } + break; case 0x0082u: /* 0x0082 iris_readout_lane; current word H'E904; dispatch unknown. */ if (value == 0x8000u) { @@ -432,10 +482,34 @@ static void sci1_candidate_panel_selector_annotation(u16 logical_index, u16 valu if (value == 0x8000u) { /* IRIS AUTO, SHUTTER OFF, MASTER GAIN -3. */ } + if (value == 0x4000u) { + /* IRIS AUTO, SHUTTER OFF, MASTER GAIN 0. */ + } + if (value == 0x2000u) { + /* IRIS AUTO, SHUTTER OFF, MASTER GAIN 3. */ + } + if (value == 0x0004u) { + /* IRIS AUTO, SHUTTER OFF, MASTER GAIN HP. */ + } if (value == 0x0000u) { /* same visible state remained at 0.5 s. */ } break; + case 0x008Fu: + /* 0x008F shutter_display_status_lane; current word H'E91E; dispatch unknown. */ + if (value == 0x8000u) { + /* IRIS AUTO plus shutter value beginning with 1. */ + } + if (value == 0x2000u) { + /* IRIS AUTO plus shutter 00.0. */ + } + if (value == 0x0800u) { + /* IRIS AUTO plus shutter EVS. */ + } + if (value == 0x1000u) { + /* IRIS AUTO plus shutter OFF. */ + } + break; case 0x0093u: /* 0x0093 white_balance_black_flare_mode_lane; current word H'E926; dispatch unknown. */ if (value == 0x8000u) { @@ -447,10 +521,31 @@ static void sci1_candidate_panel_selector_annotation(u16 logical_index, u16 valu if (value == 0x2000u) { /* BLACK/FLARE MANUAL plus white-balance MANUAL. */ } + if (value == 0x1020u) { + /* BLACK/FLARE MANUAL plus white-balance MANUAL. */ + } + if (value == 0x4040u) { + /* BLACK/FLARE AUTO plus white-balance AUTO. */ + } + if (value == 0x8040u) { + /* BLACK/FLARE AUTO plus white-balance PRESET. */ + } + if (value == 0x0020u) { + /* BLACK/FLARE MANUAL plus white-balance MANUAL. */ + } + if (value == 0x0040u) { + /* BLACK/FLARE AUTO plus white-balance MANUAL. */ + } if (value == 0x0000u) { /* BLACK/FLARE MANUAL plus white-balance MANUAL. */ } break; + case 0x0110u: + /* 0x0110 knee_auto_lamp_or_page_status_lane; current word H'EA20; dispatch unknown. */ + if (value == 0x8000u) { + /* KNEE AUTO lamp/status on. */ + } + break; default: break; } diff --git a/docs/pt2-lamp-selector-map.md b/docs/pt2-lamp-selector-map.md index cd74e12..b8acd63 100644 --- a/docs/pt2-lamp-selector-map.md +++ b/docs/pt2-lamp-selector-map.md @@ -90,6 +90,18 @@ 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. +Later refinement: the ROM-derived fresh-boot output sweep found a clean +STANDARD trigger at `0x006B = 0x8000` (`00 00 6B 80 00 B1`). It also reclassed +the formerly vague `0x001A` pocket as the MONITOR selector cluster: + +| Selector/value | Visible effect | +| --- | --- | +| `0x001A = 0x0808` | MONITOR ENC | +| `0x001A = 0x2020` | MONITOR B | +| `0x001A = 0x4040` | MONITOR G | +| `0x001A = 0x8080` | MONITOR R | +| `0x006B = 0x8000` | STANDARD | + ### `panel-atlas-big-visual-sweep-0001-017f-highbits` The broad webcam sweep and fresh-boot isolation pass produced these confirmed diff --git a/docs/pt2-panel-atlas.md b/docs/pt2-panel-atlas.md index 57c6854..112146e 100644 --- a/docs/pt2-panel-atlas.md +++ b/docs/pt2-panel-atlas.md @@ -180,6 +180,59 @@ 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. +Run result notes from `captures/panel-atlas-rom-button-output-candidates-v1-webcam-shots/`: + +| Case | Frame | Selector/value | Visible result | +| --- | --- | --- | --- | +| 001 | `00 00 13 40 00 09` | `0x0013 = 0x4000` | IRIS/M.BLACK LINK | +| 002 | `00 00 13 80 00 C9` | `0x0013 = 0x8000` | SLAVE | +| 003 | `00 00 15 80 00 CF` | `0x0015 = 0x8000` | CALL and red tally | +| 004 | `00 00 17 80 00 CD` | `0x0017 = 0x8000` | BARS | +| 005 | `00 01 90 80 00 4B` | `0x0110 = 0x8000` | KNEE AUTO | +| 006 | `00 00 1A 08 08 40` | `0x001A = 0x0808` | MONITOR ENC | +| 007 | `00 00 1A 20 20 40` | `0x001A = 0x2020` | MONITOR B | +| 008 | `00 00 1A 40 40 40` | `0x001A = 0x4040` | MONITOR G | +| 009 | `00 00 1A 80 80 40` | `0x001A = 0x8080` | MONITOR R | +| 010 | `00 00 6B 80 00 B1` | `0x006B = 0x8000` | STANDARD | +| 011 | `00 01 03 00 04 5C` | `0x0083 = 0x0004` | IRIS AUTO, SHUTTER OFF, MASTER GAIN HP | +| 012 | `00 01 03 40 00 18` | `0x0083 = 0x4000` | IRIS AUTO, SHUTTER OFF, MASTER GAIN 0 | +| 013 | `00 01 03 20 00 78` | `0x0083 = 0x2000` | IRIS AUTO, SHUTTER OFF, MASTER GAIN 3 | +| 014 | `00 01 0F 80 00 D4` | `0x008F = 0x8000` | IRIS AUTO, SHUTTER begins with `1...` | +| 015 | `00 01 0F 20 00 74` | `0x008F = 0x2000` | IRIS AUTO, SHUTTER `00.0` | +| 016 | `00 01 0F 08 00 5C` | `0x008F = 0x0800` | IRIS AUTO, SHUTTER EVS | +| 017 | `00 01 0F 10 00 44` | `0x008F = 0x1000` | IRIS AUTO, SHUTTER OFF | +| 018 | `00 01 13 10 20 78` | `0x0093 = 0x1020` | BLACK/FLARE MANUAL, white balance MANUAL | +| 019 | `00 01 13 40 40 48` | `0x0093 = 0x4040` | BLACK/FLARE AUTO, white balance AUTO | +| 020 | `00 01 13 80 40 88` | `0x0093 = 0x8040` | BLACK/FLARE AUTO, white balance PRESET | +| 021 | `00 01 13 00 20 68` | `0x0093 = 0x0020` | BLACK/FLARE MANUAL, white balance MANUAL | +| 022 | `00 01 13 00 40 08` | `0x0093 = 0x0040` | BLACK/FLARE AUTO, white balance MANUAL | +| 023 | `00 01 1A 08 00 49` | `0x009A = 0x0800` | no panel change observed | +| 024 | `00 01 37 20 00 4C` | `0x00B7 = 0x2000` | no panel change observed | + +The run directory contains 28 candidate photos. The user-supplied ordered notes +covered the first 24, so cases 025-028 still need visual review before assigning +meanings: + +| Case | Frame | Selector/value | Candidate | +| --- | --- | --- | --- | +| 025 | `00 01 39 40 00 22` | `0x00B9 = 0x4000` | F6DC.7 handler value candidate | +| 026 | `00 01 44 80 00 9F` | `0x00C4 = 0x8000` | F6D4.0 bundle selector candidate | +| 027 | `00 01 46 80 00 9D` | `0x00C6 = 0x8000` | F6D4.0 bundle selector candidate | +| 028 | `00 01 78 80 00 A3` | `0x00F8 = 0x8000` | F6D4.1 handler candidate | + +Key refinements from this run: + +- `0x001A` is now best labeled as the MONITOR selector cluster: `ENC`, `B`, `G`, + and `R` appeared cleanly from the four packed values. +- `0x006B = 0x8000` is the first clean STANDARD lamp trigger. +- `0x0083` is a MASTER GAIN/status display word, with values observed for `HP`, + `0`, and `3`, while also lighting IRIS AUTO and showing SHUTTER OFF. +- `0x008F` carries local shutter display/value states beyond the earlier + EVS/OFF bits. +- `0x0093` now has stronger white-balance plus BLACK/FLARE field mapping: + high/mid bit combinations select WB AUTO/PRESET/MANUAL and BLACK/FLARE + AUTO/MANUAL together. + ## Broad Visual Sweep Workflow For exploratory lamp/readout mining, use the generated big sweep rather than diff --git a/h8536/panel_selectors.py b/h8536/panel_selectors.py index 7c5ad09..fec1722 100644 --- a/h8536/panel_selectors.py +++ b/h8536/panel_selectors.py @@ -105,6 +105,73 @@ PANEL_SELECTOR_SEMANTICS: tuple[JsonObject, ...] = ( {"value": 0x0000, "value_hex": "0x0000", "meaning": "SLAVE and IRIS/M.BLACK LINK latch bits clear through H'2E06", "confidence": "high"}, ], }, + { + "selector": 0x0015, + "selector_hex": "0x0015", + "name": "call_and_red_tally_lamp_lane", + "summary": "Bench-visible CALL lamp and red tally lane; local CALL handler mirrors F6DB.5 into E800[0x0015].15.", + "primary_word_address": PRIMARY_TABLE_BASE + 0x0015 * 2, + "primary_word_address_hex": "H'E02A", + "current_word_address": CURRENT_TABLE_BASE + 0x0015 * 2, + "current_word_address_hex": "H'E82A", + "dispatch_handler": "handler unknown", + "confidence": "bench-high", + "evidence": [ + "bench: 00 00 15 80 00 CF lights CALL and red tally", + "ROM: H'20A1-H'20BA reads F6DB.5, writes H'E82A, and queues selector 0x0015", + ], + "value_meanings": [ + {"value": 0x8000, "value_hex": "0x8000", "meaning": "CALL lamp and red tally on", "confidence": "bench-high"}, + {"value": 0x0000, "value_hex": "0x0000", "meaning": "CALL inactive/clear report", "confidence": "bench-high"}, + ], + }, + { + "selector": 0x0017, + "selector_hex": "0x0017", + "name": "bars_lamp_lane", + "summary": "Bench-visible BARS lamp/latch lane; low writes do not reliably clear the visible latch.", + "primary_word_address": PRIMARY_TABLE_BASE + 0x0017 * 2, + "primary_word_address_hex": "H'E02E", + "current_word_address": CURRENT_TABLE_BASE + 0x0017 * 2, + "current_word_address_hex": "H'E82E", + "dispatch_handler": "handler unknown", + "confidence": "bench-high", + "evidence": [ + "bench: 00 00 17 80 00 CD lights BARS", + "bench: 00 00 17 40 00 0D also lights the BARS latch in neighbor sweep", + "ROM: H'1EDE can queue selector 0x0017 from F6D4.2", + ], + "value_meanings": [ + {"value": 0x8000, "value_hex": "0x8000", "meaning": "BARS lamp on", "confidence": "bench-high"}, + {"value": 0x4000, "value_hex": "0x4000", "meaning": "BARS lamp/latch on", "confidence": "bench-medium-high"}, + {"value": 0x0000, "value_hex": "0x0000", "meaning": "BARS low write; visible latch may remain", "confidence": "bench-medium"}, + ], + }, + { + "selector": 0x001A, + "selector_hex": "0x001A", + "name": "monitor_selector_lamps", + "summary": "Bench-visible MONITOR selector cluster found from ROM-derived button-output sweep.", + "primary_word_address": PRIMARY_TABLE_BASE + 0x001A * 2, + "primary_word_address_hex": "H'E034", + "current_word_address": CURRENT_TABLE_BASE + 0x001A * 2, + "current_word_address_hex": "H'E834", + "dispatch_handler": "handler unknown", + "confidence": "bench-high", + "evidence": [ + "bench: 00 00 1A 08 08 40 lights MONITOR ENC", + "bench: 00 00 1A 20 20 40 lights MONITOR B", + "bench: 00 00 1A 40 40 40 lights MONITOR G", + "bench: 00 00 1A 80 80 40 lights MONITOR R", + "ROM: H'1CB2-H'1D56 writes packed values to H'E834 and queues selector 0x001A", + ], + "value_meanings": [ + {"value": 0x0808, "value_hex": "0x0808", "meaning": "MONITOR ENC lamp", "confidence": "bench-high"}, + {"value": 0x2020, "value_hex": "0x2020", "meaning": "MONITOR B lamp", "confidence": "bench-high"}, + {"value": 0x4040, "value_hex": "0x4040", "meaning": "MONITOR G lamp", "confidence": "bench-high"}, + {"value": 0x8080, "value_hex": "0x8080", "meaning": "MONITOR R lamp", "confidence": "bench-high"}, + ], + }, { "selector": 0x0024, "selector_hex": "0x0024", @@ -120,6 +187,25 @@ PANEL_SELECTOR_SEMANTICS: tuple[JsonObject, ...] = ( {"value": 0x0000, "value_hex": "0x0000", "meaning": "lamp remained visible at 0.5 s in isolation run", "confidence": "bench-low"}, ], }, + { + "selector": 0x006B, + "selector_hex": "0x006B", + "name": "standard_lamp_lane", + "summary": "Bench-visible STANDARD lamp lane found from ROM-derived F6D4.6 handler candidate.", + "primary_word_address": PRIMARY_TABLE_BASE + 0x006B * 2, + "primary_word_address_hex": "H'E0D6", + "current_word_address": CURRENT_TABLE_BASE + 0x006B * 2, + "current_word_address_hex": "H'E8D6", + "dispatch_handler": "handler unknown", + "confidence": "bench-high", + "evidence": [ + "bench: 00 00 6B 80 00 B1 lights STANDARD", + "ROM: H'2048 can write H'E8D6=0x8000 and queue selector 0x006B from F6D4.6", + ], + "value_meanings": [ + {"value": 0x8000, "value_hex": "0x8000", "meaning": "STANDARD lamp on", "confidence": "bench-high"}, + ], + }, { "selector": 0x0082, "selector_hex": "0x0082", @@ -148,9 +234,36 @@ PANEL_SELECTOR_SEMANTICS: tuple[JsonObject, ...] = ( "confidence": "bench-medium-high", "value_meanings": [ {"value": 0x8000, "value_hex": "0x8000", "meaning": "IRIS AUTO, SHUTTER OFF, MASTER GAIN -3", "confidence": "bench-medium-high"}, + {"value": 0x4000, "value_hex": "0x4000", "meaning": "IRIS AUTO, SHUTTER OFF, MASTER GAIN 0", "confidence": "bench-high"}, + {"value": 0x2000, "value_hex": "0x2000", "meaning": "IRIS AUTO, SHUTTER OFF, MASTER GAIN 3", "confidence": "bench-high"}, + {"value": 0x0004, "value_hex": "0x0004", "meaning": "IRIS AUTO, SHUTTER OFF, MASTER GAIN HP", "confidence": "bench-high"}, {"value": 0x0000, "value_hex": "0x0000", "meaning": "same visible state remained at 0.5 s", "confidence": "bench-low"}, ], }, + { + "selector": 0x008F, + "selector_hex": "0x008F", + "name": "shutter_display_status_lane", + "summary": "Bench-visible shutter/status display lane; local F6D0.6/F6D0.7 handlers also queue this selector.", + "primary_word_address": PRIMARY_TABLE_BASE + 0x008F * 2, + "primary_word_address_hex": "H'E11E", + "current_word_address": CURRENT_TABLE_BASE + 0x008F * 2, + "current_word_address_hex": "H'E91E", + "confidence": "bench-high", + "evidence": [ + "bench: 00 01 0F 80 00 D4 shows IRIS AUTO and shutter value beginning with 1", + "bench: 00 01 0F 20 00 74 shows IRIS AUTO and shutter 00.0", + "bench: 00 01 0F 08 00 5C shows IRIS AUTO and shutter EVS", + "bench: 00 01 0F 10 00 44 shows IRIS AUTO and shutter OFF", + "ROM: H'24E8/H'252E write H'E91E and queue selector 0x008F from F6D0.7/F6D0.6", + ], + "value_meanings": [ + {"value": 0x8000, "value_hex": "0x8000", "meaning": "IRIS AUTO plus shutter value beginning with 1", "confidence": "bench-medium-high"}, + {"value": 0x2000, "value_hex": "0x2000", "meaning": "IRIS AUTO plus shutter 00.0", "confidence": "bench-high"}, + {"value": 0x0800, "value_hex": "0x0800", "meaning": "IRIS AUTO plus shutter EVS", "confidence": "bench-high"}, + {"value": 0x1000, "value_hex": "0x1000", "meaning": "IRIS AUTO plus shutter OFF", "confidence": "bench-high"}, + ], + }, { "selector": 0x0093, "selector_hex": "0x0093", @@ -165,9 +278,32 @@ PANEL_SELECTOR_SEMANTICS: tuple[JsonObject, ...] = ( {"value": 0x8000, "value_hex": "0x8000", "meaning": "BLACK/FLARE MANUAL plus white-balance PRESET", "confidence": "bench-high"}, {"value": 0x4000, "value_hex": "0x4000", "meaning": "BLACK/FLARE MANUAL plus white-balance AUTO", "confidence": "bench-high"}, {"value": 0x2000, "value_hex": "0x2000", "meaning": "BLACK/FLARE MANUAL plus white-balance MANUAL", "confidence": "bench-high"}, + {"value": 0x1020, "value_hex": "0x1020", "meaning": "BLACK/FLARE MANUAL plus white-balance MANUAL", "confidence": "bench-high"}, + {"value": 0x4040, "value_hex": "0x4040", "meaning": "BLACK/FLARE AUTO plus white-balance AUTO", "confidence": "bench-high"}, + {"value": 0x8040, "value_hex": "0x8040", "meaning": "BLACK/FLARE AUTO plus white-balance PRESET", "confidence": "bench-high"}, + {"value": 0x0020, "value_hex": "0x0020", "meaning": "BLACK/FLARE MANUAL plus white-balance MANUAL", "confidence": "bench-high"}, + {"value": 0x0040, "value_hex": "0x0040", "meaning": "BLACK/FLARE AUTO plus white-balance MANUAL", "confidence": "bench-high"}, {"value": 0x0000, "value_hex": "0x0000", "meaning": "BLACK/FLARE MANUAL plus white-balance MANUAL", "confidence": "bench-high"}, ], }, + { + "selector": 0x0110, + "selector_hex": "0x0110", + "name": "knee_auto_lamp_or_page_status_lane", + "summary": "Bench-visible KNEE AUTO source; ROM notes indicate timed KNEE/detail page interaction.", + "primary_word_address": PRIMARY_TABLE_BASE + 0x0110 * 2, + "primary_word_address_hex": "H'E220", + "current_word_address": CURRENT_TABLE_BASE + 0x0110 * 2, + "current_word_address_hex": "H'EA20", + "confidence": "bench-high", + "evidence": [ + "bench: 00 01 90 80 00 4B lights KNEE AUTO", + "ROM: KNEE notes identify E000[0x0110].15 as a strong KNEE AUTO/timed display source", + ], + "value_meanings": [ + {"value": 0x8000, "value_hex": "0x8000", "meaning": "KNEE AUTO lamp/status on", "confidence": "bench-high"}, + ], + }, ) diff --git a/tests/test_panel_selectors.py b/tests/test_panel_selectors.py index c7613db..72084bd 100644 --- a/tests/test_panel_selectors.py +++ b/tests/test_panel_selectors.py @@ -53,6 +53,17 @@ class PanelSelectorSemanticsTest(unittest.TestCase): self.assertEqual(state_machine["active_mirror_frame"], "00 00 13 40 00 09") self.assertEqual(state_machine["clear_mirror_frame"], "00 00 13 00 00 49") + def test_rom_button_output_sweep_meanings_are_available(self): + monitor_text = " ".join(describe_selector_value(0x001A, 0x4040)) + standard_text = " ".join(describe_selector_value(0x006B, 0x8000)) + shutter_text = " ".join(describe_selector_value(0x008F, 0x2000)) + white_balance_text = " ".join(describe_selector_value(0x0093, 0x8040)) + + self.assertIn("MONITOR G", monitor_text) + self.assertIn("STANDARD", standard_text) + self.assertIn("shutter 00.0", shutter_text) + self.assertIn("white-balance PRESET", white_balance_text) + if __name__ == "__main__": unittest.main()