HUD Menu Mode/State Dispatcher Review
0x0041d61b 및 0x0040b49e..0x0040b752 계열은 메뉴가 이미 열린 뒤의 cursor/selector/mode-state dispatcher로 분류된다. 이 층은 입력, cursor globals, selector table을 강하게 참조하지만 top-menu object sequence 생성이나 descriptor-add 호출과 연결되지 않으므로 normal-field ESC/X opener 증거가 아니다.
statusmenu-internal-dispatcher-grounded-opener-pending
dispatcher rows10
confirmed internal10
input/menu intersections6
opener-like intersections0
opener provenFalse
Confirmed Dispatcher/Selector Layer
| function | classification | refs | calls |
|---|---|---|---|
0x0040b13bdirectional input dispatch to cursor helper | confirmed-menu-internal-not-opener input edge 방향 bit를 해석해 0x410570 cursor helper로 넘기는 방향키 처리층이다. descriptor/materializer 근거가 없어 opener가 아니다. | {"input.edgeActionMask": ["0x0040b167", "0x0040b189", "0x0040b1b3", "0x0040b1d5", "0x0040b1ff", "0x0040b221", "0x0040b246", "0x0040b26b"]} | {"call.menuCursorApply": ["0x0040b17d", "0x0040b1a2", "0x0040b1c9", "0x0040b1ee", "0x0040b215", "0x0040b23a", "0x0040b25f", "0x0040b284"]} |
0x0040b49eavailability table builder | confirmed-selector-state-layer 0x59e360/0x59e370 enabled table을 준비하는 selector availability producer다. | {"runtime.enabledTableA": ["0x0040b4af"], "runtime.enabledTableB": ["0x0040b4b4"]} | {"call.availabilityBuilder": ["0x0040b4d2"]} |
0x0040b4e6availability branch consumer | confirmed-selector-state-layer object+0xa8 selector와 enabled table 값을 비교해 분기한다. | {"runtime.enabledTableA": ["0x0040b505"], "runtime.enabledTableB": ["0x0040b511"]} | {} |
0x0040b55fnext enabled row producer | confirmed-selector-state-layer enabled table에서 다음 선택 가능 row를 찾고 object+0xa8 slot에 쓴다. | {"runtime.enabledTableA": ["0x0040b57e"], "runtime.enabledTableB": ["0x0040b58a"], "descriptor.persistFlag": ["0x0040b591"]} | {} |
0x0040b696active descriptor row selector producer | confirmed-selector-state-layer active descriptor row의 +0x48/+0x4a 값을 비교해 menu selector slot을 만든다. | {"runtime.currentDescriptorIndex": ["0x0040b6a2"], "runtime.activeComparisonGroup": ["0x0040b6f5", "0x0040b70d"], "descriptor.activeOrder": ["0x0040b6aa"], "descriptor.rowTable": ["0x0040b6b8"]} | {} |
0x0040b752persistent menu category/cursor load-save | confirmed-selector-state-layer active descriptor row와 0x59e340/0x59e34a 사이에 menu category/cursor 상태를 load/save하는 persistent state handler다. | {"runtime.menuCategory": ["0x0040b79a", "0x0040b7c6", "0x0040b7d8"], "runtime.menuCursor": ["0x0040b7bb", "0x0040b7cd", "0x0040b7fa"], "runtime.currentDescriptorIndex": ["0x0040b780", "0x0040b7a1", "0x0040b7e0", "0x0040b802"], "descriptor.activeOrder": ["0x0040b788", "0x0040b7a9", "0x0040b7e8", "0x0040b80a"], "descriptor.persistFlag": ["0x0040b771"]} | {} |
0x00410570cursor apply/helper | confirmed-helper cursor movement helper로, 선택 buffer/object state를 갱신한다. | {"input.currentActionMask": ["0x004106a8"]} | {} |
0x004106bacursor motion/sound helper | confirmed-helper 0x59db5a/5b/5c/5e cursor globals를 소비하는 menu cursor motion 계층이다. | {"menu.cursorMax": ["0x00410794"], "menu.cursorMode": ["0x004106c6"], "menu.cursorSourceOffset": ["0x0041071a", "0x00410749", "0x0041079c", "0x004107b5", "0x004107e4"], "menu.cursorYBase": ["0x0041073c", "0x004107d7"], "menu.cursorY": ["0x00410771", "0x0041080c"]} | {} |
0x0041d61bmenu-internal input dispatcher | confirmed-menu-internal-not-opener edge mask를 읽고 이미 존재하는 menu object의 cursor/confirm/cancel 상태를 처리한다. 0x55b128 latch, 0x59db58..0x59db5e cursor globals, 0x59dd6c sound handle, 0x4106ba cursor motion helper, 0x42af73 sound cue를 함께 쓰지만 top-menu object sequence나 descriptor-add 호출은 없다. | {"input.edgeActionMask": ["0x0041d6ff", "0x0041d70a", "0x0041d712", "0x0041d71b", "0x0041d723", "0x0041d797", "0x0041d7b2", "0x0041d807", "0x0041d812", "0x0041d82e", "0x0041d851", "0x0041d85c"], "menu.dispatchLatch": ["0x0041d623", "0x0041d6f3", "0x0041d822", "0x0041d86c"], "menu.dispatchStopFlag": ["0x0041d87b"], "menu.cursorMax": ["0x0041d743"], "menu.cursorMode": ["0x0041d749"], "menu.cursorSourceOffset": ["0x0041d75b"], "menu.cursorYBase": ["0x0041d76a"], "menu.cursorY": ["0x0041d78f"], "menu.soundHandle": ["0x0041d7e4", "0x0041d849"]} | {"call.menuCursorMotion": ["0x0041d7a6"], "call.soundCue": ["0x0041d7da", "0x0041d83f"]} |
0x0041d89ddisplay VM selector base binder | confirmed-base-binder-not-opener display/object VM의 base pointer를 고르는 binder다. opener 증거로 쓰면 안 된다. | {"input.currentActionMask": ["0x0041d8c5"], "descriptor.rowTable": ["0x0041d8f8"], "descriptor.statusBase": ["0x0041d8d7"]} | {} |
Input + Menu-State Intersections
| function | refs | calls |
|---|---|---|
0x0040c6cc | {"input.edgeActionMask": ["0x0040c746", "0x0040c757", "0x0040c762"], "runtime.currentDescriptorIndex": ["0x0040c6eb", "0x0040c778", "0x0040c78c", "0x0040c79a", "0x0040c7a1", "0x0040c7c7", "0x0040c7e4", "0x0040c81c", "0x0040c839", "0x0040c875", "0x0040c883", "0x0040c89d", "0x0040c8a9", "0x0040c8b0", "0x0040c8c7", "0x0040c8e4"]} | {} |
0x0041b82a | {"input.edgeActionMask": ["0x0041b84c"], "menu.dispatchStopFlag": ["0x0041b864", "0x0041b8a2", "0x0041b8dc"]} | {} |
0x0041b8ee | {"input.edgeActionMask": ["0x0041b907", "0x0041b924"], "menu.dispatchStopFlag": ["0x0041b944"]} | {} |
0x0041d61b | {"input.edgeActionMask": ["0x0041d6ff", "0x0041d70a", "0x0041d712", "0x0041d71b", "0x0041d723", "0x0041d797", "0x0041d7b2", "0x0041d807", "0x0041d812", "0x0041d82e", "0x0041d851", "0x0041d85c"], "menu.dispatchLatch": ["0x0041d623", "0x0041d6f3", "0x0041d822", "0x0041d86c"], "menu.dispatchStopFlag": ["0x0041d87b"], "menu.cursorMax": ["0x0041d743"], "menu.cursorMode": ["0x0041d749"], "menu.cursorSourceOffset": ["0x0041d75b"], "menu.cursorYBase": ["0x0041d76a"], "menu.cursorY": ["0x0041d78f"], "menu.soundHandle": ["0x0041d7e4", "0x0041d849"]} | {"call.menuCursorMotion": ["0x0041d7a6"], "call.soundCue": ["0x0041d7da", "0x0041d83f"]} |
0x0041d89d | {"input.currentActionMask": ["0x0041d8c5"], "descriptor.rowTable": ["0x0041d8f8"], "descriptor.statusBase": ["0x0041d8d7"]} | {} |
0x0041f073 | {"input.edgeActionMask": ["0x0041f092", "0x0041f0c6"], "menu.dispatchStopFlag": ["0x0041f1d7", "0x0041f317"]} | {} |
Negative Evidence
- 0x0041d61b reads input edge mask and menu cursor globals, but does not reference 0x004ddc6c and does not call 0x00431fe8.
- 0x0040b49e..0x0040b752 selector handlers prepare/consume enabled tables and persistent cursor state, not menu object construction.
- The exact top-menu #6/#3/#4 construction sequence remains data-grounded at 0x004ddc84 with no input-consumer intersection.
Next Frontier
- Trace the higher-level field mode/state transition that creates or attaches the top-menu descriptor before 0x0041d61b starts consuming cursor input.
- Search for producers of descriptor stack materialization or selected-root switch, not for cursor/confirm/cancel handlers.
- Promote only if a candidate connects input/state transition to the exact 0x004ddc6c top-menu object sequence or its descriptor attachment path.