Implement ADV layout cursor and bounds
This commit is contained in:
@@ -2227,6 +2227,45 @@ the deliberately deferred shared-profile write `0x1a2`.
|
||||
|
||||
---
|
||||
|
||||
### ADV layout reset cursor and overflow bounds — `0x79` / `0x1c1` (2026-07-21)
|
||||
|
||||
SYSTEM4 uses these two three-operand operations as a pair while constructing its nine ADV layouts. They
|
||||
configure persistent layout properties used by later resets; neither operation draws text or moves the
|
||||
current cursor immediately.
|
||||
|
||||
`op_0x79_set_adv_text_reset_cursor@0x41eb50` reads `(layout_slot, x, y)` and calls
|
||||
`adv_text_layout_set_reset_cursor@0x44fed0`. Slot zero resolves through the current-layout selector at
|
||||
manager `+0x4c8`; otherwise the helper selects `manager+0x414[slot]`. It writes `x/y` to layout
|
||||
`+0x1c/+0x20`. This is distinct from `0x7a`, whose `adv_text_set_cursor@0x4530f0` path modifies the live
|
||||
cursor record immediately.
|
||||
|
||||
`op_0x1c1_set_adv_text_bounds@0x41f6c0` reads `(layout_slot, right, bottom)` and calls
|
||||
`adv_text_layout_set_bounds@0x44ff00`, which writes the pair to layout `+0x24/+0x28`. They are absolute
|
||||
layout-local overflow coordinates. `adv_text_layout_check_overflow@0x45efc0` compares glyph end x/y
|
||||
against those fields and returns horizontal/vertical overflow bits. When a layout resets,
|
||||
`adv_text_layout_reset_cursor_and_bounds_record@0x455070` replaces its retained state with a five-dword
|
||||
record `{0, reset_x, reset_y, right, bottom}` copied from all four configured fields.
|
||||
|
||||
The corpus supplies a complete consistency check: all nine sites for each opcode are in SYSTEM4 and
|
||||
alternate after layouts 1–9 are defined and initially reset. Layout 1 configures cursor `(100,47)` and
|
||||
bounds `(720,147)`; layouts 2–6 use `(45,42)` and `(645,135)`; layout 7 uses `(53,10)` and `(495,180)`;
|
||||
layout 8 uses `(53,10)` and `(495,60)`; layout 9 uses `(10,10)` and `(250,368)`. Layout 1 computes its
|
||||
bounds as `100+620` and `47+100`, further excluding width/height-delta semantics.
|
||||
|
||||
The port now keeps configured reset cursor and right/bottom bounds in its engine-owned layout state.
|
||||
`0x70` initializes bounds from width/height, `0x79` changes only the deferred reset cursor, `0x1c1`
|
||||
changes the bounds, and `0x71` restores the configured cursor while notifying the host of the concrete
|
||||
selected slot. Retained snapshots carry the boundaries, and ordinary/history Godot labels are positioned
|
||||
from the layout origin and sized from `right-cursor_x` / `bottom-cursor_y`; the former hardcoded slot-1
|
||||
rectangle is gone. The ordinary overlay remains bound to the parent input wait's captured layout while a
|
||||
nested callback such as HISTORY selects and renders into layouts 2–6; closing the callback therefore
|
||||
reveals the retained parent text at its original geometry rather than consulting the callback's last
|
||||
current-layout selection. The direct-scene SYSTEM4 bootstrap also recognizes all nine configuration pairs and
|
||||
evaluates the two constant `add` expressions used for slot 1 without entering SYSTEM4's control flow. This
|
||||
is script-owned state, with no boot seed or game-specific coordinates in the runtime.
|
||||
|
||||
---
|
||||
|
||||
## Native walls backlog (targets for this loop)
|
||||
|
||||
- ~~**call-script dispatch**~~ — **SOLVED** (above): `call-script <id>` = raw SYS4INI file index.
|
||||
|
||||
@@ -8,11 +8,13 @@
|
||||
### 0x70 `define-adv-text-layout` (define-adv-text-layout, argc 5)
|
||||
- **summary:** (layout_slot)(width)(height)(x)(y) - configure an ADV text layout/surface and, when history recording is enabled, append its logical history index and arm the next retained record as a group start.
|
||||
- **grounding:** source=investigation, confidence=high
|
||||
- **depended on by:** 0x79, 0x1c1
|
||||
- **evidence:** Ghidra /v2: op_0x70_handler@0x41e4e0 forwards the five operands and ctx+0x55110 to adv_text_layout_define@0x4550e0. The worker stores width/height/origin, creates or resizes surface slot layout+0x14, appends {layout_slot,current_record_count} to the 8-byte history index unless suppression bit31 is set, and arms manager+0xd40[slot] so the next 0x48-byte record receives group-start flag bit0.
|
||||
|
||||
### 0x71 `reset-adv-text-layout` (reset-adv-text-layout, argc 1)
|
||||
- **summary:** (layout_slot) - clear/reset an ADV text layout, append a retained-history boundary when recording is enabled, snapshot the current code/text position, and commit pending ReadTextDB records. T1 entries target these structural reset sites.
|
||||
- **grounding:** source=investigation, confidence=high
|
||||
- **depended on by:** 0x79, 0x1c1
|
||||
- **evidence:** Corpus: T1 targets op-0x71 records, but the operand is a layout slot (SC0000 uses 1; HISTORY computes 2..6), not an anchor id. Ghidra /v2: op_0x71_handler@0x41e540 calls adv_text_layout_reset@0x455210 with ctx+0x55110; the worker clears the selected layout and appends {slot,current_record_count}/arms group-start unless suppressed. The handler also snapshots (frame_pc-frame_codebase)/4 and text state and calls read_text_db_commit_pending@0x46ae20.
|
||||
|
||||
### 0x72 `wait-for-input` (wait-for-input, argc 1)
|
||||
@@ -45,6 +47,12 @@
|
||||
- **grounding:** source=investigation, confidence=high
|
||||
- **evidence:** Ghidra /v2: op_0x78_handler@0x41eb10 writes operand 1 to text-manager+0x558 and rebuilds font state. Direct draw and text_history_render_records branch on this field (including a distinct mode-3 offset path). HISTORY.BIN selects mode 3 and restores mode 3 with the normal ADV font preset.
|
||||
|
||||
### 0x79 `set-adv-text-reset-cursor` (set-adv-text-reset-cursor, argc 3)
|
||||
- **summary:** (layout_slot)(x)(y) - configure the cursor coordinates restored by a later reset of the selected ADV text layout. Slot 0 selects the current layout. This does not move the live cursor immediately; opcode 0x7a does that.
|
||||
- **grounding:** source=investigation, confidence=high
|
||||
- **depends on:** 0x70, 0x71
|
||||
- **evidence:** Ghidra /v2: op_0x79_set_adv_text_reset_cursor@0x41eb50 reads three operands and calls adv_text_layout_set_reset_cursor@0x44fed0. Slot 0 resolves through the manager current-layout field at +0x4c8; the selected layout pointer is manager+0x414[slot], and x/y are stored at layout +0x1c/+0x20. adv_text_layout_reset_cursor_and_bounds_record@0x455070 later copies those configured values into the initial retained record on layout reset. SYSTEM4 has all nine corpus sites, paired with 0x1c1 after defining/resetting layouts 1..9; slot 1 configures (100,47), layouts 2..6 configure (45,42), layouts 7/8 (53,10), and layout 9 (10,10). Port implementation stores the configured cursor separately from the live cursor, restores it on 0x71, and replays the SYSTEM4 configuration in the direct-scene bootstrap.
|
||||
|
||||
### 0x7a `set-adv-text-cursor` (set-adv-text-cursor, argc 3)
|
||||
- **summary:** (layout_slot)(x)(y) - set the cursor in the selected ADV text layout's last 20-byte record. Slot 0 selects the current layout.
|
||||
- **grounding:** source=investigation, confidence=high
|
||||
@@ -80,6 +88,12 @@
|
||||
- **grounding:** source=investigation, confidence=high
|
||||
- **evidence:** Ghidra /v2: op_0x1bb_handler@0x41f650 writes 0x80000000 to ctx+0x55110 for operand 0 and zero for operand 1, rejecting other values. Text/layout/metadata/voice paths test or propagate that high bit before appending retained history. HISTORY.BIN disables recording at entry and reenables it at exit so the backlog UI does not record itself.
|
||||
|
||||
### 0x1c1 `set-adv-text-bounds` (set-adv-text-bounds, argc 3)
|
||||
- **summary:** (layout_slot)(right)(bottom) - configure the selected ADV text layout's right and bottom overflow boundaries in layout-local coordinates. Slot 0 selects the current layout.
|
||||
- **grounding:** source=investigation, confidence=high
|
||||
- **depends on:** 0x70, 0x71
|
||||
- **evidence:** Ghidra /v2: op_0x1c1_set_adv_text_bounds@0x41f6c0 reads three operands and calls adv_text_layout_set_bounds@0x44ff00. That helper stores right/bottom at layout +0x24/+0x28; adv_text_layout_reset_cursor_and_bounds_record@0x455070 copies them into the initial retained record, and adv_text_layout_check_overflow@0x45efc0 compares glyph end coordinates against them. SYSTEM4 has all nine sites, paired with 0x79. Slot 1 computes (720,147), layouts 2..6 use (645,135), layout 7 (495,180), layout 8 (495,60), and layout 9 (250,368), proving these are layout-local boundary coordinates rather than width/height deltas. Port implementation retains the configured bounds in engine-owned layout snapshots and sizes ordinary/history Godot labels from right-cursor_x and bottom-cursor_y.
|
||||
|
||||
### 0x1ce `set-adv-wait-indicator-enabled` (u0041B9F0, argc 1)
|
||||
- **summary:** (enabled) - explicitly start or stop the animated ADV input-wait indicator service.
|
||||
- **grounding:** source=investigation, confidence=high
|
||||
@@ -931,10 +945,6 @@ op 0x90 (u0041BEB0, argc 7): `0x90 x y w h tgt_a tgt_b tgt_c`. Kelebek left it "
|
||||
- **summary:** —
|
||||
- **grounding:** source=kelebek, confidence=med
|
||||
|
||||
### 0x79 `u0041AD30` (u0041AD30, argc 3)
|
||||
- **summary:** —
|
||||
- **grounding:** source=kelebek, confidence=low
|
||||
|
||||
### 0x7f `u00414C60` (u00414C60, argc 1)
|
||||
- **summary:** —
|
||||
- **grounding:** source=kelebek, confidence=low
|
||||
@@ -1151,10 +1161,6 @@ 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
|
||||
|
||||
### 0x1c1 `u0041B820` (u0041B820, argc 3)
|
||||
- **summary:** —
|
||||
- **grounding:** source=kelebek, confidence=low
|
||||
|
||||
### 0x1c8 `toString` (toString, argc 2)
|
||||
- **summary:** —
|
||||
- **grounding:** source=kelebek, confidence=med
|
||||
|
||||
@@ -280,8 +280,12 @@ GAMESTART profile operations still deliberately deferred. The reached `0x63`/`0x
|
||||
also implemented: native `0x63` aliases a typed backing-cell address into a pointer, while `0x1b0` copies a
|
||||
counted dword span through direct or pointer endpoints. The traced natural boot reaches both without
|
||||
fallback; UNITECH is now 31/31 handled and CALCCC 14/15, with only deferred profile op `0x1a2` remaining.
|
||||
The next reached effectful cluster to investigate is SYSTEM4's paired `0x79`/`0x1c1` setup. Closing Godot
|
||||
currently releases a parked ADV wait before process teardown, so the page map may contain one trailing
|
||||
SYSTEM4's paired `0x79`/`0x1c1` setup is now natively resolved and implemented: `0x79` configures the
|
||||
cursor restored by later layout resets, while `0x1c1` configures layout-local right/bottom overflow
|
||||
boundaries. `AdvTextHistory`, VM dispatch, the direct-scene SYSTEM4 bootstrap, and ordinary/history Godot
|
||||
label geometry now share that script-owned state; the former slot-1 hardcoding is removed. The next
|
||||
natural Game Start diagnostic should identify the next reached effectful fallback. Closing Godot currently
|
||||
releases a parked ADV wait before process teardown, so the page map may contain one trailing
|
||||
shutdown-only page; the final timeline `input-wait` is the authoritative stop.
|
||||
|
||||
## Stage B2 — Faithful full boot
|
||||
|
||||
Reference in New Issue
Block a user