Implement system menu show delay opcodes

This commit is contained in:
gamer147
2026-07-29 14:45:37 -04:00
parent 2065a1c504
commit 2993962307
8 changed files with 201 additions and 25 deletions

View File

@@ -283,6 +283,11 @@ name = "text_history_recording_suppressed"
type = "uint"
note = "high bit suppresses ADV retained-history index/text/metadata/voice recording; op 0x1bb writes 0x80000000 or zero, and HISTORY.BIN brackets itself with disable/enable"
[[field]]
offset = 0x5511c
name = "system_menu_show_delay_ms"
type = "uint"
note = "op 0x149 replaces the TIMER_SHOWMENU top-edge dwell threshold; reset defaults to 0 and SYSTEM4 sets 1000; op 0x148 reads it"
[[field]]
offset = 0x55120
name = "anti_tamper_a"
type = "int"

View File

@@ -3054,23 +3054,24 @@ observed_types = ["l-str"]
[[opcode]]
op = 0x149
label = "u0041FCE0"
label = "set-system-menu-show-delay"
argc = 1
abi_source = "kelebek+decode-validated"
[opcode.semantics]
name = "u0041FCE0"
category = "unknown"
summary = ""
name = "set-system-menu-show-delay"
category = "input"
summary = "(milliseconds) - replace the unsigned dwell threshold before pointer hover at the top two client rows reveals AGERC's modeless system-menu strip. Scene reset defaults to 0; SYSTEM4 sets 1000."
details = "Port status (2026-07-29): implemented as unsigned scene-context state. The setter preserves all 32 operand bits, root scene reload restores zero, and the current Godot frontend deliberately adds no host effect because it has no AGERC application-menu strip."
noop_headless = false
source = "kelebek"
confidence = "low"
source = "investigation"
confidence = "high"
depends_on = []
evidence = ""
evidence = "Ghidra /v2: op_0x149_set_system_menu_show_delay@0x422050 directly stores operand 1 at EngineCtx+0x5511c; scene_context_init_reset writes 0 and paired op_0x148_get_system_menu_show_delay@0x429c70 reads it. system_menu_top_edge_dwell_timer_tick@0x486280 compares the field unsigned against timeGetTime elapsed while WM_MOUSEMOVE is in client y=0..1, then requires no left/right button, windowed ScreenMode, and g_pfnAgercHostCallback(-1)==0 before system_menu_strip_show@0x407bd0 invokes AGERC command 4. The handler uses the complete dword. SYSTEM4's sole site sets 1000 immediately before the unrelated tiled-surface edge setting."
[[opcode.semantics.args]]
i = 1
role = ""
role = "unsigned top-edge system-menu dwell threshold in milliseconds"
observed_types = ["imm"]
[[opcode]]
@@ -8831,20 +8832,25 @@ evidence = "Not observed in Himegari's script corpus; ABI label/argc come from K
[[opcode]]
op = 0x148
label = "u004160A0"
label = "get-system-menu-show-delay"
argc = 1
observed_in_himegari = false
abi_source = "kelebek"
abi_source = "kelebek+decode-validated"
[opcode.semantics]
name = "u004160A0"
category = "unknown"
summary = "Broader AGE-catalog compatibility stub; the port currently traces and skips it."
name = "get-system-menu-show-delay"
category = "input"
summary = "(out) - return the current unsigned TIMER_SHOWMENU top-edge dwell threshold paired with opcode 0x149."
details = "Port status (2026-07-29): implemented with opcode 0x149. The getter writes the retained dword through the VM's signed integer-cell representation so high-bit values preserve the same native 32 bits."
noop_headless = false
source = "kelebek"
confidence = "low"
source = "investigation"
confidence = "high"
depends_on = []
evidence = "Not observed in Himegari's script corpus; ABI label/argc come from Kelebek's AGE table."
evidence = "Ghidra /v2: op_0x148_get_system_menu_show_delay@0x429c70 writes EngineCtx+0x5511c to operand 1. Scene reset initializes the field to 0, opcode 0x149 replaces it, and the windowed top-edge TIMER_SHOWMENU path consumes it as an unsigned millisecond threshold. This getter is not observed in Himegari's corpus."
[[opcode.semantics.args]]
i = 1
role = "out: unsigned top-edge system-menu dwell threshold in milliseconds"
[[opcode]]
op = 0x14a