diff --git a/docs/opcode-reference.md b/docs/opcode-reference.md index 1817b1a..5e36dd7 100644 --- a/docs/opcode-reference.md +++ b/docs/opcode-reference.md @@ -34,11 +34,6 @@ - **grounding:** source=inference, confidence=low - **evidence:** confirm via frida -### 0x215 `count?` (u00421160, argc 2) -- **summary:** 2 args -> writes global then result tested >0 (gre/lt) — count/search-returns-index helper -- **grounding:** source=inference, confidence=med -- **evidence:** confirm via unicorn - ## draw ### 0x1f7 `ui-elem?` (u00420270, argc 2) @@ -86,6 +81,11 @@ - **grounding:** source=inference, confidence=med - **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 +### 0x215 `query-gfx-object?` (u00421160, argc 2) +- **summary:** 0x215 (out)(handle_id) — queries the native graphics-object manager by element handle-id (the value in 0x62455[idx], often +1/+2 for a sub-element); writes the object's slot/status into `out`, sign-tested (gre/lt 0) to drive label_12649's slot-select branch and set the working slot G[0x62452]. KEYSTONE for per-object slot selection — stubbing it collapses every draw onto slot 0, so the anchor-preserve geometry reads foreign-sized textures → cumulative bg/sprite drift (see docs/phase-a-slice-plan.md A2b-Geometry). Reads native object-manager state (NOT VM-computable). Exact return semantics: RE via unicorn (native handler @0x421160). +- **grounding:** source=investigation, confidence=med +- **evidence:** SC0000 label_12649 (0x12670) + label_123ef (0x12419/0x12450): called with 0x62455[idx] handle-ids (±offset); result gre/lt 0 branches slot-select and feeds ui-elem?(0x1f7)/set-texture slot. Record table 0x3239 (label_125bd @0x0050f) assigns per-object slots 4..13. Handles are the 0xcf08/0xe678/0xd6d8 element-id family. + ### 0x217 `gfx-geom?` (u004211E0, argc 4) - **summary:** 4 global-ints; part of a 0x217/0x218/0x21a geometry chain - **grounding:** source=inference, confidence=low diff --git a/tools/age_opcodes_himegari.py b/tools/age_opcodes_himegari.py index 9c886cf..e8e7696 100644 --- a/tools/age_opcodes_himegari.py +++ b/tools/age_opcodes_himegari.py @@ -21,7 +21,7 @@ INFERRED: dict[int, dict] = { 0x1ff: dict(name='draw?', category='draw', noop=False, confidence='low', source='inference', summary='4 args (global+imms); follows 0x217, then call'), 0x202: dict(name='draw-blit?', category='draw', noop=False, confidence='med', source='inference', summary='5 args (coords/sizes); preceded by coord arithmetic, near draw ops'), 0x203: dict(name='draw?', category='draw', noop=False, confidence='med', source='inference', summary='4 args; chains with 0x202/draw-texture'), - 0x215: dict(name='count?', category='compute', noop=False, confidence='med', source='inference', summary='2 args -> writes global then result tested >0 (gre/lt) — count/search-returns-index helper'), + 0x215: dict(name='query-gfx-object?', category='draw', noop=False, confidence='med', source='investigation', summary="0x215 (out)(handle_id) — queries the native graphics-object manager by element handle-id (the value in 0x62455[idx], often +1/+2 for a sub-element); writes the object's slot/status into `out`, sign-tested (gre/lt 0) to drive label_12649's slot-select branch and set the working slot G[0x62452]. KEYSTONE for per-object slot selection — stubbing it collapses every draw onto slot 0, so the anchor-preserve geometry reads foreign-sized textures → cumulative bg/sprite drift (see docs/phase-a-slice-plan.md A2b-Geometry). Reads native object-manager state (NOT VM-computable). Exact return semantics: RE via unicorn (native handler @0x421160)."), 0x217: dict(name='gfx-geom?', category='draw', noop=False, confidence='low', source='inference', summary='4 global-ints; part of a 0x217/0x218/0x21a geometry chain'), 0x218: dict(name='gfx-geom?', category='draw', noop=False, confidence='low', source='inference', summary='4 global-ints; chains with 0x21a/0x217'), 0x21a: dict(name='gfx-geom?', category='draw', noop=False, confidence='low', source='inference', summary='4 global-ints; chains with 0x218/0x217'), diff --git a/vm-map/opcodes.toml b/vm-map/opcodes.toml index 3ebe58b..928eaf4 100644 --- a/vm-map/opcodes.toml +++ b/vm-map/opcodes.toml @@ -5227,23 +5227,23 @@ argc = 2 abi_source = "kelebek+decode-validated" [opcode.semantics] -name = "count?" -category = "compute" -summary = "2 args -> writes global then result tested >0 (gre/lt) — count/search-returns-index helper" +name = "query-gfx-object?" +category = "draw" +summary = "0x215 (out)(handle_id) — queries the native graphics-object manager by element handle-id (the value in 0x62455[idx], often +1/+2 for a sub-element); writes the object's slot/status into `out`, sign-tested (gre/lt 0) to drive label_12649's slot-select branch and set the working slot G[0x62452]. KEYSTONE for per-object slot selection — stubbing it collapses every draw onto slot 0, so the anchor-preserve geometry reads foreign-sized textures → cumulative bg/sprite drift (see docs/phase-a-slice-plan.md A2b-Geometry). Reads native object-manager state (NOT VM-computable). Exact return semantics: RE via unicorn (native handler @0x421160)." noop_headless = false -source = "inference" +source = "investigation" confidence = "med" depends_on = [] -evidence = "confirm via unicorn" +evidence = "SC0000 label_12649 (0x12670) + label_123ef (0x12419/0x12450): called with 0x62455[idx] handle-ids (±offset); result gre/lt 0 branches slot-select and feeds ui-elem?(0x1f7)/set-texture slot. Record table 0x3239 (label_125bd @0x0050f) assigns per-object slots 4..13. Handles are the 0xcf08/0xe678/0xd6d8 element-id family." [[opcode.semantics.args]] i = 1 -role = "" +role = "out_slot_status" observed_types = ["g-int", "l-int"] [[opcode.semantics.args]] i = 2 -role = "" +role = "handle_id" observed_types = ["imm", "g-int", "l-int", "l-ptr"] [[opcode]]