From 328c25bc5656af339759219b59f5f0f6edb5e5ae Mon Sep 17 00:00:00 2001 From: gamer147 Date: Tue, 7 Jul 2026 23:37:28 -0400 Subject: [PATCH] feat(gfx): label + dispatch set-anim-transform 0x21e/0x220 into GfxState Co-Authored-By: Claude Opus 4.8 --- docs/opcode-reference.md | 32 +- engine/Age.Engine.Tests/GfxAnimationTests.cs | 27 + engine/Age.Engine/Vm/VirtualMachine.cs | 7 + vm-map/opcodes.toml | 13650 ++++++++--------- 4 files changed, 6875 insertions(+), 6841 deletions(-) diff --git a/docs/opcode-reference.md b/docs/opcode-reference.md index 6049844..aff7867 100644 --- a/docs/opcode-reference.md +++ b/docs/opcode-reference.md @@ -149,6 +149,22 @@ This also names the whole call graph statically (build/callscript-names.json). - **grounding:** source=investigation, confidence=high - **evidence:** Ghidra handler 0x42a1b0; FUN_0047f2e0(obj op1) + 3x→FUN_00425fb0(2/3/4). label_12649 site 0x00c86 handle=G[0x62457] → G[0x62498/9/a]. +### 0x21e `set-anim-transform-norm` (set-anim-transform-norm, argc 6) +- **summary:** (handle)(p1)(p2)(x)(y)(z) — set sprite transform channel, NORMALIZED (float operands /_DAT_00571c28 ~percent); cmd-type 0xd, worker gfx_anim_set_channel@0x47eaa0. SC0000 opening @0xf73+ on INIT2 CG handles. Cluster 0x21c-0x243. Handler 0x423350; Kelebek VA 0x421450 is drift. +- **grounding:** source=investigation, confidence=high + +### 0x220 `set-anim-transform-abs` (set-anim-transform-abs, argc 6) +- **summary:** (handle)(p1)(p2)(x)(y)(z) — set sprite transform channel, ABSOLUTE (raw floats); cmd-type 0xd, worker 0x47ecc0. Twin of 0x21e. SC0000 opening @0x18a5+ on INIT2 CG handles. Cluster 0x21c-0x243. Handler 0x4234e0; Kelebek VA 0x4215D0 is drift. +- **grounding:** source=investigation, confidence=high + +### 0x234 `anim-start` (anim-start, argc 5) +- **summary:** (handle)(duration)(x)(y)(z) — animate object toward target vec3 (x,y,z) over the GLOBAL clock; cmd-type 0xb, worker gfx_anim_start. op2=this object's duration (label_1235a maxes into the clock). SC0000 opening @0xdaf on INIT2 CG handles. Handler 0x423da0; Kelebek VA 0x422060 is drift. +- **grounding:** source=investigation, confidence=high + +### 0x238 `set-anim-clock` (set-anim-clock, argc 1) +- **summary:** (duration) — set the GLOBAL animation clock: native ctx+0x51b78=0 (elapsed), +0x51b7c=duration. cmd-type 3. NON-BLOCKING: only configures; the render loop advances it and interpolates all animating objects. SC0000 opening @0x123bd/@0x13858. Handler 0x4240e0; Kelebek VA 0x422390 is drift. +- **grounding:** source=investigation, confidence=high + ## input ### 0x90 `hotspot-branch` (u0041BEB0, argc 7) @@ -922,18 +938,10 @@ op 0x90 (u0041BEB0, argc 7): `0x90 x y w h tgt_a tgt_b tgt_c`. Kelebek left it " - **summary:** — - **grounding:** source=kelebek, confidence=low -### 0x21e `u00421450` (u00421450, argc 6) -- **summary:** — -- **grounding:** source=kelebek, confidence=low - ### 0x21f `u00421510` (u00421510, argc 7) - **summary:** — - **grounding:** source=kelebek, confidence=low -### 0x220 `u004215D0` (u004215D0, argc 6) -- **summary:** — -- **grounding:** source=kelebek, confidence=low - ### 0x222 `u004216C0` (u004216C0, argc 2) - **summary:** — - **grounding:** source=kelebek, confidence=low @@ -986,18 +994,10 @@ op 0x90 (u0041BEB0, argc 7): `0x90 x y w h tgt_a tgt_b tgt_c`. Kelebek left it " - **summary:** — - **grounding:** source=kelebek, confidence=low -### 0x234 `u00422060` (u00422060, argc 5) -- **summary:** — -- **grounding:** source=kelebek, confidence=low - ### 0x236 `u004221A0` (u004221A0, argc 4) - **summary:** — - **grounding:** source=kelebek, confidence=low -### 0x238 `u00422390` (u00422390, argc 1) -- **summary:** — -- **grounding:** source=kelebek, confidence=low - ### 0x239 `u004223C0` (u004223C0, argc 6) - **summary:** — - **grounding:** source=kelebek, confidence=low diff --git a/engine/Age.Engine.Tests/GfxAnimationTests.cs b/engine/Age.Engine.Tests/GfxAnimationTests.cs index 8c17d28..ef3f353 100644 --- a/engine/Age.Engine.Tests/GfxAnimationTests.cs +++ b/engine/Age.Engine.Tests/GfxAnimationTests.cs @@ -42,4 +42,31 @@ public class GfxAnimationTests Assert.Equal(400, g.AnimClockDurationTicks); Assert.Equal(cg0 + 1, g.AnimClockGeneration); } + + // ---- Tasks 3-5: VM dispatch + snapshot (synthesized scenes) ---- + + private static OpcodeTable T() => OpcodeTableJson.Load(Paths.OpcodesJson); + private static Operand G(int a) => new(3, a); + private static Operand I(long v) => new(0, v); + private static (int, Operand[]) MovGI(int d, long v) => (0x55, new[] { G(d), I(v) }); + private static (int, Operand[]) Exit() => (0x2, System.Array.Empty()); + + [Fact] + public void SetAnimTransformAbs_DispatchRecordsChannel() + { + var t = T(); + // handle g[1]=0x1000; p1 g[2]=7; p2 g[3]=9; target g[4,5,6]=(800,500,0) + var scene = ScriptAssembler.Assemble(t, "ANIM", new List<(int, Operand[])> + { + MovGI(1, 0x1000), MovGI(2, 7), MovGI(3, 9), MovGI(4, 800), MovGI(5, 500), MovGI(6, 0), + (0x220, new[] { G(1), G(2), G(3), G(4), G(5), G(6) }), + Exit(), + }, System.Array.Empty()); + var vm = new VirtualMachine(scene, t, new RecordingHost()); + vm.Run(); + var o = vm.Gfx.TryGet(0x1000)!; + Assert.Equal((800L, 500L, 0L), o.AnimTarget); + Assert.False(o.AnimNormalized); + Assert.True(o.AnimEnabled); + } } diff --git a/engine/Age.Engine/Vm/VirtualMachine.cs b/engine/Age.Engine/Vm/VirtualMachine.cs index 2b25323..edfd195 100644 --- a/engine/Age.Engine/Vm/VirtualMachine.cs +++ b/engine/Age.Engine/Vm/VirtualMachine.cs @@ -270,6 +270,13 @@ public sealed class VirtualMachine case "gfx-draw-color": // 0x203 (handle)(v)(alpha)(color) — blend deferred Gfx.GetOrCreate(Read(a[0])).Color = GfxState.PackColor(Read(a[2]), Read(a[3])); WarnAlphaDeferredOnce(); return pc + 1; + // ---- sprite transform / animation cluster (docs/engine-re.md "0x21c-0x243 ... ANIMATION") ---- + case "set-anim-transform-abs": // 0x220 (handle)(p1)(p2)(x)(y)(z) — set transform directly + Gfx.SetAnimTransform(Read(a[0]), Read(a[1]), Read(a[2]), + (Read(a[3]), Read(a[4]), Read(a[5])), normalized: false); return pc + 1; + case "set-anim-transform-norm": // 0x21e — same, operands are ~percent (/_DAT_00571c28) + Gfx.SetAnimTransform(Read(a[0]), Read(a[1]), Read(a[2]), + (Read(a[3]), Read(a[4]), Read(a[5])), normalized: true); return pc + 1; default: // Stub is per-instruction frequency (the VM handles ~30 ops; the rest hit here, e.g. // 0x258/0x259 stmt markers appear en masse), so gate it with Step — else --trace floods. diff --git a/vm-map/opcodes.toml b/vm-map/opcodes.toml index 166ed96..9c76d72 100644 --- a/vm-map/opcodes.toml +++ b/vm-map/opcodes.toml @@ -1,6825 +1,6825 @@ -# vm-map/opcodes.toml -- CANONICAL living opcode reference (hand-edited). -# Generated artifacts (age_opcodes_himegari.py, build/opcodes.json, docs/opcode-reference.md, -# build/opcode-coverage.md) come from this file via tools/opcodes_build.py --build. Do not edit those. -# Skeletons are appended by --bootstrap; enrich each [opcode.semantics] as we investigate. -[meta] -instruction_model = "code = seq of then argc*(); len_dwords = 1 + 2*argc" -opcodes_used_by_himegari = 248 - -[meta.arg_types] -"0x0" = "immediate" -"0x1" = "float" -"0x2" = "string" -"0x3" = "global-int" -"0x4" = "global-float" -"0x5" = "global-string" -"0x6" = "global-ptr" -"0x8" = "global-string-ptr" -"0x9" = "local-int" -"0xa" = "local-float" -"0xb" = "local-string" -"0xc" = "local-ptr" -"0xd" = "local-float-ptr" -"0xe" = "local-string-ptr" - -[meta.header_fields] -"F0" = "local_integer_1" -"F1" = "local_floats" -"F2" = "local_strings_1" -"F3" = "local_integer_2" -"F4" = "unknown_data" -"F5" = "local_strings_2" -"F6" = "sub_header_length(=0x1C)" -"F7" = "table_1_length" -"F8" = "table_1_offset(=code end)" -"F9" = "table_2_length" -"F10" = "table_2_offset" -"F11" = "table_3_length" -"F12" = "table_3_offset" - -[[opcode]] -op = 0x1 -label = "u004149C0" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004149C0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x2 -label = "exit" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "exit" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x3 -label = "call-script" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "call-script" -category = "control" -summary = "load & call another SYS4 script by id; id = RAW index into the SYS4INI file table (asset-index). Pushes a script frame; returns to caller when the callee ends." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "native-RE (Ghidra): handler FUN_0041bc90 -> loader FUN_0040e980 -> resolver FUN_0044f390 indexes an 80-byte record table (base [ctx+0x414], count [ctx+0x40c]) at base+id*0x50 = the SYS4INI record layout {name[64],arc_id@0x40,file_number@0x44,offset@0x48,size@0x4c}. Confirmed statically: all 297 distinct corpus call-script ids resolve to a .BIN script with a semantically-exact name (0x1ab->ADDITEM, 0x2ae7->MES, 0x143->BUNKI, 0x329d->CALCREVISE), 0 out-of-range, 0 pack-branch. See docs/engine-re.md + name-resolution.md #1." -confirm_by = "" -details = """ -op 0x03 (call-script, argc 1): `call-script `. RESOLVED — the id is a direct RAW index into -the SYS4INI global file table (the same table parse_sys4ini.py reads, but indexed WITHOUT skipping -'@' placeholders; SYS4INI has 13208 records / 2 placeholders). No separate on-disk id->code registry -exists; SYS4INI *is* the call-script registry. -Native mechanism (dispatch table `handler(op)=ctx[0x26c93+op]`, op 0x03 -> FUN_0041bc90): - 1. FUN_0041bc90 fetches operand 1 (id), bounds-checks call depth (<=0x26), pushes a frame. - 2. FUN_0040e980 (loader): opens the resource by id, reads the 0x20-byte SYS4 header, checks magic, - allocates per-frame code/local buffers from the header var-counts, reads the bytecode body, - pushes a script frame (stride 0x1e = 30 dwords, indexed by ctx[0x14f45]). - 3. FUN_0044f390 (resolver): record = [ctx+0x414] + id*0x50. Tries a LOOSE OVERRIDE first - (CreateFileA on record.name -> mod/patch hook point), else opens archive [record.arc_id*0x100 + - ctx+0x410], SetFilePointer to record.offset, size = record.size. - (High-byte-tagged ids `id & 0xff000000` select an alternate pack via [ctx+0x3028]; UNUSED by the - corpus -- 0/297 ids have a high byte.) -Companion op 0x8f `call` is INTRA-script (a local JSR), not cross-script -- see its entry. -This also names the whole call graph statically (build/callscript-names.json). -""" - -[[opcode.semantics.args]] -i = 1 -role = "script id = raw SYS4INI file index" -observed_types = ["imm", "g-int", "l-ptr"] - -[[opcode]] -op = 0x5 -label = "ret" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "ret" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x6 -label = "u00417E80" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00417E80" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x8 -label = "u00417FC0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00417FC0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x9 -label = "exit-script" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "exit-script" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x21 -label = "u00418860" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00418860" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x22 -label = "u00418920" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00418920" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x25 -label = "u00418B40" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00418B40" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x50 -label = "add" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "add" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x51 -label = "sub" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "sub" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x52 -label = "mul" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "mul" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x53 -label = "div" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "div" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x54 -label = "mod" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "mod" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int", "l-ptr"] - -[[opcode]] -op = 0x55 -label = "mov" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "mov" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x56 -label = "and" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "and" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x57 -label = "or" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "or" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x58 -label = "sar" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "sar" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x59 -label = "shl" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "shl" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int", "l-ptr"] - -[[opcode]] -op = 0x5a -label = "eq" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "eq" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x5b -label = "ne" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "ne" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x5c -label = "lt" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "lt" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x5d -label = "lte" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "lte" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x5e -label = "gr" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "gr" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x5f -label = "gre" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "gre" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x60 -label = "u0041A270" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041A270" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int", "l-ptr"] - -[[opcode]] -op = 0x61 -label = "lookup-array" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "lookup-array" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-ptr", "l-str-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "g-str", "l-int", "l-str"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x63 -label = "u00414A60" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00414A60" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x64 -label = "copy-local-array" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "copy-local-array" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x6c -label = "copy-to-global" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "copy-to-global" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x6e -label = "show-text" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "show-text" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["string", "g-str"] - -[[opcode]] -op = 0x6f -label = "end-text-line" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "end-text-line" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x70 -label = "u0041A750" -argc = 5 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041A750" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x71 -label = "u0041A7B0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "label-def" -category = "structural" -summary = "1 imm; count == T1 table size -> the label/anchor T1 indexes. v1 no-op; revisit if menu/callback dispatch looks up by id" -noop_headless = true -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x72 -label = "wait-for-input" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "wait-for-input" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x73 -label = "u0041AB30" -argc = 10 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041AB30" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 6 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 7 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 8 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 9 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 10 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x75 -label = "u0041AC30" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041AC30" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x76 -label = "u0041AC60" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041AC60" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x77 -label = "u0041ACB0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041ACB0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x78 -label = "u0041AD00" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041AD00" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x79 -label = "u0041AD30" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041AD30" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x7a -label = "u0041AD70" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "text-param?" -category = "adv" -summary = "3 args (imm/computed/imm); sub computes a value then 0x7a then show-text — text speed/wait/window param" -noop_headless = false -source = "inference" -confidence = "med" -depends_on = [] -evidence = "confirm via frida" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x7b -label = "u0041ADB0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041ADB0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x7c -label = "u00416A90" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00416A90" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x7f -label = "u00414C60" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00414C60" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x80 -label = "u0041AF00" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041AF00" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x85 -label = "u00414CF0" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00414CF0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x86 -label = "u0041B210" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041B210" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x87 -label = "u00414D10" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00414D10" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x88 -label = "u0041B290" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041B290" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x8b -label = "u0041B3D0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041B3D0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x8c -label = "jmp" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "jmp" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x8f -label = "call" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "call" -category = "control" -summary = "intra-script subroutine call (local JSR): PC = frame.codebase + operand*4; pushes a return address on the per-frame return stack. NOT cross-script (that is call-script 0x03)." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "native-RE (Ghidra): handler FUN_0041fba0 (= ctx[0x26c93+0x8f]) sets [frame PC @+0x53d2c] = [frame codebase @+0x53d28] + operand*4 and pushes ((pc-base)>>2)+3 onto the per-frame return stack ([ctx+0x552e8]/[ctx+0x55248]). Target is a code OFFSET within the current script (matches header table T3 tag 0x8F = local call targets), confirming it is a local JSR, not a script load." -confirm_by = "" - -[[opcode.semantics.args]] -i = 1 -role = "local code target (word offset within current script)" -observed_types = ["imm", "g-int"] - -[[opcode]] -op = 0x90 -label = "u0041BEB0" -argc = 7 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "hotspot-branch" -category = "input" -summary = "cursor/input hotspot hit-test: rect (x,y,w,h) -> 3-way branch on interaction, else fall through to pc+1" -noop_headless = true -source = "investigation" -confidence = "high" -depends_on = [0x1f4, 0x1f5] -evidence = "all 301 ADV scripts contain the identical 8 sites; enc.len 15 lands pc+1 on the fall-through stmt (design-confirmed); fall-through = correct headless no-input path, proven by 279 CLEAN dialogue scenes" -confirm_by = "target->interaction-state mapping (hover-enter/leave/click) via live input capture or Frida in A2" -details = """ -op 0x90 (u0041BEB0, argc 7): `0x90 x y w h tgt_a tgt_b tgt_c`. Kelebek left it "ukn" noting args -5-7 are code locations. Corpus analysis (all 301 ADV scripts) resolves it: -- Two forms, both ONLY in one shared ADV-chrome subroutine copied into every ADV script: - * Mode A (1505 = 5x301): immediate x,y,w,h with w=h=20; the five on-screen buttons at - (684|706|728|750|772, 572), each setting one of G[0x6c9..0x6cd] to 1 / 0 / 0+run-action - (reads as hover-enter / hover-leave / click). All 3 targets real. - * Mode B (903 = 3x301): local-int operands, w=h=1, only tgt_c real -- a keyed 2-way input test. -- Every one of the 301 scripts has EXACTLY 8 sites (5 A + 3 B); zero scene-specific use. -- Falls through (pc+1) when nothing matches -- design-confirmed (0xd0 + 15 dwords = 0xdf = label_df). -- Headless (no cursor/input) => fall through => vm0 stub already correct; the 12 EMPTY sweep scenes - are gated by state + this input-wait chrome, NOT by unmodelled 0x90. Model live in A2. -""" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 6 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 7 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x93 -label = "u00415040" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415040" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x94 -label = "u00415090" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415090" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x97 -label = "u0041C150" -argc = 5 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "hotspot-reg?" -category = "input" -summary = "companion register-hotspot / set-widget-action (argc5: v1 v2 1 1 ; NO code targets)" -noop_headless = true -source = "inference" -confidence = "med" -depends_on = [0x90] -evidence = "interleaves with 0x90 in the shared ADV-chrome subroutine; trailing imm = action id 0x0/0x7/0x8; same widget cluster as 0x90/0x91/0x92/0x95; confirm via frida" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0xa0 -label = "jcc" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "jcc" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0xa1 -label = "u00427C00" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00427C00" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0xa2 -label = "u00427FD0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00427FD0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0xa3 -label = "u004244D0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004244D0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0xae -label = "u00415130" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415130" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0xb4 -label = "play-sound-effect" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "play-sound-effect" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode]] -op = 0xb5 -label = "u0041D050" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041D050" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int"] - -[[opcode]] -op = 0xb6 -label = "u0041D080" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "snd-ctrl?" -category = "audio" -summary = "1 imm; self-chains, 0x41D family near play-sound-effect/0xb5 — sound channel/volume/stop control" -noop_headless = false -source = "inference" -confidence = "low" -depends_on = [] -evidence = "confirm via frida" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0xb7 -label = "u0041D0E0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041D0E0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0xb8 -label = "u00415520" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415520" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0xb9 -label = "u0041D140" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041D140" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0xba -label = "u0041D0B0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041D0B0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0xbf -label = "play-bgm" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "play-bgm" -category = "audio" -summary = "Play background music by id. BGM is addressed by DIRECT LITERAL NAME: id -> BGM{id:03d}.OGG (in DATA3), NOT the per-scene section manifest (that's voices/textures). E.g. play-bgm 5 -> BGM005." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "By-ear confirmed (2026-07-06): SC0000 real game plays BGM005 for play-bgm 0x5 and BGM008 for play-bgm 0x8 (we initially mis-played BGM006/BGM009 via the manifest = off-by-one). Direct-name proven by play-bgm 0x23 -> BGM035.OGG, a real standalone track (BGM set skips 030-034) that the manifest mis-resolved to a graphics entry (EV049AA.AGF). CORRECTS the earlier 'unified manifest / Frida BGM006' claim, which was wrong by one. Voices/textures still use the manifest (files[base+id], offset 0). Diagnostic: `Age.Cli audio SC0000.BIN`." - -[[opcode.semantics.args]] -i = 1 -role = "bgm id (direct file-name number: BGM{id:03d}.OGG)" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0xc0 -label = "u00415620" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415620" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0xc2 -label = "u0041D2B0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041D2B0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0xc4 -label = "play-voice" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "play-voice" -category = "audio" -summary = "Play a voice clip by id; id resolves via the SYS4INI section manifest -> files[section_base(scene)+id] (voice OGG in DATA1/DATA4). Same rule as set-texture (NOT play-bgm, which is direct-name BGM{id:03d})." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "By-ear confirmed (2026-07-06): SC0000 prologue voices play on their lines via Godot AudioStreamPlayer. Off-by-one disproven structurally: manifest interleaves graphics/voice (files[35]=EV049AA, [36]=MAN999, [37]=EV052CA, [38]=SYL0001), so files[base+id] lands voices on OGGs while files[base+id-1] would land them on .AGF graphics (silent) -- and they play, so the offset is exactly 0. Lily's lines are correctly form-gated (G[0xa57/0xa58/0xa59]) and stay silent when no form flag is seeded -- not a bug." - -[[opcode.semantics.args]] -i = 1 -role = "voice id (section-manifest index)" -observed_types = ["imm", "l-int", "l-ptr"] - -[[opcode]] -op = 0xc5 -label = "u0041D4A0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041D4A0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0xc6 -label = "u0041D5D0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041D5D0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0xc7 -label = "u0041D760" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041D760" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0xc8 -label = "sleep" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "sleep" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0xcc -label = "mouse_callback" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "mouse_callback" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0xcd -label = "get-input-type" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "get-input-type" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0xd0 -label = "u00415830" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415830" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0xd3 -label = "u00425960" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00425960" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0xd4 -label = "u004266F0" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004266F0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0xd5 -label = "u004262C0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004262C0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0xd9 -label = "u00415880" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415880" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0xfb -label = "joy_callback" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "joy_callback" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0xfe -label = "u0041E360" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041E360" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0xff -label = "u00415A10" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415A10" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x100 -label = "u00415A60" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415A60" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x101 -label = "u00415BF0" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415BF0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x107 -label = "u0041E500" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041E500" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x108 -label = "u00415E70" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415E70" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x109 -label = "u00415EC0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415EC0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode]] -op = 0x10a -label = "u0041E540" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041E540" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x10b -label = "u0041E5A0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041E5A0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x10c -label = "u0041E5E0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041E5E0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x10d -label = "u00415F10" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415F10" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x12c -label = "lookup-array-2d" -argc = 5 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "lookup-array-2d" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-ptr", "l-str-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "g-str", "l-int", "l-str"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x12e -label = "u0041E940" -argc = 8 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041E940" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 6 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 7 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 8 -role = "" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode]] -op = 0x12f -label = "u0041ECB0" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041ECB0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x130 -label = "u00415F40" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415F40" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x131 -label = "u00415F70" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415F70" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode]] -op = 0x132 -label = "u0041EF00" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041EF00" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x133 -label = "u0041EFF0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041EFF0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x134 -label = "u0041F050" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041F050" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x135 -label = "bit-set" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "bit-set" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int", "l-ptr"] - -[[opcode]] -op = 0x136 -label = "bit-reset" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "bit-reset" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int", "l-ptr"] - -[[opcode]] -op = 0x137 -label = "u0041F1C0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041F1C0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x13a -label = "u0041F3A0" -argc = 6 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041F3A0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 6 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x13f -label = "check-bit" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "check-bit" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x140 -label = "u0041F9C0" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041F9C0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["string"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["string"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["g-int"] - -[[opcode]] -op = 0x141 -label = "u0041FAA0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041FAA0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x142 -label = "u0041FB10" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041FB10" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x143 -label = "u00415FB0" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415FB0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x144 -label = "u004259D0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004259D0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-str"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-str"] - -[[opcode]] -op = 0x149 -label = "u0041FCE0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041FCE0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x191 -label = "u0041A4A0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041A4A0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int"] - -[[opcode]] -op = 0x192 -label = "set-string" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "set-string" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-str", "l-str", "l-str-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["string", "g-int", "g-str", "l-str", "l-str-ptr"] - -[[opcode]] -op = 0x193 -label = "concat" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "concat" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-str", "l-str"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["string", "g-str", "l-str", "l-str-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["string", "g-str", "l-str", "l-ptr", "l-str-ptr"] - -[[opcode]] -op = 0x194 -label = "u00425480" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00425480" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-str", "l-str", "l-str-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["string", "l-str", "l-str-ptr"] - -[[opcode]] -op = 0x195 -label = "u00425580" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00425580" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-str", "l-str", "l-str-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["string", "g-str"] - -[[opcode]] -op = 0x196 -label = "display-furigana" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "display-furigana" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["string"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["string"] - -[[opcode]] -op = 0x197 -label = "u0041B510" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041B510" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x198 -label = "u0041B540" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041B540" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x199 -label = "u00414D50" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00414D50" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x19a -label = "u00414E50" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00414E50" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int"] - -[[opcode]] -op = 0x19b -label = "u00414E80" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00414E80" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x19c -label = "u00414EC0" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00414EC0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x19d -label = "u0041C680" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041C680" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-ptr"] - -[[opcode]] -op = 0x19e -label = "u0041C6E0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041C6E0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode]] -op = 0x1a0 -label = "u0041C9B0" -argc = 9 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041C9B0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 6 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 7 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 8 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 9 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x1a1 -label = "u0041CB40" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041CB40" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x1a2 -label = "gfx-cmd-register" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "gfx-cmd-register" -category = "draw" -summary = "0x1a2 (handle) — gfx cmd-type 3. Handler gfx_op_0x1a2_registry_insert @0x42d360: builds key '%c%8.8x'(3, operand-desc) and INSERTS operand 1 into the op-0x215 query registry (FUN_0042cf70, open-addressing hash; native stores map[handle]=handle). This is the SOLE populator of the registry op 0x215 queries — the geometry SET/draw ops (0x217/0x219/0x1ff/0x1fb/0x202/...) do NOT register. VM impl: GfxState.Register(handle) (a separate set from the geometry object store). Conflating the two (registering on every GetOrCreate) was the retained-mode geometry bug: CG handles wrongly read back as 'existing' and collapsed to (-400,-600). NOT save/scene (raw Kelebek VA 0x428010 drifted to op 0x1ac save handler). See docs/engine-re.md gfx op-contract table." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "Ghidra: real handler FUN_0042d360 (via dispatch table ctx[0x26c93+op]); sets *(ctx+0x53d88+ctx[0x53d14]*0x78)=3, sprintf(\"%c%8.8x\",3,op1), FUN_0042cf70 (hash insert; counterpart of op 0x215 find). NOT save/scene (raw Kelebek VA 0x428010 drifted to op 0x1ac save handler). See docs/engine-re.md" - -[[opcode.semantics.args]] -i = 1 -role = "value" -observed_types = ["g-int", "l-ptr"] - -[[opcode]] -op = 0x1a3 -label = "string-lookup-set" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "string-lookup-set" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-ptr"] - -[[opcode]] -op = 0x1a4 -label = "u0041B580" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041B580" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x1a5 -label = "set-font" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "set-font" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["string"] - -[[opcode]] -op = 0x1a6 -label = "halve-strlen" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "halve-strlen" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-str", "l-str-ptr"] - -[[opcode]] -op = 0x1a7 -label = "comment" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "comment" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["string", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x1a8 -label = "dev_ukn" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "dev_ukn" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x1a9 -label = "u00428090" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00428090" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-str", "l-str-ptr"] - -[[opcode]] -op = 0x1aa -label = "u00425920" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00425920" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-str", "l-str-ptr"] - -[[opcode]] -op = 0x1ab -label = "u0041CCA0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041CCA0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x1ac -label = "u0041CD80" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041CD80" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x1ad -label = "u004154F0" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004154F0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x1ae -label = "u0041CED0" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041CED0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x1af -label = "u004245C0" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004245C0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x1b0 -label = "u0041A510" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041A510" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x1b2 -label = "u00425790" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00425790" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["string", "g-int"] - -[[opcode]] -op = 0x1b3 -label = "u004257D0" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004257D0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x1b4 -label = "u004237C0" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004237C0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x1b5 -label = "u0041B5F0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041B5F0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x1b6 -label = "u00414F60" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00414F60" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int"] - -[[opcode]] -op = 0x1b7 -label = "u0041B640" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041B640" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int"] - -[[opcode]] -op = 0x1b8 -label = "u0041B670" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041B670" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x1b9 -label = "u0041B710" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041B710" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x1ba -label = "u0041D850" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041D850" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x1bb -label = "u0041B7B0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041B7B0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x1bc -label = "u00415670" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "block-mark" -category = "marker" -summary = "zero-arg; follows jcc/mov, precedes mov/ret — block boundary" -noop_headless = true -source = "inference" -confidence = "high" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x1bd -label = "u0041D910" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041D910" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x1bf -label = "u004156C0" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "call-end" -category = "marker" -summary = "zero-arg; call->0x1bf->stmt-end — end-of-call-statement marker" -noop_headless = true -source = "inference" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x1c1 -label = "u0041B820" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041B820" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x1c7 -label = "u00414F90" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00414F90" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int"] - -[[opcode]] -op = 0x1c8 -label = "toString" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "toString" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-str"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode]] -op = 0x1ca -label = "u0041B9B0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041B9B0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int"] - -[[opcode]] -op = 0x1cb -label = "u00414FD0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00414FD0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int"] - -[[opcode]] -op = 0x1cc -label = "u00415010" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00415010" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int"] - -[[opcode]] -op = 0x1ce -label = "u0041B9F0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041B9F0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x1cf -label = "u0041DA10" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041DA10" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int"] - -[[opcode]] -op = 0x1d0 -label = "u0041BA80" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041BA80" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x1d1 -label = "u0041BAE0" -argc = 5 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041BAE0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x1d2 -label = "u0041BB40" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "stmt-desc?" -category = "marker" -summary = "2 imm; immediately after stmt-begin 0x1f4 — statement descriptor?" -noop_headless = true -source = "harness" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x1d3 -label = "u0041BB90" -argc = 5 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041BB90" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x1d4 -label = "u0041BC00" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0041BC00" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x1d5 -label = "u00415700" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "cond-block" -category = "marker" -summary = "zero-arg; ALWAYS follows jcc — marks conditional body entry" -noop_headless = true -source = "inference" -confidence = "high" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x1f4 -label = "u004160D0" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "stmt-begin" -category = "marker" -summary = "zero-arg; opens scripts, pairs with stmt-end 0x1f5" -noop_headless = true -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x1f5 -label = "u00416120" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "stmt-end" -category = "marker" -summary = "zero-arg; precedes exit/next-stmt, pairs with 0x1f4" -noop_headless = true -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x1f6 -label = "u00416170" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00416170" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x1f7 -label = "gfx-elem-erase" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "gfx-elem-erase" -category = "draw" -summary = "0x1f7 (handle)(count) — gfx cmd-type 5. Handler gfx_op_0x1f7_elem_erase @0x422270: ERASES registry handles — if count>1 → gfx_registry_erase_range(handle,count) [erase [handle, handle+count)], else gfx_registry_erase(handle). It is a TEARDOWN/erase, NOT a create (corrects the earlier 'gfx-elem-create' reading). In label_12649 it runs after a 0x215 slot-query, before 0x1fa releases the slot. Objects are created lazily by the geometry SET ops (gfx_object_get_or_create). See docs/engine-re.md gfx op-contract table." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "Ghidra handler 0x422270 (dispatch ctx[0x26c93+0x1f7]); count>1 → gfx_registry_erase_range @0x47d8b0 (loops gfx_registry_erase @0x47d850 over [op1,op1+op2)), else gfx_registry_erase(op1). gfx_registry_erase does map.find+erase on the ctx+0x408 registry." - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x1f8 -label = "create-texture" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "create-texture" -category = "draw" -summary = "Allocate/prepare a texture slot: (slot, width, height, flag). e.g. `create-texture 0xd 0x190 0x1e 0x0` = slot 13, 400x30." -noop_headless = false -source = "investigation" -confidence = "med" -depends_on = [] -evidence = "SC0000 CG/UI-draw path disasm; slot/w/h roles read off the operands (400x30 text bars, etc.)." - -[[opcode.semantics.args]] -i = 1 -role = "texture slot" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "width" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "height" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 4 -role = "flag" -observed_types = ["imm"] - -[[opcode]] -op = 0x1f9 -label = "set-texture" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "set-texture" -category = "draw" -summary = "Load asset #resId into texture slot: (resId, slot, flag=-1). resId resolves via the SYS4INI per-scene section manifest: files[section_base(scene)+resId] (same rule for play-bgm/play-voice). See docs/asset-resolution-re.md." -noop_headless = false -source = "frida" -confidence = "high" -depends_on = [] -evidence = "SC0000 Frida-confirmed 17/17 (0x25->EV052CA, 0x2e->EV052DB, 0x36->BG030A background); resolution rule validated on 586/595 captured loads. Traced in CG-load subroutine label_12649 as `set-texture G[0x62424] -1`." - -[[opcode.semantics.args]] -i = 1 -role = "resId (section-manifest index into SYS4INI)" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "texture slot" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "flag (typically -1 / 0xffffffff)" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x1fa -label = "gfx-elem-release" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "gfx-elem-release" -category = "draw" -summary = "0x1fa (idx) — gfx cmd-type 3. Handler gfx_op_0x1fa_elem_release @0x4224a0: releases the element at [ctx+0x52bd4 + idx*4] (virtual free, then nulls the slot) + FUN_00474e40(idx). In label_12649 it clears the working slot G[0x62452] after a 0x215/0x1f7 pair. See docs/engine-re.md gfx op-contract table." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "Ghidra handler 0x4224a0 (dispatch ctx[0x26c93+0x1fa]); frees ctx+0x52bd4[operand1*4] via vtbl, then FUN_00474e40(operand1)." - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x1fb -label = "draw-texture" -argc = 8 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "draw-texture" -category = "draw" -summary = "Blit a texture slot to screen. Observed 8 args: (handle, slot, srcx, srcy, w, h, dstx, dsty). e.g. `draw-texture 0xcf08 0x3 0 0 0x320 0x258 0 0` = full-screen (800x600) slot 3 at (0,0)." -noop_headless = false -source = "investigation" -confidence = "med" -depends_on = [] -evidence = "SC0000 CG-load subroutine label_12649: `draw-texture (ptr) (slot) 0 0 (w) (h) (dstx) (dsty)`; full-screen slot-3 draws use 0x320x0x258 (800x600)." - -[[opcode.semantics.args]] -i = 1 -role = "handle/source ref" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "texture slot" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "src x" -observed_types = ["imm", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 4 -role = "src y" -observed_types = ["imm", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 5 -role = "width" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 6 -role = "height" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 7 -role = "dst x" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 8 -role = "dst y" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x1fd -label = "u00420620" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00420620" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x1fe -label = "u004206C0" -argc = 5 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004206C0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x1ff -label = "set-gfx-geom3-c" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "set-gfx-geom3-c" -category = "draw" -summary = "0x1ff (handle)(a)(b)(c) — gfx cmd-type 9. Handler gfx_op_0x1ff_set_geom3 @0x4227b0: SETS a 3-vector (int→float a,b,c) on object `handle` via native worker FUN_0047e800 (sibling of 0x217/0x219, a distinct per-object vector). See docs/engine-re.md gfx op-contract table." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "Ghidra handler 0x4227b0 (dispatch ctx[0x26c93+0x1ff]); FUN_0047e800(op1,(float)op2,(float)op3,(float)op4)." - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x202 -label = "gfx-blit-color" -argc = 5 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "gfx-blit-color" -category = "draw" -summary = "0x202 (handle)(x)(y)(alpha)(color) — gfx cmd-type 0xb. Handler gfx_op_0x202_blit_color @0x4228d0: blits object `handle` at (x,y) with a packed ARGB built from alpha(op4, ≥0x100→0xff, <0→FUN_0047f3e0) and color(op5, <0→FUN_0047f3e0) → FUN_0047ea00. See docs/engine-re.md gfx op-contract table." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "Ghidra handler 0x4228d0 (dispatch ctx[0x26c93+0x202]); packs (alpha<<24|rgb) from operands 4/5, FUN_0047ea00(op1,op2,op3,packed)." - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode]] -op = 0x203 -label = "gfx-draw-color" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "gfx-draw-color" -category = "draw" -summary = "0x203 (handle)(v)(alpha)(color) — gfx cmd-type 9. Handler gfx_op_0x203_draw_color @0x4229a0: draws object `handle` with op2 + a packed ARGB from alpha(op3)/color(op4) → FUN_0047e9b0. Sibling of 0x202 with one fewer positional arg. See docs/engine-re.md gfx op-contract table." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "Ghidra handler 0x4229a0 (dispatch ctx[0x26c93+0x203]); packs color from operands 3/4, FUN_0047e9b0(op1,op2,packed)." - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "g-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode]] -op = 0x204 -label = "draw-string" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "draw-string" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["string", "g-str", "l-str", "l-str-ptr"] - -[[opcode]] -op = 0x205 -label = "u00420A60" -argc = 6 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00420A60" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 6 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x207 -label = "u00420B00" -argc = 8 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00420B00" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "g-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 6 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 7 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 8 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x208 -label = "get-texture-size" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "get-texture-size" -category = "draw" -summary = "0x208 (slot)(out_w)(out_h) — writes the loaded texture's width/height into two output globals; keystone for bytecode-computed sprite/bg geometry (SC0000 label_12649)" -noop_headless = false -source = "inference" -confidence = "med" -depends_on = [] -evidence = "SC0000 label_12649: set-texture(resId,slot) then 0x208(slot)->w,h feeds w/2 horizontal-center + foot-anchor subtraction into draw-texture dst; stubbing yields 0x0 sizes / off-center draws" - -[[opcode.semantics.args]] -i = 1 -role = "slot" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "out_width" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "out_height" -observed_types = ["g-int", "l-int"] - -[[opcode]] -op = 0x20a -label = "u00420CE0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00420CE0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x20b -label = "u00420D50" -argc = 7 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00420D50" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 6 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 7 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x20c -label = "u00416200" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00416200" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x20d -label = "u00420E10" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00420E10" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x20e -label = "u00416250" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00416250" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x20f -label = "u00420E40" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00420E40" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x212 -label = "set-gfx-field64" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "set-gfx-field64" -category = "draw" -summary = "0x212 (obj_idx)(val) — gfx cmd-type 5. Handler gfx_op_0x212_set_field64 @0x4230c0: obj=[ctx+0x14d54 + obj_idx*4]; if obj: *(obj+0x64)=val. Sets one per-object field. See docs/engine-re.md gfx op-contract table." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "Ghidra handler 0x4230c0 (dispatch ctx[0x26c93+0x212]); writes [obj+0x64]=operand2, obj from ctx+0x14d54[operand1*4]." - -[[opcode.semantics.args]] -i = 1 -role = "obj_idx" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "value" -observed_types = ["imm"] - -[[opcode]] -op = 0x213 -label = "set-gfx-xy" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "set-gfx-xy" -category = "draw" -summary = "0x213 (obj_idx)(x)(y) — gfx cmd-type 7. Handler gfx_op_0x213_set_field68_6c @0x423110: obj=[ctx+0x14d54 + obj_idx*4]; if obj: *(obj+0x68)=x; *(obj+0x6c)=y (an (x,y) pair). See docs/engine-re.md gfx op-contract table." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "Ghidra handler 0x423110; writes obj+0x68/+0x6c from operands 2/3, obj from ctx+0x14d54[operand1*4]." - -[[opcode.semantics.args]] -i = 1 -role = "obj_idx" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "x" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "y" -observed_types = ["imm"] - -[[opcode]] -op = 0x215 -label = "query-gfx-object?" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "query-gfx-object?" -category = "draw" -summary = "0x215 (out)(handle_id) — native graphics command-buffer op. Real handler FUN_0042a0b0 (Ghidra-resolved via the dispatch table ctx[0x26c93+op]; Kelebek's 0x421160 is VA-drift, lands in an unrelated fn). Does TWO things: (1) writes cmd-type 5 into the CURRENT gfx-object record `[ctx+0x53d88 + ctx[0x53d14]*0x78]` (a command-buffer registration, parallel to op 0x1a2→type 3); (2) returns `out = map.find(handle_id)` over an engine-internal associative registry (found value, else 0xffffffff=not-found), sign-tested (gre/lt 0) to drive label_12649's slot-select branch + set working slot G[0x62452]. So `out` is NATIVE COMMAND-BUFFER STATE (the registry is populated by sibling gfx ops — op 0x1a2→FUN_0042cf70 is the hash insert), NOT the VM global bank → seeding story-state CANNOT reproduce it. Stubbed → constant return → every draw collapses to slot 0 → anchor-preserve reads foreign-sized textures → the cumulative bg/sprite drift. SETTLES the drift as (b) a genuine native op, NOT (a) state-divergence. Faithful fix = model the gfx command-buffer (record array + handle→object registry) and run the gfx ops instead of stubbing — static/Frida-free (handlers now readable; inserts are bytecode-driven). Full decode + verdict: docs/engine-re.md (op 0x215 section). RETAINED-MODE FIX (2026-07-07): the registry MUST be separate from the geometry object store — it is populated ONLY by op 0x1a2, never by the geometry SET/draw ops. VM: QuerySlot returns the registered value (=handle) or -1, NOT a fabricated per-object slot. CG handles are never 0x1a2-registered → query returns -1 → label_12649 takes its FRESH branch (anchor from the INIT2 arrays) → dst=(0,0). The prior GfxState.GetOrCreate-assigns-AcquireSlot model made CG handles read as 'existing' → existing branch called get-texture-size on the wrong slot (0) → dst=(-400,-600) off-screen (the '2nd CG off-screen' bug)." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "Ghidra: real handler FUN_0042a0b0 = {*(ctx+0x53d88+ctx[0x53d14]*0x78)=5; out=FUN_0047f280(FUN_0041b940(2))}. FUN_0047f280 = std::map::find (returns mapped value or 0xffffffff); FUN_0041b940(2) = operand-fetch of operand 2 (the handle key); FUN_00425fb0(1,val) = operand-write to `out`. Registry populated by op 0x1a2 handler FUN_0042d360 → FUN_0042cf70 (open-addressing hash insert). Bytecode sites: SC0000 label_12649 (0x12670) + label_123ef (0x12419/0x12450), handle-ids from 0x62455[idx] (±offset); result gre/lt 0 branches slot-select. Record table 0x3239 (label_125bd @0x0050f) assigns per-object slots 4..13." - -[[opcode.semantics.args]] -i = 1 -role = "out_slot_status" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "handle_id" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode]] -op = 0x216 -label = "query-gfx-field?" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "query-gfx-field?" -category = "draw" -summary = "0x216 (out)(idx) — gfx cmd-type 5. Handler gfx_op_0x216_query_table46d14 @0x42a0f0: out = *(ctx+0x46d14 + idx*0x14). A per-object field query over a stride-0x14 table. See docs/engine-re.md gfx op-contract table." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "Ghidra handler 0x42a0f0; reads ctx+0x46d14[operand2 * 0x14], writes operand1 via FUN_00425fb0(1,·)." - -[[opcode.semantics.args]] -i = 1 -role = "out" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "idx" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode]] -op = 0x217 -label = "set-gfx-geom3" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "set-gfx-geom3" -category = "draw" -summary = "0x217 (handle)(a)(b)(c) — gfx cmd-type 9. Handler gfx_op_0x217_set_geom3 @0x4231b0: SETS a 3-vector (int→float a,b,c) on object `handle` via native worker FUN_0047e960. In SC0000 label_12649 it writes the anchor vector G[0x6249b/c/d] INTO the object; op 0x218 reads it back. See docs/engine-re.md gfx op-contract table." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "Ghidra handler 0x4231b0 (dispatch ctx[0x26c93+0x217]); FUN_0047e960(op1,(float)op2,(float)op3,(float)op4). label_12649 sites e.g. 0x00c67 handle=G[0x62457], vec=G[0x6249b/c/d]." - -[[opcode.semantics.args]] -i = 1 -role = "handle" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "a" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "b" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "c" -observed_types = ["imm", "g-int"] - -[[opcode]] -op = 0x218 -label = "get-gfx-geom3?" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "get-gfx-geom3?" -category = "draw" -summary = "0x218 (handle)(out_a)(out_b)(out_c) — gfx cmd-type 9. Handler gfx_op_0x218_query_geom3 @0x42a130: GETS a stored 3-vector from object `handle` (FUN_0047f360) into out_a/b/c. In label_12649 it reads the object's anchor vector back into G[0x6249b/c/d] — a stubbed DRIVER of the render drift (stale anchor → bad centering). See docs/engine-re.md gfx op-contract table." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "Ghidra handler 0x42a130; FUN_0047f360(obj op1) + 3x FUN_00550850→FUN_00425fb0(2/3/4). label_12649 site 0x00c8f handle=G[0x62457] → G[0x6249b/c/d]." - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["g-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["g-int"] - -[[opcode]] -op = 0x219 -label = "set-gfx-geom3-b" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "set-gfx-geom3-b" -category = "draw" -summary = "0x219 (handle)(a)(b)(c) — gfx cmd-type 9. Handler gfx_op_0x219_set_geom3 @0x423240: SETS a 3-vector (int→float) on object `handle` via native worker FUN_0047e910 (sibling of 0x217, a different per-object vector). See docs/engine-re.md gfx op-contract table." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "Ghidra handler 0x423240 (was unanalyzed; function created this session; dispatch ctx[0x26c93+0x219]); FUN_0047e910(op1,(float)op2,(float)op3,(float)op4)." - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["g-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["g-int"] - -[[opcode]] -op = 0x21a -label = "get-gfx-geom3-b?" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "get-gfx-geom3-b?" -category = "draw" -summary = "0x21a (handle)(out_a)(out_b)(out_c) — gfx cmd-type 9. Handler gfx_op_0x21a_query_geom3 @0x42a1b0: GETS a stored 3-vector from object `handle` (FUN_0047f2e0) into out_a/b/c. In label_12649 it reads the object's position vector into G[0x62498/9/a] — a stubbed DRIVER of the render drift. See docs/engine-re.md gfx op-contract table." -noop_headless = false -source = "investigation" -confidence = "high" -depends_on = [] -evidence = "Ghidra handler 0x42a1b0; FUN_0047f2e0(obj op1) + 3x→FUN_00425fb0(2/3/4). label_12649 site 0x00c86 handle=G[0x62457] → G[0x62498/9/a]." - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode]] -op = 0x21b -label = "u004213E0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "line-id?" -category = "marker" -summary = "1 imm; mov->0x21b->stmt-end; near save/load-messkip — likely line/stmt id, verify not msg-control" -noop_headless = true -source = "harness" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x21c -label = "u00416270" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00416270" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x21d -label = "u00421410" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00421410" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x21e -label = "u00421450" -argc = 6 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00421450" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 6 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x21f -label = "u00421510" -argc = 7 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00421510" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 6 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 7 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x220 -label = "u004215D0" -argc = 6 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004215D0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 6 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x222 -label = "u004216C0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004216C0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x223 -label = "u00421700" -argc = 8 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00421700" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm", "l-ptr"] - -[[opcode.semantics.args]] -i = 6 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 7 -role = "" -observed_types = ["imm", "g-int"] - -[[opcode.semantics.args]] -i = 8 -role = "" -observed_types = ["imm", "g-int"] - -[[opcode]] -op = 0x224 -label = "u00416290" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00416290" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x228 -label = "u00421940" -argc = 5 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00421940" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "g-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode]] -op = 0x229 -label = "u004219E0" -argc = 5 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004219E0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm", "g-int"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x22a -label = "u00421A90" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00421A90" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x22c -label = "u00421BD0" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00421BD0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x22d -label = "u00421C60" -argc = 5 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00421C60" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["g-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["g-int"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x22f -label = "u00421DD0" -argc = 5 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00421DD0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x230 -label = "u00421E70" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00421E70" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode]] -op = 0x231 -label = "u00421EA0" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00421EA0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-ptr"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm", "l-ptr"] - -[[opcode]] -op = 0x232 -label = "u00421EF0" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00421EF0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x233 -label = "u00421FB0" -argc = 5 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00421FB0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x234 -label = "u00422060" -argc = 5 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00422060" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["g-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x236 -label = "u004221A0" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004221A0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm", "l-ptr"] - -[[opcode]] -op = 0x238 -label = "u00422390" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00422390" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int"] - -[[opcode]] -op = 0x239 -label = "u004223C0" -argc = 6 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004223C0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm", "l-ptr"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm", "l-ptr"] - -[[opcode.semantics.args]] -i = 6 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x23a -label = "u00422420" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00422420" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x23b -label = "u00422460" -argc = 7 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00422460" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "g-int", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 6 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 7 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x23c -label = "u004162B0" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004162B0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x23d -label = "u004162F0" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004162F0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x23f -label = "u00422930" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00422930" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode]] -op = 0x241 -label = "u00422B80" -argc = 5 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00422B80" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-ptr"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["l-ptr"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["l-int"] - -[[opcode]] -op = 0x242 -label = "u00422D60" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00422D60" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x243 -label = "u00417070" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00417070" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode]] -op = 0x248 -label = "u00422E80" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00422E80" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x249 -label = "u00422EB0" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00422EB0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "l-int", "l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x24d -label = "u00422E90" -argc = 12 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00422E90" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 5 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode.semantics.args]] -i = 6 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 7 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 8 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 9 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 10 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 11 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 12 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x24e -label = "u00422EA0" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00422EA0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x258 -label = "u00422FE0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "decl?" -category = "marker" -summary = "2 imm; runs in a chain right after script-entry 0x259, enumerating ids — prologue declaration/registration?" -noop_headless = true -source = "harness" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x259 -label = "u00416410" -argc = 0 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "script-entry" -category = "marker" -summary = "zero-arg; the first instruction of a script (offset 0), opens the decl chain that 0x258 continues — script/prologue entry marker, structural" -noop_headless = true -source = "harness" -confidence = "low" -depends_on = [] -evidence = "SC0000 offset 0x0 = op 0x259 (argc 0); 0x258's summary names it 'script-entry 0x259'; VM treats it as no-op (default stub) across all 279 CLEAN A0 scenes" - -[[opcode]] -op = 0x2bd -label = "u00423100" -argc = 1 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00423100" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm"] - -[[opcode]] -op = 0x2bf -label = "u00423180" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u00423180" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["imm", "g-int", "l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["imm", "l-int"] - -[[opcode]] -op = 0x2c0 -label = "u004231C0" -argc = 3 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u004231C0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["imm"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["l-ptr"] - -[[opcode]] -op = 0x2c5 -label = "strlen" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "strlen" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "med" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["g-str", "l-str", "l-str-ptr"] - -[[opcode]] -op = 0x2c6 -label = "u0042B5E0" -argc = 2 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0042B5E0" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-str"] - -[[opcode]] -op = 0x2c8 -label = "u0042B610" -argc = 4 -abi_source = "kelebek+decode-validated" - -[opcode.semantics] -name = "u0042B610" -category = "unknown" -summary = "" -noop_headless = false -source = "kelebek" -confidence = "low" -depends_on = [] -evidence = "" - -[[opcode.semantics.args]] -i = 1 -role = "" -observed_types = ["l-str-ptr"] - -[[opcode.semantics.args]] -i = 2 -role = "" -observed_types = ["l-str"] - -[[opcode.semantics.args]] -i = 3 -role = "" -observed_types = ["l-int"] - -[[opcode.semantics.args]] -i = 4 -role = "" -observed_types = ["imm"] +# vm-map/opcodes.toml -- CANONICAL living opcode reference (hand-edited). +# Generated artifacts (age_opcodes_himegari.py, build/opcodes.json, docs/opcode-reference.md, +# build/opcode-coverage.md) come from this file via tools/opcodes_build.py --build. Do not edit those. +# Skeletons are appended by --bootstrap; enrich each [opcode.semantics] as we investigate. +[meta] +instruction_model = "code = seq of then argc*(); len_dwords = 1 + 2*argc" +opcodes_used_by_himegari = 248 + +[meta.arg_types] +"0x0" = "immediate" +"0x1" = "float" +"0x2" = "string" +"0x3" = "global-int" +"0x4" = "global-float" +"0x5" = "global-string" +"0x6" = "global-ptr" +"0x8" = "global-string-ptr" +"0x9" = "local-int" +"0xa" = "local-float" +"0xb" = "local-string" +"0xc" = "local-ptr" +"0xd" = "local-float-ptr" +"0xe" = "local-string-ptr" + +[meta.header_fields] +"F0" = "local_integer_1" +"F1" = "local_floats" +"F2" = "local_strings_1" +"F3" = "local_integer_2" +"F4" = "unknown_data" +"F5" = "local_strings_2" +"F6" = "sub_header_length(=0x1C)" +"F7" = "table_1_length" +"F8" = "table_1_offset(=code end)" +"F9" = "table_2_length" +"F10" = "table_2_offset" +"F11" = "table_3_length" +"F12" = "table_3_offset" + +[[opcode]] +op = 0x1 +label = "u004149C0" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004149C0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x2 +label = "exit" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "exit" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x3 +label = "call-script" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "call-script" +category = "control" +summary = "load & call another SYS4 script by id; id = RAW index into the SYS4INI file table (asset-index). Pushes a script frame; returns to caller when the callee ends." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "native-RE (Ghidra): handler FUN_0041bc90 -> loader FUN_0040e980 -> resolver FUN_0044f390 indexes an 80-byte record table (base [ctx+0x414], count [ctx+0x40c]) at base+id*0x50 = the SYS4INI record layout {name[64],arc_id@0x40,file_number@0x44,offset@0x48,size@0x4c}. Confirmed statically: all 297 distinct corpus call-script ids resolve to a .BIN script with a semantically-exact name (0x1ab->ADDITEM, 0x2ae7->MES, 0x143->BUNKI, 0x329d->CALCREVISE), 0 out-of-range, 0 pack-branch. See docs/engine-re.md + name-resolution.md #1." +confirm_by = "" +details = """ +op 0x03 (call-script, argc 1): `call-script `. RESOLVED — the id is a direct RAW index into +the SYS4INI global file table (the same table parse_sys4ini.py reads, but indexed WITHOUT skipping +'@' placeholders; SYS4INI has 13208 records / 2 placeholders). No separate on-disk id->code registry +exists; SYS4INI *is* the call-script registry. +Native mechanism (dispatch table `handler(op)=ctx[0x26c93+op]`, op 0x03 -> FUN_0041bc90): + 1. FUN_0041bc90 fetches operand 1 (id), bounds-checks call depth (<=0x26), pushes a frame. + 2. FUN_0040e980 (loader): opens the resource by id, reads the 0x20-byte SYS4 header, checks magic, + allocates per-frame code/local buffers from the header var-counts, reads the bytecode body, + pushes a script frame (stride 0x1e = 30 dwords, indexed by ctx[0x14f45]). + 3. FUN_0044f390 (resolver): record = [ctx+0x414] + id*0x50. Tries a LOOSE OVERRIDE first + (CreateFileA on record.name -> mod/patch hook point), else opens archive [record.arc_id*0x100 + + ctx+0x410], SetFilePointer to record.offset, size = record.size. + (High-byte-tagged ids `id & 0xff000000` select an alternate pack via [ctx+0x3028]; UNUSED by the + corpus -- 0/297 ids have a high byte.) +Companion op 0x8f `call` is INTRA-script (a local JSR), not cross-script -- see its entry. +This also names the whole call graph statically (build/callscript-names.json). +""" + +[[opcode.semantics.args]] +i = 1 +role = "script id = raw SYS4INI file index" +observed_types = ["imm", "g-int", "l-ptr"] + +[[opcode]] +op = 0x5 +label = "ret" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "ret" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x6 +label = "u00417E80" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00417E80" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x8 +label = "u00417FC0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00417FC0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x9 +label = "exit-script" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "exit-script" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x21 +label = "u00418860" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00418860" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x22 +label = "u00418920" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00418920" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x25 +label = "u00418B40" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00418B40" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x50 +label = "add" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "add" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x51 +label = "sub" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "sub" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x52 +label = "mul" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "mul" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x53 +label = "div" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "div" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x54 +label = "mod" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "mod" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int", "l-ptr"] + +[[opcode]] +op = 0x55 +label = "mov" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "mov" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x56 +label = "and" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "and" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x57 +label = "or" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "or" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x58 +label = "sar" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "sar" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x59 +label = "shl" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "shl" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int", "l-ptr"] + +[[opcode]] +op = 0x5a +label = "eq" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "eq" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x5b +label = "ne" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "ne" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x5c +label = "lt" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "lt" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x5d +label = "lte" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "lte" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x5e +label = "gr" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "gr" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x5f +label = "gre" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "gre" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x60 +label = "u0041A270" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041A270" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int", "l-ptr"] + +[[opcode]] +op = 0x61 +label = "lookup-array" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "lookup-array" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-ptr", "l-str-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "g-str", "l-int", "l-str"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x63 +label = "u00414A60" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00414A60" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x64 +label = "copy-local-array" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "copy-local-array" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x6c +label = "copy-to-global" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "copy-to-global" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x6e +label = "show-text" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "show-text" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["string", "g-str"] + +[[opcode]] +op = 0x6f +label = "end-text-line" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "end-text-line" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x70 +label = "u0041A750" +argc = 5 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041A750" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x71 +label = "u0041A7B0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "label-def" +category = "structural" +summary = "1 imm; count == T1 table size -> the label/anchor T1 indexes. v1 no-op; revisit if menu/callback dispatch looks up by id" +noop_headless = true +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x72 +label = "wait-for-input" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "wait-for-input" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x73 +label = "u0041AB30" +argc = 10 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041AB30" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 6 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 7 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 8 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 9 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 10 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x75 +label = "u0041AC30" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041AC30" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x76 +label = "u0041AC60" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041AC60" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x77 +label = "u0041ACB0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041ACB0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x78 +label = "u0041AD00" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041AD00" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x79 +label = "u0041AD30" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041AD30" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x7a +label = "u0041AD70" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "text-param?" +category = "adv" +summary = "3 args (imm/computed/imm); sub computes a value then 0x7a then show-text — text speed/wait/window param" +noop_headless = false +source = "inference" +confidence = "med" +depends_on = [] +evidence = "confirm via frida" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x7b +label = "u0041ADB0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041ADB0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x7c +label = "u00416A90" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00416A90" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x7f +label = "u00414C60" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00414C60" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x80 +label = "u0041AF00" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041AF00" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x85 +label = "u00414CF0" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00414CF0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x86 +label = "u0041B210" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041B210" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x87 +label = "u00414D10" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00414D10" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x88 +label = "u0041B290" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041B290" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x8b +label = "u0041B3D0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041B3D0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x8c +label = "jmp" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "jmp" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x8f +label = "call" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "call" +category = "control" +summary = "intra-script subroutine call (local JSR): PC = frame.codebase + operand*4; pushes a return address on the per-frame return stack. NOT cross-script (that is call-script 0x03)." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "native-RE (Ghidra): handler FUN_0041fba0 (= ctx[0x26c93+0x8f]) sets [frame PC @+0x53d2c] = [frame codebase @+0x53d28] + operand*4 and pushes ((pc-base)>>2)+3 onto the per-frame return stack ([ctx+0x552e8]/[ctx+0x55248]). Target is a code OFFSET within the current script (matches header table T3 tag 0x8F = local call targets), confirming it is a local JSR, not a script load." +confirm_by = "" + +[[opcode.semantics.args]] +i = 1 +role = "local code target (word offset within current script)" +observed_types = ["imm", "g-int"] + +[[opcode]] +op = 0x90 +label = "u0041BEB0" +argc = 7 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "hotspot-branch" +category = "input" +summary = "cursor/input hotspot hit-test: rect (x,y,w,h) -> 3-way branch on interaction, else fall through to pc+1" +noop_headless = true +source = "investigation" +confidence = "high" +depends_on = [0x1f4, 0x1f5] +evidence = "all 301 ADV scripts contain the identical 8 sites; enc.len 15 lands pc+1 on the fall-through stmt (design-confirmed); fall-through = correct headless no-input path, proven by 279 CLEAN dialogue scenes" +confirm_by = "target->interaction-state mapping (hover-enter/leave/click) via live input capture or Frida in A2" +details = """ +op 0x90 (u0041BEB0, argc 7): `0x90 x y w h tgt_a tgt_b tgt_c`. Kelebek left it "ukn" noting args +5-7 are code locations. Corpus analysis (all 301 ADV scripts) resolves it: +- Two forms, both ONLY in one shared ADV-chrome subroutine copied into every ADV script: + * Mode A (1505 = 5x301): immediate x,y,w,h with w=h=20; the five on-screen buttons at + (684|706|728|750|772, 572), each setting one of G[0x6c9..0x6cd] to 1 / 0 / 0+run-action + (reads as hover-enter / hover-leave / click). All 3 targets real. + * Mode B (903 = 3x301): local-int operands, w=h=1, only tgt_c real -- a keyed 2-way input test. +- Every one of the 301 scripts has EXACTLY 8 sites (5 A + 3 B); zero scene-specific use. +- Falls through (pc+1) when nothing matches -- design-confirmed (0xd0 + 15 dwords = 0xdf = label_df). +- Headless (no cursor/input) => fall through => vm0 stub already correct; the 12 EMPTY sweep scenes + are gated by state + this input-wait chrome, NOT by unmodelled 0x90. Model live in A2. +""" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 6 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 7 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x93 +label = "u00415040" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415040" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x94 +label = "u00415090" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415090" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x97 +label = "u0041C150" +argc = 5 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "hotspot-reg?" +category = "input" +summary = "companion register-hotspot / set-widget-action (argc5: v1 v2 1 1 ; NO code targets)" +noop_headless = true +source = "inference" +confidence = "med" +depends_on = [0x90] +evidence = "interleaves with 0x90 in the shared ADV-chrome subroutine; trailing imm = action id 0x0/0x7/0x8; same widget cluster as 0x90/0x91/0x92/0x95; confirm via frida" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0xa0 +label = "jcc" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "jcc" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0xa1 +label = "u00427C00" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00427C00" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0xa2 +label = "u00427FD0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00427FD0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0xa3 +label = "u004244D0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004244D0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0xae +label = "u00415130" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415130" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0xb4 +label = "play-sound-effect" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "play-sound-effect" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode]] +op = 0xb5 +label = "u0041D050" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041D050" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int"] + +[[opcode]] +op = 0xb6 +label = "u0041D080" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "snd-ctrl?" +category = "audio" +summary = "1 imm; self-chains, 0x41D family near play-sound-effect/0xb5 — sound channel/volume/stop control" +noop_headless = false +source = "inference" +confidence = "low" +depends_on = [] +evidence = "confirm via frida" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0xb7 +label = "u0041D0E0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041D0E0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0xb8 +label = "u00415520" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415520" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0xb9 +label = "u0041D140" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041D140" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0xba +label = "u0041D0B0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041D0B0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0xbf +label = "play-bgm" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "play-bgm" +category = "audio" +summary = "Play background music by id. BGM is addressed by DIRECT LITERAL NAME: id -> BGM{id:03d}.OGG (in DATA3), NOT the per-scene section manifest (that's voices/textures). E.g. play-bgm 5 -> BGM005." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "By-ear confirmed (2026-07-06): SC0000 real game plays BGM005 for play-bgm 0x5 and BGM008 for play-bgm 0x8 (we initially mis-played BGM006/BGM009 via the manifest = off-by-one). Direct-name proven by play-bgm 0x23 -> BGM035.OGG, a real standalone track (BGM set skips 030-034) that the manifest mis-resolved to a graphics entry (EV049AA.AGF). CORRECTS the earlier 'unified manifest / Frida BGM006' claim, which was wrong by one. Voices/textures still use the manifest (files[base+id], offset 0). Diagnostic: `Age.Cli audio SC0000.BIN`." + +[[opcode.semantics.args]] +i = 1 +role = "bgm id (direct file-name number: BGM{id:03d}.OGG)" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0xc0 +label = "u00415620" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415620" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0xc2 +label = "u0041D2B0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041D2B0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0xc4 +label = "play-voice" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "play-voice" +category = "audio" +summary = "Play a voice clip by id; id resolves via the SYS4INI section manifest -> files[section_base(scene)+id] (voice OGG in DATA1/DATA4). Same rule as set-texture (NOT play-bgm, which is direct-name BGM{id:03d})." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "By-ear confirmed (2026-07-06): SC0000 prologue voices play on their lines via Godot AudioStreamPlayer. Off-by-one disproven structurally: manifest interleaves graphics/voice (files[35]=EV049AA, [36]=MAN999, [37]=EV052CA, [38]=SYL0001), so files[base+id] lands voices on OGGs while files[base+id-1] would land them on .AGF graphics (silent) -- and they play, so the offset is exactly 0. Lily's lines are correctly form-gated (G[0xa57/0xa58/0xa59]) and stay silent when no form flag is seeded -- not a bug." + +[[opcode.semantics.args]] +i = 1 +role = "voice id (section-manifest index)" +observed_types = ["imm", "l-int", "l-ptr"] + +[[opcode]] +op = 0xc5 +label = "u0041D4A0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041D4A0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0xc6 +label = "u0041D5D0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041D5D0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0xc7 +label = "u0041D760" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041D760" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0xc8 +label = "sleep" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "sleep" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0xcc +label = "mouse_callback" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "mouse_callback" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0xcd +label = "get-input-type" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "get-input-type" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0xd0 +label = "u00415830" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415830" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0xd3 +label = "u00425960" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00425960" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0xd4 +label = "u004266F0" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004266F0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0xd5 +label = "u004262C0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004262C0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0xd9 +label = "u00415880" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415880" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0xfb +label = "joy_callback" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "joy_callback" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0xfe +label = "u0041E360" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041E360" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0xff +label = "u00415A10" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415A10" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x100 +label = "u00415A60" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415A60" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x101 +label = "u00415BF0" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415BF0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x107 +label = "u0041E500" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041E500" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x108 +label = "u00415E70" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415E70" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x109 +label = "u00415EC0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415EC0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode]] +op = 0x10a +label = "u0041E540" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041E540" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x10b +label = "u0041E5A0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041E5A0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x10c +label = "u0041E5E0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041E5E0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x10d +label = "u00415F10" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415F10" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x12c +label = "lookup-array-2d" +argc = 5 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "lookup-array-2d" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-ptr", "l-str-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "g-str", "l-int", "l-str"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x12e +label = "u0041E940" +argc = 8 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041E940" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 6 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 7 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 8 +role = "" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode]] +op = 0x12f +label = "u0041ECB0" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041ECB0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x130 +label = "u00415F40" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415F40" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x131 +label = "u00415F70" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415F70" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode]] +op = 0x132 +label = "u0041EF00" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041EF00" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x133 +label = "u0041EFF0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041EFF0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x134 +label = "u0041F050" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041F050" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x135 +label = "bit-set" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "bit-set" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int", "l-ptr"] + +[[opcode]] +op = 0x136 +label = "bit-reset" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "bit-reset" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int", "l-ptr"] + +[[opcode]] +op = 0x137 +label = "u0041F1C0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041F1C0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x13a +label = "u0041F3A0" +argc = 6 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041F3A0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 6 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x13f +label = "check-bit" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "check-bit" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x140 +label = "u0041F9C0" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041F9C0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["string"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["string"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["g-int"] + +[[opcode]] +op = 0x141 +label = "u0041FAA0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041FAA0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x142 +label = "u0041FB10" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041FB10" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x143 +label = "u00415FB0" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415FB0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x144 +label = "u004259D0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004259D0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-str"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-str"] + +[[opcode]] +op = 0x149 +label = "u0041FCE0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041FCE0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x191 +label = "u0041A4A0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041A4A0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int"] + +[[opcode]] +op = 0x192 +label = "set-string" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "set-string" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-str", "l-str", "l-str-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["string", "g-int", "g-str", "l-str", "l-str-ptr"] + +[[opcode]] +op = 0x193 +label = "concat" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "concat" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-str", "l-str"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["string", "g-str", "l-str", "l-str-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["string", "g-str", "l-str", "l-ptr", "l-str-ptr"] + +[[opcode]] +op = 0x194 +label = "u00425480" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00425480" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-str", "l-str", "l-str-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["string", "l-str", "l-str-ptr"] + +[[opcode]] +op = 0x195 +label = "u00425580" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00425580" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-str", "l-str", "l-str-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["string", "g-str"] + +[[opcode]] +op = 0x196 +label = "display-furigana" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "display-furigana" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["string"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["string"] + +[[opcode]] +op = 0x197 +label = "u0041B510" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041B510" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x198 +label = "u0041B540" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041B540" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x199 +label = "u00414D50" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00414D50" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x19a +label = "u00414E50" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00414E50" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int"] + +[[opcode]] +op = 0x19b +label = "u00414E80" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00414E80" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x19c +label = "u00414EC0" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00414EC0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x19d +label = "u0041C680" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041C680" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-ptr"] + +[[opcode]] +op = 0x19e +label = "u0041C6E0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041C6E0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode]] +op = 0x1a0 +label = "u0041C9B0" +argc = 9 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041C9B0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 6 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 7 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 8 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 9 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x1a1 +label = "u0041CB40" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041CB40" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x1a2 +label = "gfx-cmd-register" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "gfx-cmd-register" +category = "draw" +summary = "0x1a2 (handle) — gfx cmd-type 3. Handler gfx_op_0x1a2_registry_insert @0x42d360: builds key '%c%8.8x'(3, operand-desc) and INSERTS operand 1 into the op-0x215 query registry (FUN_0042cf70, open-addressing hash; native stores map[handle]=handle). This is the SOLE populator of the registry op 0x215 queries — the geometry SET/draw ops (0x217/0x219/0x1ff/0x1fb/0x202/...) do NOT register. VM impl: GfxState.Register(handle) (a separate set from the geometry object store). Conflating the two (registering on every GetOrCreate) was the retained-mode geometry bug: CG handles wrongly read back as 'existing' and collapsed to (-400,-600). NOT save/scene (raw Kelebek VA 0x428010 drifted to op 0x1ac save handler). See docs/engine-re.md gfx op-contract table." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "Ghidra: real handler FUN_0042d360 (via dispatch table ctx[0x26c93+op]); sets *(ctx+0x53d88+ctx[0x53d14]*0x78)=3, sprintf(\"%c%8.8x\",3,op1), FUN_0042cf70 (hash insert; counterpart of op 0x215 find). NOT save/scene (raw Kelebek VA 0x428010 drifted to op 0x1ac save handler). See docs/engine-re.md" + +[[opcode.semantics.args]] +i = 1 +role = "value" +observed_types = ["g-int", "l-ptr"] + +[[opcode]] +op = 0x1a3 +label = "string-lookup-set" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "string-lookup-set" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-ptr"] + +[[opcode]] +op = 0x1a4 +label = "u0041B580" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041B580" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x1a5 +label = "set-font" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "set-font" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["string"] + +[[opcode]] +op = 0x1a6 +label = "halve-strlen" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "halve-strlen" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-str", "l-str-ptr"] + +[[opcode]] +op = 0x1a7 +label = "comment" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "comment" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["string", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x1a8 +label = "dev_ukn" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "dev_ukn" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x1a9 +label = "u00428090" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00428090" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-str", "l-str-ptr"] + +[[opcode]] +op = 0x1aa +label = "u00425920" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00425920" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-str", "l-str-ptr"] + +[[opcode]] +op = 0x1ab +label = "u0041CCA0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041CCA0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x1ac +label = "u0041CD80" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041CD80" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x1ad +label = "u004154F0" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004154F0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x1ae +label = "u0041CED0" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041CED0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x1af +label = "u004245C0" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004245C0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x1b0 +label = "u0041A510" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041A510" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x1b2 +label = "u00425790" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00425790" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["string", "g-int"] + +[[opcode]] +op = 0x1b3 +label = "u004257D0" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004257D0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x1b4 +label = "u004237C0" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004237C0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x1b5 +label = "u0041B5F0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041B5F0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x1b6 +label = "u00414F60" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00414F60" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int"] + +[[opcode]] +op = 0x1b7 +label = "u0041B640" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041B640" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int"] + +[[opcode]] +op = 0x1b8 +label = "u0041B670" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041B670" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x1b9 +label = "u0041B710" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041B710" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x1ba +label = "u0041D850" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041D850" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x1bb +label = "u0041B7B0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041B7B0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x1bc +label = "u00415670" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "block-mark" +category = "marker" +summary = "zero-arg; follows jcc/mov, precedes mov/ret — block boundary" +noop_headless = true +source = "inference" +confidence = "high" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x1bd +label = "u0041D910" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041D910" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x1bf +label = "u004156C0" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "call-end" +category = "marker" +summary = "zero-arg; call->0x1bf->stmt-end — end-of-call-statement marker" +noop_headless = true +source = "inference" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x1c1 +label = "u0041B820" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041B820" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x1c7 +label = "u00414F90" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00414F90" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int"] + +[[opcode]] +op = 0x1c8 +label = "toString" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "toString" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-str"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode]] +op = 0x1ca +label = "u0041B9B0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041B9B0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int"] + +[[opcode]] +op = 0x1cb +label = "u00414FD0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00414FD0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int"] + +[[opcode]] +op = 0x1cc +label = "u00415010" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00415010" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int"] + +[[opcode]] +op = 0x1ce +label = "u0041B9F0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041B9F0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x1cf +label = "u0041DA10" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041DA10" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int"] + +[[opcode]] +op = 0x1d0 +label = "u0041BA80" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041BA80" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x1d1 +label = "u0041BAE0" +argc = 5 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041BAE0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x1d2 +label = "u0041BB40" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "stmt-desc?" +category = "marker" +summary = "2 imm; immediately after stmt-begin 0x1f4 — statement descriptor?" +noop_headless = true +source = "harness" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x1d3 +label = "u0041BB90" +argc = 5 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041BB90" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x1d4 +label = "u0041BC00" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0041BC00" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x1d5 +label = "u00415700" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "cond-block" +category = "marker" +summary = "zero-arg; ALWAYS follows jcc — marks conditional body entry" +noop_headless = true +source = "inference" +confidence = "high" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x1f4 +label = "u004160D0" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "stmt-begin" +category = "marker" +summary = "zero-arg; opens scripts, pairs with stmt-end 0x1f5" +noop_headless = true +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x1f5 +label = "u00416120" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "stmt-end" +category = "marker" +summary = "zero-arg; precedes exit/next-stmt, pairs with 0x1f4" +noop_headless = true +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x1f6 +label = "u00416170" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00416170" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x1f7 +label = "gfx-elem-erase" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "gfx-elem-erase" +category = "draw" +summary = "0x1f7 (handle)(count) — gfx cmd-type 5. Handler gfx_op_0x1f7_elem_erase @0x422270: ERASES registry handles — if count>1 → gfx_registry_erase_range(handle,count) [erase [handle, handle+count)], else gfx_registry_erase(handle). It is a TEARDOWN/erase, NOT a create (corrects the earlier 'gfx-elem-create' reading). In label_12649 it runs after a 0x215 slot-query, before 0x1fa releases the slot. Objects are created lazily by the geometry SET ops (gfx_object_get_or_create). See docs/engine-re.md gfx op-contract table." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "Ghidra handler 0x422270 (dispatch ctx[0x26c93+0x1f7]); count>1 → gfx_registry_erase_range @0x47d8b0 (loops gfx_registry_erase @0x47d850 over [op1,op1+op2)), else gfx_registry_erase(op1). gfx_registry_erase does map.find+erase on the ctx+0x408 registry." + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x1f8 +label = "create-texture" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "create-texture" +category = "draw" +summary = "Allocate/prepare a texture slot: (slot, width, height, flag). e.g. `create-texture 0xd 0x190 0x1e 0x0` = slot 13, 400x30." +noop_headless = false +source = "investigation" +confidence = "med" +depends_on = [] +evidence = "SC0000 CG/UI-draw path disasm; slot/w/h roles read off the operands (400x30 text bars, etc.)." + +[[opcode.semantics.args]] +i = 1 +role = "texture slot" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "width" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "height" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 4 +role = "flag" +observed_types = ["imm"] + +[[opcode]] +op = 0x1f9 +label = "set-texture" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "set-texture" +category = "draw" +summary = "Load asset #resId into texture slot: (resId, slot, flag=-1). resId resolves via the SYS4INI per-scene section manifest: files[section_base(scene)+resId] (same rule for play-bgm/play-voice). See docs/asset-resolution-re.md." +noop_headless = false +source = "frida" +confidence = "high" +depends_on = [] +evidence = "SC0000 Frida-confirmed 17/17 (0x25->EV052CA, 0x2e->EV052DB, 0x36->BG030A background); resolution rule validated on 586/595 captured loads. Traced in CG-load subroutine label_12649 as `set-texture G[0x62424] -1`." + +[[opcode.semantics.args]] +i = 1 +role = "resId (section-manifest index into SYS4INI)" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "texture slot" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "flag (typically -1 / 0xffffffff)" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x1fa +label = "gfx-elem-release" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "gfx-elem-release" +category = "draw" +summary = "0x1fa (idx) — gfx cmd-type 3. Handler gfx_op_0x1fa_elem_release @0x4224a0: releases the element at [ctx+0x52bd4 + idx*4] (virtual free, then nulls the slot) + FUN_00474e40(idx). In label_12649 it clears the working slot G[0x62452] after a 0x215/0x1f7 pair. See docs/engine-re.md gfx op-contract table." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "Ghidra handler 0x4224a0 (dispatch ctx[0x26c93+0x1fa]); frees ctx+0x52bd4[operand1*4] via vtbl, then FUN_00474e40(operand1)." + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x1fb +label = "draw-texture" +argc = 8 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "draw-texture" +category = "draw" +summary = "Blit a texture slot to screen. Observed 8 args: (handle, slot, srcx, srcy, w, h, dstx, dsty). e.g. `draw-texture 0xcf08 0x3 0 0 0x320 0x258 0 0` = full-screen (800x600) slot 3 at (0,0)." +noop_headless = false +source = "investigation" +confidence = "med" +depends_on = [] +evidence = "SC0000 CG-load subroutine label_12649: `draw-texture (ptr) (slot) 0 0 (w) (h) (dstx) (dsty)`; full-screen slot-3 draws use 0x320x0x258 (800x600)." + +[[opcode.semantics.args]] +i = 1 +role = "handle/source ref" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "texture slot" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "src x" +observed_types = ["imm", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 4 +role = "src y" +observed_types = ["imm", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 5 +role = "width" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 6 +role = "height" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 7 +role = "dst x" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 8 +role = "dst y" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x1fd +label = "u00420620" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00420620" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x1fe +label = "u004206C0" +argc = 5 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004206C0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x1ff +label = "set-gfx-geom3-c" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "set-gfx-geom3-c" +category = "draw" +summary = "0x1ff (handle)(a)(b)(c) — gfx cmd-type 9. Handler gfx_op_0x1ff_set_geom3 @0x4227b0: SETS a 3-vector (int→float a,b,c) on object `handle` via native worker FUN_0047e800 (sibling of 0x217/0x219, a distinct per-object vector). See docs/engine-re.md gfx op-contract table." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "Ghidra handler 0x4227b0 (dispatch ctx[0x26c93+0x1ff]); FUN_0047e800(op1,(float)op2,(float)op3,(float)op4)." + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x202 +label = "gfx-blit-color" +argc = 5 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "gfx-blit-color" +category = "draw" +summary = "0x202 (handle)(x)(y)(alpha)(color) — gfx cmd-type 0xb. Handler gfx_op_0x202_blit_color @0x4228d0: blits object `handle` at (x,y) with a packed ARGB built from alpha(op4, ≥0x100→0xff, <0→FUN_0047f3e0) and color(op5, <0→FUN_0047f3e0) → FUN_0047ea00. See docs/engine-re.md gfx op-contract table." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "Ghidra handler 0x4228d0 (dispatch ctx[0x26c93+0x202]); packs (alpha<<24|rgb) from operands 4/5, FUN_0047ea00(op1,op2,op3,packed)." + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode]] +op = 0x203 +label = "gfx-draw-color" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "gfx-draw-color" +category = "draw" +summary = "0x203 (handle)(v)(alpha)(color) — gfx cmd-type 9. Handler gfx_op_0x203_draw_color @0x4229a0: draws object `handle` with op2 + a packed ARGB from alpha(op3)/color(op4) → FUN_0047e9b0. Sibling of 0x202 with one fewer positional arg. See docs/engine-re.md gfx op-contract table." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "Ghidra handler 0x4229a0 (dispatch ctx[0x26c93+0x203]); packs color from operands 3/4, FUN_0047e9b0(op1,op2,packed)." + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "g-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode]] +op = 0x204 +label = "draw-string" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "draw-string" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["string", "g-str", "l-str", "l-str-ptr"] + +[[opcode]] +op = 0x205 +label = "u00420A60" +argc = 6 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00420A60" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 6 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x207 +label = "u00420B00" +argc = 8 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00420B00" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "g-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 6 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 7 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 8 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x208 +label = "get-texture-size" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "get-texture-size" +category = "draw" +summary = "0x208 (slot)(out_w)(out_h) — writes the loaded texture's width/height into two output globals; keystone for bytecode-computed sprite/bg geometry (SC0000 label_12649)" +noop_headless = false +source = "inference" +confidence = "med" +depends_on = [] +evidence = "SC0000 label_12649: set-texture(resId,slot) then 0x208(slot)->w,h feeds w/2 horizontal-center + foot-anchor subtraction into draw-texture dst; stubbing yields 0x0 sizes / off-center draws" + +[[opcode.semantics.args]] +i = 1 +role = "slot" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "out_width" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "out_height" +observed_types = ["g-int", "l-int"] + +[[opcode]] +op = 0x20a +label = "u00420CE0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00420CE0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x20b +label = "u00420D50" +argc = 7 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00420D50" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 6 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 7 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x20c +label = "u00416200" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00416200" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x20d +label = "u00420E10" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00420E10" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x20e +label = "u00416250" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00416250" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x20f +label = "u00420E40" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00420E40" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x212 +label = "set-gfx-field64" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "set-gfx-field64" +category = "draw" +summary = "0x212 (obj_idx)(val) — gfx cmd-type 5. Handler gfx_op_0x212_set_field64 @0x4230c0: obj=[ctx+0x14d54 + obj_idx*4]; if obj: *(obj+0x64)=val. Sets one per-object field. See docs/engine-re.md gfx op-contract table." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "Ghidra handler 0x4230c0 (dispatch ctx[0x26c93+0x212]); writes [obj+0x64]=operand2, obj from ctx+0x14d54[operand1*4]." + +[[opcode.semantics.args]] +i = 1 +role = "obj_idx" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "value" +observed_types = ["imm"] + +[[opcode]] +op = 0x213 +label = "set-gfx-xy" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "set-gfx-xy" +category = "draw" +summary = "0x213 (obj_idx)(x)(y) — gfx cmd-type 7. Handler gfx_op_0x213_set_field68_6c @0x423110: obj=[ctx+0x14d54 + obj_idx*4]; if obj: *(obj+0x68)=x; *(obj+0x6c)=y (an (x,y) pair). See docs/engine-re.md gfx op-contract table." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "Ghidra handler 0x423110; writes obj+0x68/+0x6c from operands 2/3, obj from ctx+0x14d54[operand1*4]." + +[[opcode.semantics.args]] +i = 1 +role = "obj_idx" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "x" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "y" +observed_types = ["imm"] + +[[opcode]] +op = 0x215 +label = "query-gfx-object?" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "query-gfx-object?" +category = "draw" +summary = "0x215 (out)(handle_id) — native graphics command-buffer op. Real handler FUN_0042a0b0 (Ghidra-resolved via the dispatch table ctx[0x26c93+op]; Kelebek's 0x421160 is VA-drift, lands in an unrelated fn). Does TWO things: (1) writes cmd-type 5 into the CURRENT gfx-object record `[ctx+0x53d88 + ctx[0x53d14]*0x78]` (a command-buffer registration, parallel to op 0x1a2→type 3); (2) returns `out = map.find(handle_id)` over an engine-internal associative registry (found value, else 0xffffffff=not-found), sign-tested (gre/lt 0) to drive label_12649's slot-select branch + set working slot G[0x62452]. So `out` is NATIVE COMMAND-BUFFER STATE (the registry is populated by sibling gfx ops — op 0x1a2→FUN_0042cf70 is the hash insert), NOT the VM global bank → seeding story-state CANNOT reproduce it. Stubbed → constant return → every draw collapses to slot 0 → anchor-preserve reads foreign-sized textures → the cumulative bg/sprite drift. SETTLES the drift as (b) a genuine native op, NOT (a) state-divergence. Faithful fix = model the gfx command-buffer (record array + handle→object registry) and run the gfx ops instead of stubbing — static/Frida-free (handlers now readable; inserts are bytecode-driven). Full decode + verdict: docs/engine-re.md (op 0x215 section). RETAINED-MODE FIX (2026-07-07): the registry MUST be separate from the geometry object store — it is populated ONLY by op 0x1a2, never by the geometry SET/draw ops. VM: QuerySlot returns the registered value (=handle) or -1, NOT a fabricated per-object slot. CG handles are never 0x1a2-registered → query returns -1 → label_12649 takes its FRESH branch (anchor from the INIT2 arrays) → dst=(0,0). The prior GfxState.GetOrCreate-assigns-AcquireSlot model made CG handles read as 'existing' → existing branch called get-texture-size on the wrong slot (0) → dst=(-400,-600) off-screen (the '2nd CG off-screen' bug)." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "Ghidra: real handler FUN_0042a0b0 = {*(ctx+0x53d88+ctx[0x53d14]*0x78)=5; out=FUN_0047f280(FUN_0041b940(2))}. FUN_0047f280 = std::map::find (returns mapped value or 0xffffffff); FUN_0041b940(2) = operand-fetch of operand 2 (the handle key); FUN_00425fb0(1,val) = operand-write to `out`. Registry populated by op 0x1a2 handler FUN_0042d360 → FUN_0042cf70 (open-addressing hash insert). Bytecode sites: SC0000 label_12649 (0x12670) + label_123ef (0x12419/0x12450), handle-ids from 0x62455[idx] (±offset); result gre/lt 0 branches slot-select. Record table 0x3239 (label_125bd @0x0050f) assigns per-object slots 4..13." + +[[opcode.semantics.args]] +i = 1 +role = "out_slot_status" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "handle_id" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode]] +op = 0x216 +label = "query-gfx-field?" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "query-gfx-field?" +category = "draw" +summary = "0x216 (out)(idx) — gfx cmd-type 5. Handler gfx_op_0x216_query_table46d14 @0x42a0f0: out = *(ctx+0x46d14 + idx*0x14). A per-object field query over a stride-0x14 table. See docs/engine-re.md gfx op-contract table." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "Ghidra handler 0x42a0f0; reads ctx+0x46d14[operand2 * 0x14], writes operand1 via FUN_00425fb0(1,·)." + +[[opcode.semantics.args]] +i = 1 +role = "out" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "idx" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode]] +op = 0x217 +label = "set-gfx-geom3" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "set-gfx-geom3" +category = "draw" +summary = "0x217 (handle)(a)(b)(c) — gfx cmd-type 9. Handler gfx_op_0x217_set_geom3 @0x4231b0: SETS a 3-vector (int→float a,b,c) on object `handle` via native worker FUN_0047e960. In SC0000 label_12649 it writes the anchor vector G[0x6249b/c/d] INTO the object; op 0x218 reads it back. See docs/engine-re.md gfx op-contract table." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "Ghidra handler 0x4231b0 (dispatch ctx[0x26c93+0x217]); FUN_0047e960(op1,(float)op2,(float)op3,(float)op4). label_12649 sites e.g. 0x00c67 handle=G[0x62457], vec=G[0x6249b/c/d]." + +[[opcode.semantics.args]] +i = 1 +role = "handle" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "a" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "b" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "c" +observed_types = ["imm", "g-int"] + +[[opcode]] +op = 0x218 +label = "get-gfx-geom3?" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "get-gfx-geom3?" +category = "draw" +summary = "0x218 (handle)(out_a)(out_b)(out_c) — gfx cmd-type 9. Handler gfx_op_0x218_query_geom3 @0x42a130: GETS a stored 3-vector from object `handle` (FUN_0047f360) into out_a/b/c. In label_12649 it reads the object's anchor vector back into G[0x6249b/c/d] — a stubbed DRIVER of the render drift (stale anchor → bad centering). See docs/engine-re.md gfx op-contract table." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "Ghidra handler 0x42a130; FUN_0047f360(obj op1) + 3x FUN_00550850→FUN_00425fb0(2/3/4). label_12649 site 0x00c8f handle=G[0x62457] → G[0x6249b/c/d]." + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["g-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["g-int"] + +[[opcode]] +op = 0x219 +label = "set-gfx-geom3-b" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "set-gfx-geom3-b" +category = "draw" +summary = "0x219 (handle)(a)(b)(c) — gfx cmd-type 9. Handler gfx_op_0x219_set_geom3 @0x423240: SETS a 3-vector (int→float) on object `handle` via native worker FUN_0047e910 (sibling of 0x217, a different per-object vector). See docs/engine-re.md gfx op-contract table." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "Ghidra handler 0x423240 (was unanalyzed; function created this session; dispatch ctx[0x26c93+0x219]); FUN_0047e910(op1,(float)op2,(float)op3,(float)op4)." + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["g-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["g-int"] + +[[opcode]] +op = 0x21a +label = "get-gfx-geom3-b?" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "get-gfx-geom3-b?" +category = "draw" +summary = "0x21a (handle)(out_a)(out_b)(out_c) — gfx cmd-type 9. Handler gfx_op_0x21a_query_geom3 @0x42a1b0: GETS a stored 3-vector from object `handle` (FUN_0047f2e0) into out_a/b/c. In label_12649 it reads the object's position vector into G[0x62498/9/a] — a stubbed DRIVER of the render drift. See docs/engine-re.md gfx op-contract table." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "Ghidra handler 0x42a1b0; FUN_0047f2e0(obj op1) + 3x→FUN_00425fb0(2/3/4). label_12649 site 0x00c86 handle=G[0x62457] → G[0x62498/9/a]." + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode]] +op = 0x21b +label = "u004213E0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "line-id?" +category = "marker" +summary = "1 imm; mov->0x21b->stmt-end; near save/load-messkip — likely line/stmt id, verify not msg-control" +noop_headless = true +source = "harness" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x21c +label = "u00416270" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00416270" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x21d +label = "u00421410" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00421410" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x21e +label = "set-anim-transform-norm" +argc = 6 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "set-anim-transform-norm" +category = "draw" +summary = "(handle)(p1)(p2)(x)(y)(z) — set sprite transform channel, NORMALIZED (float operands /_DAT_00571c28 ~percent); cmd-type 0xd, worker gfx_anim_set_channel@0x47eaa0. SC0000 opening @0xf73+ on INIT2 CG handles. Cluster 0x21c-0x243. Handler 0x423350; Kelebek VA 0x421450 is drift." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 6 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x21f +label = "u00421510" +argc = 7 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00421510" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 6 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 7 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x220 +label = "set-anim-transform-abs" +argc = 6 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "set-anim-transform-abs" +category = "draw" +summary = "(handle)(p1)(p2)(x)(y)(z) — set sprite transform channel, ABSOLUTE (raw floats); cmd-type 0xd, worker 0x47ecc0. Twin of 0x21e. SC0000 opening @0x18a5+ on INIT2 CG handles. Cluster 0x21c-0x243. Handler 0x4234e0; Kelebek VA 0x4215D0 is drift." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 6 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x222 +label = "u004216C0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004216C0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x223 +label = "u00421700" +argc = 8 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00421700" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm", "l-ptr"] + +[[opcode.semantics.args]] +i = 6 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 7 +role = "" +observed_types = ["imm", "g-int"] + +[[opcode.semantics.args]] +i = 8 +role = "" +observed_types = ["imm", "g-int"] + +[[opcode]] +op = 0x224 +label = "u00416290" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00416290" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x228 +label = "u00421940" +argc = 5 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00421940" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "g-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode]] +op = 0x229 +label = "u004219E0" +argc = 5 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004219E0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm", "g-int"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x22a +label = "u00421A90" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00421A90" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x22c +label = "u00421BD0" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00421BD0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x22d +label = "u00421C60" +argc = 5 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00421C60" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["g-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["g-int"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x22f +label = "u00421DD0" +argc = 5 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00421DD0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x230 +label = "u00421E70" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00421E70" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode]] +op = 0x231 +label = "u00421EA0" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00421EA0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-ptr"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm", "l-ptr"] + +[[opcode]] +op = 0x232 +label = "u00421EF0" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00421EF0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x233 +label = "u00421FB0" +argc = 5 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00421FB0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x234 +label = "anim-start" +argc = 5 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "anim-start" +category = "draw" +summary = "(handle)(duration)(x)(y)(z) — animate object toward target vec3 (x,y,z) over the GLOBAL clock; cmd-type 0xb, worker gfx_anim_start. op2=this object's duration (label_1235a maxes into the clock). SC0000 opening @0xdaf on INIT2 CG handles. Handler 0x423da0; Kelebek VA 0x422060 is drift." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["g-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x236 +label = "u004221A0" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004221A0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm", "l-ptr"] + +[[opcode]] +op = 0x238 +label = "set-anim-clock" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "set-anim-clock" +category = "draw" +summary = "(duration) — set the GLOBAL animation clock: native ctx+0x51b78=0 (elapsed), +0x51b7c=duration. cmd-type 3. NON-BLOCKING: only configures; the render loop advances it and interpolates all animating objects. SC0000 opening @0x123bd/@0x13858. Handler 0x4240e0; Kelebek VA 0x422390 is drift." +noop_headless = false +source = "investigation" +confidence = "high" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int"] + +[[opcode]] +op = 0x239 +label = "u004223C0" +argc = 6 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004223C0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm", "l-ptr"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm", "l-ptr"] + +[[opcode.semantics.args]] +i = 6 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x23a +label = "u00422420" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00422420" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x23b +label = "u00422460" +argc = 7 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00422460" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "g-int", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 6 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 7 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x23c +label = "u004162B0" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004162B0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x23d +label = "u004162F0" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004162F0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x23f +label = "u00422930" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00422930" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode]] +op = 0x241 +label = "u00422B80" +argc = 5 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00422B80" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-ptr"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["l-ptr"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["l-int"] + +[[opcode]] +op = 0x242 +label = "u00422D60" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00422D60" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x243 +label = "u00417070" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00417070" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode]] +op = 0x248 +label = "u00422E80" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00422E80" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x249 +label = "u00422EB0" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00422EB0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "l-int", "l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x24d +label = "u00422E90" +argc = 12 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00422E90" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 5 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode.semantics.args]] +i = 6 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 7 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 8 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 9 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 10 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 11 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 12 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x24e +label = "u00422EA0" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00422EA0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x258 +label = "u00422FE0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "decl?" +category = "marker" +summary = "2 imm; runs in a chain right after script-entry 0x259, enumerating ids — prologue declaration/registration?" +noop_headless = true +source = "harness" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x259 +label = "u00416410" +argc = 0 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "script-entry" +category = "marker" +summary = "zero-arg; the first instruction of a script (offset 0), opens the decl chain that 0x258 continues — script/prologue entry marker, structural" +noop_headless = true +source = "harness" +confidence = "low" +depends_on = [] +evidence = "SC0000 offset 0x0 = op 0x259 (argc 0); 0x258's summary names it 'script-entry 0x259'; VM treats it as no-op (default stub) across all 279 CLEAN A0 scenes" + +[[opcode]] +op = 0x2bd +label = "u00423100" +argc = 1 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00423100" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm"] + +[[opcode]] +op = 0x2bf +label = "u00423180" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u00423180" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["imm", "g-int", "l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["imm", "l-int"] + +[[opcode]] +op = 0x2c0 +label = "u004231C0" +argc = 3 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u004231C0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["imm"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["l-ptr"] + +[[opcode]] +op = 0x2c5 +label = "strlen" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "strlen" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "med" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["g-str", "l-str", "l-str-ptr"] + +[[opcode]] +op = 0x2c6 +label = "u0042B5E0" +argc = 2 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0042B5E0" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-str"] + +[[opcode]] +op = 0x2c8 +label = "u0042B610" +argc = 4 +abi_source = "kelebek+decode-validated" + +[opcode.semantics] +name = "u0042B610" +category = "unknown" +summary = "" +noop_headless = false +source = "kelebek" +confidence = "low" +depends_on = [] +evidence = "" + +[[opcode.semantics.args]] +i = 1 +role = "" +observed_types = ["l-str-ptr"] + +[[opcode.semantics.args]] +i = 2 +role = "" +observed_types = ["l-str"] + +[[opcode.semantics.args]] +i = 3 +role = "" +observed_types = ["l-int"] + +[[opcode.semantics.args]] +i = 4 +role = "" +observed_types = ["imm"]