Merge remote-tracking branch 'origin/main' into auto/no-disc-and-menu-captures
This commit is contained in:
@@ -95,6 +95,28 @@ indirect_dispatch_candidates 1 827 297 dispatch_pc, vtable_address, method_addr
|
||||
`instructions.raw` is an **INT, not hex** — a trap this corpus has already paid
|
||||
for. Query with `python3 -c 'import duckdb'`; it is not SQLite.
|
||||
|
||||
### ⚠️ It is derived data, and it is wrong in places
|
||||
|
||||
The image is **primary** — those are the bytes the console executed. The database
|
||||
is **an analysis of them**, produced by a disassembler that had to guess, and it
|
||||
fails the way disassemblers fail:
|
||||
|
||||
* **misdecoded mnemonics** — data read as code, or a decoder-table gap, produces
|
||||
a plausible instruction that was never executed as one;
|
||||
* **wrong function boundaries** — `end_address` short or long, neighbours merged,
|
||||
one function split in two;
|
||||
* **incomplete coverage** — code reached only through indirect dispatch may be
|
||||
absent entirely; the 1.8 M `indirect_dispatch_candidates` are *candidates*;
|
||||
* **invented names** — largely derived rather than symbols, so a name is a
|
||||
hypothesis wearing a label.
|
||||
|
||||
**A finding resting on a database row is not established until the bytes agree.**
|
||||
Read the same address out of the `.pe` and check. Where they disagree the image
|
||||
wins, and the disagreement is worth recording — it tells the next reader which
|
||||
parts of the database to distrust.
|
||||
|
||||
It is a fast index into 9.2 MB of machine code. It is not a source of truth.
|
||||
|
||||
### These mounts are reference material, not a deliverable
|
||||
|
||||
They are read-only and they come from outside the repository, which means a
|
||||
|
||||
@@ -38,6 +38,52 @@ If the merge conflicts, resolve it, say so in your reply, and carry on.
|
||||
6. `docs/re/INDEX.md` — what is decoded. Re-deriving a ✅ row is not a finding.
|
||||
7. `docs/game/navigation.md` — how the game is navigated, **from the player's
|
||||
side**. Fill it in as you go: you are the one who sees the real screens.
|
||||
8. `docs/agents/CONTAINER-NOTES.md` — the container's tooling, and the reference
|
||||
assets described below.
|
||||
|
||||
## Reference assets you may not know you have
|
||||
|
||||
Your session is new each time the container restarts, so this is repeated here
|
||||
rather than left in a document you might not reach.
|
||||
|
||||
| path | what | env |
|
||||
|---|---|---|
|
||||
| `/image/sylpheed.pe` | the decompressed executable image | `SYLPHEED_PE` |
|
||||
| `/xenia-rs/sylpheed.db` | a disassembly database, 586 MB | `SYLPHEED_DB` |
|
||||
| `/disc` | the extracted disc | `SYLPHEED_DISC` |
|
||||
| `/iso/game.iso` | the retail ISO Canary boots | `SYLPH_ISO` |
|
||||
| `/canary` | the Canary source, read-write | `XENIA_SRC` |
|
||||
|
||||
**The `.pe` is a flat VA dump**: file offset = `VA - 0x82000000`. Reading
|
||||
`0x820A1630` is `seek(0xA1630)`. No XEX decrypt, no LZX, **no booted emulator** —
|
||||
dumping guest memory works but makes the whole static corpus depend on a running
|
||||
game, and it does not have to. An earlier claim that this file was *stale* was
|
||||
tested and **refuted**; it is current.
|
||||
|
||||
The database holds 25 481 functions, 851 classes with RTTI, EH tables, imports,
|
||||
1 526 function-pointer arrays and 1.8 M indirect-dispatch candidates. Query it
|
||||
with `duckdb` — it is not SQLite. `instructions.raw` is an **INT, not hex**.
|
||||
|
||||
### ⚠️ The database is derived, and it can be wrong
|
||||
|
||||
The image is **primary**: those are the bytes the console executed. The database
|
||||
is **somebody's analysis of them**, produced by a disassembler that had to guess,
|
||||
and it is wrong in the ways disassemblers are wrong:
|
||||
|
||||
* **Mnemonics can be misdecoded** — data read as code, or a decoder-table gap,
|
||||
yields a plausible instruction that was never executed as one.
|
||||
* **Function boundaries can be wrong.** `end_address` may be short or long;
|
||||
neighbouring functions may be merged, or one split in two.
|
||||
* **Coverage is incomplete.** Code reached only through indirect dispatch may not
|
||||
appear at all — the 1.8 M `indirect_dispatch_candidates` are *candidates*.
|
||||
* **Names are largely derived, not symbols.** A name is a hypothesis with a label.
|
||||
|
||||
So: **a finding that rests on a database row is not established until the bytes
|
||||
agree.** Read the same address out of the `.pe` and check. Where they disagree,
|
||||
the image wins and the disagreement is itself worth recording — it tells the next
|
||||
reader which parts of the database to distrust.
|
||||
|
||||
Treat it as a fast index into 9.2 MB of machine code, not as a source of truth.
|
||||
|
||||
## The oracle
|
||||
|
||||
|
||||
Reference in New Issue
Block a user