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

functionclassificationrefscalls
0x0040b13b
directional 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"]}
0x0040b49e
availability table builder
confirmed-selector-state-layer
0x59e360/0x59e370 enabled table을 준비하는 selector availability producer다.
{"runtime.enabledTableA": ["0x0040b4af"], "runtime.enabledTableB": ["0x0040b4b4"]}{"call.availabilityBuilder": ["0x0040b4d2"]}
0x0040b4e6
availability branch consumer
confirmed-selector-state-layer
object+0xa8 selector와 enabled table 값을 비교해 분기한다.
{"runtime.enabledTableA": ["0x0040b505"], "runtime.enabledTableB": ["0x0040b511"]}{}
0x0040b55f
next enabled row producer
confirmed-selector-state-layer
enabled table에서 다음 선택 가능 row를 찾고 object+0xa8 slot에 쓴다.
{"runtime.enabledTableA": ["0x0040b57e"], "runtime.enabledTableB": ["0x0040b58a"], "descriptor.persistFlag": ["0x0040b591"]}{}
0x0040b696
active 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"]}{}
0x0040b752
persistent 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"]}{}
0x00410570
cursor apply/helper
confirmed-helper
cursor movement helper로, 선택 buffer/object state를 갱신한다.
{"input.currentActionMask": ["0x004106a8"]}{}
0x004106ba
cursor 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"]}{}
0x0041d61b
menu-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"]}
0x0041d89d
display 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

functionrefscalls
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

Next Frontier

Raw JSON