feat(phase-3.5): prototype research spike — go/no-go (protos don't accelerate Gen1 matching)

- extract_proto_exe.py: subdir-aware proto main-EXE extraction (reuses iso9660); extracted
  sep8 SLUS_007.26 (413,696 B) + aug31 MUSASHI/USA_DEMO.EXE (415,744 B, base 0x80018000)
- ghidra_import.sh: reusable headless import; both protos imported into the bfm project
  (sep8 1726 funcs, aug31 1737 funcs, both PsyQ 4.0.0), R9-verified
- DumpFunctionSignatures.java + match_protos.py: 3-tier (exact/norm/seq) cross-binary
  correspondence; MIPS normalizer validated by anchors
- FINDINGS: (T2) no debug symbols in either proto — Hidden Palace "no symbols" VERIFIED;
  recon "Sep-8 less-stripped" REFUTED by per-file byte compare. (T3) Sep-8 99.6% byte-identical
  to retail (only 3 funcs differ: DebugMenuHandler, CdReadSectorReadyCB, SaveLoadRoutine);
  Aug-31 66% norm-identical, 862 1:1 correspondences. (T4) demo shares retail's 18-entry
  game-mode dispatch architecture but the handler code diverged — Q#10 resolved
- VERDICT (docs/proto-correspondence.md): NO-GO as a Gen1 label/symbol accelerator; GO to retain
  Sep-8 (Phase-6 compiler corroborant) + both (Gen2 assets); proto-side labels in
  config/symbols.proto-{sep8,demo}.txt (R13-tagged, never feed symbols.us.txt)
- reorg extracted/ into per-ROM subfolders (extracted/retail/, extracted/proto/); nested
  gitignore allowlist; extractor defaults updated; manifest --verify PASS
- memory-map.md: Phase-3.5 block + demo dispatch anchors; Q#10 RESOLVED; §5 proto notes VERIFIED
- ghidra_mcp_start.sh: PROG arg to serve a prototype
- rules R13 (proto-provenance/confidence tagging), R14 (verify recon counts vs bytes)
- bumps project version 1.3.0 -> 1.3.1
This commit is contained in:
Drew T
2026-06-14 03:19:23 -06:00
parent bd5e21b366
commit 3207d52491
16 changed files with 2449 additions and 18 deletions
+13 -8
View File
@@ -43,15 +43,20 @@ __pycache__/
.vscode/
Thumbs.db
# Asset extraction (Phase 2): commit the tooling + manifest, NOT the bulk
# payloads (deterministically regenerable from the dump; ~hundreds of MB incl.
# FMV). Ignore everything under extracted/ EXCEPT the committed EXE and the
# manifest (hashes are always safe to commit — sotn precedent). This satisfies
# the Phase-2 milestone's "zero ROM-derived files staged".
# Asset/EXE extraction: commit the tooling + manifest + the retail EXE, NOT the
# bulk payloads (deterministically regenerable from the dump; ~hundreds of MB
# incl. FMV) and NOT the prototype EXEs. Per-ROM subfolders under extracted/:
# extracted/retail/ — retail SLUS-00726 disc extraction (3 files committed)
# extracted/proto/ — prototype main EXEs (ROM-derived; fully ignored)
# Nested allowlist: ignore everything under extracted/, re-include only the 3
# retail committed files (EXE + manifest + manifest hash — always safe; sotn
# precedent). This keeps the "zero ROM-derived bulk staged" guarantee.
/extracted/*
!/extracted/SLUS_007.26
!/extracted/manifest.jsonl
!/extracted/manifest.sha1
!/extracted/retail/
/extracted/retail/*
!/extracted/retail/SLUS_007.26
!/extracted/retail/manifest.jsonl
!/extracted/retail/manifest.sha1
# NOTE (H1 relaxed, private phase): asm/ assets/ are intentionally NOT ignored
# — other ROM-derived content stays committable while the repo is private.
+689
View File
@@ -0,0 +1,689 @@
// config/symbols.proto-demo.txt — retail symbol names mapped onto the aug31_USA_DEMO.EXE prototype.
// Phase 3.5: generated by tools/match_protos.py from 1:1 h_norm correspondences (NOT byte-matches).
// PROVENANCE (R13): each name is INHERITED FROM RETAIL via normalized-instruction equality and is
// UNVERIFIED against the proto until independently confirmed. Proto-side navigation aid for
// Phase-6/Gen2 ONLY. These are NOT retail symbols; never merge into config/symbols.us.txt.
// count=682
LzssDecodeSector = 0x80020C20; // func <- retail 0x80018730 (norm-1to1, unverified)
LoaderResetReadState = 0x80021E3C; // func <- retail 0x80019990 (norm-1to1, unverified)
CdReadRequest = 0x80021ED0; // func <- retail 0x80019a24 (norm-1to1, unverified)
ResourceGetCdLoc = 0x80023C4C; // func <- retail 0x8001b788 (norm-1to1, unverified)
SsGetMute = 0x80024244; // func <- retail 0x8001bd80 (norm-1to1, unverified)
CdQueueBusy = 0x8003D030; // func <- retail 0x80034b98 (norm-1to1, unverified)
SPU_OBJ_440 = 0x80042E90; // func <- retail 0x8003a9f8 (norm-1to1, unverified)
_spu_FiDMA = 0x80042EB0; // func <- retail 0x8003aa18 (norm-1to1, unverified)
_spu_Fr_ = 0x80042F70; // func <- retail 0x8003aad8 (norm-1to1, unverified)
_spu_t = 0x8004301C; // func <- retail 0x8003ab84 (norm-1to1, unverified)
SPU_OBJ_7C0 = 0x80043210; // func <- retail 0x8003ad78 (norm-1to1, unverified)
_spu_Fw = 0x800432AC; // func <- retail 0x8003ae14 (norm-1to1, unverified)
_spu_Fr = 0x80043334; // func <- retail 0x8003ae9c (norm-1to1, unverified)
_spu_FsetRXX = 0x8004339C; // func <- retail 0x8003af04 (norm-1to1, unverified)
_spu_FsetRXXa = 0x800433E4; // func <- retail 0x8003af4c (norm-1to1, unverified)
_spu_FgetRXXa = 0x80043488; // func <- retail 0x8003aff0 (norm-1to1, unverified)
_spu_FsetPCR = 0x800434C4; // func <- retail 0x8003b02c (norm-1to1, unverified)
SPU_OBJ_AC4 = 0x80043514; // func <- retail 0x8003b07c (norm-1to1, unverified)
_spu_Fw1ts = 0x8004357C; // func <- retail 0x8003b0e4 (norm-1to1, unverified)
SPU_OBJ_B74 = 0x800435C4; // func <- retail 0x8003b12c (norm-1to1, unverified)
_SpuDataCallback = 0x800435E4; // func <- retail 0x8003b14c (norm-1to1, unverified)
SpuNSetVoiceAttr = 0x800436E8; // func <- retail 0x8003b250 (norm-1to1, unverified)
SpuSetReverb = 0x80043718; // func <- retail 0x8003b280 (norm-1to1, unverified)
S_SR_OBJ_B0 = 0x800437C8; // func <- retail 0x8003b330 (norm-1to1, unverified)
S_SR_OBJ_B4 = 0x800437CC; // func <- retail 0x8003b334 (norm-1to1, unverified)
_SpuIsInAllocateArea = 0x800437E8; // func <- retail 0x8003b350 (norm-1to1, unverified)
_SpuIsInAllocateArea_ = 0x80043868; // func <- retail 0x8003b3d0 (norm-1to1, unverified)
S_SRMP_OBJ_170 = 0x80043A64; // func <- retail 0x8003b5cc (norm-1to1, unverified)
S_SRMP_OBJ_334 = 0x80043C28; // func <- retail 0x8003b790 (norm-1to1, unverified)
S_SRMP_OBJ_420 = 0x80043D14; // func <- retail 0x8003b87c (norm-1to1, unverified)
S_SRMP_OBJ_444 = 0x80043D38; // func <- retail 0x8003b8a0 (norm-1to1, unverified)
S_SRMP_OBJ_4C4 = 0x80043DB8; // func <- retail 0x8003b920 (norm-1to1, unverified)
_spu_setReverbAttr = 0x80043DEC; // func <- retail 0x8003b954 (norm-1to1, unverified)
SpuReserveReverbWorkArea = 0x800442BC; // func <- retail 0x8003be24 (norm-1to1, unverified)
SpuSetReverbVoice = 0x8004430C; // func <- retail 0x8003be74 (norm-1to1, unverified)
S_SAV_OBJ_114 = 0x80044444; // func <- retail 0x8003bfac (norm-1to1, unverified)
S_SAV_OBJ_1E8 = 0x80044518; // func <- retail 0x8003c080 (norm-1to1, unverified)
S_SAV_OBJ_1F8 = 0x80044528; // func <- retail 0x8003c090 (norm-1to1, unverified)
S_CRWA_OBJ_9C = 0x800445D4; // func <- retail 0x8003c13c (norm-1to1, unverified)
S_CRWA_OBJ_174 = 0x800446AC; // func <- retail 0x8003c214 (norm-1to1, unverified)
SpuRead = 0x800448D0; // func <- retail 0x8003c438 (norm-1to1, unverified)
SpuSetTransferStartAddr = 0x80044930; // func <- retail 0x8003c498 (norm-1to1, unverified)
SpuIsTransferCompleted = 0x80044988; // func <- retail 0x8003c4f0 (norm-1to1, unverified)
SpuSetCommonAttr = 0x80044A30; // func <- retail 0x8003c598 (norm-1to1, unverified)
S_SCA_OBJ_94 = 0x80044AC4; // func <- retail 0x8003c62c (norm-1to1, unverified)
S_SCA_OBJ_9C = 0x80044ACC; // func <- retail 0x8003c634 (norm-1to1, unverified)
S_SCA_OBJ_CC = 0x80044AFC; // func <- retail 0x8003c664 (norm-1to1, unverified)
S_SCA_OBJ_15C = 0x80044B8C; // func <- retail 0x8003c6f4 (norm-1to1, unverified)
S_SCA_OBJ_164 = 0x80044B94; // func <- retail 0x8003c6fc (norm-1to1, unverified)
S_SCA_OBJ_194 = 0x80044BC4; // func <- retail 0x8003c72c (norm-1to1, unverified)
S_SCA_OBJ_288 = 0x80044CB8; // func <- retail 0x8003c820 (norm-1to1, unverified)
S_SCA_OBJ_2DC = 0x80044D0C; // func <- retail 0x8003c874 (norm-1to1, unverified)
S_SCA_OBJ_330 = 0x80044D60; // func <- retail 0x8003c8c8 (norm-1to1, unverified)
S_SCA_OBJ_384 = 0x80044DB4; // func <- retail 0x8003c91c (norm-1to1, unverified)
_SpuRSetVoiceAttr = 0x80044DC4; // func <- retail 0x8003c92c (norm-1to1, unverified)
SR_SV_OBJ_224 = 0x80044FE8; // func <- retail 0x8003cb50 (norm-1to1, unverified)
SR_SV_OBJ_22C = 0x80044FF0; // func <- retail 0x8003cb58 (norm-1to1, unverified)
SR_SV_OBJ_25C = 0x80045020; // func <- retail 0x8003cb88 (norm-1to1, unverified)
SR_SV_OBJ_2F4 = 0x800450B8; // func <- retail 0x8003cc20 (norm-1to1, unverified)
SR_SV_OBJ_2FC = 0x800450C0; // func <- retail 0x8003cc28 (norm-1to1, unverified)
SR_SV_OBJ_32C = 0x800450F0; // func <- retail 0x8003cc58 (norm-1to1, unverified)
SR_SV_OBJ_3C0 = 0x80045184; // func <- retail 0x8003ccec (norm-1to1, unverified)
SR_SV_OBJ_514 = 0x800452D8; // func <- retail 0x8003ce40 (norm-1to1, unverified)
SR_SV_OBJ_598 = 0x8004535C; // func <- retail 0x8003cec4 (norm-1to1, unverified)
SR_SV_OBJ_608 = 0x800453CC; // func <- retail 0x8003cf34 (norm-1to1, unverified)
_spu_2pitch = 0x80045400; // func <- retail 0x8003cf68 (norm-1to1, unverified)
_spu_note2pitch = 0x80045490; // func <- retail 0x8003cff8 (norm-1to1, unverified)
S_N2P_OBJ_11C = 0x8004551C; // func <- retail 0x8003d084 (norm-1to1, unverified)
_spu_pitch2note = 0x800455CC; // func <- retail 0x8003d134 (norm-1to1, unverified)
S_N2P_OBJ_208 = 0x80045608; // func <- retail 0x8003d170 (norm-1to1, unverified)
SpuRGetAllKeysStatus = 0x800456F4; // func <- retail 0x8003d25c (norm-1to1, unverified)
SR_GAKS_OBJ_B4 = 0x800457A8; // func <- retail 0x8003d310 (norm-1to1, unverified)
SpuGetAllKeysStatus = 0x800457C4; // func <- retail 0x8003d32c (norm-1to1, unverified)
SR_GAKS_OBJ_140 = 0x80045834; // func <- retail 0x8003d39c (norm-1to1, unverified)
SpuSetVoiceRR = 0x8004584C; // func <- retail 0x8003d3b4 (norm-1to1, unverified)
SsEnd = 0x800458EC; // func <- retail 0x8003d454 (norm-1to1, unverified)
SSEND_OBJ_A0 = 0x8004598C; // func <- retail 0x8003d4f4 (norm-1to1, unverified)
SsSetSerialAttr = 0x80045AE8; // func <- retail 0x8003d650 (norm-1to1, unverified)
SsStart = 0x80045DE4; // func <- retail 0x8003d94c (norm-1to1, unverified)
_SsTrapIntrVSync = 0x80045E24; // func <- retail 0x8003d98c (norm-1to1, unverified)
_SsSeqCalledTbyT_1per2 = 0x80045E64; // func <- retail 0x8003d9cc (norm-1to1, unverified)
_SsSndPlay = 0x8004677C; // func <- retail 0x8003e2e4 (norm-1to1, unverified)
_SsSeqPlay = 0x800467A8; // func <- retail 0x8003e310 (norm-1to1, unverified)
MIDIREAD_OBJ_E4 = 0x8004688C; // func <- retail 0x8003e3f4 (norm-1to1, unverified)
MIDIREAD_OBJ_E8 = 0x80046890; // func <- retail 0x8003e3f8 (norm-1to1, unverified)
MIDIREAD_OBJ_20C = 0x800469B4; // func <- retail 0x8003e51c (norm-1to1, unverified)
MIDIREAD_OBJ_2DC = 0x80046A84; // func <- retail 0x8003e5ec (norm-1to1, unverified)
MIDIREAD_OBJ_600 = 0x80046DA8; // func <- retail 0x8003e910 (norm-1to1, unverified)
MIDIREAD_OBJ_65C = 0x80046E04; // func <- retail 0x8003e96c (norm-1to1, unverified)
MIDIREAD_OBJ_6AC = 0x80046E54; // func <- retail 0x8003e9bc (norm-1to1, unverified)
MIDIREAD_OBJ_6BC = 0x80046E64; // func <- retail 0x8003e9cc (norm-1to1, unverified)
MIDIREAD_OBJ_6C0 = 0x80046E68; // func <- retail 0x8003e9d0 (norm-1to1, unverified)
MIDIREAD_OBJ_6CC = 0x80046E74; // func <- retail 0x8003e9dc (norm-1to1, unverified)
_SsReadDeltaValue = 0x80046E9C; // func <- retail 0x8003ea04 (norm-1to1, unverified)
SsSetSerialVol = 0x80047280; // func <- retail 0x8003ede8 (norm-1to1, unverified)
TEMPO_OBJ_128 = 0x800474A4; // func <- retail 0x8003f00c (norm-1to1, unverified)
TEMPO_OBJ_208 = 0x80047584; // func <- retail 0x8003f0ec (norm-1to1, unverified)
SsGetCurrentPoint = 0x8004759C; // func <- retail 0x8003f104 (norm-1to1, unverified)
SsUtGetVagAtr = 0x800475DC; // func <- retail 0x8003f144 (norm-1to1, unverified)
SsUtGetVagAddr = 0x80047818; // func <- retail 0x8003f380 (norm-1to1, unverified)
SsUtKeyOnV = 0x800478CC; // func <- retail 0x8003f434 (norm-1to1, unverified)
UT_KEYV_OBJ_174 = 0x80047A40; // func <- retail 0x8003f5a8 (norm-1to1, unverified)
UT_KEYV_OBJ_180 = 0x80047A4C; // func <- retail 0x8003f5b4 (norm-1to1, unverified)
UT_KEYV_OBJ_350 = 0x80047C1C; // func <- retail 0x8003f784 (norm-1to1, unverified)
UT_KEYV_OBJ_360 = 0x80047C2C; // func <- retail 0x8003f794 (norm-1to1, unverified)
SsUtKeyOffV = 0x80047C60; // func <- retail 0x8003f7c8 (norm-1to1, unverified)
SpuSetNoiseVoice = 0x800482B0; // func <- retail 0x8003fe18 (norm-1to1, unverified)
VM_INIT_OBJ_E4 = 0x800483B8; // func <- retail 0x8003ff20 (norm-1to1, unverified)
SpuInitMalloc = 0x800485E4; // func <- retail 0x8004014c (norm-1to1, unverified)
note2pitch = 0x8004867C; // func <- retail 0x800401e4 (norm-1to1, unverified)
note2pitch2 = 0x80048740; // func <- retail 0x800402a8 (norm-1to1, unverified)
vmNoiseOn = 0x8004883C; // func <- retail 0x800403a4 (norm-1to1, unverified)
VM_NO1_OBJ_184 = 0x800489C0; // func <- retail 0x80040528 (norm-1to1, unverified)
VM_NO1_OBJ_1F4 = 0x80048A30; // func <- retail 0x80040598 (norm-1to1, unverified)
VM_NO1_OBJ_28C = 0x80048AC8; // func <- retail 0x80040630 (norm-1to1, unverified)
VM_NO1_OBJ_31C = 0x80048B58; // func <- retail 0x800406c0 (norm-1to1, unverified)
VM_NO1_OBJ_4A4 = 0x80048CE0; // func <- retail 0x80040848 (norm-1to1, unverified)
_SsVmKeyOffNow = 0x80048D00; // func <- retail 0x80040868 (norm-1to1, unverified)
VM_NOWOF_OBJ_38 = 0x80048D38; // func <- retail 0x800408a0 (norm-1to1, unverified)
_SsVmKeyOnNow = 0x80048DD0; // func <- retail 0x80040938 (norm-1to1, unverified)
VM_NOWON_OBJ_3D4 = 0x800491A4; // func <- retail 0x80040d0c (norm-1to1, unverified)
VM_NOWON_OBJ_44C = 0x8004921C; // func <- retail 0x80040d84 (norm-1to1, unverified)
_SsVmVSetUp = 0x8004997C; // func <- retail 0x800414e4 (norm-1to1, unverified)
SsVabClose = 0x80049A40; // func <- retail 0x800415a8 (norm-1to1, unverified)
SpuFree = 0x80049AC4; // func <- retail 0x8004162c (norm-1to1, unverified)
S_M_F_OBJ_64 = 0x80049B28; // func <- retail 0x80041690 (norm-1to1, unverified)
_spu_gcSPU = 0x80049B40; // func <- retail 0x800416a8 (norm-1to1, unverified)
S_M_INT_OBJ_50 = 0x80049B90; // func <- retail 0x800416f8 (norm-1to1, unverified)
S_M_INT_OBJ_C0 = 0x80049C00; // func <- retail 0x80041768 (norm-1to1, unverified)
S_M_INT_OBJ_278 = 0x80049DB8; // func <- retail 0x80041920 (norm-1to1, unverified)
SsVabFakeBody = 0x80049E48; // func <- retail 0x800419b0 (norm-1to1, unverified)
SsVabOpenHead = 0x80049EB8; // func <- retail 0x80041a20 (norm-1to1, unverified)
SsVabOpenHeadWithMode = 0x80049F48; // func <- retail 0x80041ab0 (norm-1to1, unverified)
VS_VH_OBJ_180 = 0x8004A038; // func <- retail 0x80041ba0 (norm-1to1, unverified)
VS_VH_OBJ_190 = 0x8004A048; // func <- retail 0x80041bb0 (norm-1to1, unverified)
VS_VH_OBJ_350 = 0x8004A208; // func <- retail 0x80041d70 (norm-1to1, unverified)
VS_VH_OBJ_364 = 0x8004A21C; // func <- retail 0x80041d84 (norm-1to1, unverified)
VS_VH_OBJ_40C = 0x8004A2C4; // func <- retail 0x80041e2c (norm-1to1, unverified)
VS_VH_OBJ_444 = 0x8004A2FC; // func <- retail 0x80041e64 (norm-1to1, unverified)
SpuMalloc = 0x8004A324; // func <- retail 0x80041e8c (norm-1to1, unverified)
S_M_M_OBJ_54 = 0x8004A378; // func <- retail 0x80041ee0 (norm-1to1, unverified)
S_M_M_OBJ_12C = 0x8004A450; // func <- retail 0x80041fb8 (norm-1to1, unverified)
SsVabTransBodyPartly = 0x8004A5EC; // func <- retail 0x80042154 (norm-1to1, unverified)
SpuSetTransferMode = 0x8004A74C; // func <- retail 0x800422b4 (norm-1to1, unverified)
S_STM_OBJ_1C = 0x8004A768; // func <- retail 0x800422d0 (norm-1to1, unverified)
SpuWritePartly = 0x8004A780; // func <- retail 0x800422e8 (norm-1to1, unverified)
SsVabTransCompleted = 0x8004A80C; // func <- retail 0x80042374 (norm-1to1, unverified)
VSync = 0x8004A834; // func <- retail 0x8004239c (norm-1to1, unverified)
VSYNC_OBJ_84 = 0x8004A8B8; // func <- retail 0x80042420 (norm-1to1, unverified)
ResetCallback = 0x8004AA18; // func <- retail 0x80042580 (norm-1to1, unverified)
InterruptCallback = 0x8004AA48; // func <- retail 0x800425b0 (norm-1to1, unverified)
VSyncCallback = 0x8004AAA8; // func <- retail 0x80042610 (norm-1to1, unverified)
StopCallback = 0x8004AB0C; // func <- retail 0x80042674 (norm-1to1, unverified)
RestartCallback = 0x8004AB3C; // func <- retail 0x800426a4 (norm-1to1, unverified)
CheckCallback = 0x8004AB6C; // func <- retail 0x800426d4 (norm-1to1, unverified)
GetIntrMask = 0x8004AB7C; // func <- retail 0x800426e4 (norm-1to1, unverified)
SetIntrMask = 0x8004AB94; // func <- retail 0x800426fc (norm-1to1, unverified)
INTR_OBJ_428 = 0x8004AE40; // func <- retail 0x800429a8 (norm-1to1, unverified)
INTR_OBJ_514 = 0x8004AF2C; // func <- retail 0x80042a94 (norm-1to1, unverified)
INTR_DMA_OBJ_274 = 0x8004B4C4; // func <- retail 0x8004302c (norm-1to1, unverified)
StSetRing = 0x8004B520; // func <- retail 0x80043088 (norm-1to1, unverified)
CdGetToc = 0x8004B550; // func <- retail 0x800430b8 (norm-1to1, unverified)
def_cbsync = 0x8004B830; // func <- retail 0x80043398 (norm-1to1, unverified)
CdReset = 0x8004B8E8; // func <- retail 0x80043450 (norm-1to1, unverified)
CdMix = 0x8004BE0C; // func <- retail 0x80043974 (norm-1to1, unverified)
CdIntToPos = 0x8004BEB0; // func <- retail 0x80043a18 (norm-1to1, unverified)
CdPosToInt = 0x8004BFB4; // func <- retail 0x80043b1c (norm-1to1, unverified)
getintr = 0x8004C034; // func <- retail 0x80043b9c (norm-1to1, unverified)
BIOS_OBJ_570 = 0x8004C5A4; // func <- retail 0x8004410c (norm-1to1, unverified)
BIOS_OBJ_6B4 = 0x8004C6E8; // func <- retail 0x80044250 (norm-1to1, unverified)
BIOS_OBJ_7DC = 0x8004C810; // func <- retail 0x80044378 (norm-1to1, unverified)
BIOS_OBJ_93C = 0x8004C970; // func <- retail 0x800444d8 (norm-1to1, unverified)
BIOS_OBJ_AA4 = 0x8004CAD8; // func <- retail 0x80044640 (norm-1to1, unverified)
BIOS_OBJ_DAC = 0x8004CDE0; // func <- retail 0x80044948 (norm-1to1, unverified)
BIOS_OBJ_EC8 = 0x8004CEFC; // func <- retail 0x80044a64 (norm-1to1, unverified)
CD_vol = 0x8004CF24; // func <- retail 0x80044a8c (norm-1to1, unverified)
CD_initvol = 0x8004D08C; // func <- retail 0x80044bf4 (norm-1to1, unverified)
BIOS_OBJ_14A4 = 0x8004D4D8; // func <- retail 0x80045040 (norm-1to1, unverified)
CD_getsector = 0x8004D528; // func <- retail 0x80045090 (norm-1to1, unverified)
CD_getsector2 = 0x8004D628; // func <- retail 0x80045190 (norm-1to1, unverified)
CdSearchFile = 0x8004D80C; // func <- retail 0x80045374 (norm-1to1, unverified)
_cmp = 0x8004DAD8; // func <- retail 0x80045640 (norm-1to1, unverified)
ISO9660_OBJ_7F4 = 0x8004E000; // func <- retail 0x80045b68 (norm-1to1, unverified)
ISO9660_OBJ_8F4 = 0x8004E100; // func <- retail 0x80045c68 (norm-1to1, unverified)
cd_read = 0x8004E12C; // func <- retail 0x80045c94 (norm-1to1, unverified)
CDREAD_OBJ_1A4 = 0x8004E33C; // func <- retail 0x80045ea4 (norm-1to1, unverified)
cb_data = 0x8004E468; // func <- retail 0x80045fd0 (norm-1to1, unverified)
CDREAD_OBJ_5C0 = 0x8004E758; // func <- retail 0x800462c0 (norm-1to1, unverified)
CdRead = 0x8004E814; // func <- retail 0x8004637c (norm-1to1, unverified)
CDREAD_OBJ_810 = 0x8004E9A8; // func <- retail 0x80046510 (norm-1to1, unverified)
CdRead2 = 0x8004EA14; // func <- retail 0x8004657c (norm-1to1, unverified)
CdDiskReady = 0x8004EAC8; // func <- retail 0x80046630 (norm-1to1, unverified)
TYPE_OBJ_104 = 0x8004EBCC; // func <- retail 0x80046734 (norm-1to1, unverified)
CdGetDiskType = 0x8004EBE4; // func <- retail 0x8004674c (norm-1to1, unverified)
TYPE_OBJ_254 = 0x8004ED1C; // func <- retail 0x80046884 (norm-1to1, unverified)
StClearRing = 0x8004ED34; // func <- retail 0x8004689c (norm-1to1, unverified)
StSetStream = 0x8004EF54; // func <- retail 0x80046abc (norm-1to1, unverified)
StFreeRing = 0x8004EFDC; // func <- retail 0x80046b44 (norm-1to1, unverified)
C_007_OBJ_AC = 0x8004F088; // func <- retail 0x80046bf0 (norm-1to1, unverified)
init_ring_status = 0x8004F094; // func <- retail 0x80046bfc (norm-1to1, unverified)
StGetNext = 0x8004F0D0; // func <- retail 0x80046c38 (norm-1to1, unverified)
StCdInterrupt = 0x8004F1B4; // func <- retail 0x80046d1c (norm-1to1, unverified)
C_011_OBJ_270 = 0x8004F424; // func <- retail 0x80046f8c (norm-1to1, unverified)
C_011_OBJ_3D0 = 0x8004F584; // func <- retail 0x800470ec (norm-1to1, unverified)
C_011_OBJ_7BC = 0x8004F970; // func <- retail 0x800474d8 (norm-1to1, unverified)
C_011_OBJ_85C = 0x8004FA10; // func <- retail 0x80047578 (norm-1to1, unverified)
C_011_OBJ_900 = 0x8004FAB4; // func <- retail 0x8004761c (norm-1to1, unverified)
C_011_OBJ_960 = 0x8004FB14; // func <- retail 0x8004767c (norm-1to1, unverified)
mem2mem = 0x8004FB24; // func <- retail 0x8004768c (norm-1to1, unverified)
dma_execute = 0x8004FB58; // func <- retail 0x800476c0 (norm-1to1, unverified)
C_011_OBJ_A30 = 0x8004FBE4; // func <- retail 0x8004774c (norm-1to1, unverified)
C_011_OBJ_A90 = 0x8004FC44; // func <- retail 0x800477ac (norm-1to1, unverified)
rsin = 0x8004FD14; // func <- retail 0x8004787c (norm-1to1, unverified)
sin_1 = 0x8004FD50; // func <- retail 0x800478b8 (norm-1to1, unverified)
rcos = 0x8004FDE0; // func <- retail 0x80047948 (norm-1to1, unverified)
csqrt_1 = 0x8004FE80; // func <- retail 0x800479e8 (norm-1to1, unverified)
COR_05_OBJ_130 = 0x8004FFB0; // func <- retail 0x80047b18 (norm-1to1, unverified)
COR_05_OBJ_134 = 0x8004FFB4; // func <- retail 0x80047b1c (norm-1to1, unverified)
csqrt = 0x8004FFD4; // func <- retail 0x80047b3c (norm-1to1, unverified)
COR_05_OBJ_1AC = 0x8005002C; // func <- retail 0x80047b94 (norm-1to1, unverified)
COR_06_OBJ_A4 = 0x80050114; // func <- retail 0x80047c7c (norm-1to1, unverified)
InitGeom = 0x8005014C; // func <- retail 0x80047cb4 (norm-1to1, unverified)
SquareRoot0 = 0x800501D4; // func <- retail 0x80047d3c (norm-1to1, unverified)
InvSquareRoot = 0x80050264; // func <- retail 0x80047dcc (norm-1to1, unverified)
VectorNormalS = 0x800502F0; // func <- retail 0x80047e58 (norm-1to1, unverified)
VectorNormal = 0x80050304; // func <- retail 0x80047e6c (norm-1to1, unverified)
VectorNormalSS = 0x80050330; // func <- retail 0x80047e98 (norm-1to1, unverified)
MSC02_OBJ_FC = 0x80050360; // func <- retail 0x80047ec8 (norm-1to1, unverified)
MatrixNormal = 0x8005041C; // func <- retail 0x80047f84 (norm-1to1, unverified)
gteMIMefunc = 0x80050504; // func <- retail 0x8004806c (norm-1to1, unverified)
SquareRoot12 = 0x80050584; // func <- retail 0x800480ec (norm-1to1, unverified)
MulMatrix0 = 0x80050624; // func <- retail 0x8004818c (norm-1to1, unverified)
MulRotMatrix = 0x80050734; // func <- retail 0x8004829c (norm-1to1, unverified)
CompMatrix = 0x80050824; // func <- retail 0x8004838c (norm-1to1, unverified)
ApplyMatrixLV = 0x80050984; // func <- retail 0x800484ec (norm-1to1, unverified)
ApplyRotMatrix = 0x80050AE4; // func <- retail 0x8004864c (norm-1to1, unverified)
ReadRotMatrix = 0x80050C54; // func <- retail 0x800487bc (norm-1to1, unverified)
SetMulMatrix = 0x80050CA4; // func <- retail 0x8004880c (norm-1to1, unverified)
CompMatrixLV = 0x80050DB4; // func <- retail 0x8004891c (norm-1to1, unverified)
ApplyRotMatrixLV = 0x80051004; // func <- retail 0x80048b6c (norm-1to1, unverified)
SetMulRotMatrix = 0x80051144; // func <- retail 0x80048cac (norm-1to1, unverified)
MulMatrix = 0x80051234; // func <- retail 0x80048d9c (norm-1to1, unverified)
MulMatrix2 = 0x80051344; // func <- retail 0x80048eac (norm-1to1, unverified)
ApplyMatrixSV = 0x80051454; // func <- retail 0x80048fbc (norm-1to1, unverified)
ScaleMatrix = 0x800514B4; // func <- retail 0x8004901c (norm-1to1, unverified)
SetRotMatrix = 0x800515E4; // func <- retail 0x8004914c (norm-1to1, unverified)
SetLightMatrix = 0x80051614; // func <- retail 0x8004917c (norm-1to1, unverified)
SetTransMatrix = 0x80051644; // func <- retail 0x800491ac (norm-1to1, unverified)
ReadGeomOffset = 0x80051664; // func <- retail 0x800491cc (norm-1to1, unverified)
SetBackColor = 0x80051694; // func <- retail 0x800491fc (norm-1to1, unverified)
LightColor = 0x800516E4; // func <- retail 0x8004924c (norm-1to1, unverified)
DpqColorLight = 0x8005170C; // func <- retail 0x80049274 (norm-1to1, unverified)
DpqColor3 = 0x80051734; // func <- retail 0x8004929c (norm-1to1, unverified)
Intpl = 0x80051770; // func <- retail 0x800492d8 (norm-1to1, unverified)
Square12 = 0x80051794; // func <- retail 0x800492fc (norm-1to1, unverified)
Square0 = 0x800517BC; // func <- retail 0x80049324 (norm-1to1, unverified)
AverageZ3 = 0x800517E4; // func <- retail 0x8004934c (norm-1to1, unverified)
AverageZ4 = 0x80051804; // func <- retail 0x8004936c (norm-1to1, unverified)
OuterProduct12 = 0x80051828; // func <- retail 0x80049390 (norm-1to1, unverified)
OuterProduct0 = 0x80051880; // func <- retail 0x800493e8 (norm-1to1, unverified)
Lzc = 0x800518D8; // func <- retail 0x80049440 (norm-1to1, unverified)
RotTransSV = 0x800518F4; // func <- retail 0x8004945c (norm-1to1, unverified)
SquareSS12 = 0x80051924; // func <- retail 0x8004948c (norm-1to1, unverified)
SquareSS0 = 0x8005195C; // func <- retail 0x800494c4 (norm-1to1, unverified)
SquareSL12 = 0x80051994; // func <- retail 0x800494fc (norm-1to1, unverified)
SquareSL0 = 0x800519C4; // func <- retail 0x8004952c (norm-1to1, unverified)
RotTransPers = 0x800519F4; // func <- retail 0x8004955c (norm-1to1, unverified)
RotTransPers3 = 0x80051A24; // func <- retail 0x8004958c (norm-1to1, unverified)
RotTransPers4 = 0x80051AB4; // func <- retail 0x8004961c (norm-1to1, unverified)
RotNclip4 = 0x80051B34; // func <- retail 0x8004969c (norm-1to1, unverified)
TransposeMatrix = 0x80051BE4; // func <- retail 0x8004974c (norm-1to1, unverified)
RotMatrix = 0x80051C24; // func <- retail 0x8004978c (norm-1to1, unverified)
FGO_01_OBJ_64 = 0x80051C88; // func <- retail 0x800497f0 (norm-1to1, unverified)
FGO_01_OBJ_CC = 0x80051CF0; // func <- retail 0x80049858 (norm-1to1, unverified)
FGO_01_OBJ_160 = 0x80051D84; // func <- retail 0x800498ec (norm-1to1, unverified)
RotMatrixYXZ = 0x80051EB4; // func <- retail 0x80049a1c (norm-1to1, unverified)
FGO_02_OBJ_68 = 0x80051F1C; // func <- retail 0x80049a84 (norm-1to1, unverified)
FGO_02_OBJ_CC = 0x80051F80; // func <- retail 0x80049ae8 (norm-1to1, unverified)
FGO_02_OBJ_160 = 0x80052014; // func <- retail 0x80049b7c (norm-1to1, unverified)
RotMatrixZYX = 0x80052144; // func <- retail 0x80049cac (norm-1to1, unverified)
FGO_03_OBJ_64 = 0x800521A8; // func <- retail 0x80049d10 (norm-1to1, unverified)
FGO_03_OBJ_CC = 0x80052210; // func <- retail 0x80049d78 (norm-1to1, unverified)
FGO_03_OBJ_160 = 0x800522A4; // func <- retail 0x80049e0c (norm-1to1, unverified)
FGO_04_OBJ_64 = 0x80052438; // func <- retail 0x80049fa0 (norm-1to1, unverified)
RotMatrixY = 0x80052574; // func <- retail 0x8004a0dc (norm-1to1, unverified)
FGO_05_OBJ_64 = 0x800525D8; // func <- retail 0x8004a140 (norm-1to1, unverified)
FGO_06_OBJ_64 = 0x80052778; // func <- retail 0x8004a2e0 (norm-1to1, unverified)
GsPrstNF3 = 0x800528B4; // func <- retail 0x8004a41c (norm-1to1, unverified)
GsPrstF3NL = 0x800529D4; // func <- retail 0x8004a53c (norm-1to1, unverified)
GsPrstF3L = 0x80052AF8; // func <- retail 0x8004a660 (norm-1to1, unverified)
GsPrstF3LFG = 0x80052C2C; // func <- retail 0x8004a794 (norm-1to1, unverified)
GsPrstNF4 = 0x80052D64; // func <- retail 0x8004a8cc (norm-1to1, unverified)
GsPrstF4NL = 0x80052EB0; // func <- retail 0x8004aa18 (norm-1to1, unverified)
GsPrstF4L = 0x80053000; // func <- retail 0x8004ab68 (norm-1to1, unverified)
GsPrstF4LFG = 0x80053164; // func <- retail 0x8004accc (norm-1to1, unverified)
GsPrstNG3 = 0x800532D4; // func <- retail 0x8004ae3c (norm-1to1, unverified)
GsPrstG3NL = 0x800533F4; // func <- retail 0x8004af5c (norm-1to1, unverified)
GsPrstG3L = 0x80053510; // func <- retail 0x8004b078 (norm-1to1, unverified)
GsPrstG3LFG = 0x80053690; // func <- retail 0x8004b1f8 (norm-1to1, unverified)
GsPrstNG4 = 0x80053814; // func <- retail 0x8004b37c (norm-1to1, unverified)
GsPrstG4NL = 0x80053960; // func <- retail 0x8004b4c8 (norm-1to1, unverified)
GsPrstG4L = 0x80053AAC; // func <- retail 0x8004b614 (norm-1to1, unverified)
GsPrstG4LFG = 0x80053C78; // func <- retail 0x8004b7e0 (norm-1to1, unverified)
GsPrstTNF3 = 0x80053E44; // func <- retail 0x8004b9ac (norm-1to1, unverified)
GsPrstTF3NL = 0x80053F64; // func <- retail 0x8004bacc (norm-1to1, unverified)
GsPrstTF3L = 0x80054088; // func <- retail 0x8004bbf0 (norm-1to1, unverified)
GsPrstTF3LFG = 0x800541D0; // func <- retail 0x8004bd38 (norm-1to1, unverified)
GsPrstTNF4 = 0x80054324; // func <- retail 0x8004be8c (norm-1to1, unverified)
GsPrstTF4NL = 0x80054470; // func <- retail 0x8004bfd8 (norm-1to1, unverified)
GsPrstTF4L = 0x800545C0; // func <- retail 0x8004c128 (norm-1to1, unverified)
GsPrstTF4LFG = 0x80054738; // func <- retail 0x8004c2a0 (norm-1to1, unverified)
GsPrstTNG3 = 0x800548B4; // func <- retail 0x8004c41c (norm-1to1, unverified)
GsPrstTG3NL = 0x800549D4; // func <- retail 0x8004c53c (norm-1to1, unverified)
GsPrstTG3L = 0x80054AF0; // func <- retail 0x8004c658 (norm-1to1, unverified)
GsPrstTG3LFG = 0x80054C84; // func <- retail 0x8004c7ec (norm-1to1, unverified)
GsPrstTNG4 = 0x80054E24; // func <- retail 0x8004c98c (norm-1to1, unverified)
GsPrstTG4NL = 0x80054F70; // func <- retail 0x8004cad8 (norm-1to1, unverified)
GsPrstTG4L = 0x800550BC; // func <- retail 0x8004cc24 (norm-1to1, unverified)
GsPrstTG4LFG = 0x8005529C; // func <- retail 0x8004ce04 (norm-1to1, unverified)
ratan2 = 0x80055484; // func <- retail 0x8004cfec (norm-1to1, unverified)
RATAN_OBJ_BC = 0x80055540; // func <- retail 0x8004d0a8 (norm-1to1, unverified)
RATAN_OBJ_148 = 0x800555CC; // func <- retail 0x8004d134 (norm-1to1, unverified)
RATAN_OBJ_15C = 0x800555E0; // func <- retail 0x8004d148 (norm-1to1, unverified)
TransRot_32 = 0x800556A4; // func <- retail 0x8004d20c (norm-1to1, unverified)
TransRotPers = 0x80055844; // func <- retail 0x8004d3ac (norm-1to1, unverified)
TransRotPers3 = 0x800558B8; // func <- retail 0x8004d420 (norm-1to1, unverified)
ApplyTransposeMatrixLV = 0x8005599C; // func <- retail 0x8004d504 (norm-1to1, unverified)
GsTMDfastNF3 = 0x80055B54; // func <- retail 0x8004d6bc (norm-1to1, unverified)
GsTMDfastF3NL = 0x80055C90; // func <- retail 0x8004d7f8 (norm-1to1, unverified)
GsTMDfastF3L = 0x80055DD0; // func <- retail 0x8004d938 (norm-1to1, unverified)
GsTMDfastF3LFG = 0x80055F18; // func <- retail 0x8004da80 (norm-1to1, unverified)
GsTMDfastNF4 = 0x80056064; // func <- retail 0x8004dbcc (norm-1to1, unverified)
GsTMDfastF4NL = 0x800561CC; // func <- retail 0x8004dd34 (norm-1to1, unverified)
GsTMDfastF4L = 0x80056338; // func <- retail 0x8004dea0 (norm-1to1, unverified)
GsTMDfastF4LFG = 0x800564B0; // func <- retail 0x8004e018 (norm-1to1, unverified)
GsTMDfastNG3 = 0x80056634; // func <- retail 0x8004e19c (norm-1to1, unverified)
GsTMDfastG3NL = 0x8005677C; // func <- retail 0x8004e2e4 (norm-1to1, unverified)
GsTMDfastG3L = 0x800568BC; // func <- retail 0x8004e424 (norm-1to1, unverified)
GsTMDfastG3LFG = 0x80056A4C; // func <- retail 0x8004e5b4 (norm-1to1, unverified)
GsTMDfastNG4 = 0x80056BE4; // func <- retail 0x8004e74c (norm-1to1, unverified)
GsTMDfastG4NL = 0x80056D64; // func <- retail 0x8004e8cc (norm-1to1, unverified)
GsTMDfastG4L = 0x80056ED8; // func <- retail 0x8004ea40 (norm-1to1, unverified)
GsTMDfastG4LFG = 0x800570B8; // func <- retail 0x8004ec20 (norm-1to1, unverified)
GsTMDfastTNF3 = 0x800572A4; // func <- retail 0x8004ee0c (norm-1to1, unverified)
GsTMDfastTF3NL = 0x80057410; // func <- retail 0x8004ef78 (norm-1to1, unverified)
GsTMDfastTF3L = 0x80057574; // func <- retail 0x8004f0dc (norm-1to1, unverified)
GsTMDfastTF3LFG = 0x800576E4; // func <- retail 0x8004f24c (norm-1to1, unverified)
GsTMDfastTNF4 = 0x80057854; // func <- retail 0x8004f3bc (norm-1to1, unverified)
GsTMDfastTF4NL = 0x800579F4; // func <- retail 0x8004f55c (norm-1to1, unverified)
GsTMDfastTF4L = 0x80057B90; // func <- retail 0x8004f6f8 (norm-1to1, unverified)
GsTMDfastTF4LFG = 0x80057D3C; // func <- retail 0x8004f8a4 (norm-1to1, unverified)
GsTMDfastTNG3 = 0x80057EF4; // func <- retail 0x8004fa5c (norm-1to1, unverified)
GsTMDfastTG3NL = 0x8005806C; // func <- retail 0x8004fbd4 (norm-1to1, unverified)
GsTMDfastTG3L = 0x800581C8; // func <- retail 0x8004fd30 (norm-1to1, unverified)
GsTMDfastTG3LFG = 0x8005837C; // func <- retail 0x8004fee4 (norm-1to1, unverified)
GsTMDfastTNG4 = 0x80058534; // func <- retail 0x8005009c (norm-1to1, unverified)
GsTMDfastTG4NL = 0x800586F0; // func <- retail 0x80050258 (norm-1to1, unverified)
GsTMDfastTG4L = 0x80058888; // func <- retail 0x800503f0 (norm-1to1, unverified)
GsTMDfastTG4LFG = 0x80058A94; // func <- retail 0x800505fc (norm-1to1, unverified)
2D_BG0_OBJ_1B4 = 0x80058E58; // func <- retail 0x800509c0 (norm-1to1, unverified)
2D_BG0_OBJ_4A0 = 0x80059144; // func <- retail 0x80050cac (norm-1to1, unverified)
2D_BG0_OBJ_4D8 = 0x8005917C; // func <- retail 0x80050ce4 (norm-1to1, unverified)
2D_BG0_OBJ_658 = 0x800592FC; // func <- retail 0x80050e64 (norm-1to1, unverified)
2D_BG0_OBJ_698 = 0x8005933C; // func <- retail 0x80050ea4 (norm-1to1, unverified)
GsSortFastBg = 0x800594DC; // func <- retail 0x80051044 (norm-1to1, unverified)
_mk_spr_packet = 0x80059C9C; // func <- retail 0x80051804 (norm-1to1, unverified)
_mk_xpndsp = 0x80059CDC; // func <- retail 0x80051844 (norm-1to1, unverified)
2D_COM0_OBJ_EC = 0x80059D88; // func <- retail 0x800518f0 (norm-1to1, unverified)
2D_COM0_OBJ_154 = 0x80059DF0; // func <- retail 0x80051958 (norm-1to1, unverified)
_mk_normsp = 0x80059FA4; // func <- retail 0x80051b0c (norm-1to1, unverified)
2D_COM0_OBJ_39C = 0x8005A038; // func <- retail 0x80051ba0 (norm-1to1, unverified)
2D_COM0_OBJ_400 = 0x8005A09C; // func <- retail 0x80051c04 (norm-1to1, unverified)
ApplyMatrix = 0x8005A210; // func <- retail 0x80051d78 (norm-1to1, unverified)
GsSortLine = 0x8005A260; // func <- retail 0x80051dc8 (norm-1to1, unverified)
2D_SP0_OBJ_240 = 0x8005A60C; // func <- retail 0x80052174 (norm-1to1, unverified)
2D_SP0_OBJ_388 = 0x8005A754; // func <- retail 0x800522bc (norm-1to1, unverified)
2D_SP0_OBJ_3C8 = 0x8005A794; // func <- retail 0x800522fc (norm-1to1, unverified)
2D_SP0_OBJ_4C0 = 0x8005A88C; // func <- retail 0x800523f4 (norm-1to1, unverified)
GsSortFastSprite = 0x8005A8F8; // func <- retail 0x80052460 (norm-1to1, unverified)
GsInitGraph = 0x8005AA74; // func <- retail 0x800525dc (norm-1to1, unverified)
GsInitGraph2 = 0x8005AC5C; // func <- retail 0x800527c4 (norm-1to1, unverified)
GsSortClear = 0x8005AF38; // func <- retail 0x80052aa0 (norm-1to1, unverified)
GsGetActiveBuff = 0x8005B074; // func <- retail 0x80052bdc (norm-1to1, unverified)
GsInitCoord2param = 0x8005B2A4; // func <- retail 0x80052e0c (norm-1to1, unverified)
GsSetLsMatrix = 0x8005B2D0; // func <- retail 0x80052e38 (norm-1to1, unverified)
GsMulCoord0 = 0x8005B3D0; // func <- retail 0x80052f38 (norm-1to1, unverified)
GsMulCoord2 = 0x8005B464; // func <- retail 0x80052fcc (norm-1to1, unverified)
GsMulCoord3 = 0x8005B4E8; // func <- retail 0x80053050 (norm-1to1, unverified)
GsInit3D = 0x8005B6B0; // func <- retail 0x80053218 (norm-1to1, unverified)
GsMapModelingData = 0x8005B728; // func <- retail 0x80053290 (norm-1to1, unverified)
GS_107_OBJ_4B8 = 0x8005BC78; // func <- retail 0x800537e0 (norm-1to1, unverified)
SetColorMatrix = 0x8005BD54; // func <- retail 0x800538bc (norm-1to1, unverified)
GsSetLightMode = 0x8005BD84; // func <- retail 0x800538ec (norm-1to1, unverified)
GsSetFogParam = 0x8005BE10; // func <- retail 0x80053978 (norm-1to1, unverified)
SetVertex0 = 0x8005BE60; // func <- retail 0x800539c8 (norm-1to1, unverified)
SetVertex1 = 0x8005BE70; // func <- retail 0x800539d8 (norm-1to1, unverified)
SetVertex2 = 0x8005BE80; // func <- retail 0x800539e8 (norm-1to1, unverified)
SetVertexTri = 0x8005BE90; // func <- retail 0x800539f8 (norm-1to1, unverified)
SetRGBfifo = 0x8005BEB0; // func <- retail 0x80053a18 (norm-1to1, unverified)
SetIR123 = 0x8005BEC4; // func <- retail 0x80053a2c (norm-1to1, unverified)
SetIR0 = 0x8005BED8; // func <- retail 0x80053a40 (norm-1to1, unverified)
SetSZfifo3 = 0x8005BEE4; // func <- retail 0x80053a4c (norm-1to1, unverified)
SetSZfifo4 = 0x8005BEF8; // func <- retail 0x80053a60 (norm-1to1, unverified)
SetSXSYfifo = 0x8005BF10; // func <- retail 0x80053a78 (norm-1to1, unverified)
SetRii = 0x8005BF24; // func <- retail 0x80053a8c (norm-1to1, unverified)
SetMAC123 = 0x8005BF38; // func <- retail 0x80053aa0 (norm-1to1, unverified)
SetData32 = 0x8005BF4C; // func <- retail 0x80053ab4 (norm-1to1, unverified)
SetDQA = 0x8005BF58; // func <- retail 0x80053ac0 (norm-1to1, unverified)
SetDQB = 0x8005BF64; // func <- retail 0x80053acc (norm-1to1, unverified)
SetFarColor = 0x8005BF70; // func <- retail 0x80053ad8 (norm-1to1, unverified)
GsSetAmbient = 0x8005BF90; // func <- retail 0x80053af8 (norm-1to1, unverified)
gte_rotate_z_matrix = 0x8005BFB8; // func <- retail 0x80053b20 (norm-1to1, unverified)
gte_scale_matrix = 0x8005C070; // func <- retail 0x80053bd8 (norm-1to1, unverified)
gte_init = 0x8005C190; // func <- retail 0x80053cf8 (norm-1to1, unverified)
GsGetTimInfo = 0x8005C1DC; // func <- retail 0x80053d44 (norm-1to1, unverified)
GS_123_OBJ_78 = 0x8005C338; // func <- retail 0x80053ea0 (norm-1to1, unverified)
GS_123_OBJ_90 = 0x8005C350; // func <- retail 0x80053eb8 (norm-1to1, unverified)
GS_123_OBJ_A8 = 0x8005C368; // func <- retail 0x80053ed0 (norm-1to1, unverified)
scale_view_param = 0x8005C7D8; // func <- retail 0x80054340 (norm-1to1, unverified)
GS_131_OBJ_4A4 = 0x8005C8A8; // func <- retail 0x80054410 (norm-1to1, unverified)
select_max_param = 0x8005C8C8; // func <- retail 0x80054430 (norm-1to1, unverified)
len_param = 0x8005C990; // func <- retail 0x800544f8 (norm-1to1, unverified)
GS_137_OBJ_1B8 = 0x8005D41C; // func <- retail 0x80054f84 (norm-1to1, unverified)
GS_137_OBJ_39C = 0x8005D600; // func <- retail 0x80055168 (norm-1to1, unverified)
GS_137_OBJ_488 = 0x8005D6EC; // func <- retail 0x80055254 (norm-1to1, unverified)
GS_137_OBJ_5EC = 0x8005D850; // func <- retail 0x800553b8 (norm-1to1, unverified)
GsLinkObject5 = 0x8005D870; // func <- retail 0x800553d8 (norm-1to1, unverified)
GsPresetObject = 0x8005D88C; // func <- retail 0x800553f4 (norm-1to1, unverified)
PRESET_OBJ_108 = 0x8005D978; // func <- retail 0x800554e0 (norm-1to1, unverified)
PRESET_OBJ_14C = 0x8005D9BC; // func <- retail 0x80055524 (norm-1to1, unverified)
PRESET_OBJ_1A8 = 0x8005DA18; // func <- retail 0x80055580 (norm-1to1, unverified)
PRESET_OBJ_1CC = 0x8005DA3C; // func <- retail 0x800555a4 (norm-1to1, unverified)
PRESET_OBJ_244 = 0x8005DAB4; // func <- retail 0x8005561c (norm-1to1, unverified)
PRESET_OBJ_2E8 = 0x8005DB58; // func <- retail 0x800556c0 (norm-1to1, unverified)
PRESET_OBJ_380 = 0x8005DBF0; // func <- retail 0x80055758 (norm-1to1, unverified)
PRESET_OBJ_39C = 0x8005DC0C; // func <- retail 0x80055774 (norm-1to1, unverified)
PRESET_OBJ_3B4 = 0x8005DC24; // func <- retail 0x8005578c (norm-1to1, unverified)
PRESET_OBJ_3C0 = 0x8005DC30; // func <- retail 0x80055798 (norm-1to1, unverified)
PRESET_OBJ_450 = 0x8005DCC0; // func <- retail 0x80055828 (norm-1to1, unverified)
PRESET_OBJ_4B4 = 0x8005DD24; // func <- retail 0x8005588c (norm-1to1, unverified)
PRESET_OBJ_574 = 0x8005DDE4; // func <- retail 0x8005594c (norm-1to1, unverified)
PRESET_OBJ_5C0 = 0x8005DE30; // func <- retail 0x80055998 (norm-1to1, unverified)
PRESET_OBJ_63C = 0x8005DEAC; // func <- retail 0x80055a14 (norm-1to1, unverified)
PRESET_OBJ_6E8 = 0x8005DF58; // func <- retail 0x80055ac0 (norm-1to1, unverified)
PRESET_OBJ_744 = 0x8005DFB4; // func <- retail 0x80055b1c (norm-1to1, unverified)
PRESET_OBJ_748 = 0x8005DFB8; // func <- retail 0x80055b20 (norm-1to1, unverified)
PRESET_OBJ_754 = 0x8005DFC4; // func <- retail 0x80055b2c (norm-1to1, unverified)
PRESET_OBJ_7E8 = 0x8005E058; // func <- retail 0x80055bc0 (norm-1to1, unverified)
PRESET_OBJ_8C0 = 0x8005E130; // func <- retail 0x80055c98 (norm-1to1, unverified)
PRESET_OBJ_8FC = 0x8005E16C; // func <- retail 0x80055cd4 (norm-1to1, unverified)
GsSortObject5 = 0x8005E1D8; // func <- retail 0x80055d40 (norm-1to1, unverified)
PRESET2_OBJ_D0 = 0x8005E2A8; // func <- retail 0x80055e10 (norm-1to1, unverified)
PRESET2_OBJ_13C = 0x8005E314; // func <- retail 0x80055e7c (norm-1to1, unverified)
PRESET2_OBJ_16C = 0x8005E344; // func <- retail 0x80055eac (norm-1to1, unverified)
PRESET2_OBJ_484 = 0x8005E65C; // func <- retail 0x800561c4 (norm-1to1, unverified)
PRESET2_OBJ_4B0 = 0x8005E688; // func <- retail 0x800561f0 (norm-1to1, unverified)
PRESET2_OBJ_4DC = 0x8005E6B4; // func <- retail 0x8005621c (norm-1to1, unverified)
PRESET2_OBJ_528 = 0x8005E700; // func <- retail 0x80056268 (norm-1to1, unverified)
PRESET2_OBJ_540 = 0x8005E718; // func <- retail 0x80056280 (norm-1to1, unverified)
PRESET2_OBJ_598 = 0x8005E770; // func <- retail 0x800562d8 (norm-1to1, unverified)
PRESET2_OBJ_658 = 0x8005E830; // func <- retail 0x80056398 (norm-1to1, unverified)
PRESET2_OBJ_678 = 0x8005E850; // func <- retail 0x800563b8 (norm-1to1, unverified)
PRESET2_OBJ_6E4 = 0x8005E8BC; // func <- retail 0x80056424 (norm-1to1, unverified)
PRESET2_OBJ_738 = 0x8005E910; // func <- retail 0x80056478 (norm-1to1, unverified)
PRESET2_OBJ_A44 = 0x8005EC1C; // func <- retail 0x80056784 (norm-1to1, unverified)
PRESET2_OBJ_A68 = 0x8005EC40; // func <- retail 0x800567a8 (norm-1to1, unverified)
PRESET2_OBJ_A88 = 0x8005EC60; // func <- retail 0x800567c8 (norm-1to1, unverified)
PRESET2_OBJ_B28 = 0x8005ED00; // func <- retail 0x80056868 (norm-1to1, unverified)
PRESET2_OBJ_BE0 = 0x8005EDB8; // func <- retail 0x80056920 (norm-1to1, unverified)
PRESET2_OBJ_C40 = 0x8005EE18; // func <- retail 0x80056980 (norm-1to1, unverified)
PRESET2_OBJ_F8C = 0x8005F164; // func <- retail 0x80056ccc (norm-1to1, unverified)
PRESET2_OBJ_FB4 = 0x8005F18C; // func <- retail 0x80056cf4 (norm-1to1, unverified)
PRESET2_OBJ_FD8 = 0x8005F1B0; // func <- retail 0x80056d18 (norm-1to1, unverified)
PRESET2_OBJ_FF4 = 0x8005F1CC; // func <- retail 0x80056d34 (norm-1to1, unverified)
PRESET2_OBJ_103C = 0x8005F214; // func <- retail 0x80056d7c (norm-1to1, unverified)
PRESET2_OBJ_1074 = 0x8005F24C; // func <- retail 0x80056db4 (norm-1to1, unverified)
PRESET2_OBJ_10B4 = 0x8005F28C; // func <- retail 0x80056df4 (norm-1to1, unverified)
PRESET2_OBJ_10EC = 0x8005F2C4; // func <- retail 0x80056e2c (norm-1to1, unverified)
PRESET2_OBJ_112C = 0x8005F304; // func <- retail 0x80056e6c (norm-1to1, unverified)
PRESET2_OBJ_118C = 0x8005F364; // func <- retail 0x80056ecc (norm-1to1, unverified)
GsLinkObject4 = 0x8005F3B0; // func <- retail 0x80056f18 (norm-1to1, unverified)
OBJT_OBJ_C4 = 0x8005F474; // func <- retail 0x80056fdc (norm-1to1, unverified)
OBJT_OBJ_D0 = 0x8005F480; // func <- retail 0x80056fe8 (norm-1to1, unverified)
OBJT_OBJ_D8 = 0x8005F488; // func <- retail 0x80056ff0 (norm-1to1, unverified)
OBJT_OBJ_E4 = 0x8005F494; // func <- retail 0x80056ffc (norm-1to1, unverified)
OBJT_OBJ_EC = 0x8005F49C; // func <- retail 0x80057004 (norm-1to1, unverified)
OBJT_OBJ_F8 = 0x8005F4A8; // func <- retail 0x80057010 (norm-1to1, unverified)
OBJT_OBJ_108 = 0x8005F4B8; // func <- retail 0x80057020 (norm-1to1, unverified)
OBJT_OBJ_110 = 0x8005F4C0; // func <- retail 0x80057028 (norm-1to1, unverified)
OBJT_OBJ_118 = 0x8005F4C8; // func <- retail 0x80057030 (norm-1to1, unverified)
OBJT_OBJ_124 = 0x8005F4D4; // func <- retail 0x8005703c (norm-1to1, unverified)
OBJT_OBJ_13C = 0x8005F4EC; // func <- retail 0x80057054 (norm-1to1, unverified)
GsSortObject4 = 0x8005F52C; // func <- retail 0x80057094 (norm-1to1, unverified)
OBJT2_OBJ_E0 = 0x8005F60C; // func <- retail 0x80057174 (norm-1to1, unverified)
OBJT2_OBJ_5C0 = 0x8005FAEC; // func <- retail 0x80057654 (norm-1to1, unverified)
OBJT2_OBJ_5EC = 0x8005FB18; // func <- retail 0x80057680 (norm-1to1, unverified)
OBJT2_OBJ_618 = 0x8005FB44; // func <- retail 0x800576ac (norm-1to1, unverified)
OBJT2_OBJ_66C = 0x8005FB98; // func <- retail 0x80057700 (norm-1to1, unverified)
OBJT2_OBJ_6EC = 0x8005FC18; // func <- retail 0x80057780 (norm-1to1, unverified)
OBJT2_OBJ_7BC = 0x8005FCE8; // func <- retail 0x80057850 (norm-1to1, unverified)
OBJT2_OBJ_7E4 = 0x8005FD10; // func <- retail 0x80057878 (norm-1to1, unverified)
OBJT2_OBJ_858 = 0x8005FD84; // func <- retail 0x800578ec (norm-1to1, unverified)
GsTMDfastG3GL = 0x8005FDC0; // func <- retail 0x80057928 (norm-1to1, unverified)
GsTMDfastG3GNL = 0x8005FFAC; // func <- retail 0x80057b14 (norm-1to1, unverified)
GsTMDfastF3GL = 0x80060114; // func <- retail 0x80057c7c (norm-1to1, unverified)
GsTMDfastF3GNL = 0x80060318; // func <- retail 0x80057e80 (norm-1to1, unverified)
GsTMDfastF4GL = 0x80060494; // func <- retail 0x80057ffc (norm-1to1, unverified)
GsTMDfastF4GNL = 0x8006071C; // func <- retail 0x80058284 (norm-1to1, unverified)
GsTMDfastG4GL = 0x800608F4; // func <- retail 0x8005845c (norm-1to1, unverified)
GsTMDfastG4GNL = 0x80060B64; // func <- retail 0x800586cc (norm-1to1, unverified)
LoadTPage = 0x80060D28; // func <- retail 0x80058890 (norm-1to1, unverified)
EXT_OBJ_A8 = 0x80060DD0; // func <- retail 0x80058938 (norm-1to1, unverified)
EXT_OBJ_AC = 0x80060DD4; // func <- retail 0x8005893c (norm-1to1, unverified)
LoadClut = 0x80060E14; // func <- retail 0x8005897c (norm-1to1, unverified)
LoadClut2 = 0x80060E7C; // func <- retail 0x800589e4 (norm-1to1, unverified)
SetDefDrawEnv = 0x80060EE4; // func <- retail 0x80058a4c (norm-1to1, unverified)
EXT_OBJ_234 = 0x80060F5C; // func <- retail 0x80058ac4 (norm-1to1, unverified)
SetDefDispEnv = 0x80060F9C; // func <- retail 0x80058b04 (norm-1to1, unverified)
GetTPage = 0x80060FD8; // func <- retail 0x80058b40 (norm-1to1, unverified)
GetClut = 0x80061014; // func <- retail 0x80058b7c (norm-1to1, unverified)
NextPrim = 0x800610CC; // func <- retail 0x80058c34 (norm-1to1, unverified)
IsEndPrim = 0x800610E8; // func <- retail 0x80058c50 (norm-1to1, unverified)
AddPrim = 0x80061104; // func <- retail 0x80058c6c (norm-1to1, unverified)
AddPrims = 0x80061140; // func <- retail 0x80058ca8 (norm-1to1, unverified)
CatPrim = 0x8006117C; // func <- retail 0x80058ce4 (norm-1to1, unverified)
TermPrim = 0x800611A0; // func <- retail 0x80058d08 (norm-1to1, unverified)
SetSemiTrans = 0x800611B8; // func <- retail 0x80058d20 (norm-1to1, unverified)
SetShadeTex = 0x800611E0; // func <- retail 0x80058d48 (norm-1to1, unverified)
SetPolyF3 = 0x80061208; // func <- retail 0x80058d70 (norm-1to1, unverified)
SetPolyFT3 = 0x8006121C; // func <- retail 0x80058d84 (norm-1to1, unverified)
SetPolyG3 = 0x80061230; // func <- retail 0x80058d98 (norm-1to1, unverified)
SetPolyGT3 = 0x80061244; // func <- retail 0x80058dac (norm-1to1, unverified)
SetPolyF4 = 0x80061258; // func <- retail 0x80058dc0 (norm-1to1, unverified)
SetPolyFT4 = 0x8006126C; // func <- retail 0x80058dd4 (norm-1to1, unverified)
SetPolyG4 = 0x80061280; // func <- retail 0x80058de8 (norm-1to1, unverified)
SetPolyGT4 = 0x80061294; // func <- retail 0x80058dfc (norm-1to1, unverified)
SetSprt8 = 0x800612A8; // func <- retail 0x80058e10 (norm-1to1, unverified)
SetSprt16 = 0x800612BC; // func <- retail 0x80058e24 (norm-1to1, unverified)
SetSprt = 0x800612D0; // func <- retail 0x80058e38 (norm-1to1, unverified)
SetTile1 = 0x800612E4; // func <- retail 0x80058e4c (norm-1to1, unverified)
SetTile8 = 0x800612F8; // func <- retail 0x80058e60 (norm-1to1, unverified)
SetTile16 = 0x8006130C; // func <- retail 0x80058e74 (norm-1to1, unverified)
SetTile = 0x80061320; // func <- retail 0x80058e88 (norm-1to1, unverified)
SetLineF2 = 0x80061334; // func <- retail 0x80058e9c (norm-1to1, unverified)
SetLineG2 = 0x80061348; // func <- retail 0x80058eb0 (norm-1to1, unverified)
SetLineF3 = 0x8006135C; // func <- retail 0x80058ec4 (norm-1to1, unverified)
SetLineG3 = 0x8006137C; // func <- retail 0x80058ee4 (norm-1to1, unverified)
SetLineF4 = 0x8006139C; // func <- retail 0x80058f04 (norm-1to1, unverified)
SetLineG4 = 0x800613BC; // func <- retail 0x80058f24 (norm-1to1, unverified)
SetDrawTPage = 0x800613DC; // func <- retail 0x80058f44 (norm-1to1, unverified)
SetDrawMove = 0x80061408; // func <- retail 0x80058f70 (norm-1to1, unverified)
SetDrawLoad = 0x80061468; // func <- retail 0x80058fd0 (norm-1to1, unverified)
MargePrim = 0x800614D4; // func <- retail 0x8005903c (norm-1to1, unverified)
SYS_OBJ_210 = 0x800618DC; // func <- retail 0x80059444 (norm-1to1, unverified)
SYS_OBJ_640 = 0x80061D0C; // func <- retail 0x80059874 (norm-1to1, unverified)
DrawPrim = 0x8006212C; // func <- retail 0x80059c94 (norm-1to1, unverified)
SYS_OBJ_F00 = 0x800625CC; // func <- retail 0x8005a134 (norm-1to1, unverified)
SYS_OBJ_F24 = 0x800625F0; // func <- retail 0x8005a158 (norm-1to1, unverified)
SYS_OBJ_F58 = 0x80062624; // func <- retail 0x8005a18c (norm-1to1, unverified)
SYS_OBJ_FD8 = 0x800626A4; // func <- retail 0x8005a20c (norm-1to1, unverified)
SYS_OBJ_1034 = 0x80062700; // func <- retail 0x8005a268 (norm-1to1, unverified)
GetODE = 0x80062938; // func <- retail 0x8005a4a0 (norm-1to1, unverified)
SetTexWindow = 0x80062968; // func <- retail 0x8005a4d0 (norm-1to1, unverified)
SetDrawArea = 0x800629A4; // func <- retail 0x8005a50c (norm-1to1, unverified)
SetDrawOffset = 0x80062A28; // func <- retail 0x8005a590 (norm-1to1, unverified)
SetPriority = 0x80062A6C; // func <- retail 0x8005a5d4 (norm-1to1, unverified)
SetDrawMode = 0x80062A98; // func <- retail 0x8005a600 (norm-1to1, unverified)
SetDrawEnv = 0x80062AF0; // func <- retail 0x8005a658 (norm-1to1, unverified)
SYS_OBJ_1578 = 0x80062C44; // func <- retail 0x8005a7ac (norm-1to1, unverified)
SetDrawEnv2 = 0x80062D08; // func <- retail 0x8005a870 (norm-1to1, unverified)
SYS_OBJ_1790 = 0x80062E5C; // func <- retail 0x8005a9c4 (norm-1to1, unverified)
SYS_OBJ_18AC = 0x80062F78; // func <- retail 0x8005aae0 (norm-1to1, unverified)
get_mode = 0x80062F98; // func <- retail 0x8005ab00 (norm-1to1, unverified)
SYS_OBJ_191C = 0x80062FE8; // func <- retail 0x8005ab50 (norm-1to1, unverified)
get_ofs = 0x80063188; // func <- retail 0x8005acf0 (norm-1to1, unverified)
SYS_OBJ_1AF0 = 0x800631BC; // func <- retail 0x8005ad24 (norm-1to1, unverified)
get_tw = 0x800631CC; // func <- retail 0x8005ad34 (norm-1to1, unverified)
SYS_OBJ_1B78 = 0x80063244; // func <- retail 0x8005adac (norm-1to1, unverified)
get_dx = 0x80063250; // func <- retail 0x8005adb8 (norm-1to1, unverified)
SYS_OBJ_1BC4 = 0x80063290; // func <- retail 0x8005adf8 (norm-1to1, unverified)
SYS_OBJ_1C28 = 0x800632F4; // func <- retail 0x8005ae5c (norm-1to1, unverified)
_status = 0x80063300; // func <- retail 0x8005ae68 (norm-1to1, unverified)
_otc = 0x80063318; // func <- retail 0x8005ae80 (norm-1to1, unverified)
_clr = 0x80063400; // func <- retail 0x8005af68 (norm-1to1, unverified)
SYS_OBJ_1D84 = 0x80063450; // func <- retail 0x8005afb8 (norm-1to1, unverified)
_dws = 0x8006365C; // func <- retail 0x8005b1c4 (norm-1to1, unverified)
SYS_OBJ_202C = 0x800636F8; // func <- retail 0x8005b260 (norm-1to1, unverified)
SYS_OBJ_21A4 = 0x80063870; // func <- retail 0x8005b3d8 (norm-1to1, unverified)
_drs = 0x80063898; // func <- retail 0x8005b400 (norm-1to1, unverified)
SYS_OBJ_2264 = 0x80063930; // func <- retail 0x8005b498 (norm-1to1, unverified)
_ctl = 0x80063B1C; // func <- retail 0x8005b684 (norm-1to1, unverified)
_cwb = 0x80063B58; // func <- retail 0x8005b6c0 (norm-1to1, unverified)
_cwc = 0x80063BA8; // func <- retail 0x8005b710 (norm-1to1, unverified)
_param = 0x80063BF4; // func <- retail 0x8005b75c (norm-1to1, unverified)
_addque = 0x80063C24; // func <- retail 0x8005b78c (norm-1to1, unverified)
_addque2 = 0x80063C48; // func <- retail 0x8005b7b0 (norm-1to1, unverified)
SYS_OBJ_27A8 = 0x80063E74; // func <- retail 0x8005b9dc (norm-1to1, unverified)
SYS_OBJ_2C6C = 0x80064338; // func <- retail 0x8005bea0 (norm-1to1, unverified)
_sync = 0x80064370; // func <- retail 0x8005bed8 (norm-1to1, unverified)
SYS_OBJ_2CC4 = 0x80064390; // func <- retail 0x8005bef8 (norm-1to1, unverified)
SYS_OBJ_2CDC = 0x800643A8; // func <- retail 0x8005bf10 (norm-1to1, unverified)
set_alarm = 0x800644B8; // func <- retail 0x8005c020 (norm-1to1, unverified)
_version = 0x80064658; // func <- retail 0x8005c1c0 (norm-1to1, unverified)
memset = 0x80064734; // func <- retail 0x8005c29c (norm-1to1, unverified)
bzero = 0x80064760; // func <- retail 0x8005c2c8 (norm-1to1, unverified)
getchar = 0x80064790; // func <- retail 0x8005c2f8 (norm-1to1, unverified)
memcpy = 0x800647BC; // func <- retail 0x8005c324 (norm-1to1, unverified)
memset = 0x800647F0; // func <- retail 0x8005c358 (norm-1to1, unverified)
putchar = 0x80064820; // func <- retail 0x8005c388 (norm-1to1, unverified)
PUTCHAR_OBJ_3C = 0x8006485C; // func <- retail 0x8005c3c4 (norm-1to1, unverified)
PUTCHAR_OBJ_98 = 0x800648B8; // func <- retail 0x8005c420 (norm-1to1, unverified)
toupper = 0x800648D4; // func <- retail 0x8005c43c (norm-1to1, unverified)
tolower = 0x80064904; // func <- retail 0x8005c46c (norm-1to1, unverified)
rand = 0x80064934; // func <- retail 0x8005c49c (norm-1to1, unverified)
strcmp = 0x80064974; // func <- retail 0x8005c4dc (norm-1to1, unverified)
strcpy = 0x800649D8; // func <- retail 0x8005c540 (norm-1to1, unverified)
strncmp = 0x80064A1C; // func <- retail 0x8005c584 (norm-1to1, unverified)
printf = 0x80064A9C; // func <- retail 0x8005c604 (norm-1to1, unverified)
PRNT_OBJ_50 = 0x80064B28; // func <- retail 0x8005c690 (norm-1to1, unverified)
PRNT_OBJ_60 = 0x80064B38; // func <- retail 0x8005c6a0 (norm-1to1, unverified)
PRNT_OBJ_88 = 0x80064B60; // func <- retail 0x8005c6c8 (norm-1to1, unverified)
PRNT_OBJ_B8 = 0x80064B90; // func <- retail 0x8005c6f8 (norm-1to1, unverified)
PRNT_OBJ_C8 = 0x80064BA0; // func <- retail 0x8005c708 (norm-1to1, unverified)
PRNT_OBJ_D0 = 0x80064BA8; // func <- retail 0x8005c710 (norm-1to1, unverified)
PRNT_OBJ_EC = 0x80064BC4; // func <- retail 0x8005c72c (norm-1to1, unverified)
PRNT_OBJ_F4 = 0x80064BCC; // func <- retail 0x8005c734 (norm-1to1, unverified)
PRNT_OBJ_FC = 0x80064BD4; // func <- retail 0x8005c73c (norm-1to1, unverified)
PRNT_OBJ_178 = 0x80064C50; // func <- retail 0x8005c7b8 (norm-1to1, unverified)
PRNT_OBJ_188 = 0x80064C60; // func <- retail 0x8005c7c8 (norm-1to1, unverified)
PRNT_OBJ_190 = 0x80064C68; // func <- retail 0x8005c7d0 (norm-1to1, unverified)
PRNT_OBJ_1E8 = 0x80064CC0; // func <- retail 0x8005c828 (norm-1to1, unverified)
PRNT_OBJ_1F0 = 0x80064CC8; // func <- retail 0x8005c830 (norm-1to1, unverified)
PRNT_OBJ_1F8 = 0x80064CD0; // func <- retail 0x8005c838 (norm-1to1, unverified)
PRNT_OBJ_200 = 0x80064CD8; // func <- retail 0x8005c840 (norm-1to1, unverified)
PRNT_OBJ_220 = 0x80064CF8; // func <- retail 0x8005c860 (norm-1to1, unverified)
PRNT_OBJ_24C = 0x80064D24; // func <- retail 0x8005c88c (norm-1to1, unverified)
PRNT_OBJ_264 = 0x80064D3C; // func <- retail 0x8005c8a4 (norm-1to1, unverified)
PRNT_OBJ_2A4 = 0x80064D7C; // func <- retail 0x8005c8e4 (norm-1to1, unverified)
PRNT_OBJ_2D8 = 0x80064DB0; // func <- retail 0x8005c918 (norm-1to1, unverified)
PRNT_OBJ_340 = 0x80064E18; // func <- retail 0x8005c980 (norm-1to1, unverified)
PRNT_OBJ_34C = 0x80064E24; // func <- retail 0x8005c98c (norm-1to1, unverified)
PRNT_OBJ_38C = 0x80064E64; // func <- retail 0x8005c9cc (norm-1to1, unverified)
PRNT_OBJ_3BC = 0x80064E94; // func <- retail 0x8005c9fc (norm-1to1, unverified)
PRNT_OBJ_3D0 = 0x80064EA8; // func <- retail 0x8005ca10 (norm-1to1, unverified)
PRNT_OBJ_470 = 0x80064F48; // func <- retail 0x8005cab0 (norm-1to1, unverified)
PRNT_OBJ_590 = 0x80065068; // func <- retail 0x8005cbd0 (norm-1to1, unverified)
PRNT_OBJ_634 = 0x8006510C; // func <- retail 0x8005cc74 (norm-1to1, unverified)
PRNT_OBJ_64C = 0x80065124; // func <- retail 0x8005cc8c (norm-1to1, unverified)
PRNT_OBJ_654 = 0x8006512C; // func <- retail 0x8005cc94 (norm-1to1, unverified)
memchr = 0x80065160; // func <- retail 0x8005ccc8 (norm-1to1, unverified)
MEMCHR_OBJ_20 = 0x80065180; // func <- retail 0x8005cce8 (norm-1to1, unverified)
strlen = 0x800651B0; // func <- retail 0x8005cd18 (norm-1to1, unverified)
PUTS_OBJ_2C = 0x8006520C; // func <- retail 0x8005cd74 (norm-1to1, unverified)
setjmp = 0x80065230; // func <- retail 0x8005cd98 (norm-1to1, unverified)
longjmp = 0x8006526C; // func <- retail 0x8005cdd4 (norm-1to1, unverified)
MemCardInit = 0x80068100; // func <- retail 0x8005fc68 (norm-1to1, unverified)
_card_exist_back = 0x8006826C; // func <- retail 0x8005fdd4 (norm-1to1, unverified)
LIBMCRD_OBJ_2E4 = 0x800683E4; // func <- retail 0x8005ff4c (norm-1to1, unverified)
LIBMCRD_OBJ_308 = 0x80068408; // func <- retail 0x8005ff70 (norm-1to1, unverified)
LIBMCRD_OBJ_310 = 0x80068410; // func <- retail 0x8005ff78 (norm-1to1, unverified)
_card_accept_back = 0x800684C8; // func <- retail 0x80060030 (norm-1to1, unverified)
LIBMCRD_OBJ_490 = 0x80068590; // func <- retail 0x800600f8 (norm-1to1, unverified)
LIBMCRD_OBJ_4B0 = 0x800685B0; // func <- retail 0x80060118 (norm-1to1, unverified)
LIBMCRD_OBJ_4DC = 0x800685DC; // func <- retail 0x80060144 (norm-1to1, unverified)
LIBMCRD_OBJ_594 = 0x80068694; // func <- retail 0x800601fc (norm-1to1, unverified)
LIBMCRD_OBJ_6DC = 0x800687DC; // func <- retail 0x80060344 (norm-1to1, unverified)
LIBMCRD_OBJ_730 = 0x80068830; // func <- retail 0x80060398 (norm-1to1, unverified)
LIBMCRD_OBJ_1284 = 0x80069384; // func <- retail 0x80060eec (norm-1to1, unverified)
LIBMCRD_OBJ_12E8 = 0x800693E8; // func <- retail 0x80060f50 (norm-1to1, unverified)
LIBMCRD_OBJ_1374 = 0x80069474; // func <- retail 0x80060fdc (norm-1to1, unverified)
LIBMCRD_OBJ_16B8 = 0x800697B8; // func <- retail 0x80061320 (norm-1to1, unverified)
LIBMCRD_OBJ_189C = 0x8006999C; // func <- retail 0x80061504 (norm-1to1, unverified)
LIBMCRD_OBJ_1944 = 0x80069A44; // func <- retail 0x800615ac (norm-1to1, unverified)
LIBMCRD_OBJ_19F8 = 0x80069AF8; // func <- retail 0x80061660 (norm-1to1, unverified)
_rslt_to_code = 0x80069B10; // func <- retail 0x80061678 (norm-1to1, unverified)
LIBMCRD_OBJ_1A60 = 0x80069B60; // func <- retail 0x800616c8 (norm-1to1, unverified)
_card_open = 0x80069D04; // func <- retail 0x8006186c (norm-1to1, unverified)
_card_stop = 0x80069F38; // func <- retail 0x80061aa0 (norm-1to1, unverified)
_clr_card_event = 0x80069FF0; // func <- retail 0x80061b58 (norm-1to1, unverified)
strcat = 0x8006A328; // func <- retail 0x80061e90 (norm-1to1, unverified)
_card_clear = 0x8006A730; // func <- retail 0x80062298 (norm-1to1, unverified)
UserFuncComplete = 0x8006AE20; // func <- retail 0x80062988 (norm-1to1, unverified)
+960
View File
@@ -0,0 +1,960 @@
// config/symbols.proto-sep8.txt — retail symbol names mapped onto the sep8_SLUS_007.26 prototype.
// Phase 3.5: generated by tools/match_protos.py from 1:1 h_norm correspondences (NOT byte-matches).
// PROVENANCE (R13): each name is INHERITED FROM RETAIL via normalized-instruction equality and is
// UNVERIFIED against the proto until independently confirmed. Proto-side navigation aid for
// Phase-6/Gen2 ONLY. These are NOT retail symbols; never merge into config/symbols.us.txt.
// count=953
start = 0x80010000; // func <- retail 0x80010000 (norm-1to1, unverified)
__main = 0x800100A0; // func <- retail 0x800100a0 (norm-1to1, unverified)
__do_global_dtors = 0x80010110; // func <- retail 0x80010110 (norm-1to1, unverified)
main = 0x80010178; // func <- retail 0x80010178 (norm-1to1, unverified)
GameModeDispatch = 0x80010B40; // func <- retail 0x80010b40 (norm-1to1, unverified)
LzssDecodeSector = 0x80018730; // func <- retail 0x80018730 (norm-1to1, unverified)
LoaderInitFileTable = 0x8001971C; // func <- retail 0x8001971c (norm-1to1, unverified)
LoaderResetReadState = 0x80019990; // func <- retail 0x80019990 (norm-1to1, unverified)
CdReadRequest = 0x80019A24; // func <- retail 0x80019a24 (norm-1to1, unverified)
CdReadStateMachine = 0x80019AF8; // func <- retail 0x80019af8 (norm-1to1, unverified)
ResourceLoadStateMachine = 0x8001B3C4; // func <- retail 0x8001b3c4 (norm-1to1, unverified)
ResourceGetCdLoc = 0x8001B788; // func <- retail 0x8001b788 (norm-1to1, unverified)
SsGetMute = 0x8001BD80; // func <- retail 0x8001bd80 (norm-1to1, unverified)
CdQueueBusy = 0x80034B98; // func <- retail 0x80034b98 (norm-1to1, unverified)
StreamLoadStateMachine = 0x800363CC; // func <- retail 0x800363cc (norm-1to1, unverified)
_SpuInit = 0x8003A444; // func <- retail 0x8003a444 (norm-1to1, unverified)
SpuStart = 0x8003A53C; // func <- retail 0x8003a53c (norm-1to1, unverified)
_spu_init = 0x8003A5B8; // func <- retail 0x8003a5b8 (norm-1to1, unverified)
SPU_OBJ_DC = 0x8003A694; // func <- retail 0x8003a694 (norm-1to1, unverified)
_spu_FwriteByIO = 0x8003A84C; // func <- retail 0x8003a84c (norm-1to1, unverified)
SPU_OBJ_3AC = 0x8003A964; // func <- retail 0x8003a964 (norm-1to1, unverified)
SPU_OBJ_440 = 0x8003A9F8; // func <- retail 0x8003a9f8 (norm-1to1, unverified)
_spu_FiDMA = 0x8003AA18; // func <- retail 0x8003aa18 (norm-1to1, unverified)
_spu_Fr_ = 0x8003AAD8; // func <- retail 0x8003aad8 (norm-1to1, unverified)
_spu_t = 0x8003AB84; // func <- retail 0x8003ab84 (norm-1to1, unverified)
SPU_OBJ_7C0 = 0x8003AD78; // func <- retail 0x8003ad78 (norm-1to1, unverified)
_spu_Fw = 0x8003AE14; // func <- retail 0x8003ae14 (norm-1to1, unverified)
_spu_Fr = 0x8003AE9C; // func <- retail 0x8003ae9c (norm-1to1, unverified)
_spu_FsetRXX = 0x8003AF04; // func <- retail 0x8003af04 (norm-1to1, unverified)
_spu_FsetRXXa = 0x8003AF4C; // func <- retail 0x8003af4c (norm-1to1, unverified)
_spu_FgetRXXa = 0x8003AFF0; // func <- retail 0x8003aff0 (norm-1to1, unverified)
_spu_FsetPCR = 0x8003B02C; // func <- retail 0x8003b02c (norm-1to1, unverified)
SPU_OBJ_AC4 = 0x8003B07C; // func <- retail 0x8003b07c (norm-1to1, unverified)
_spu_Fw1ts = 0x8003B0E4; // func <- retail 0x8003b0e4 (norm-1to1, unverified)
SPU_OBJ_B74 = 0x8003B12C; // func <- retail 0x8003b12c (norm-1to1, unverified)
_SpuDataCallback = 0x8003B14C; // func <- retail 0x8003b14c (norm-1to1, unverified)
SpuSetEnv = 0x8003B1EC; // func <- retail 0x8003b1ec (norm-1to1, unverified)
SpuNSetVoiceAttr = 0x8003B250; // func <- retail 0x8003b250 (norm-1to1, unverified)
SpuSetReverb = 0x8003B280; // func <- retail 0x8003b280 (norm-1to1, unverified)
S_SR_OBJ_B0 = 0x8003B330; // func <- retail 0x8003b330 (norm-1to1, unverified)
S_SR_OBJ_B4 = 0x8003B334; // func <- retail 0x8003b334 (norm-1to1, unverified)
_SpuIsInAllocateArea = 0x8003B350; // func <- retail 0x8003b350 (norm-1to1, unverified)
_SpuIsInAllocateArea_ = 0x8003B3D0; // func <- retail 0x8003b3d0 (norm-1to1, unverified)
SpuSetReverbModeParam = 0x8003B45C; // func <- retail 0x8003b45c (norm-1to1, unverified)
S_SRMP_OBJ_170 = 0x8003B5CC; // func <- retail 0x8003b5cc (norm-1to1, unverified)
S_SRMP_OBJ_180 = 0x8003B5DC; // func <- retail 0x8003b5dc (norm-1to1, unverified)
S_SRMP_OBJ_334 = 0x8003B790; // func <- retail 0x8003b790 (norm-1to1, unverified)
S_SRMP_OBJ_420 = 0x8003B87C; // func <- retail 0x8003b87c (norm-1to1, unverified)
S_SRMP_OBJ_444 = 0x8003B8A0; // func <- retail 0x8003b8a0 (norm-1to1, unverified)
S_SRMP_OBJ_4C4 = 0x8003B920; // func <- retail 0x8003b920 (norm-1to1, unverified)
_spu_setReverbAttr = 0x8003B954; // func <- retail 0x8003b954 (norm-1to1, unverified)
SpuReserveReverbWorkArea = 0x8003BE24; // func <- retail 0x8003be24 (norm-1to1, unverified)
SpuSetReverbVoice = 0x8003BE74; // func <- retail 0x8003be74 (norm-1to1, unverified)
_SpuSetAnyVoice = 0x8003BE98; // func <- retail 0x8003be98 (norm-1to1, unverified)
S_SAV_OBJ_38 = 0x8003BED0; // func <- retail 0x8003bed0 (norm-1to1, unverified)
S_SAV_OBJ_114 = 0x8003BFAC; // func <- retail 0x8003bfac (norm-1to1, unverified)
S_SAV_OBJ_1E8 = 0x8003C080; // func <- retail 0x8003c080 (norm-1to1, unverified)
S_SAV_OBJ_1F8 = 0x8003C090; // func <- retail 0x8003c090 (norm-1to1, unverified)
SpuClearReverbWorkArea = 0x8003C0A0; // func <- retail 0x8003c0a0 (norm-1to1, unverified)
S_CRWA_OBJ_9C = 0x8003C13C; // func <- retail 0x8003c13c (norm-1to1, unverified)
S_CRWA_OBJ_100 = 0x8003C1A0; // func <- retail 0x8003c1a0 (norm-1to1, unverified)
S_CRWA_OBJ_174 = 0x8003C214; // func <- retail 0x8003c214 (norm-1to1, unverified)
SpuSetKey = 0x8003C23C; // func <- retail 0x8003c23c (norm-1to1, unverified)
SpuRead = 0x8003C438; // func <- retail 0x8003c438 (norm-1to1, unverified)
SpuSetTransferStartAddr = 0x8003C498; // func <- retail 0x8003c498 (norm-1to1, unverified)
SpuIsTransferCompleted = 0x8003C4F0; // func <- retail 0x8003c4f0 (norm-1to1, unverified)
SpuSetCommonAttr = 0x8003C598; // func <- retail 0x8003c598 (norm-1to1, unverified)
S_SCA_OBJ_94 = 0x8003C62C; // func <- retail 0x8003c62c (norm-1to1, unverified)
S_SCA_OBJ_9C = 0x8003C634; // func <- retail 0x8003c634 (norm-1to1, unverified)
S_SCA_OBJ_CC = 0x8003C664; // func <- retail 0x8003c664 (norm-1to1, unverified)
S_SCA_OBJ_15C = 0x8003C6F4; // func <- retail 0x8003c6f4 (norm-1to1, unverified)
S_SCA_OBJ_164 = 0x8003C6FC; // func <- retail 0x8003c6fc (norm-1to1, unverified)
S_SCA_OBJ_194 = 0x8003C72C; // func <- retail 0x8003c72c (norm-1to1, unverified)
S_SCA_OBJ_288 = 0x8003C820; // func <- retail 0x8003c820 (norm-1to1, unverified)
S_SCA_OBJ_2DC = 0x8003C874; // func <- retail 0x8003c874 (norm-1to1, unverified)
S_SCA_OBJ_330 = 0x8003C8C8; // func <- retail 0x8003c8c8 (norm-1to1, unverified)
S_SCA_OBJ_384 = 0x8003C91C; // func <- retail 0x8003c91c (norm-1to1, unverified)
_SpuRSetVoiceAttr = 0x8003C92C; // func <- retail 0x8003c92c (norm-1to1, unverified)
SR_SV_OBJ_224 = 0x8003CB50; // func <- retail 0x8003cb50 (norm-1to1, unverified)
SR_SV_OBJ_22C = 0x8003CB58; // func <- retail 0x8003cb58 (norm-1to1, unverified)
SR_SV_OBJ_25C = 0x8003CB88; // func <- retail 0x8003cb88 (norm-1to1, unverified)
SR_SV_OBJ_2F4 = 0x8003CC20; // func <- retail 0x8003cc20 (norm-1to1, unverified)
SR_SV_OBJ_2FC = 0x8003CC28; // func <- retail 0x8003cc28 (norm-1to1, unverified)
SR_SV_OBJ_32C = 0x8003CC58; // func <- retail 0x8003cc58 (norm-1to1, unverified)
SR_SV_OBJ_3C0 = 0x8003CCEC; // func <- retail 0x8003ccec (norm-1to1, unverified)
SR_SV_OBJ_514 = 0x8003CE40; // func <- retail 0x8003ce40 (norm-1to1, unverified)
SR_SV_OBJ_598 = 0x8003CEC4; // func <- retail 0x8003cec4 (norm-1to1, unverified)
SR_SV_OBJ_608 = 0x8003CF34; // func <- retail 0x8003cf34 (norm-1to1, unverified)
_spu_2pitch = 0x8003CF68; // func <- retail 0x8003cf68 (norm-1to1, unverified)
_spu_note2pitch = 0x8003CFF8; // func <- retail 0x8003cff8 (norm-1to1, unverified)
S_N2P_OBJ_11C = 0x8003D084; // func <- retail 0x8003d084 (norm-1to1, unverified)
_spu_pitch2note = 0x8003D134; // func <- retail 0x8003d134 (norm-1to1, unverified)
S_N2P_OBJ_208 = 0x8003D170; // func <- retail 0x8003d170 (norm-1to1, unverified)
SpuRGetAllKeysStatus = 0x8003D25C; // func <- retail 0x8003d25c (norm-1to1, unverified)
SR_GAKS_OBJ_B4 = 0x8003D310; // func <- retail 0x8003d310 (norm-1to1, unverified)
SpuGetAllKeysStatus = 0x8003D32C; // func <- retail 0x8003d32c (norm-1to1, unverified)
SR_GAKS_OBJ_140 = 0x8003D39C; // func <- retail 0x8003d39c (norm-1to1, unverified)
SpuSetVoiceRR = 0x8003D3B4; // func <- retail 0x8003d3b4 (norm-1to1, unverified)
SsEnd = 0x8003D454; // func <- retail 0x8003d454 (norm-1to1, unverified)
SSEND_OBJ_A0 = 0x8003D4F4; // func <- retail 0x8003d4f4 (norm-1to1, unverified)
_SsInit = 0x8003D548; // func <- retail 0x8003d548 (norm-1to1, unverified)
SsSetSerialAttr = 0x8003D650; // func <- retail 0x8003d650 (norm-1to1, unverified)
_SsStart = 0x8003D6E4; // func <- retail 0x8003d6e4 (norm-1to1, unverified)
SSSTART_OBJ_DC = 0x8003D7C0; // func <- retail 0x8003d7c0 (norm-1to1, unverified)
SSSTART_OBJ_18C = 0x8003D870; // func <- retail 0x8003d870 (norm-1to1, unverified)
SsStart = 0x8003D94C; // func <- retail 0x8003d94c (norm-1to1, unverified)
_SsTrapIntrVSync = 0x8003D98C; // func <- retail 0x8003d98c (norm-1to1, unverified)
_SsSeqCalledTbyT_1per2 = 0x8003D9CC; // func <- retail 0x8003d9cc (norm-1to1, unverified)
SsSeqCalledTbyT = 0x8003DA1C; // func <- retail 0x8003da1c (norm-1to1, unverified)
_SsSndPause = 0x8003E248; // func <- retail 0x8003e248 (norm-1to1, unverified)
_SsSndPlay = 0x8003E2E4; // func <- retail 0x8003e2e4 (norm-1to1, unverified)
_SsSeqPlay = 0x8003E310; // func <- retail 0x8003e310 (norm-1to1, unverified)
MIDIREAD_OBJ_E4 = 0x8003E3F4; // func <- retail 0x8003e3f4 (norm-1to1, unverified)
MIDIREAD_OBJ_E8 = 0x8003E3F8; // func <- retail 0x8003e3f8 (norm-1to1, unverified)
_SsSeqGetEof = 0x8003E418; // func <- retail 0x8003e418 (norm-1to1, unverified)
MIDIREAD_OBJ_20C = 0x8003E51C; // func <- retail 0x8003e51c (norm-1to1, unverified)
MIDIREAD_OBJ_2DC = 0x8003E5EC; // func <- retail 0x8003e5ec (norm-1to1, unverified)
_SsGetSeqData = 0x8003E65C; // func <- retail 0x8003e65c (norm-1to1, unverified)
MIDIREAD_OBJ_600 = 0x8003E910; // func <- retail 0x8003e910 (norm-1to1, unverified)
MIDIREAD_OBJ_65C = 0x8003E96C; // func <- retail 0x8003e96c (norm-1to1, unverified)
MIDIREAD_OBJ_6AC = 0x8003E9BC; // func <- retail 0x8003e9bc (norm-1to1, unverified)
MIDIREAD_OBJ_6BC = 0x8003E9CC; // func <- retail 0x8003e9cc (norm-1to1, unverified)
MIDIREAD_OBJ_6C0 = 0x8003E9D0; // func <- retail 0x8003e9d0 (norm-1to1, unverified)
MIDIREAD_OBJ_6CC = 0x8003E9DC; // func <- retail 0x8003e9dc (norm-1to1, unverified)
_SsReadDeltaValue = 0x8003EA04; // func <- retail 0x8003ea04 (norm-1to1, unverified)
_SsSndNextSep = 0x8003EAB4; // func <- retail 0x8003eab4 (norm-1to1, unverified)
_SsSndReplay = 0x8003EBB0; // func <- retail 0x8003ebb0 (norm-1to1, unverified)
SsSetSerialVol = 0x8003EDE8; // func <- retail 0x8003ede8 (norm-1to1, unverified)
_SsSndTempo = 0x8003EEE4; // func <- retail 0x8003eee4 (norm-1to1, unverified)
TEMPO_OBJ_128 = 0x8003F00C; // func <- retail 0x8003f00c (norm-1to1, unverified)
TEMPO_OBJ_134 = 0x8003F018; // func <- retail 0x8003f018 (norm-1to1, unverified)
TEMPO_OBJ_208 = 0x8003F0EC; // func <- retail 0x8003f0ec (norm-1to1, unverified)
SsGetCurrentPoint = 0x8003F104; // func <- retail 0x8003f104 (norm-1to1, unverified)
SsUtGetVagAtr = 0x8003F144; // func <- retail 0x8003f144 (norm-1to1, unverified)
SsUtGetVagAddr = 0x8003F380; // func <- retail 0x8003f380 (norm-1to1, unverified)
SsUtKeyOnV = 0x8003F434; // func <- retail 0x8003f434 (norm-1to1, unverified)
UT_KEYV_OBJ_174 = 0x8003F5A8; // func <- retail 0x8003f5a8 (norm-1to1, unverified)
UT_KEYV_OBJ_180 = 0x8003F5B4; // func <- retail 0x8003f5b4 (norm-1to1, unverified)
UT_KEYV_OBJ_350 = 0x8003F784; // func <- retail 0x8003f784 (norm-1to1, unverified)
UT_KEYV_OBJ_360 = 0x8003F794; // func <- retail 0x8003f794 (norm-1to1, unverified)
SsUtKeyOffV = 0x8003F7C8; // func <- retail 0x8003f7c8 (norm-1to1, unverified)
_SsVmDoAllocate = 0x8003F840; // func <- retail 0x8003f840 (norm-1to1, unverified)
VM_ALOC2_OBJ_120 = 0x8003F960; // func <- retail 0x8003f960 (norm-1to1, unverified)
_SsVmFlush = 0x8003FA64; // func <- retail 0x8003fa64 (norm-1to1, unverified)
SpuSetNoiseVoice = 0x8003FE18; // func <- retail 0x8003fe18 (norm-1to1, unverified)
_SsVmInit = 0x8003FE3C; // func <- retail 0x8003fe3c (norm-1to1, unverified)
VM_INIT_OBJ_E4 = 0x8003FF20; // func <- retail 0x8003ff20 (norm-1to1, unverified)
SpuInitMalloc = 0x8004014C; // func <- retail 0x8004014c (norm-1to1, unverified)
note2pitch = 0x800401E4; // func <- retail 0x800401e4 (norm-1to1, unverified)
note2pitch2 = 0x800402A8; // func <- retail 0x800402a8 (norm-1to1, unverified)
vmNoiseOn = 0x800403A4; // func <- retail 0x800403a4 (norm-1to1, unverified)
VM_NO1_OBJ_184 = 0x80040528; // func <- retail 0x80040528 (norm-1to1, unverified)
VM_NO1_OBJ_1F4 = 0x80040598; // func <- retail 0x80040598 (norm-1to1, unverified)
VM_NO1_OBJ_28C = 0x80040630; // func <- retail 0x80040630 (norm-1to1, unverified)
VM_NO1_OBJ_31C = 0x800406C0; // func <- retail 0x800406c0 (norm-1to1, unverified)
VM_NO1_OBJ_4A4 = 0x80040848; // func <- retail 0x80040848 (norm-1to1, unverified)
_SsVmKeyOffNow = 0x80040868; // func <- retail 0x80040868 (norm-1to1, unverified)
VM_NOWOF_OBJ_38 = 0x800408A0; // func <- retail 0x800408a0 (norm-1to1, unverified)
_SsVmKeyOnNow = 0x80040938; // func <- retail 0x80040938 (norm-1to1, unverified)
VM_NOWON_OBJ_2C8 = 0x80040C00; // func <- retail 0x80040c00 (norm-1to1, unverified)
VM_NOWON_OBJ_3D4 = 0x80040D0C; // func <- retail 0x80040d0c (norm-1to1, unverified)
VM_NOWON_OBJ_44C = 0x80040D84; // func <- retail 0x80040d84 (norm-1to1, unverified)
_SsVmVSetUp = 0x800414E4; // func <- retail 0x800414e4 (norm-1to1, unverified)
SsVabClose = 0x800415A8; // func <- retail 0x800415a8 (norm-1to1, unverified)
SpuFree = 0x8004162C; // func <- retail 0x8004162c (norm-1to1, unverified)
S_M_F_OBJ_64 = 0x80041690; // func <- retail 0x80041690 (norm-1to1, unverified)
_spu_gcSPU = 0x800416A8; // func <- retail 0x800416a8 (norm-1to1, unverified)
S_M_INT_OBJ_50 = 0x800416F8; // func <- retail 0x800416f8 (norm-1to1, unverified)
S_M_INT_OBJ_C0 = 0x80041768; // func <- retail 0x80041768 (norm-1to1, unverified)
S_M_INT_OBJ_278 = 0x80041920; // func <- retail 0x80041920 (norm-1to1, unverified)
SsVabFakeBody = 0x800419B0; // func <- retail 0x800419b0 (norm-1to1, unverified)
SsVabOpenHead = 0x80041A20; // func <- retail 0x80041a20 (norm-1to1, unverified)
SsVabOpenHeadWithMode = 0x80041AB0; // func <- retail 0x80041ab0 (norm-1to1, unverified)
VS_VH_OBJ_180 = 0x80041BA0; // func <- retail 0x80041ba0 (norm-1to1, unverified)
VS_VH_OBJ_190 = 0x80041BB0; // func <- retail 0x80041bb0 (norm-1to1, unverified)
VS_VH_OBJ_350 = 0x80041D70; // func <- retail 0x80041d70 (norm-1to1, unverified)
VS_VH_OBJ_364 = 0x80041D84; // func <- retail 0x80041d84 (norm-1to1, unverified)
VS_VH_OBJ_40C = 0x80041E2C; // func <- retail 0x80041e2c (norm-1to1, unverified)
VS_VH_OBJ_444 = 0x80041E64; // func <- retail 0x80041e64 (norm-1to1, unverified)
SpuMalloc = 0x80041E8C; // func <- retail 0x80041e8c (norm-1to1, unverified)
S_M_M_OBJ_54 = 0x80041EE0; // func <- retail 0x80041ee0 (norm-1to1, unverified)
S_M_M_OBJ_12C = 0x80041FB8; // func <- retail 0x80041fb8 (norm-1to1, unverified)
SsVabTransBodyPartly = 0x80042154; // func <- retail 0x80042154 (norm-1to1, unverified)
SpuSetTransferMode = 0x800422B4; // func <- retail 0x800422b4 (norm-1to1, unverified)
S_STM_OBJ_1C = 0x800422D0; // func <- retail 0x800422d0 (norm-1to1, unverified)
SpuWritePartly = 0x800422E8; // func <- retail 0x800422e8 (norm-1to1, unverified)
SsVabTransCompleted = 0x80042374; // func <- retail 0x80042374 (norm-1to1, unverified)
VSync = 0x8004239C; // func <- retail 0x8004239c (norm-1to1, unverified)
VSYNC_OBJ_84 = 0x80042420; // func <- retail 0x80042420 (norm-1to1, unverified)
v_wait = 0x800424E4; // func <- retail 0x800424e4 (norm-1to1, unverified)
ResetCallback = 0x80042580; // func <- retail 0x80042580 (norm-1to1, unverified)
InterruptCallback = 0x800425B0; // func <- retail 0x800425b0 (norm-1to1, unverified)
VSyncCallback = 0x80042610; // func <- retail 0x80042610 (norm-1to1, unverified)
StopCallback = 0x80042674; // func <- retail 0x80042674 (norm-1to1, unverified)
RestartCallback = 0x800426A4; // func <- retail 0x800426a4 (norm-1to1, unverified)
CheckCallback = 0x800426D4; // func <- retail 0x800426d4 (norm-1to1, unverified)
GetIntrMask = 0x800426E4; // func <- retail 0x800426e4 (norm-1to1, unverified)
SetIntrMask = 0x800426FC; // func <- retail 0x800426fc (norm-1to1, unverified)
startIntr = 0x80042718; // func <- retail 0x80042718 (norm-1to1, unverified)
trapIntr = 0x800427F4; // func <- retail 0x800427f4 (norm-1to1, unverified)
INTR_OBJ_428 = 0x800429A8; // func <- retail 0x800429a8 (norm-1to1, unverified)
setIntr = 0x800429DC; // func <- retail 0x800429dc (norm-1to1, unverified)
INTR_OBJ_514 = 0x80042A94; // func <- retail 0x80042a94 (norm-1to1, unverified)
stopIntr = 0x80042B30; // func <- retail 0x80042b30 (norm-1to1, unverified)
restartIntr = 0x80042BDC; // func <- retail 0x80042bdc (norm-1to1, unverified)
startIntrVSync = 0x80042C90; // func <- retail 0x80042c90 (norm-1to1, unverified)
trapIntrVSync = 0x80042CE8; // func <- retail 0x80042ce8 (norm-1to1, unverified)
setIntrVSync = 0x80042D60; // func <- retail 0x80042d60 (norm-1to1, unverified)
startIntrDMA = 0x80042DB8; // func <- retail 0x80042db8 (norm-1to1, unverified)
trapIntrDMA = 0x80042E08; // func <- retail 0x80042e08 (norm-1to1, unverified)
setIntrDMA = 0x80042F8C; // func <- retail 0x80042f8c (norm-1to1, unverified)
INTR_DMA_OBJ_274 = 0x8004302C; // func <- retail 0x8004302c (norm-1to1, unverified)
StSetRing = 0x80043088; // func <- retail 0x80043088 (norm-1to1, unverified)
CdGetToc = 0x800430B8; // func <- retail 0x800430b8 (norm-1to1, unverified)
CdGetToc2 = 0x800430DC; // func <- retail 0x800430dc (norm-1to1, unverified)
CdInit = 0x80043300; // func <- retail 0x80043300 (norm-1to1, unverified)
def_cbsync = 0x80043398; // func <- retail 0x80043398 (norm-1to1, unverified)
CdLastPos = 0x80043440; // func <- retail 0x80043440 (norm-1to1, unverified)
CdReset = 0x80043450; // func <- retail 0x80043450 (norm-1to1, unverified)
CdComstr = 0x800434F4; // func <- retail 0x800434f4 (norm-1to1, unverified)
CdIntstr = 0x80043528; // func <- retail 0x80043528 (norm-1to1, unverified)
CdControl = 0x800435CC; // func <- retail 0x800435cc (norm-1to1, unverified)
CdControlF = 0x80043704; // func <- retail 0x80043704 (norm-1to1, unverified)
CdControlB = 0x80043830; // func <- retail 0x80043830 (norm-1to1, unverified)
CdMix = 0x80043974; // func <- retail 0x80043974 (norm-1to1, unverified)
CdIntToPos = 0x80043A18; // func <- retail 0x80043a18 (norm-1to1, unverified)
CdPosToInt = 0x80043B1C; // func <- retail 0x80043b1c (norm-1to1, unverified)
getintr = 0x80043B9C; // func <- retail 0x80043b9c (norm-1to1, unverified)
BIOS_OBJ_64 = 0x80043C00; // func <- retail 0x80043c00 (norm-1to1, unverified)
BIOS_OBJ_26C = 0x80043E08; // func <- retail 0x80043e08 (norm-1to1, unverified)
BIOS_OBJ_36C = 0x80043F08; // func <- retail 0x80043f08 (norm-1to1, unverified)
BIOS_OBJ_3B8 = 0x80043F54; // func <- retail 0x80043f54 (norm-1to1, unverified)
BIOS_OBJ_43C = 0x80043FD8; // func <- retail 0x80043fd8 (norm-1to1, unverified)
BIOS_OBJ_4C0 = 0x8004405C; // func <- retail 0x8004405c (norm-1to1, unverified)
BIOS_OBJ_570 = 0x8004410C; // func <- retail 0x8004410c (norm-1to1, unverified)
CD_sync = 0x80044124; // func <- retail 0x80044124 (norm-1to1, unverified)
BIOS_OBJ_6B4 = 0x80044250; // func <- retail 0x80044250 (norm-1to1, unverified)
BIOS_OBJ_6E4 = 0x80044280; // func <- retail 0x80044280 (norm-1to1, unverified)
BIOS_OBJ_7DC = 0x80044378; // func <- retail 0x80044378 (norm-1to1, unverified)
CD_ready = 0x800443A4; // func <- retail 0x800443a4 (norm-1to1, unverified)
BIOS_OBJ_93C = 0x800444D8; // func <- retail 0x800444d8 (norm-1to1, unverified)
BIOS_OBJ_96C = 0x80044508; // func <- retail 0x80044508 (norm-1to1, unverified)
BIOS_OBJ_AA4 = 0x80044640; // func <- retail 0x80044640 (norm-1to1, unverified)
CD_cw = 0x80044670; // func <- retail 0x80044670 (norm-1to1, unverified)
BIOS_OBJ_DAC = 0x80044948; // func <- retail 0x80044948 (norm-1to1, unverified)
BIOS_OBJ_DDC = 0x80044978; // func <- retail 0x80044978 (norm-1to1, unverified)
BIOS_OBJ_EC8 = 0x80044A64; // func <- retail 0x80044a64 (norm-1to1, unverified)
CD_vol = 0x80044A8C; // func <- retail 0x80044a8c (norm-1to1, unverified)
CD_flush = 0x80044B14; // func <- retail 0x80044b14 (norm-1to1, unverified)
CD_initvol = 0x80044BF4; // func <- retail 0x80044bf4 (norm-1to1, unverified)
CD_initintr = 0x80044CE8; // func <- retail 0x80044ce8 (norm-1to1, unverified)
CD_init = 0x80044D38; // func <- retail 0x80044d38 (norm-1to1, unverified)
CD_datasync = 0x80044F24; // func <- retail 0x80044f24 (norm-1to1, unverified)
BIOS_OBJ_14A4 = 0x80045040; // func <- retail 0x80045040 (norm-1to1, unverified)
CD_getsector = 0x80045090; // func <- retail 0x80045090 (norm-1to1, unverified)
CD_getsector2 = 0x80045190; // func <- retail 0x80045190 (norm-1to1, unverified)
callback = 0x80045290; // func <- retail 0x80045290 (norm-1to1, unverified)
BIOS_OBJ_1728 = 0x800452C4; // func <- retail 0x800452c4 (norm-1to1, unverified)
CdSearchFile = 0x80045374; // func <- retail 0x80045374 (norm-1to1, unverified)
ISO9660_OBJ_F8 = 0x8004546C; // func <- retail 0x8004546c (norm-1to1, unverified)
_cmp = 0x80045640; // func <- retail 0x80045640 (norm-1to1, unverified)
CD_newmedia = 0x80045660; // func <- retail 0x80045660 (norm-1to1, unverified)
CD_searchdir = 0x80045940; // func <- retail 0x80045940 (norm-1to1, unverified)
CD_cachefile = 0x800459E8; // func <- retail 0x800459e8 (norm-1to1, unverified)
ISO9660_OBJ_7F4 = 0x80045B68; // func <- retail 0x80045b68 (norm-1to1, unverified)
ISO9660_OBJ_810 = 0x80045B84; // func <- retail 0x80045b84 (norm-1to1, unverified)
ISO9660_OBJ_8F4 = 0x80045C68; // func <- retail 0x80045c68 (norm-1to1, unverified)
cd_read = 0x80045C94; // func <- retail 0x80045c94 (norm-1to1, unverified)
cb_read = 0x80045D00; // func <- retail 0x80045d00 (norm-1to1, unverified)
CDREAD_OBJ_A4 = 0x80045DA4; // func <- retail 0x80045da4 (norm-1to1, unverified)
CDREAD_OBJ_1A4 = 0x80045EA4; // func <- retail 0x80045ea4 (norm-1to1, unverified)
cb_data = 0x80045FD0; // func <- retail 0x80045fd0 (norm-1to1, unverified)
cd_read_retry = 0x800460CC; // func <- retail 0x800460cc (norm-1to1, unverified)
CDREAD_OBJ_5C0 = 0x800462C0; // func <- retail 0x800462c0 (norm-1to1, unverified)
CdReadBreak = 0x800462E0; // func <- retail 0x800462e0 (norm-1to1, unverified)
CdRead = 0x8004637C; // func <- retail 0x8004637c (norm-1to1, unverified)
CDREAD_OBJ_6B8 = 0x800463B8; // func <- retail 0x800463b8 (norm-1to1, unverified)
CdReadSync = 0x80046480; // func <- retail 0x80046480 (norm-1to1, unverified)
CDREAD_OBJ_810 = 0x80046510; // func <- retail 0x80046510 (norm-1to1, unverified)
CdReadMode = 0x80046564; // func <- retail 0x80046564 (norm-1to1, unverified)
CdRead2 = 0x8004657C; // func <- retail 0x8004657c (norm-1to1, unverified)
CDREAD2_OBJ_50 = 0x800465CC; // func <- retail 0x800465cc (norm-1to1, unverified)
CdDiskReady = 0x80046630; // func <- retail 0x80046630 (norm-1to1, unverified)
TYPE_OBJ_104 = 0x80046734; // func <- retail 0x80046734 (norm-1to1, unverified)
CdGetDiskType = 0x8004674C; // func <- retail 0x8004674c (norm-1to1, unverified)
TYPE_OBJ_178 = 0x800467A8; // func <- retail 0x800467a8 (norm-1to1, unverified)
TYPE_OBJ_254 = 0x80046884; // func <- retail 0x80046884 (norm-1to1, unverified)
StClearRing = 0x8004689C; // func <- retail 0x8004689c (norm-1to1, unverified)
DsSyncCallback = 0x80046980; // func <- retail 0x80046980 (norm-1to1, unverified)
DsReadyCallback = 0x80046994; // func <- retail 0x80046994 (norm-1to1, unverified)
data_ready_callback = 0x800469CC; // func <- retail 0x800469cc (norm-1to1, unverified)
StGetBackloc = 0x80046A5C; // func <- retail 0x80046a5c (norm-1to1, unverified)
StSetStream = 0x80046ABC; // func <- retail 0x80046abc (norm-1to1, unverified)
StFreeRing = 0x80046B44; // func <- retail 0x80046b44 (norm-1to1, unverified)
C_007_OBJ_AC = 0x80046BF0; // func <- retail 0x80046bf0 (norm-1to1, unverified)
init_ring_status = 0x80046BFC; // func <- retail 0x80046bfc (norm-1to1, unverified)
StGetNext = 0x80046C38; // func <- retail 0x80046c38 (norm-1to1, unverified)
StCdInterrupt = 0x80046D1C; // func <- retail 0x80046d1c (norm-1to1, unverified)
C_011_OBJ_270 = 0x80046F8C; // func <- retail 0x80046f8c (norm-1to1, unverified)
C_011_OBJ_3D0 = 0x800470EC; // func <- retail 0x800470ec (norm-1to1, unverified)
C_011_OBJ_7BC = 0x800474D8; // func <- retail 0x800474d8 (norm-1to1, unverified)
C_011_OBJ_85C = 0x80047578; // func <- retail 0x80047578 (norm-1to1, unverified)
C_011_OBJ_900 = 0x8004761C; // func <- retail 0x8004761c (norm-1to1, unverified)
C_011_OBJ_960 = 0x8004767C; // func <- retail 0x8004767c (norm-1to1, unverified)
mem2mem = 0x8004768C; // func <- retail 0x8004768c (norm-1to1, unverified)
dma_execute = 0x800476C0; // func <- retail 0x800476c0 (norm-1to1, unverified)
C_011_OBJ_A30 = 0x8004774C; // func <- retail 0x8004774c (norm-1to1, unverified)
C_011_OBJ_A90 = 0x800477AC; // func <- retail 0x800477ac (norm-1to1, unverified)
rsin = 0x8004787C; // func <- retail 0x8004787c (norm-1to1, unverified)
sin_1 = 0x800478B8; // func <- retail 0x800478b8 (norm-1to1, unverified)
rcos = 0x80047948; // func <- retail 0x80047948 (norm-1to1, unverified)
csqrt_1 = 0x800479E8; // func <- retail 0x800479e8 (norm-1to1, unverified)
COR_05_OBJ_130 = 0x80047B18; // func <- retail 0x80047b18 (norm-1to1, unverified)
COR_05_OBJ_134 = 0x80047B1C; // func <- retail 0x80047b1c (norm-1to1, unverified)
csqrt = 0x80047B3C; // func <- retail 0x80047b3c (norm-1to1, unverified)
COR_05_OBJ_1AC = 0x80047B94; // func <- retail 0x80047b94 (norm-1to1, unverified)
catan = 0x80047BD8; // func <- retail 0x80047bd8 (norm-1to1, unverified)
COR_06_OBJ_A4 = 0x80047C7C; // func <- retail 0x80047c7c (norm-1to1, unverified)
InitGeom = 0x80047CB4; // func <- retail 0x80047cb4 (norm-1to1, unverified)
SquareRoot0 = 0x80047D3C; // func <- retail 0x80047d3c (norm-1to1, unverified)
InvSquareRoot = 0x80047DCC; // func <- retail 0x80047dcc (norm-1to1, unverified)
VectorNormalS = 0x80047E58; // func <- retail 0x80047e58 (norm-1to1, unverified)
VectorNormal = 0x80047E6C; // func <- retail 0x80047e6c (norm-1to1, unverified)
VectorNormalSS = 0x80047E98; // func <- retail 0x80047e98 (norm-1to1, unverified)
MSC02_OBJ_FC = 0x80047EC8; // func <- retail 0x80047ec8 (norm-1to1, unverified)
MatrixNormal = 0x80047F84; // func <- retail 0x80047f84 (norm-1to1, unverified)
gteMIMefunc = 0x8004806C; // func <- retail 0x8004806c (norm-1to1, unverified)
SquareRoot12 = 0x800480EC; // func <- retail 0x800480ec (norm-1to1, unverified)
MulMatrix0 = 0x8004818C; // func <- retail 0x8004818c (norm-1to1, unverified)
MulRotMatrix = 0x8004829C; // func <- retail 0x8004829c (norm-1to1, unverified)
CompMatrix = 0x8004838C; // func <- retail 0x8004838c (norm-1to1, unverified)
ApplyMatrixLV = 0x800484EC; // func <- retail 0x800484ec (norm-1to1, unverified)
ApplyRotMatrix = 0x8004864C; // func <- retail 0x8004864c (norm-1to1, unverified)
PushMatrix = 0x8004867C; // func <- retail 0x8004867c (norm-1to1, unverified)
PopMatrix = 0x8004871C; // func <- retail 0x8004871c (norm-1to1, unverified)
ReadRotMatrix = 0x800487BC; // func <- retail 0x800487bc (norm-1to1, unverified)
SetMulMatrix = 0x8004880C; // func <- retail 0x8004880c (norm-1to1, unverified)
CompMatrixLV = 0x8004891C; // func <- retail 0x8004891c (norm-1to1, unverified)
ApplyRotMatrixLV = 0x80048B6C; // func <- retail 0x80048b6c (norm-1to1, unverified)
SetMulRotMatrix = 0x80048CAC; // func <- retail 0x80048cac (norm-1to1, unverified)
MulMatrix = 0x80048D9C; // func <- retail 0x80048d9c (norm-1to1, unverified)
MulMatrix2 = 0x80048EAC; // func <- retail 0x80048eac (norm-1to1, unverified)
ApplyMatrixSV = 0x80048FBC; // func <- retail 0x80048fbc (norm-1to1, unverified)
ScaleMatrix = 0x8004901C; // func <- retail 0x8004901c (norm-1to1, unverified)
SetRotMatrix = 0x8004914C; // func <- retail 0x8004914c (norm-1to1, unverified)
SetLightMatrix = 0x8004917C; // func <- retail 0x8004917c (norm-1to1, unverified)
SetTransMatrix = 0x800491AC; // func <- retail 0x800491ac (norm-1to1, unverified)
ReadGeomOffset = 0x800491CC; // func <- retail 0x800491cc (norm-1to1, unverified)
SetBackColor = 0x800491FC; // func <- retail 0x800491fc (norm-1to1, unverified)
LightColor = 0x8004924C; // func <- retail 0x8004924c (norm-1to1, unverified)
DpqColorLight = 0x80049274; // func <- retail 0x80049274 (norm-1to1, unverified)
DpqColor3 = 0x8004929C; // func <- retail 0x8004929c (norm-1to1, unverified)
Intpl = 0x800492D8; // func <- retail 0x800492d8 (norm-1to1, unverified)
Square12 = 0x800492FC; // func <- retail 0x800492fc (norm-1to1, unverified)
Square0 = 0x80049324; // func <- retail 0x80049324 (norm-1to1, unverified)
AverageZ3 = 0x8004934C; // func <- retail 0x8004934c (norm-1to1, unverified)
AverageZ4 = 0x8004936C; // func <- retail 0x8004936c (norm-1to1, unverified)
OuterProduct12 = 0x80049390; // func <- retail 0x80049390 (norm-1to1, unverified)
OuterProduct0 = 0x800493E8; // func <- retail 0x800493e8 (norm-1to1, unverified)
Lzc = 0x80049440; // func <- retail 0x80049440 (norm-1to1, unverified)
RotTransSV = 0x8004945C; // func <- retail 0x8004945c (norm-1to1, unverified)
SquareSS12 = 0x8004948C; // func <- retail 0x8004948c (norm-1to1, unverified)
SquareSS0 = 0x800494C4; // func <- retail 0x800494c4 (norm-1to1, unverified)
SquareSL12 = 0x800494FC; // func <- retail 0x800494fc (norm-1to1, unverified)
SquareSL0 = 0x8004952C; // func <- retail 0x8004952c (norm-1to1, unverified)
RotTransPers = 0x8004955C; // func <- retail 0x8004955c (norm-1to1, unverified)
RotTransPers3 = 0x8004958C; // func <- retail 0x8004958c (norm-1to1, unverified)
RotTransPers4 = 0x8004961C; // func <- retail 0x8004961c (norm-1to1, unverified)
RotNclip4 = 0x8004969C; // func <- retail 0x8004969c (norm-1to1, unverified)
TransposeMatrix = 0x8004974C; // func <- retail 0x8004974c (norm-1to1, unverified)
RotMatrix = 0x8004978C; // func <- retail 0x8004978c (norm-1to1, unverified)
FGO_01_OBJ_64 = 0x800497F0; // func <- retail 0x800497f0 (norm-1to1, unverified)
FGO_01_OBJ_CC = 0x80049858; // func <- retail 0x80049858 (norm-1to1, unverified)
FGO_01_OBJ_160 = 0x800498EC; // func <- retail 0x800498ec (norm-1to1, unverified)
RotMatrixYXZ = 0x80049A1C; // func <- retail 0x80049a1c (norm-1to1, unverified)
FGO_02_OBJ_68 = 0x80049A84; // func <- retail 0x80049a84 (norm-1to1, unverified)
FGO_02_OBJ_CC = 0x80049AE8; // func <- retail 0x80049ae8 (norm-1to1, unverified)
FGO_02_OBJ_160 = 0x80049B7C; // func <- retail 0x80049b7c (norm-1to1, unverified)
RotMatrixZYX = 0x80049CAC; // func <- retail 0x80049cac (norm-1to1, unverified)
FGO_03_OBJ_64 = 0x80049D10; // func <- retail 0x80049d10 (norm-1to1, unverified)
FGO_03_OBJ_CC = 0x80049D78; // func <- retail 0x80049d78 (norm-1to1, unverified)
FGO_03_OBJ_160 = 0x80049E0C; // func <- retail 0x80049e0c (norm-1to1, unverified)
FGO_04_OBJ_64 = 0x80049FA0; // func <- retail 0x80049fa0 (norm-1to1, unverified)
RotMatrixY = 0x8004A0DC; // func <- retail 0x8004a0dc (norm-1to1, unverified)
FGO_05_OBJ_64 = 0x8004A140; // func <- retail 0x8004a140 (norm-1to1, unverified)
FGO_06_OBJ_64 = 0x8004A2E0; // func <- retail 0x8004a2e0 (norm-1to1, unverified)
GsPrstNF3 = 0x8004A41C; // func <- retail 0x8004a41c (norm-1to1, unverified)
GsPrstF3NL = 0x8004A53C; // func <- retail 0x8004a53c (norm-1to1, unverified)
GsPrstF3L = 0x8004A660; // func <- retail 0x8004a660 (norm-1to1, unverified)
GsPrstF3LFG = 0x8004A794; // func <- retail 0x8004a794 (norm-1to1, unverified)
GsPrstNF4 = 0x8004A8CC; // func <- retail 0x8004a8cc (norm-1to1, unverified)
GsPrstF4NL = 0x8004AA18; // func <- retail 0x8004aa18 (norm-1to1, unverified)
GsPrstF4L = 0x8004AB68; // func <- retail 0x8004ab68 (norm-1to1, unverified)
GsPrstF4LFG = 0x8004ACCC; // func <- retail 0x8004accc (norm-1to1, unverified)
GsPrstNG3 = 0x8004AE3C; // func <- retail 0x8004ae3c (norm-1to1, unverified)
GsPrstG3NL = 0x8004AF5C; // func <- retail 0x8004af5c (norm-1to1, unverified)
GsPrstG3L = 0x8004B078; // func <- retail 0x8004b078 (norm-1to1, unverified)
GsPrstG3LFG = 0x8004B1F8; // func <- retail 0x8004b1f8 (norm-1to1, unverified)
GsPrstNG4 = 0x8004B37C; // func <- retail 0x8004b37c (norm-1to1, unverified)
GsPrstG4NL = 0x8004B4C8; // func <- retail 0x8004b4c8 (norm-1to1, unverified)
GsPrstG4L = 0x8004B614; // func <- retail 0x8004b614 (norm-1to1, unverified)
GsPrstG4LFG = 0x8004B7E0; // func <- retail 0x8004b7e0 (norm-1to1, unverified)
GsPrstTNF3 = 0x8004B9AC; // func <- retail 0x8004b9ac (norm-1to1, unverified)
GsPrstTF3NL = 0x8004BACC; // func <- retail 0x8004bacc (norm-1to1, unverified)
GsPrstTF3L = 0x8004BBF0; // func <- retail 0x8004bbf0 (norm-1to1, unverified)
GsPrstTF3LFG = 0x8004BD38; // func <- retail 0x8004bd38 (norm-1to1, unverified)
GsPrstTNF4 = 0x8004BE8C; // func <- retail 0x8004be8c (norm-1to1, unverified)
GsPrstTF4NL = 0x8004BFD8; // func <- retail 0x8004bfd8 (norm-1to1, unverified)
GsPrstTF4L = 0x8004C128; // func <- retail 0x8004c128 (norm-1to1, unverified)
GsPrstTF4LFG = 0x8004C2A0; // func <- retail 0x8004c2a0 (norm-1to1, unverified)
GsPrstTNG3 = 0x8004C41C; // func <- retail 0x8004c41c (norm-1to1, unverified)
GsPrstTG3NL = 0x8004C53C; // func <- retail 0x8004c53c (norm-1to1, unverified)
GsPrstTG3L = 0x8004C658; // func <- retail 0x8004c658 (norm-1to1, unverified)
GsPrstTG3LFG = 0x8004C7EC; // func <- retail 0x8004c7ec (norm-1to1, unverified)
GsPrstTNG4 = 0x8004C98C; // func <- retail 0x8004c98c (norm-1to1, unverified)
GsPrstTG4NL = 0x8004CAD8; // func <- retail 0x8004cad8 (norm-1to1, unverified)
GsPrstTG4L = 0x8004CC24; // func <- retail 0x8004cc24 (norm-1to1, unverified)
GsPrstTG4LFG = 0x8004CE04; // func <- retail 0x8004ce04 (norm-1to1, unverified)
ratan2 = 0x8004CFEC; // func <- retail 0x8004cfec (norm-1to1, unverified)
RATAN_OBJ_BC = 0x8004D0A8; // func <- retail 0x8004d0a8 (norm-1to1, unverified)
RATAN_OBJ_148 = 0x8004D134; // func <- retail 0x8004d134 (norm-1to1, unverified)
RATAN_OBJ_15C = 0x8004D148; // func <- retail 0x8004d148 (norm-1to1, unverified)
_patch_gte = 0x8004D16C; // func <- retail 0x8004d16c (norm-1to1, unverified)
TransRot_32 = 0x8004D20C; // func <- retail 0x8004d20c (norm-1to1, unverified)
TransRotPers = 0x8004D3AC; // func <- retail 0x8004d3ac (norm-1to1, unverified)
TransRotPers3 = 0x8004D420; // func <- retail 0x8004d420 (norm-1to1, unverified)
ApplyTransposeMatrixLV = 0x8004D504; // func <- retail 0x8004d504 (norm-1to1, unverified)
GsTMDfastNF3 = 0x8004D6BC; // func <- retail 0x8004d6bc (norm-1to1, unverified)
GsTMDfastF3NL = 0x8004D7F8; // func <- retail 0x8004d7f8 (norm-1to1, unverified)
GsTMDfastF3L = 0x8004D938; // func <- retail 0x8004d938 (norm-1to1, unverified)
GsTMDfastF3LFG = 0x8004DA80; // func <- retail 0x8004da80 (norm-1to1, unverified)
GsTMDfastNF4 = 0x8004DBCC; // func <- retail 0x8004dbcc (norm-1to1, unverified)
GsTMDfastF4NL = 0x8004DD34; // func <- retail 0x8004dd34 (norm-1to1, unverified)
GsTMDfastF4L = 0x8004DEA0; // func <- retail 0x8004dea0 (norm-1to1, unverified)
GsTMDfastF4LFG = 0x8004E018; // func <- retail 0x8004e018 (norm-1to1, unverified)
GsTMDfastNG3 = 0x8004E19C; // func <- retail 0x8004e19c (norm-1to1, unverified)
GsTMDfastG3NL = 0x8004E2E4; // func <- retail 0x8004e2e4 (norm-1to1, unverified)
GsTMDfastG3L = 0x8004E424; // func <- retail 0x8004e424 (norm-1to1, unverified)
GsTMDfastG3LFG = 0x8004E5B4; // func <- retail 0x8004e5b4 (norm-1to1, unverified)
GsTMDfastNG4 = 0x8004E74C; // func <- retail 0x8004e74c (norm-1to1, unverified)
GsTMDfastG4NL = 0x8004E8CC; // func <- retail 0x8004e8cc (norm-1to1, unverified)
GsTMDfastG4L = 0x8004EA40; // func <- retail 0x8004ea40 (norm-1to1, unverified)
GsTMDfastG4LFG = 0x8004EC20; // func <- retail 0x8004ec20 (norm-1to1, unverified)
GsTMDfastTNF3 = 0x8004EE0C; // func <- retail 0x8004ee0c (norm-1to1, unverified)
GsTMDfastTF3NL = 0x8004EF78; // func <- retail 0x8004ef78 (norm-1to1, unverified)
GsTMDfastTF3L = 0x8004F0DC; // func <- retail 0x8004f0dc (norm-1to1, unverified)
GsTMDfastTF3LFG = 0x8004F24C; // func <- retail 0x8004f24c (norm-1to1, unverified)
GsTMDfastTNF4 = 0x8004F3BC; // func <- retail 0x8004f3bc (norm-1to1, unverified)
GsTMDfastTF4NL = 0x8004F55C; // func <- retail 0x8004f55c (norm-1to1, unverified)
GsTMDfastTF4L = 0x8004F6F8; // func <- retail 0x8004f6f8 (norm-1to1, unverified)
GsTMDfastTF4LFG = 0x8004F8A4; // func <- retail 0x8004f8a4 (norm-1to1, unverified)
GsTMDfastTNG3 = 0x8004FA5C; // func <- retail 0x8004fa5c (norm-1to1, unverified)
GsTMDfastTG3NL = 0x8004FBD4; // func <- retail 0x8004fbd4 (norm-1to1, unverified)
GsTMDfastTG3L = 0x8004FD30; // func <- retail 0x8004fd30 (norm-1to1, unverified)
GsTMDfastTG3LFG = 0x8004FEE4; // func <- retail 0x8004fee4 (norm-1to1, unverified)
GsTMDfastTNG4 = 0x8005009C; // func <- retail 0x8005009c (norm-1to1, unverified)
GsTMDfastTG4NL = 0x80050258; // func <- retail 0x80050258 (norm-1to1, unverified)
GsTMDfastTG4L = 0x800503F0; // func <- retail 0x800503f0 (norm-1to1, unverified)
GsTMDfastTG4LFG = 0x800505FC; // func <- retail 0x800505fc (norm-1to1, unverified)
GsSortBg = 0x8005080C; // func <- retail 0x8005080c (norm-1to1, unverified)
2D_BG0_OBJ_1B4 = 0x800509C0; // func <- retail 0x800509c0 (norm-1to1, unverified)
2D_BG0_OBJ_4A0 = 0x80050CAC; // func <- retail 0x80050cac (norm-1to1, unverified)
2D_BG0_OBJ_4D8 = 0x80050CE4; // func <- retail 0x80050ce4 (norm-1to1, unverified)
2D_BG0_OBJ_658 = 0x80050E64; // func <- retail 0x80050e64 (norm-1to1, unverified)
2D_BG0_OBJ_698 = 0x80050EA4; // func <- retail 0x80050ea4 (norm-1to1, unverified)
GsSortFastBg = 0x80051044; // func <- retail 0x80051044 (norm-1to1, unverified)
2D_BG1_OBJ_648 = 0x8005168C; // func <- retail 0x8005168c (norm-1to1, unverified)
_mk_spr_packet = 0x80051804; // func <- retail 0x80051804 (norm-1to1, unverified)
_mk_xpndsp = 0x80051844; // func <- retail 0x80051844 (norm-1to1, unverified)
2D_COM0_OBJ_EC = 0x800518F0; // func <- retail 0x800518f0 (norm-1to1, unverified)
2D_COM0_OBJ_154 = 0x80051958; // func <- retail 0x80051958 (norm-1to1, unverified)
_mk_normsp = 0x80051B0C; // func <- retail 0x80051b0c (norm-1to1, unverified)
2D_COM0_OBJ_39C = 0x80051BA0; // func <- retail 0x80051ba0 (norm-1to1, unverified)
2D_COM0_OBJ_400 = 0x80051C04; // func <- retail 0x80051c04 (norm-1to1, unverified)
ApplyMatrix = 0x80051D78; // func <- retail 0x80051d78 (norm-1to1, unverified)
GsSortLine = 0x80051DC8; // func <- retail 0x80051dc8 (norm-1to1, unverified)
_make_packet = 0x80051EA0; // func <- retail 0x80051ea0 (norm-1to1, unverified)
GsSortSprite = 0x80051F34; // func <- retail 0x80051f34 (norm-1to1, unverified)
2D_SP0_OBJ_240 = 0x80052174; // func <- retail 0x80052174 (norm-1to1, unverified)
2D_SP0_OBJ_388 = 0x800522BC; // func <- retail 0x800522bc (norm-1to1, unverified)
2D_SP0_OBJ_3C8 = 0x800522FC; // func <- retail 0x800522fc (norm-1to1, unverified)
2D_SP0_OBJ_4C0 = 0x800523F4; // func <- retail 0x800523f4 (norm-1to1, unverified)
GsSortFastSprite = 0x80052460; // func <- retail 0x80052460 (norm-1to1, unverified)
GsInitGraph = 0x800525DC; // func <- retail 0x800525dc (norm-1to1, unverified)
gpu_init = 0x80052654; // func <- retail 0x80052654 (norm-1to1, unverified)
GsInitGraph2 = 0x800527C4; // func <- retail 0x800527c4 (norm-1to1, unverified)
valiable_init = 0x8005283C; // func <- retail 0x8005283c (norm-1to1, unverified)
GsSortClear = 0x80052AA0; // func <- retail 0x80052aa0 (norm-1to1, unverified)
GS_001_OBJ_5D0 = 0x80052BAC; // func <- retail 0x80052bac (norm-1to1, unverified)
GsGetActiveBuff = 0x80052BDC; // func <- retail 0x80052bdc (norm-1to1, unverified)
GsSetDrawBuffOffset = 0x80052BEC; // func <- retail 0x80052bec (norm-1to1, unverified)
GsSetDrawBuffClip = 0x80052D00; // func <- retail 0x80052d00 (norm-1to1, unverified)
GsInitCoordinate2 = 0x80052D90; // func <- retail 0x80052d90 (norm-1to1, unverified)
GsInitCoord2param = 0x80052E0C; // func <- retail 0x80052e0c (norm-1to1, unverified)
GsSetLsMatrix = 0x80052E38; // func <- retail 0x80052e38 (norm-1to1, unverified)
GsSetLightMatrix = 0x80052E68; // func <- retail 0x80052e68 (norm-1to1, unverified)
GsSetLightMatrix2 = 0x80052F04; // func <- retail 0x80052f04 (norm-1to1, unverified)
GsMulCoord0 = 0x80052F38; // func <- retail 0x80052f38 (norm-1to1, unverified)
GsMulCoord2 = 0x80052FCC; // func <- retail 0x80052fcc (norm-1to1, unverified)
GsMulCoord3 = 0x80053050; // func <- retail 0x80053050 (norm-1to1, unverified)
print_matrix = 0x800530D4; // func <- retail 0x800530d4 (norm-1to1, unverified)
print_vector = 0x80053144; // func <- retail 0x80053144 (norm-1to1, unverified)
GsInit3D = 0x80053218; // func <- retail 0x80053218 (norm-1to1, unverified)
GsMapModelingData = 0x80053290; // func <- retail 0x80053290 (norm-1to1, unverified)
GsSetFlatLight = 0x80053328; // func <- retail 0x80053328 (norm-1to1, unverified)
GS_107_OBJ_464 = 0x8005378C; // func <- retail 0x8005378c (norm-1to1, unverified)
GS_107_OBJ_4B8 = 0x800537E0; // func <- retail 0x800537e0 (norm-1to1, unverified)
gte_set_lc = 0x80053804; // func <- retail 0x80053804 (norm-1to1, unverified)
gte_read_lc = 0x8005386C; // func <- retail 0x8005386c (norm-1to1, unverified)
SetColorMatrix = 0x800538BC; // func <- retail 0x800538bc (norm-1to1, unverified)
GsSetLightMode = 0x800538EC; // func <- retail 0x800538ec (norm-1to1, unverified)
GS_108_OBJ_6C = 0x80053958; // func <- retail 0x80053958 (norm-1to1, unverified)
GsSetFogParam = 0x80053978; // func <- retail 0x80053978 (norm-1to1, unverified)
SetVertex0 = 0x800539C8; // func <- retail 0x800539c8 (norm-1to1, unverified)
SetVertex1 = 0x800539D8; // func <- retail 0x800539d8 (norm-1to1, unverified)
SetVertex2 = 0x800539E8; // func <- retail 0x800539e8 (norm-1to1, unverified)
SetVertexTri = 0x800539F8; // func <- retail 0x800539f8 (norm-1to1, unverified)
SetRGBfifo = 0x80053A18; // func <- retail 0x80053a18 (norm-1to1, unverified)
SetIR123 = 0x80053A2C; // func <- retail 0x80053a2c (norm-1to1, unverified)
SetIR0 = 0x80053A40; // func <- retail 0x80053a40 (norm-1to1, unverified)
SetSZfifo3 = 0x80053A4C; // func <- retail 0x80053a4c (norm-1to1, unverified)
SetSZfifo4 = 0x80053A60; // func <- retail 0x80053a60 (norm-1to1, unverified)
SetSXSYfifo = 0x80053A78; // func <- retail 0x80053a78 (norm-1to1, unverified)
SetRii = 0x80053A8C; // func <- retail 0x80053a8c (norm-1to1, unverified)
SetMAC123 = 0x80053AA0; // func <- retail 0x80053aa0 (norm-1to1, unverified)
SetData32 = 0x80053AB4; // func <- retail 0x80053ab4 (norm-1to1, unverified)
SetDQA = 0x80053AC0; // func <- retail 0x80053ac0 (norm-1to1, unverified)
SetDQB = 0x80053ACC; // func <- retail 0x80053acc (norm-1to1, unverified)
SetFarColor = 0x80053AD8; // func <- retail 0x80053ad8 (norm-1to1, unverified)
GsSetAmbient = 0x80053AF8; // func <- retail 0x80053af8 (norm-1to1, unverified)
gte_rotate_z_matrix = 0x80053B20; // func <- retail 0x80053b20 (norm-1to1, unverified)
gte_scale_matrix = 0x80053BD8; // func <- retail 0x80053bd8 (norm-1to1, unverified)
gte_init = 0x80053CF8; // func <- retail 0x80053cf8 (norm-1to1, unverified)
GsGetTimInfo = 0x80053D44; // func <- retail 0x80053d44 (norm-1to1, unverified)
Gssub_make_matrix = 0x80053E28; // func <- retail 0x80053e28 (norm-1to1, unverified)
GS_123_OBJ_78 = 0x80053EA0; // func <- retail 0x80053ea0 (norm-1to1, unverified)
GS_123_OBJ_90 = 0x80053EB8; // func <- retail 0x80053eb8 (norm-1to1, unverified)
GS_123_OBJ_A8 = 0x80053ED0; // func <- retail 0x80053ed0 (norm-1to1, unverified)
GsSetRefView2 = 0x80053F6C; // func <- retail 0x80053f6c (norm-1to1, unverified)
scale_view_param = 0x80054340; // func <- retail 0x80054340 (norm-1to1, unverified)
GS_131_OBJ_4A4 = 0x80054410; // func <- retail 0x80054410 (norm-1to1, unverified)
select_max_param = 0x80054430; // func <- retail 0x80054430 (norm-1to1, unverified)
len_param = 0x800544F8; // func <- retail 0x800544f8 (norm-1to1, unverified)
GS_133_OBJ_224 = 0x80054738; // func <- retail 0x80054738 (norm-1to1, unverified)
GS_134_OBJ_224 = 0x800549FC; // func <- retail 0x800549fc (norm-1to1, unverified)
GsGetLws = 0x80054AAC; // func <- retail 0x80054aac (norm-1to1, unverified)
GS_135_OBJ_22C = 0x80054CD8; // func <- retail 0x80054cd8 (norm-1to1, unverified)
GsSetRefView2L = 0x80054DCC; // func <- retail 0x80054dcc (norm-1to1, unverified)
GS_137_OBJ_1B8 = 0x80054F84; // func <- retail 0x80054f84 (norm-1to1, unverified)
GS_137_OBJ_274 = 0x80055040; // func <- retail 0x80055040 (norm-1to1, unverified)
GS_137_OBJ_39C = 0x80055168; // func <- retail 0x80055168 (norm-1to1, unverified)
GS_137_OBJ_488 = 0x80055254; // func <- retail 0x80055254 (norm-1to1, unverified)
GS_137_OBJ_48C = 0x80055258; // func <- retail 0x80055258 (norm-1to1, unverified)
GS_137_OBJ_5EC = 0x800553B8; // func <- retail 0x800553b8 (norm-1to1, unverified)
GsLinkObject5 = 0x800553D8; // func <- retail 0x800553d8 (norm-1to1, unverified)
GsPresetObject = 0x800553F4; // func <- retail 0x800553f4 (norm-1to1, unverified)
PRESET_OBJ_108 = 0x800554E0; // func <- retail 0x800554e0 (norm-1to1, unverified)
PRESET_OBJ_14C = 0x80055524; // func <- retail 0x80055524 (norm-1to1, unverified)
PRESET_OBJ_1A8 = 0x80055580; // func <- retail 0x80055580 (norm-1to1, unverified)
PRESET_OBJ_1CC = 0x800555A4; // func <- retail 0x800555a4 (norm-1to1, unverified)
PRESET_OBJ_244 = 0x8005561C; // func <- retail 0x8005561c (norm-1to1, unverified)
PRESET_OBJ_2E8 = 0x800556C0; // func <- retail 0x800556c0 (norm-1to1, unverified)
PRESET_OBJ_380 = 0x80055758; // func <- retail 0x80055758 (norm-1to1, unverified)
PRESET_OBJ_39C = 0x80055774; // func <- retail 0x80055774 (norm-1to1, unverified)
PRESET_OBJ_3B4 = 0x8005578C; // func <- retail 0x8005578c (norm-1to1, unverified)
PRESET_OBJ_3C0 = 0x80055798; // func <- retail 0x80055798 (norm-1to1, unverified)
PRESET_OBJ_450 = 0x80055828; // func <- retail 0x80055828 (norm-1to1, unverified)
PRESET_OBJ_4B4 = 0x8005588C; // func <- retail 0x8005588c (norm-1to1, unverified)
PRESET_OBJ_574 = 0x8005594C; // func <- retail 0x8005594c (norm-1to1, unverified)
PRESET_OBJ_5C0 = 0x80055998; // func <- retail 0x80055998 (norm-1to1, unverified)
PRESET_OBJ_63C = 0x80055A14; // func <- retail 0x80055a14 (norm-1to1, unverified)
PRESET_OBJ_6E8 = 0x80055AC0; // func <- retail 0x80055ac0 (norm-1to1, unverified)
PRESET_OBJ_744 = 0x80055B1C; // func <- retail 0x80055b1c (norm-1to1, unverified)
PRESET_OBJ_748 = 0x80055B20; // func <- retail 0x80055b20 (norm-1to1, unverified)
PRESET_OBJ_754 = 0x80055B2C; // func <- retail 0x80055b2c (norm-1to1, unverified)
PRESET_OBJ_7E8 = 0x80055BC0; // func <- retail 0x80055bc0 (norm-1to1, unverified)
PRESET_OBJ_8C0 = 0x80055C98; // func <- retail 0x80055c98 (norm-1to1, unverified)
PRESET_OBJ_8CC = 0x80055CA4; // func <- retail 0x80055ca4 (norm-1to1, unverified)
PRESET_OBJ_8FC = 0x80055CD4; // func <- retail 0x80055cd4 (norm-1to1, unverified)
GsSortObject5 = 0x80055D40; // func <- retail 0x80055d40 (norm-1to1, unverified)
PRESET2_OBJ_D0 = 0x80055E10; // func <- retail 0x80055e10 (norm-1to1, unverified)
PRESET2_OBJ_13C = 0x80055E7C; // func <- retail 0x80055e7c (norm-1to1, unverified)
PRESET2_OBJ_16C = 0x80055EAC; // func <- retail 0x80055eac (norm-1to1, unverified)
PRESET2_OBJ_1A0 = 0x80055EE0; // func <- retail 0x80055ee0 (norm-1to1, unverified)
PRESET2_OBJ_210 = 0x80055F50; // func <- retail 0x80055f50 (norm-1to1, unverified)
PRESET2_OBJ_254 = 0x80055F94; // func <- retail 0x80055f94 (norm-1to1, unverified)
PRESET2_OBJ_2E0 = 0x80056020; // func <- retail 0x80056020 (norm-1to1, unverified)
PRESET2_OBJ_33C = 0x8005607C; // func <- retail 0x8005607c (norm-1to1, unverified)
PRESET2_OBJ_39C = 0x800560DC; // func <- retail 0x800560dc (norm-1to1, unverified)
PRESET2_OBJ_3E0 = 0x80056120; // func <- retail 0x80056120 (norm-1to1, unverified)
PRESET2_OBJ_424 = 0x80056164; // func <- retail 0x80056164 (norm-1to1, unverified)
PRESET2_OBJ_484 = 0x800561C4; // func <- retail 0x800561c4 (norm-1to1, unverified)
PRESET2_OBJ_4B0 = 0x800561F0; // func <- retail 0x800561f0 (norm-1to1, unverified)
PRESET2_OBJ_4DC = 0x8005621C; // func <- retail 0x8005621c (norm-1to1, unverified)
PRESET2_OBJ_528 = 0x80056268; // func <- retail 0x80056268 (norm-1to1, unverified)
PRESET2_OBJ_540 = 0x80056280; // func <- retail 0x80056280 (norm-1to1, unverified)
PRESET2_OBJ_598 = 0x800562D8; // func <- retail 0x800562d8 (norm-1to1, unverified)
PRESET2_OBJ_658 = 0x80056398; // func <- retail 0x80056398 (norm-1to1, unverified)
PRESET2_OBJ_678 = 0x800563B8; // func <- retail 0x800563b8 (norm-1to1, unverified)
PRESET2_OBJ_6D4 = 0x80056414; // func <- retail 0x80056414 (norm-1to1, unverified)
PRESET2_OBJ_6E4 = 0x80056424; // func <- retail 0x80056424 (norm-1to1, unverified)
PRESET2_OBJ_738 = 0x80056478; // func <- retail 0x80056478 (norm-1to1, unverified)
PRESET2_OBJ_76C = 0x800564AC; // func <- retail 0x800564ac (norm-1to1, unverified)
PRESET2_OBJ_7F4 = 0x80056534; // func <- retail 0x80056534 (norm-1to1, unverified)
PRESET2_OBJ_838 = 0x80056578; // func <- retail 0x80056578 (norm-1to1, unverified)
PRESET2_OBJ_8D4 = 0x80056614; // func <- retail 0x80056614 (norm-1to1, unverified)
PRESET2_OBJ_91C = 0x8005665C; // func <- retail 0x8005665c (norm-1to1, unverified)
PRESET2_OBJ_96C = 0x800566AC; // func <- retail 0x800566ac (norm-1to1, unverified)
PRESET2_OBJ_9B0 = 0x800566F0; // func <- retail 0x800566f0 (norm-1to1, unverified)
PRESET2_OBJ_9F4 = 0x80056734; // func <- retail 0x80056734 (norm-1to1, unverified)
PRESET2_OBJ_A44 = 0x80056784; // func <- retail 0x80056784 (norm-1to1, unverified)
PRESET2_OBJ_A68 = 0x800567A8; // func <- retail 0x800567a8 (norm-1to1, unverified)
PRESET2_OBJ_A88 = 0x800567C8; // func <- retail 0x800567c8 (norm-1to1, unverified)
PRESET2_OBJ_B28 = 0x80056868; // func <- retail 0x80056868 (norm-1to1, unverified)
PRESET2_OBJ_BE0 = 0x80056920; // func <- retail 0x80056920 (norm-1to1, unverified)
PRESET2_OBJ_C40 = 0x80056980; // func <- retail 0x80056980 (norm-1to1, unverified)
PRESET2_OBJ_CB4 = 0x800569F4; // func <- retail 0x800569f4 (norm-1to1, unverified)
PRESET2_OBJ_D3C = 0x80056A7C; // func <- retail 0x80056a7c (norm-1to1, unverified)
PRESET2_OBJ_D80 = 0x80056AC0; // func <- retail 0x80056ac0 (norm-1to1, unverified)
PRESET2_OBJ_E1C = 0x80056B5C; // func <- retail 0x80056b5c (norm-1to1, unverified)
PRESET2_OBJ_E64 = 0x80056BA4; // func <- retail 0x80056ba4 (norm-1to1, unverified)
PRESET2_OBJ_EB4 = 0x80056BF4; // func <- retail 0x80056bf4 (norm-1to1, unverified)
PRESET2_OBJ_EF8 = 0x80056C38; // func <- retail 0x80056c38 (norm-1to1, unverified)
PRESET2_OBJ_F3C = 0x80056C7C; // func <- retail 0x80056c7c (norm-1to1, unverified)
PRESET2_OBJ_F8C = 0x80056CCC; // func <- retail 0x80056ccc (norm-1to1, unverified)
PRESET2_OBJ_FB4 = 0x80056CF4; // func <- retail 0x80056cf4 (norm-1to1, unverified)
PRESET2_OBJ_FD8 = 0x80056D18; // func <- retail 0x80056d18 (norm-1to1, unverified)
PRESET2_OBJ_FF4 = 0x80056D34; // func <- retail 0x80056d34 (norm-1to1, unverified)
PRESET2_OBJ_103C = 0x80056D7C; // func <- retail 0x80056d7c (norm-1to1, unverified)
PRESET2_OBJ_1074 = 0x80056DB4; // func <- retail 0x80056db4 (norm-1to1, unverified)
PRESET2_OBJ_10B4 = 0x80056DF4; // func <- retail 0x80056df4 (norm-1to1, unverified)
PRESET2_OBJ_10EC = 0x80056E2C; // func <- retail 0x80056e2c (norm-1to1, unverified)
PRESET2_OBJ_112C = 0x80056E6C; // func <- retail 0x80056e6c (norm-1to1, unverified)
PRESET2_OBJ_118C = 0x80056ECC; // func <- retail 0x80056ecc (norm-1to1, unverified)
GsLinkObject4 = 0x80056F18; // func <- retail 0x80056f18 (norm-1to1, unverified)
OBJT_OBJ_C4 = 0x80056FDC; // func <- retail 0x80056fdc (norm-1to1, unverified)
OBJT_OBJ_D0 = 0x80056FE8; // func <- retail 0x80056fe8 (norm-1to1, unverified)
OBJT_OBJ_D8 = 0x80056FF0; // func <- retail 0x80056ff0 (norm-1to1, unverified)
OBJT_OBJ_E4 = 0x80056FFC; // func <- retail 0x80056ffc (norm-1to1, unverified)
OBJT_OBJ_EC = 0x80057004; // func <- retail 0x80057004 (norm-1to1, unverified)
OBJT_OBJ_F8 = 0x80057010; // func <- retail 0x80057010 (norm-1to1, unverified)
OBJT_OBJ_108 = 0x80057020; // func <- retail 0x80057020 (norm-1to1, unverified)
OBJT_OBJ_110 = 0x80057028; // func <- retail 0x80057028 (norm-1to1, unverified)
OBJT_OBJ_118 = 0x80057030; // func <- retail 0x80057030 (norm-1to1, unverified)
OBJT_OBJ_124 = 0x8005703C; // func <- retail 0x8005703c (norm-1to1, unverified)
OBJT_OBJ_12C = 0x80057044; // func <- retail 0x80057044 (norm-1to1, unverified)
OBJT_OBJ_13C = 0x80057054; // func <- retail 0x80057054 (norm-1to1, unverified)
GsSortObject4 = 0x80057094; // func <- retail 0x80057094 (norm-1to1, unverified)
OBJT2_OBJ_E0 = 0x80057174; // func <- retail 0x80057174 (norm-1to1, unverified)
OBJT2_OBJ_14C = 0x800571E0; // func <- retail 0x800571e0 (norm-1to1, unverified)
OBJT2_OBJ_1C4 = 0x80057258; // func <- retail 0x80057258 (norm-1to1, unverified)
OBJT2_OBJ_248 = 0x800572DC; // func <- retail 0x800572dc (norm-1to1, unverified)
OBJT2_OBJ_28C = 0x80057320; // func <- retail 0x80057320 (norm-1to1, unverified)
OBJT2_OBJ_358 = 0x800573EC; // func <- retail 0x800573ec (norm-1to1, unverified)
OBJT2_OBJ_3BC = 0x80057450; // func <- retail 0x80057450 (norm-1to1, unverified)
OBJT2_OBJ_468 = 0x800574FC; // func <- retail 0x800574fc (norm-1to1, unverified)
OBJT2_OBJ_4AC = 0x80057540; // func <- retail 0x80057540 (norm-1to1, unverified)
OBJT2_OBJ_558 = 0x800575EC; // func <- retail 0x800575ec (norm-1to1, unverified)
OBJT2_OBJ_5C0 = 0x80057654; // func <- retail 0x80057654 (norm-1to1, unverified)
OBJT2_OBJ_5EC = 0x80057680; // func <- retail 0x80057680 (norm-1to1, unverified)
OBJT2_OBJ_618 = 0x800576AC; // func <- retail 0x800576ac (norm-1to1, unverified)
OBJT2_OBJ_66C = 0x80057700; // func <- retail 0x80057700 (norm-1to1, unverified)
OBJT2_OBJ_6EC = 0x80057780; // func <- retail 0x80057780 (norm-1to1, unverified)
OBJT2_OBJ_7BC = 0x80057850; // func <- retail 0x80057850 (norm-1to1, unverified)
OBJT2_OBJ_7E4 = 0x80057878; // func <- retail 0x80057878 (norm-1to1, unverified)
OBJT2_OBJ_848 = 0x800578DC; // func <- retail 0x800578dc (norm-1to1, unverified)
OBJT2_OBJ_858 = 0x800578EC; // func <- retail 0x800578ec (norm-1to1, unverified)
GsTMDfastG3GL = 0x80057928; // func <- retail 0x80057928 (norm-1to1, unverified)
GsTMDfastG3GNL = 0x80057B14; // func <- retail 0x80057b14 (norm-1to1, unverified)
GsTMDfastF3GL = 0x80057C7C; // func <- retail 0x80057c7c (norm-1to1, unverified)
GsTMDfastF3GNL = 0x80057E80; // func <- retail 0x80057e80 (norm-1to1, unverified)
GsTMDfastF4GL = 0x80057FFC; // func <- retail 0x80057ffc (norm-1to1, unverified)
GsTMDfastF4GNL = 0x80058284; // func <- retail 0x80058284 (norm-1to1, unverified)
GsTMDfastG4GL = 0x8005845C; // func <- retail 0x8005845c (norm-1to1, unverified)
GsTMDfastG4GNL = 0x800586CC; // func <- retail 0x800586cc (norm-1to1, unverified)
LoadTPage = 0x80058890; // func <- retail 0x80058890 (norm-1to1, unverified)
EXT_OBJ_A8 = 0x80058938; // func <- retail 0x80058938 (norm-1to1, unverified)
EXT_OBJ_AC = 0x8005893C; // func <- retail 0x8005893c (norm-1to1, unverified)
LoadClut = 0x8005897C; // func <- retail 0x8005897c (norm-1to1, unverified)
LoadClut2 = 0x800589E4; // func <- retail 0x800589e4 (norm-1to1, unverified)
SetDefDrawEnv = 0x80058A4C; // func <- retail 0x80058a4c (norm-1to1, unverified)
EXT_OBJ_234 = 0x80058AC4; // func <- retail 0x80058ac4 (norm-1to1, unverified)
SetDefDispEnv = 0x80058B04; // func <- retail 0x80058b04 (norm-1to1, unverified)
GetTPage = 0x80058B40; // func <- retail 0x80058b40 (norm-1to1, unverified)
GetClut = 0x80058B7C; // func <- retail 0x80058b7c (norm-1to1, unverified)
DumpTPage = 0x80058B94; // func <- retail 0x80058b94 (norm-1to1, unverified)
DumpClut = 0x80058BF4; // func <- retail 0x80058bf4 (norm-1to1, unverified)
NextPrim = 0x80058C34; // func <- retail 0x80058c34 (norm-1to1, unverified)
IsEndPrim = 0x80058C50; // func <- retail 0x80058c50 (norm-1to1, unverified)
AddPrim = 0x80058C6C; // func <- retail 0x80058c6c (norm-1to1, unverified)
AddPrims = 0x80058CA8; // func <- retail 0x80058ca8 (norm-1to1, unverified)
CatPrim = 0x80058CE4; // func <- retail 0x80058ce4 (norm-1to1, unverified)
TermPrim = 0x80058D08; // func <- retail 0x80058d08 (norm-1to1, unverified)
SetSemiTrans = 0x80058D20; // func <- retail 0x80058d20 (norm-1to1, unverified)
SetShadeTex = 0x80058D48; // func <- retail 0x80058d48 (norm-1to1, unverified)
SetPolyF3 = 0x80058D70; // func <- retail 0x80058d70 (norm-1to1, unverified)
SetPolyFT3 = 0x80058D84; // func <- retail 0x80058d84 (norm-1to1, unverified)
SetPolyG3 = 0x80058D98; // func <- retail 0x80058d98 (norm-1to1, unverified)
SetPolyGT3 = 0x80058DAC; // func <- retail 0x80058dac (norm-1to1, unverified)
SetPolyF4 = 0x80058DC0; // func <- retail 0x80058dc0 (norm-1to1, unverified)
SetPolyFT4 = 0x80058DD4; // func <- retail 0x80058dd4 (norm-1to1, unverified)
SetPolyG4 = 0x80058DE8; // func <- retail 0x80058de8 (norm-1to1, unverified)
SetPolyGT4 = 0x80058DFC; // func <- retail 0x80058dfc (norm-1to1, unverified)
SetSprt8 = 0x80058E10; // func <- retail 0x80058e10 (norm-1to1, unverified)
SetSprt16 = 0x80058E24; // func <- retail 0x80058e24 (norm-1to1, unverified)
SetSprt = 0x80058E38; // func <- retail 0x80058e38 (norm-1to1, unverified)
SetTile1 = 0x80058E4C; // func <- retail 0x80058e4c (norm-1to1, unverified)
SetTile8 = 0x80058E60; // func <- retail 0x80058e60 (norm-1to1, unverified)
SetTile16 = 0x80058E74; // func <- retail 0x80058e74 (norm-1to1, unverified)
SetTile = 0x80058E88; // func <- retail 0x80058e88 (norm-1to1, unverified)
SetLineF2 = 0x80058E9C; // func <- retail 0x80058e9c (norm-1to1, unverified)
SetLineG2 = 0x80058EB0; // func <- retail 0x80058eb0 (norm-1to1, unverified)
SetLineF3 = 0x80058EC4; // func <- retail 0x80058ec4 (norm-1to1, unverified)
SetLineG3 = 0x80058EE4; // func <- retail 0x80058ee4 (norm-1to1, unverified)
SetLineF4 = 0x80058F04; // func <- retail 0x80058f04 (norm-1to1, unverified)
SetLineG4 = 0x80058F24; // func <- retail 0x80058f24 (norm-1to1, unverified)
SetDrawTPage = 0x80058F44; // func <- retail 0x80058f44 (norm-1to1, unverified)
SetDrawMove = 0x80058F70; // func <- retail 0x80058f70 (norm-1to1, unverified)
SetDrawLoad = 0x80058FD0; // func <- retail 0x80058fd0 (norm-1to1, unverified)
MargePrim = 0x8005903C; // func <- retail 0x8005903c (norm-1to1, unverified)
DumpDrawEnv = 0x80059074; // func <- retail 0x80059074 (norm-1to1, unverified)
DumpDispEnv = 0x80059188; // func <- retail 0x80059188 (norm-1to1, unverified)
ResetGraph = 0x80059234; // func <- retail 0x80059234 (norm-1to1, unverified)
SYS_OBJ_11C = 0x80059350; // func <- retail 0x80059350 (norm-1to1, unverified)
SetGraphReverse = 0x800593B8; // func <- retail 0x800593b8 (norm-1to1, unverified)
SYS_OBJ_210 = 0x80059444; // func <- retail 0x80059444 (norm-1to1, unverified)
SetGraphDebug = 0x800594CC; // func <- retail 0x800594cc (norm-1to1, unverified)
SetGraphQueue = 0x80059530; // func <- retail 0x80059530 (norm-1to1, unverified)
DrawSyncCallback = 0x800595FC; // func <- retail 0x800595fc (norm-1to1, unverified)
SetDispMask = 0x80059658; // func <- retail 0x80059658 (norm-1to1, unverified)
DrawSync = 0x800596F4; // func <- retail 0x800596f4 (norm-1to1, unverified)
checkRECT = 0x80059760; // func <- retail 0x80059760 (norm-1to1, unverified)
SYS_OBJ_604 = 0x80059838; // func <- retail 0x80059838 (norm-1to1, unverified)
SYS_OBJ_640 = 0x80059874; // func <- retail 0x80059874 (norm-1to1, unverified)
ClearImage = 0x80059888; // func <- retail 0x80059888 (norm-1to1, unverified)
ClearImage2 = 0x8005991C; // func <- retail 0x8005991c (norm-1to1, unverified)
LoadImage = 0x800599B8; // func <- retail 0x800599b8 (norm-1to1, unverified)
StoreImage = 0x80059A1C; // func <- retail 0x80059a1c (norm-1to1, unverified)
MoveImage = 0x80059A80; // func <- retail 0x80059a80 (norm-1to1, unverified)
ClearOTag = 0x80059B44; // func <- retail 0x80059b44 (norm-1to1, unverified)
ClearOTagR = 0x80059BFC; // func <- retail 0x80059bfc (norm-1to1, unverified)
DrawPrim = 0x80059C94; // func <- retail 0x80059c94 (norm-1to1, unverified)
DrawOTag = 0x80059CF4; // func <- retail 0x80059cf4 (norm-1to1, unverified)
PutDrawEnv = 0x80059D68; // func <- retail 0x80059d68 (norm-1to1, unverified)
DrawOTagEnv = 0x80059E6C; // func <- retail 0x80059e6c (norm-1to1, unverified)
GetDrawEnv = 0x80059F88; // func <- retail 0x80059f88 (norm-1to1, unverified)
PutDispEnv = 0x80059FC0; // func <- retail 0x80059fc0 (norm-1to1, unverified)
SYS_OBJ_E34 = 0x8005A068; // func <- retail 0x8005a068 (norm-1to1, unverified)
SYS_OBJ_F00 = 0x8005A134; // func <- retail 0x8005a134 (norm-1to1, unverified)
SYS_OBJ_F24 = 0x8005A158; // func <- retail 0x8005a158 (norm-1to1, unverified)
SYS_OBJ_F58 = 0x8005A18C; // func <- retail 0x8005a18c (norm-1to1, unverified)
SYS_OBJ_FD8 = 0x8005A20C; // func <- retail 0x8005a20c (norm-1to1, unverified)
SYS_OBJ_1034 = 0x8005A268; // func <- retail 0x8005a268 (norm-1to1, unverified)
SYS_OBJ_11C0 = 0x8005A3F4; // func <- retail 0x8005a3f4 (norm-1to1, unverified)
GetDispEnv = 0x8005A468; // func <- retail 0x8005a468 (norm-1to1, unverified)
GetODE = 0x8005A4A0; // func <- retail 0x8005a4a0 (norm-1to1, unverified)
SetTexWindow = 0x8005A4D0; // func <- retail 0x8005a4d0 (norm-1to1, unverified)
SetDrawArea = 0x8005A50C; // func <- retail 0x8005a50c (norm-1to1, unverified)
SetDrawOffset = 0x8005A590; // func <- retail 0x8005a590 (norm-1to1, unverified)
SetPriority = 0x8005A5D4; // func <- retail 0x8005a5d4 (norm-1to1, unverified)
SetDrawMode = 0x8005A600; // func <- retail 0x8005a600 (norm-1to1, unverified)
SetDrawEnv = 0x8005A658; // func <- retail 0x8005a658 (norm-1to1, unverified)
SYS_OBJ_1578 = 0x8005A7AC; // func <- retail 0x8005a7ac (norm-1to1, unverified)
SetDrawEnv2 = 0x8005A870; // func <- retail 0x8005a870 (norm-1to1, unverified)
SYS_OBJ_1790 = 0x8005A9C4; // func <- retail 0x8005a9c4 (norm-1to1, unverified)
SYS_OBJ_18AC = 0x8005AAE0; // func <- retail 0x8005aae0 (norm-1to1, unverified)
get_mode = 0x8005AB00; // func <- retail 0x8005ab00 (norm-1to1, unverified)
SYS_OBJ_191C = 0x8005AB50; // func <- retail 0x8005ab50 (norm-1to1, unverified)
get_ofs = 0x8005ACF0; // func <- retail 0x8005acf0 (norm-1to1, unverified)
SYS_OBJ_1AF0 = 0x8005AD24; // func <- retail 0x8005ad24 (norm-1to1, unverified)
get_tw = 0x8005AD34; // func <- retail 0x8005ad34 (norm-1to1, unverified)
SYS_OBJ_1B78 = 0x8005ADAC; // func <- retail 0x8005adac (norm-1to1, unverified)
get_dx = 0x8005ADB8; // func <- retail 0x8005adb8 (norm-1to1, unverified)
SYS_OBJ_1BC4 = 0x8005ADF8; // func <- retail 0x8005adf8 (norm-1to1, unverified)
SYS_OBJ_1C28 = 0x8005AE5C; // func <- retail 0x8005ae5c (norm-1to1, unverified)
_status = 0x8005AE68; // func <- retail 0x8005ae68 (norm-1to1, unverified)
_otc = 0x8005AE80; // func <- retail 0x8005ae80 (norm-1to1, unverified)
_clr = 0x8005AF68; // func <- retail 0x8005af68 (norm-1to1, unverified)
SYS_OBJ_1D84 = 0x8005AFB8; // func <- retail 0x8005afb8 (norm-1to1, unverified)
SYS_OBJ_1DC0 = 0x8005AFF4; // func <- retail 0x8005aff4 (norm-1to1, unverified)
SYS_OBJ_1F64 = 0x8005B198; // func <- retail 0x8005b198 (norm-1to1, unverified)
_dws = 0x8005B1C4; // func <- retail 0x8005b1c4 (norm-1to1, unverified)
SYS_OBJ_202C = 0x8005B260; // func <- retail 0x8005b260 (norm-1to1, unverified)
SYS_OBJ_21A4 = 0x8005B3D8; // func <- retail 0x8005b3d8 (norm-1to1, unverified)
_drs = 0x8005B400; // func <- retail 0x8005b400 (norm-1to1, unverified)
SYS_OBJ_2264 = 0x8005B498; // func <- retail 0x8005b498 (norm-1to1, unverified)
_ctl = 0x8005B684; // func <- retail 0x8005b684 (norm-1to1, unverified)
_cwb = 0x8005B6C0; // func <- retail 0x8005b6c0 (norm-1to1, unverified)
_cwc = 0x8005B710; // func <- retail 0x8005b710 (norm-1to1, unverified)
_param = 0x8005B75C; // func <- retail 0x8005b75c (norm-1to1, unverified)
_addque = 0x8005B78C; // func <- retail 0x8005b78c (norm-1to1, unverified)
_addque2 = 0x8005B7B0; // func <- retail 0x8005b7b0 (norm-1to1, unverified)
SYS_OBJ_25C8 = 0x8005B7FC; // func <- retail 0x8005b7fc (norm-1to1, unverified)
SYS_OBJ_26EC = 0x8005B920; // func <- retail 0x8005b920 (norm-1to1, unverified)
SYS_OBJ_27A8 = 0x8005B9DC; // func <- retail 0x8005b9dc (norm-1to1, unverified)
_exeque = 0x8005BA90; // func <- retail 0x8005ba90 (norm-1to1, unverified)
_reset = 0x8005BD7C; // func <- retail 0x8005bd7c (norm-1to1, unverified)
SYS_OBJ_2C6C = 0x8005BEA0; // func <- retail 0x8005bea0 (norm-1to1, unverified)
_sync = 0x8005BED8; // func <- retail 0x8005bed8 (norm-1to1, unverified)
SYS_OBJ_2CC4 = 0x8005BEF8; // func <- retail 0x8005bef8 (norm-1to1, unverified)
SYS_OBJ_2CDC = 0x8005BF10; // func <- retail 0x8005bf10 (norm-1to1, unverified)
set_alarm = 0x8005C020; // func <- retail 0x8005c020 (norm-1to1, unverified)
get_alarm = 0x8005C054; // func <- retail 0x8005c054 (norm-1to1, unverified)
_version = 0x8005C1C0; // func <- retail 0x8005c1c0 (norm-1to1, unverified)
memset = 0x8005C29C; // func <- retail 0x8005c29c (norm-1to1, unverified)
bzero = 0x8005C2C8; // func <- retail 0x8005c2c8 (norm-1to1, unverified)
getchar = 0x8005C2F8; // func <- retail 0x8005c2f8 (norm-1to1, unverified)
memcpy = 0x8005C324; // func <- retail 0x8005c324 (norm-1to1, unverified)
memset = 0x8005C358; // func <- retail 0x8005c358 (norm-1to1, unverified)
putchar = 0x8005C388; // func <- retail 0x8005c388 (norm-1to1, unverified)
PUTCHAR_OBJ_3C = 0x8005C3C4; // func <- retail 0x8005c3c4 (norm-1to1, unverified)
PUTCHAR_OBJ_98 = 0x8005C420; // func <- retail 0x8005c420 (norm-1to1, unverified)
toupper = 0x8005C43C; // func <- retail 0x8005c43c (norm-1to1, unverified)
tolower = 0x8005C46C; // func <- retail 0x8005c46c (norm-1to1, unverified)
rand = 0x8005C49C; // func <- retail 0x8005c49c (norm-1to1, unverified)
strcmp = 0x8005C4DC; // func <- retail 0x8005c4dc (norm-1to1, unverified)
strcpy = 0x8005C540; // func <- retail 0x8005c540 (norm-1to1, unverified)
strncmp = 0x8005C584; // func <- retail 0x8005c584 (norm-1to1, unverified)
printf = 0x8005C604; // func <- retail 0x8005c604 (norm-1to1, unverified)
prnt = 0x8005C640; // func <- retail 0x8005c640 (norm-1to1, unverified)
PRNT_OBJ_50 = 0x8005C690; // func <- retail 0x8005c690 (norm-1to1, unverified)
PRNT_OBJ_60 = 0x8005C6A0; // func <- retail 0x8005c6a0 (norm-1to1, unverified)
PRNT_OBJ_88 = 0x8005C6C8; // func <- retail 0x8005c6c8 (norm-1to1, unverified)
PRNT_OBJ_B8 = 0x8005C6F8; // func <- retail 0x8005c6f8 (norm-1to1, unverified)
PRNT_OBJ_C8 = 0x8005C708; // func <- retail 0x8005c708 (norm-1to1, unverified)
PRNT_OBJ_D0 = 0x8005C710; // func <- retail 0x8005c710 (norm-1to1, unverified)
PRNT_OBJ_EC = 0x8005C72C; // func <- retail 0x8005c72c (norm-1to1, unverified)
PRNT_OBJ_F4 = 0x8005C734; // func <- retail 0x8005c734 (norm-1to1, unverified)
PRNT_OBJ_FC = 0x8005C73C; // func <- retail 0x8005c73c (norm-1to1, unverified)
PRNT_OBJ_178 = 0x8005C7B8; // func <- retail 0x8005c7b8 (norm-1to1, unverified)
PRNT_OBJ_188 = 0x8005C7C8; // func <- retail 0x8005c7c8 (norm-1to1, unverified)
PRNT_OBJ_190 = 0x8005C7D0; // func <- retail 0x8005c7d0 (norm-1to1, unverified)
PRNT_OBJ_1E8 = 0x8005C828; // func <- retail 0x8005c828 (norm-1to1, unverified)
PRNT_OBJ_1F0 = 0x8005C830; // func <- retail 0x8005c830 (norm-1to1, unverified)
PRNT_OBJ_1F8 = 0x8005C838; // func <- retail 0x8005c838 (norm-1to1, unverified)
PRNT_OBJ_200 = 0x8005C840; // func <- retail 0x8005c840 (norm-1to1, unverified)
PRNT_OBJ_220 = 0x8005C860; // func <- retail 0x8005c860 (norm-1to1, unverified)
PRNT_OBJ_24C = 0x8005C88C; // func <- retail 0x8005c88c (norm-1to1, unverified)
PRNT_OBJ_264 = 0x8005C8A4; // func <- retail 0x8005c8a4 (norm-1to1, unverified)
PRNT_OBJ_2A4 = 0x8005C8E4; // func <- retail 0x8005c8e4 (norm-1to1, unverified)
PRNT_OBJ_2D8 = 0x8005C918; // func <- retail 0x8005c918 (norm-1to1, unverified)
PRNT_OBJ_2E8 = 0x8005C928; // func <- retail 0x8005c928 (norm-1to1, unverified)
PRNT_OBJ_340 = 0x8005C980; // func <- retail 0x8005c980 (norm-1to1, unverified)
PRNT_OBJ_34C = 0x8005C98C; // func <- retail 0x8005c98c (norm-1to1, unverified)
PRNT_OBJ_380 = 0x8005C9C0; // func <- retail 0x8005c9c0 (norm-1to1, unverified)
PRNT_OBJ_38C = 0x8005C9CC; // func <- retail 0x8005c9cc (norm-1to1, unverified)
PRNT_OBJ_3BC = 0x8005C9FC; // func <- retail 0x8005c9fc (norm-1to1, unverified)
PRNT_OBJ_3D0 = 0x8005CA10; // func <- retail 0x8005ca10 (norm-1to1, unverified)
PRNT_OBJ_3D4 = 0x8005CA14; // func <- retail 0x8005ca14 (norm-1to1, unverified)
PRNT_OBJ_470 = 0x8005CAB0; // func <- retail 0x8005cab0 (norm-1to1, unverified)
PRNT_OBJ_590 = 0x8005CBD0; // func <- retail 0x8005cbd0 (norm-1to1, unverified)
PRNT_OBJ_634 = 0x8005CC74; // func <- retail 0x8005cc74 (norm-1to1, unverified)
PRNT_OBJ_64C = 0x8005CC8C; // func <- retail 0x8005cc8c (norm-1to1, unverified)
PRNT_OBJ_654 = 0x8005CC94; // func <- retail 0x8005cc94 (norm-1to1, unverified)
memchr = 0x8005CCC8; // func <- retail 0x8005ccc8 (norm-1to1, unverified)
MEMCHR_OBJ_20 = 0x8005CCE8; // func <- retail 0x8005cce8 (norm-1to1, unverified)
strlen = 0x8005CD18; // func <- retail 0x8005cd18 (norm-1to1, unverified)
puts = 0x8005CD48; // func <- retail 0x8005cd48 (norm-1to1, unverified)
PUTS_OBJ_2C = 0x8005CD74; // func <- retail 0x8005cd74 (norm-1to1, unverified)
setjmp = 0x8005CD98; // func <- retail 0x8005cd98 (norm-1to1, unverified)
longjmp = 0x8005CDD4; // func <- retail 0x8005cdd4 (norm-1to1, unverified)
InitHeap = 0x8005CE18; // func <- retail 0x8005ce18 (norm-1to1, unverified)
FlushCache = 0x8005CE28; // func <- retail 0x8005ce28 (norm-1to1, unverified)
GPU_cw = 0x8005CE38; // func <- retail 0x8005ce38 (norm-1to1, unverified)
DeliverEvent = 0x8005CE68; // func <- retail 0x8005ce68 (norm-1to1, unverified)
OpenEvent = 0x8005CE78; // func <- retail 0x8005ce78 (norm-1to1, unverified)
CloseEvent = 0x8005CE88; // func <- retail 0x8005ce88 (norm-1to1, unverified)
WaitEvent = 0x8005CE98; // func <- retail 0x8005ce98 (norm-1to1, unverified)
TestEvent = 0x8005CEA8; // func <- retail 0x8005cea8 (norm-1to1, unverified)
EnableEvent = 0x8005CEB8; // func <- retail 0x8005ceb8 (norm-1to1, unverified)
DisableEvent = 0x8005CEC8; // func <- retail 0x8005cec8 (norm-1to1, unverified)
ReturnFromException = 0x8005CED8; // func <- retail 0x8005ced8 (norm-1to1, unverified)
ResetEntryInt = 0x8005CEE8; // func <- retail 0x8005cee8 (norm-1to1, unverified)
HookEntryInt = 0x8005CEF8; // func <- retail 0x8005cef8 (norm-1to1, unverified)
read = 0x8005CF28; // func <- retail 0x8005cf28 (norm-1to1, unverified)
write = 0x8005CF38; // func <- retail 0x8005cf38 (norm-1to1, unverified)
ChangeClearPAD = 0x8005CF48; // func <- retail 0x8005cf48 (norm-1to1, unverified)
ChangeClearRCnt = 0x8005CF58; // func <- retail 0x8005cf58 (norm-1to1, unverified)
SysEnqIntRP = 0x8005E168; // func <- retail 0x8005e168 (norm-1to1, unverified)
SysDeqIntRP = 0x8005E178; // func <- retail 0x8005e178 (norm-1to1, unverified)
MemCardInit = 0x8005FC68; // func <- retail 0x8005fc68 (norm-1to1, unverified)
MemCardStart = 0x8005FCB8; // func <- retail 0x8005fcb8 (norm-1to1, unverified)
MemCardStop = 0x8005FD18; // func <- retail 0x8005fd18 (norm-1to1, unverified)
MemCardExist = 0x8005FD58; // func <- retail 0x8005fd58 (norm-1to1, unverified)
_card_exist_back = 0x8005FDD4; // func <- retail 0x8005fdd4 (norm-1to1, unverified)
LIBMCRD_OBJ_2E4 = 0x8005FF4C; // func <- retail 0x8005ff4c (norm-1to1, unverified)
LIBMCRD_OBJ_308 = 0x8005FF70; // func <- retail 0x8005ff70 (norm-1to1, unverified)
LIBMCRD_OBJ_310 = 0x8005FF78; // func <- retail 0x8005ff78 (norm-1to1, unverified)
MemCardAccept = 0x8005FFB4; // func <- retail 0x8005ffb4 (norm-1to1, unverified)
_card_accept_back = 0x80060030; // func <- retail 0x80060030 (norm-1to1, unverified)
LIBMCRD_OBJ_404 = 0x8006006C; // func <- retail 0x8006006c (norm-1to1, unverified)
LIBMCRD_OBJ_438 = 0x800600A0; // func <- retail 0x800600a0 (norm-1to1, unverified)
LIBMCRD_OBJ_490 = 0x800600F8; // func <- retail 0x800600f8 (norm-1to1, unverified)
LIBMCRD_OBJ_4B0 = 0x80060118; // func <- retail 0x80060118 (norm-1to1, unverified)
LIBMCRD_OBJ_4DC = 0x80060144; // func <- retail 0x80060144 (norm-1to1, unverified)
LIBMCRD_OBJ_594 = 0x800601FC; // func <- retail 0x800601fc (norm-1to1, unverified)
MemCardOpen = 0x8006023C; // func <- retail 0x8006023c (norm-1to1, unverified)
LIBMCRD_OBJ_6DC = 0x80060344; // func <- retail 0x80060344 (norm-1to1, unverified)
LIBMCRD_OBJ_730 = 0x80060398; // func <- retail 0x80060398 (norm-1to1, unverified)
MemCardClose = 0x800603BC; // func <- retail 0x800603bc (norm-1to1, unverified)
MemCardReadData = 0x80060404; // func <- retail 0x80060404 (norm-1to1, unverified)
MemCardWriteData = 0x80060614; // func <- retail 0x80060614 (norm-1to1, unverified)
MemCardReadFile = 0x80060824; // func <- retail 0x80060824 (norm-1to1, unverified)
MemCardWriteFile = 0x80060AE0; // func <- retail 0x80060ae0 (norm-1to1, unverified)
MemCardGetDirentry = 0x80060D9C; // func <- retail 0x80060d9c (norm-1to1, unverified)
LIBMCRD_OBJ_1284 = 0x80060EEC; // func <- retail 0x80060eec (norm-1to1, unverified)
LIBMCRD_OBJ_12E8 = 0x80060F50; // func <- retail 0x80060f50 (norm-1to1, unverified)
LIBMCRD_OBJ_1374 = 0x80060FDC; // func <- retail 0x80060fdc (norm-1to1, unverified)
MemCardCallback = 0x80061010; // func <- retail 0x80061010 (norm-1to1, unverified)
MemCardSync = 0x80061024; // func <- retail 0x80061024 (norm-1to1, unverified)
LIBMCRD_OBJ_1460 = 0x800610C8; // func <- retail 0x800610c8 (norm-1to1, unverified)
MemCardCreateFile = 0x80061114; // func <- retail 0x80061114 (norm-1to1, unverified)
LIBMCRD_OBJ_15EC = 0x80061254; // func <- retail 0x80061254 (norm-1to1, unverified)
LIBMCRD_OBJ_16B8 = 0x80061320; // func <- retail 0x80061320 (norm-1to1, unverified)
MemCardDeleteFile = 0x80061344; // func <- retail 0x80061344 (norm-1to1, unverified)
LIBMCRD_OBJ_17E0 = 0x80061448; // func <- retail 0x80061448 (norm-1to1, unverified)
LIBMCRD_OBJ_189C = 0x80061504; // func <- retail 0x80061504 (norm-1to1, unverified)
MemCardFormat = 0x80061524; // func <- retail 0x80061524 (norm-1to1, unverified)
LIBMCRD_OBJ_1944 = 0x800615AC; // func <- retail 0x800615ac (norm-1to1, unverified)
MemCardUnformat = 0x800615BC; // func <- retail 0x800615bc (norm-1to1, unverified)
LIBMCRD_OBJ_19F8 = 0x80061660; // func <- retail 0x80061660 (norm-1to1, unverified)
_rslt_to_code = 0x80061678; // func <- retail 0x80061678 (norm-1to1, unverified)
LIBMCRD_OBJ_1A60 = 0x800616C8; // func <- retail 0x800616c8 (norm-1to1, unverified)
_callback_handler = 0x800616D0; // func <- retail 0x800616d0 (norm-1to1, unverified)
_make_file_discrpt = 0x80061770; // func <- retail 0x80061770 (norm-1to1, unverified)
_card_open = 0x8006186C; // func <- retail 0x8006186c (norm-1to1, unverified)
_card_start = 0x8006189C; // func <- retail 0x8006189c (norm-1to1, unverified)
_card_stop = 0x80061AA0; // func <- retail 0x80061aa0 (norm-1to1, unverified)
_clr_card_event = 0x80061B58; // func <- retail 0x80061b58 (norm-1to1, unverified)
strcat = 0x80061E90; // func <- retail 0x80061e90 (norm-1to1, unverified)
_bu_init = 0x80061F38; // func <- retail 0x80061f38 (norm-1to1, unverified)
open = 0x80061F48; // func <- retail 0x80061f48 (norm-1to1, unverified)
lseek = 0x80061F58; // func <- retail 0x80061f58 (norm-1to1, unverified)
close = 0x80061F68; // func <- retail 0x80061f68 (norm-1to1, unverified)
format = 0x80061F78; // func <- retail 0x80061f78 (norm-1to1, unverified)
nextfile = 0x80061F88; // func <- retail 0x80061f88 (norm-1to1, unverified)
erase = 0x80061F98; // func <- retail 0x80061f98 (norm-1to1, unverified)
firstfile = 0x80062248; // func <- retail 0x80062248 (norm-1to1, unverified)
_card_info = 0x80062258; // func <- retail 0x80062258 (norm-1to1, unverified)
_card_load = 0x80062268; // func <- retail 0x80062268 (norm-1to1, unverified)
_card_write = 0x80062278; // func <- retail 0x80062278 (norm-1to1, unverified)
_new_card = 0x80062288; // func <- retail 0x80062288 (norm-1to1, unverified)
_card_clear = 0x80062298; // func <- retail 0x80062298 (norm-1to1, unverified)
InitPAD2 = 0x80062688; // func <- retail 0x80062688 (norm-1to1, unverified)
StartPAD2 = 0x80062698; // func <- retail 0x80062698 (norm-1to1, unverified)
StopPAD2 = 0x800626A8; // func <- retail 0x800626a8 (norm-1to1, unverified)
PAD_init2 = 0x800626B8; // func <- retail 0x800626b8 (norm-1to1, unverified)
InitCARD2 = 0x800627D8; // func <- retail 0x800627d8 (norm-1to1, unverified)
StartCARD2 = 0x800627E8; // func <- retail 0x800627e8 (norm-1to1, unverified)
StopCARD2 = 0x800627F8; // func <- retail 0x800627f8 (norm-1to1, unverified)
UserFuncOpen = 0x8006289C; // func <- retail 0x8006289c (norm-1to1, unverified)
UserFuncExecute = 0x8006291C; // func <- retail 0x8006291c (norm-1to1, unverified)
UserFuncComplete = 0x80062988; // func <- retail 0x80062988 (norm-1to1, unverified)
+29 -4
View File
@@ -153,6 +153,28 @@ runtime data init (P9). **Overlay-map datapoint:** `tut_forest` (tutorial forest
"0.4" → 0x80128158. The method also re-validates the extractor — the live game's decompressed overlay ==
our LZSS decoder output for 389,400 contiguous bytes.
## Phase 3.5 — Prototype correspondence (2026-06-14)
Two CRC-verified US prototypes imported into the `bfm` Ghidra project and diffed against retail.
Full report + go/no-go: **`docs/proto-correspondence.md`**. Verdict: **NO-GO** as a Gen1 label/symbol
accelerator (neither proto carries symbols retail lacks; both have FEWER names than retail); **retain**
Sep-8 as a Phase-6 compiler-determinism corroborant and both as Gen2 overlay/engine assets.
| Build | Main EXE (region) | Load addr | SHA1 | Funcs | vs retail |
|---|---|---|---|---|---|
| Sep-8 "Master" | `SLUS_007.26` (PROTO) | 0x80010000 | `43006a31…` | 1726 | **99.6% byte-identical**; only 3 substantial funcs differ |
| Aug-31 "Demo" | `MUSASHI/USA_DEMO.EXE` (DEMO) | **0x80018000** | `6150b0f8…` | 1737 | 66% norm-identical; 862 1:1 pairs; **SC02 region** |
- All three builds detected **PsyQ 4.0.0** (independent corroboration for the Phase-6 fingerprint).
- **Sep-8 pre-release diff** (the ONLY 3 substantial code changes vs retail — a Phase-6 cross-check):
`DebugMenuHandler` 0x80011144, `CdReadSectorReadyCB` 0x8001a338 (424 ins), `SaveLoadRoutine` 0x8002b154.
- **DEMO dispatch anchors** (confidence `verified` vs the demo binary; **DEMO region — NOT valid for US
retail**): `GameModeDispatch` 0x80018b48, `gameModeHandlerTable` 0x8006ae8c (**18 entries**, same order +
same idx[10]==idx[15] duplicate as retail's 0x800629f4), `gameMode` 0x800c1eb6, debug-menu slot[7]
handler 0x800194cc (code diverged from retail `DebugMenuHandler`). NB demo `gameMode` 0x800c1eb6 ≠ retail
0x800b99de and is NOT the JP −0xEA0 delta — the demo has its own layout.
- Proto EXEs gitignored under `extracted/proto/`; programs live in the `bfm` Ghidra project (gitignored).
## Purpose and rules
1. **Every address carries a Region and a Source.** No exceptions.
@@ -487,9 +509,12 @@ overlay loader (pick room → watch `.CD` loads and the 0x8012xxxx region repopu
| Sep-8-1998 master ("Musashi Master") | Near-final US localization master ("Dual Shock Vibration" vs final "Vibration", one dialog line changed). Useful to validate diff tooling. **STAGED locally 2026-06-13 (`disks/`, CloneCD .img), CRC32 5C24728E ✓ verified.** | Hidden Palace |
| SLUS-90029 (and "Squaresoft on PlayStation Vol.2") | **Not BFM** — an **FF8** playable demo disc bundled in the BFM retail case (corrected 2026-06-13, Drew). The FF8-demo collector disc is staged in `disks/` but carries no BFM code. **No playable US BFM demo is known**; SLUS-90028 "Squaresoft on PlayStation Vol.1" (bundled with Parasite Eve) has BFM **preview FMV only** (its playable demo is Xenogears). | Drew; WebSearch (game-rave, emuparadise) |
**No debug symbols** are noted by Hidden Palace for either prototype — symbol potential is
**UNVERIFIED** (hunt for `.SYM` files, debug strings, or less-optimized code when diffing).
Whether the proto's scene-select shares tables with the retail L3 menu is an open question.
**No debug symbols** in either prototype — **VERIFIED (Phase 3.5):** both main EXEs are stripped
identically to retail (no `.SYM`, no source paths, no symbol tables; only `\DEBUG.BIN;1` + the stock
`SetGraphDebug` format string, as in retail). The disc-wide `_dbg_RE1L@55` / `C:\TIMPACK\` strings are
in retail too (shipped data, not a debug build). The proto's scene-select shares the retail debug-menu
**architecture** (identical 18-mode dispatch table) but **not** its handler code or any labels — see
`docs/proto-correspondence.md` (Q#10 resolved).
---
@@ -506,7 +531,7 @@ Whether the proto's scene-select shares tables with the retail L3 menu is an ope
| 7 | PAC types 6/7 semantics; meaning of PAC header u32 at +0x08 | Unknown to every prior source (CUE: "???"; jywjyw: "??") | Ghidra analysis of the PAC-header parser in the loader |
| 8 | **CONFIRMED position-locked (T6b)** — overlay loaded verbatim to fixed vaddr 0x80128158 (389,400 B contiguous exact match at the exact address; no relocation) | Determines splat segment strategy — simple fixed-address segments | Done |
| 9 | **RESOLVED (T8): the `\DEBUG.BIN;1` path is DEAD in retail.** `LoaderInitFileTable` 0x8001971C `CdSearchFile`s it at boot and stores the result to `debugBinPresent` 0x800747D0, but that flag is **write-only — zero readers** (only xref is the boot WRITE @0x8001979C). So nothing acts on it; the debug-loader path is dormant/dead | Possible dormant debug functionality | Done |
| 10 | Does the Aug-31 proto's title-screen scene-select share code/tables with the retail L3 menu? | Free labels for retail RE | Binary diff proto vs retail around the menu dispatch found via Q-anchor in §5 |
| 10 | **RESOLVED (Phase 3.5):** the demo's scene-select is the SAME architectural feature as the retail L3 debug menu — identical 18-entry `gameModeHandlerTable` (same order + same idx[10]==idx[15] duplicate), game mode #7 — BUT the slot-7 handler CODE diverged and the demo is **unnamed** ⇒ **no free labels**. Shared architecture, not shared labels. | Free labels for retail RE | Done — see `docs/proto-correspondence.md` |
| 11 | $gp usage: header `gp0` = 0 (verified) — is the build −G0? | Pins a compiler flag for matching (Phase 6) | Check for `$gp`-relative loads in Ghidra |
| 12 | **RESOLVED (T6b, change-detection)** — 0x80078EB2 = hp_max, 0x80078EB4 = hp_current (HP 146→136 tracked live); same {max,cur} pattern for BP at 0xEB6/0xEB8 | Correct struct field names | Done |
| 13 | Nature of `buildIdBytes` @ 0x8000BA94 (kernel-area RAM) | Used by AP-world for region detect; odd location | Inspect live; check if BIOS/kernel structure or game-written |
+100
View File
@@ -0,0 +1,100 @@
# Prototype Research Spike — Correspondence & Go/No-Go (Phase 3.5)
> **Date:** 2026-06-14 · **Evolvable `docs/` layer.** The go/no-go deliverable for Phase 3.5.
> **Question (Drew's directive):** do the two CRC-verified US prototypes *accelerate Gen1 matching*?
> Bytes are the only truth (P9/G3): proto bytes ≠ retail, so proto matches never transfer as matches.
## TL;DR — Verdict: **SPLIT**
| Claim | Verdict | Why |
|---|---|---|
| Protos accelerate Gen1 matching via **symbols / debug-info / labels / readability** | **NO-GO** | Refuted: *neither* proto carries any symbols, source paths, or labels retail lacks (Finding 1). Both have **fewer** names than retail's 952 — the label flow is retail→proto, not proto→retail. |
| Protos are worth **retaining as project assets** | **GO (modest, targeted)** | Sep-8 is a near-duplicate of retail (99.6%) → a **Phase-6 compiler-determinism corroborant**. Aug-31 is the same engine rebuilt (862 1:1 correspondences, shared dispatch architecture) → a **Gen2 overlay/engine asset** (it covers the SC02 region) + a marginal differential-analysis aid. |
**Actions:** (1) Do **not** build proto-based labeling into the Gen1 matching loop — there is no payoff. (2) Keep the imported Ghidra programs + the correspondence artifacts as committed assets. (3) The bounded lift (T6) is **one-way, retail→proto** (name the proto programs from retail to make them navigable for Phase-6/Gen2); nothing is pushed onto the retail DB (G6). (4) All proto-derived data is provenance/confidence-tagged (R13) so a later full-lift phase can verify/extend it without risk to `config/symbols.us.txt`.
## The prototypes
| Build | Main EXE | Size | Load addr | SHA1 | Funcs | PsyQ | Source |
|---|---|---|---|---|---|---|---|
| Retail (SLUS-00726) | `SLUS_007.26` | 413,696 | 0x80010000 | `143dbb89…` | 1726 | 4.0.0 | redump |
| **Sep-8 "Musashi Master"** | `SLUS_007.26` (root) | 413,696 | 0x80010000 | `43006a31…` | 1726 | 4.0.0 | Hidden Palace, CRC 5C24728E |
| **Aug-31 "Musashi Demo"** | `MUSASHI/USA_DEMO.EXE` | 415,744 | **0x80018000** | `6150b0f8…` | 1737 | 4.0.0 | Hidden Palace, CRC 1369DE07 |
- The Aug-31 demo loads 0x8000 higher; its root `LAUNCH.EXE` (24,576 B) is a bootloader owning the low 32 KB. The demo ships `MAIN.CD` (= retail size) + `SC02.CD` only → it is the **SC02 region** (tutorial/Allucaneet area). The Sep-8 master is structurally retail-identical (27 files, full MAIN+SC01–07).
- **All three share PsyQ 4.0.0** (same compiler family — independent corroboration for the Phase-6 fingerprint).
## Method (reproducible)
1. Extract proto main EXEs: `tools/bfm_extract/extract_proto_exe.py` (reuses the general `iso9660` reader; `--dir` for the demo's `MUSASHI/` subdir; magic-only validation) → `extracted/proto/` (gitignored).
2. Import into the `bfm` Ghidra project: `tools/ghidra_import.sh <exe>` (PSX loader auto-detect → auto-analysis incl. PsyQ signatures + DetectPsyQ → PsyQ-4.0 types → DumpProgramInfo).
3. Fingerprint every function (read-only): `tools/ghidra_scripts/DumpFunctionSignatures.java` → `.run/sig.<prog>.jsonl`. Three tiers so the match count is **bracketed**:
- `h_exact` — SHA1 of raw instruction bytes (strict).
- `h_norm` — SHA1 of a MIPS-normalized stream: neutralize `j`/`jal` absolute targets, `lui` high-halves, `%lo`/gp-relative address immediates (detected via Ghidra's analyzed references), branch targets → PC-relative offsets; **keep registers (regalloc) + true constants**. The cross-build "same source, relocated" tier.
- `h_seq` — SHA1 of the mnemonic-only sequence (loose).
4. Correspondence: `tools/match_protos.py` → per-tier counts + 1:1 unique `h_norm` pairs → `.run/correspondence.<proto>-vs-retail.tsv`.
Normalizer validated by anchors: `LzssDecodeSector` and `CdReadRequest` both `h_norm`-match across the Aug-31 address shift + rebuild (0x80018730→0x80020c20, 0x80019a24→0x80021ed0).
## Finding 1 — No debug symbols in either prototype (T2)
Hidden Palace's "no symbols" is now **verified**, not assumed. Per-file byte comparison (the three main EXEs and the three disc images):
- **Main EXEs are stripped identically.** Each carries only two "debug" strings: `\DEBUG.BIN;1` (the known dead loader path) and `SetGraphDebug:level:%d…` (a stock PsyQ format string, present in retail). No source paths, no symbol tables, no function names in any main EXE.
- **Disc-wide, retail and Sep-8 are debug-string-identical.** `^_dbg_RE1L@55;` is in **retail too** (not Sep-8-only); `C:\TIMPACK\OPDEMO0/1.PAT` is in both (shipped opening-demo data); `DEBUG`-substring counts are retail 63 vs sep8 59 — both pure garbage (coincidental ASCII in compressed data).
- **Correction:** an early reconnaissance pass reported "Sep-8 is less-stripped (11× DEBUG + a `dbg_` linker symbol)" as a strong go-signal. That was a **false positive** from naive disc-wide `strings|grep` counting coincidental `X:\`/`DEBUG` byte sequences. Per-file comparison shows parity. (→ rule candidate R14: verify sub-agent/recon summary *counts* against the bytes before relying on them.)
## Finding 2 — Code correspondence (T3)
Retail real functions (≥1 instruction): 1569; substantial (≥8 ins): 1179.
| Proto vs retail | h_exact (subst.) | h_norm (subst.) | h_seq (subst.) | 1:1 unique norm pairs |
|---|---|---|---|---|
| **Sep-8** | **99.4%** | **99.7%** | 99.7% | 1072 (≥8 ins) |
| **Aug-31** | 16.0% | **65.9%** | 99.0% | 690 (≥8 ins) |
- **Sep-8 is a near-duplicate of retail.** Only **3 substantial functions differ at every tier** — the pre-release diff: `DebugMenuHandler` (0x80011144, 30 ins), `CdReadSectorReadyCB` (0x8001a338, **424 ins** — the inline-LZSS-decode CD-read callback), `SaveLoadRoutine` (0x8002b154, 60 ins) — plus 3 pure-relocation diffs. Everything else is **byte-identical at the same address.** Sep-8 therefore adds essentially no new matching information; its worth is corroboration (below).
- **Aug-31 is the same engine, genuinely recompiled.** Low `h_exact` (address-shifted + rebuilt) but **66% of substantial functions are normalized-identical** and 99% share the opcode sequence — two-thirds of the engine is literally the same source→codegen, the rest minor codegen drift. **862 confident 1:1 correspondences** (`.run/correspondence.aug31_USA_DEMO.EXE-vs-retail.tsv`).
## Finding 3 — Shared dispatch architecture, diverged handlers (T4; resolves Open Q#10)
Anchor-bootstrap from the retail debug-menu anchors:
- The demo's game-mode dispatcher is `FUN_80018b48` (matched by opcode sequence to retail `GameModeDispatch` 0x80010b40; relative offset +0xB48 vs retail +0xB40 — the demo mirrors retail's early-code layout, shifted +0x8000). It decompiles to the same pattern: `(*(code*)(&handlerTable)[gameMode])()`.
- **Both handler tables have exactly 18 entries**, in the same order, **with the same internal duplicate** (index[10] == index[15] in both). retail `gameModeHandlerTable` @0x800629F4 ↔ demo table @0x8006AE8C.
- **Slot [7]** (the menu): retail `DebugMenuHandler` 0x80011144 ↔ demo 0x800194cc — **same slot, but the handler code diverged** (no norm/seq match in the demo *or* in Sep-8).
**Q#10 answer:** the demo's "press-Start scene-select" and retail's "L3 debug menu" are the **same architectural feature** (game mode #7 of an identical 18-mode dispatch table) — but the handler is **reimplemented**, and the demo is **unnamed**, so there are **no labels to lift onto retail.** The shared architecture is real; the "free labels" payoff is not.
## Go/No-Go rationale
The spike's hypotheses, each tested against the bytes:
1. *Protos carry symbols / debug info* → **refuted** (Finding 1).
2. *Protos are more readable / easier to decomp* → **no** — equally stripped; no symbols (Finding 1).
3. *The demo's title menu shares retail's debug-menu code → free labels* → **refuted** — same architecture, diverged + unnamed handler (Finding 3).
4. *A second build helps matching* → **only marginally** — Sep-8 ≈ retail (no new info); Aug-31 gives a same-source-different-address differential that can disambiguate a stubborn function, but it is not a force-multiplier and carries no names (Finding 2).
So for the *stated question* — accelerate Gen1 matching — the answer is **NO-GO**. The protos do not shorten the matching loop.
What they **are** worth (hence retain, don't discard):
- **Sep-8 → Phase 6.** A second build that is 99.6% byte-identical to retail is strong evidence the toolchain is deterministic, and it pins exactly which 3 functions changed pre-release. When the compiler triple is pinned and retail is rebuilt, Sep-8 is a free second cross-check.
- **Aug-31 → Gen2.** A second, navigable build of the engine (once named from retail) covering the **SC02 region**, with 862 mapped functions and a confirmed shared dispatch architecture — a head-start for Gen2 overlay/engine RE. Its overlays (MAIN.CD = retail size; SC02.CD) are a second sample for the Gen2 overlay work.
## Actionable outcomes
- **Keep** the imported Ghidra programs (`sep8_SLUS_007.26`, `aug31_USA_DEMO.EXE`) in the `bfm` project and the committed correspondence artifacts.
- **T6 (bounded lift, one-way retail→proto):** apply retail's names onto the proto programs via the 1:1 `h_norm` correspondences (proto-side only), export `config/symbols.proto-sep8.txt` / `config/symbols.proto-demo.txt`. This makes the protos navigable for Phase-6/Gen2 without touching `config/symbols.us.txt`.
- **Do NOT** push proto-derived names/comments onto the retail DB (the protos have nothing retail lacks; G6).
- **Deferred (Drew):** the exhaustive exact+norm+fuzzy adjudication (Version Tracking + manual near-miss review) is a *later* phase. Every proto-derived datum is tagged `unverified` unless independently confirmed against retail, so that phase can verify/extend safely (R13).
## Provenance & confidence (R13)
| Datum | Region | Confidence |
|---|---|---|
| Proto EXE sizes / SHA1s / load addrs / func counts / PsyQ version | PROTO | **verified** (read from the binaries) |
| Correspondence tier counts; 862/1072 1:1 pairs | PROTO↔US | **verified** (deterministic over the dumps) |
| Sep-8 pre-release diff = {DebugMenuHandler, CdReadSectorReadyCB, SaveLoadRoutine} | PROTO↔US | **verified** |
| Demo dispatch anchors: `GameModeDispatch` 0x80018b48, `gameModeHandlerTable` 0x8006ae8c (18), `gameMode` 0x800c1eb6, slot[7] 0x800194cc | DEMO | **verified** (decompiled + table read from the demo binary) — DEMO addresses, NOT valid for US retail |
| Individual retail↔proto function name assignments (T6 output) | PROTO | **unverified** until confirmed vs retail — quarantined to `config/symbols.proto-*.txt` |
+137
View File
@@ -0,0 +1,137 @@
# PhaseEnd — Phase 3.5: Prototype Research Spike
**Date:** 2026-06-14 · **Project Version:** 1.3.1 · **Phase Status:** Complete
> Inserted half-phase (Drew's directive at Phase-3 close): assess whether the two CRC-verified US
> prototypes accelerate Gen1 matching, **before** the build toolchain (which resumes as Phase 4).
> Filename uses an underscore (`Phase3_5`) so the glob load order sorts Phase3 → Phase3_5 → Phase4.
## Build Log
**Files created/changed and complete — do not recreate:**
- `tools/bfm_extract/extract_proto_exe.py` — extract a main EXE from a prototype disc; reuses the general
`iso9660` reader, `--dir` for subdirectories (the demo's real EXE is in `MUSASHI/`), magic-only
validation (proto sizes/SHA1s differ from retail). Companion to the retail-locked `extract_exe.py`.
- `tools/ghidra_import.sh` — reusable headless import of any PS-X EXE into the `bfm` project (PSX-loader
auto-detect → auto-analysis incl. PsyQ signatures + DetectPsyQ → PsyQ-4.0 types via `ImportPsyqGdt.java`
→ `DumpProgramInfo.java`). Precondition: MCP server stopped (exclusive project lock).
- `tools/ghidra_scripts/DumpFunctionSignatures.java` — **read-only** per-function 3-tier fingerprint
(`h_exact` raw bytes / `h_norm` MIPS-normalized / `h_seq` mnemonic-only) + ordered call targets →
`.run/sig.<prog>.jsonl`. Consumed by `match_protos.py`.
- `tools/match_protos.py` — cross-binary correspondence: per-tier counts, 1:1 unique `h_norm` pairs,
anchor sanity check; emits `config/symbols.proto-*.txt`. Consumes the `.run/sig.*.jsonl` dumps.
- `docs/proto-correspondence.md` — **the deliverable**: the evidence-backed go/no-go report.
- `config/symbols.proto-sep8.txt` (953) / `config/symbols.proto-demo.txt` (682) — retail names mapped onto
the protos via 1:1 `h_norm` correspondence. **R13-tagged: proto-side, UNVERIFIED, never merge into
`config/symbols.us.txt`.** Phase-6/Gen2 navigation aid.
- `docs/memory-map.md` — added the **Phase-3.5 block** (proto correspondence summary + DEMO dispatch
anchors), resolved **Open Q#10**, upgraded §5 proto notes ("no symbols") to **VERIFIED**.
- `.gitignore` — nested allowlist for `extracted/retail/` (3 committed files re-included); `extracted/proto/`
fully ignored.
- `tools/bfm_extract/extract.py` · `extract_exe.py` · `crosscheck.py` — DEFAULT output/extracted paths
→ `extracted/retail` (per-ROM subfolders).
- `tools/ghidra_mcp_start.sh` — `PROG` now `${1:-SLUS_007.26}` (serve a prototype by passing its name).
- **Renamed (git mv, history preserved):** `extracted/{SLUS_007.26,manifest.jsonl,manifest.sha1}` →
`extracted/retail/` (the extracted/ reorg; the 34 gitignored bulk items moved alongside).
**Local artifacts (gitignored / outside the repo — present on this machine; a fresh clone redoes them):**
- `extracted/proto/sep8_SLUS_007.26` (413,696 B, sha1 `43006a314513d962528ddc90ee496c781867366a`) +
`extracted/proto/aug31_USA_DEMO.EXE` (415,744 B, base 0x80018000, sha1
`6150b0f839972ac52214e3510e7d7f0e2c194624`) — extracted proto main EXEs.
- Ghidra `bfm` project now holds **3 programs**: `SLUS_007.26` (retail) + `sep8_SLUS_007.26` (1726 funcs)
+ `aug31_USA_DEMO.EXE` (1737 funcs); all PsyQ 4.0.0; R9-verified. (The retail DB was NOT modified.)
- `extracted/retail/` bulk (the Phase-2 disc extraction, moved here); `.run/sig.*.jsonl` ×3,
`.run/correspondence.*.tsv` ×2, `.run/proto-import.log` — scratch.
**Tools/packages installed:** None (used the existing Ghidra 12.1 + Python stack).
**Verification results (literal):**
- **Proto extraction:** sep8 `SLUS_007.26` 413,696 B, sha1 `43006a31…`; aug31 `USA_DEMO.EXE` 415,744 B,
base 0x80018000, sha1 `6150b0f8…`; both `PS-X EXE` magic verified. `extracted/` reorg: `extract.py
--verify --out extracted/retail` **PASS** (manifest paths are out_root-relative → move transparent);
git shows 3 renames; **zero ROM bulk staged**.
- **Ghidra import:** sep8 **1726 funcs / PsyQ 4.0.0**, aug31 **1737 funcs / PsyQ 4.0.0**; both
`Import succeeded` + **R9-verified** by read-only re-open.
- **T2 (debug-info):** main EXEs string-identical (retail=sep8=351, aug31=331; only `\DEBUG.BIN;1` +
`SetGraphDebug`); disc-wide retail/sep8 debug-string-identical (`_dbg_RE1L@55`, `C:\TIMPACK\` in **both**;
`DEBUG`-substrings retail 63 / sep8 59 = garbage). **No symbols in any proto — Hidden Palace claim
VERIFIED; the recon "Sep-8 less-stripped" signal REFUTED.**
- **T3 (correspondence, substantial ≥8 ins):** sep8 h_exact **99.4%** / h_norm **99.7%** / h_seq 99.7%,
1072 1:1 pairs; aug31 h_exact 16.0% / h_norm **65.9%** / h_seq 99.0%, 690 1:1 (862 all sizes). Normalizer
validated by anchors (`LzssDecodeSector`, `CdReadRequest` matched across the demo's shift+rebuild).
Sep-8→retail pre-release diff = exactly **3 substantial funcs** (`DebugMenuHandler`,
`CdReadSectorReadyCB` 424 ins, `SaveLoadRoutine`).
- **T4 (anchor):** demo dispatch table @0x8006AE8C = **18 entries** (= retail's 18, same idx[10]==idx[15]
duplicate); demo `GameModeDispatch` 0x80018b48, `gameMode` 0x800c1eb6; slot **[7]** 0x800194cc (= retail
`DebugMenuHandler` slot, **code diverged**). **Q#10 resolved.**
- **T6:** `config/symbols.proto-sep8.txt` 953 names, `config/symbols.proto-demo.txt` 682 names, R13-tagged.
**Milestone achieved:** `docs/proto-correspondence.md` states an evidence-backed go/no-go — **SPLIT:
NO-GO** as a Gen1 label/symbol accelerator (no symbols in either proto, *verified* by byte compare; the
free-label lead refuted), **GO** to retain Sep-8 (Phase-6 compiler-determinism corroborant; 99.6%
byte-identical, 3-function pre-release diff) and both (Gen2 assets) — backed by a per-proto debug-info
inventory, quantified retail↔proto correspondence (Sep-8 99.6% / Aug-31 66% norm, 862 1:1), and the
Aug-31 anchor alignment (18-entry dispatch table located, slot[7] mapped) resolving Q#10; proto-side
labels imported (`config/symbols.proto-*.txt`).
**Next:** Phase 4 — Matching-build toolchain (WSL). Start with: apt toolchain + Python 3.12 venv +
splat64 installed; submodules (asm-differ, m2c, maspsx, decomp-permuter) added and pinned.
## Deviations
| Item | Plan | Actual | Reason |
|---|---|---|---|
| Spike outcome | open (free-label lead hypothesized "GO") | NO-GO for Gen1 accel; GO only as asset | Bytes refuted the symbol/label hypothesis (T2); protos have FEWER names than retail's 952 |
| `extracted/` layout | single `extracted/` root | reorganized → `extracted/retail/` + `extracted/proto/` | Drew directive mid-phase (multiple ROMs now); inserted cleanup task |
| T6 lift direction | name protos **and** annotate retail w/ proto provenance | one-way retail→proto only; **retail untouched** | verdict: protos add nothing retail lacks → nothing to annotate; preserves crown-jewel DB (G6) |
| T6 application | apply names in the Ghidra proto programs + export | `config/symbols.proto-*.txt` only; **Ghidra-side naming deferred** | premature given NO-GO (protos are future assets); the text file is the durable record |
| T2 xref step | map debug strings → functions via MCP | moot — no new debug strings exist in any main EXE | negative finding; nothing to map |
| Recon debug signal | (4th explore agent: "Sep-8 = GO, strong") | refuted | naive disc-wide grep counted coincidental `X:\`/`DEBUG` byte sequences (→ R14) |
| `BfmVtExactMatch.java` (Version Tracking) | available for T6 on GO | not created/needed | correspondence computed in Python; the bounded lift needs no Ghidra writes |
| MCP for the spike | live MCP for xref/anchor | mostly standalone read-only `analyzeHeadless` | lock-serialized + avoids `/mcp` re-attach churn; only one decompile needed |
## Commit Message
```
feat(phase-3.5): prototype research spike — go/no-go (protos don't accelerate Gen1 matching)
- extract_proto_exe.py: subdir-aware proto main-EXE extraction (reuses iso9660); extracted
sep8 SLUS_007.26 (413,696 B) + aug31 MUSASHI/USA_DEMO.EXE (415,744 B, base 0x80018000)
- ghidra_import.sh: reusable headless import; both protos imported into the bfm project
(sep8 1726 funcs, aug31 1737 funcs, both PsyQ 4.0.0), R9-verified
- DumpFunctionSignatures.java + match_protos.py: 3-tier (exact/norm/seq) cross-binary
correspondence; MIPS normalizer validated by anchors
- FINDINGS: (T2) no debug symbols in either proto — Hidden Palace "no symbols" VERIFIED;
recon "Sep-8 less-stripped" REFUTED by per-file byte compare. (T3) Sep-8 99.6% byte-identical
to retail (only 3 funcs differ: DebugMenuHandler, CdReadSectorReadyCB, SaveLoadRoutine);
Aug-31 66% norm-identical, 862 1:1 correspondences. (T4) demo shares retail's 18-entry
game-mode dispatch architecture but the handler code diverged — Q#10 resolved
- VERDICT (docs/proto-correspondence.md): NO-GO as a Gen1 label/symbol accelerator; GO to retain
Sep-8 (Phase-6 compiler corroborant) + both (Gen2 assets); proto-side labels in
config/symbols.proto-{sep8,demo}.txt (R13-tagged, never feed symbols.us.txt)
- reorg extracted/ into per-ROM subfolders (extracted/retail/, extracted/proto/); nested
gitignore allowlist; extractor defaults updated; manifest --verify PASS
- memory-map.md: Phase-3.5 block + demo dispatch anchors; Q#10 RESOLVED; §5 proto notes VERIFIED
- ghidra_mcp_start.sh: PROG arg to serve a prototype
- rules R13 (proto-provenance/confidence tagging), R14 (verify recon counts vs bytes)
- bumps project version 1.3.0 -> 1.3.1
```
## Rules Added This Phase
| Rule | Reason |
|---|---|
| **R13 — Proto-provenance & confidence tagging.** Every prototype/cross-build-derived datum carries source build (`sep8`/`demo`/…), match tier (`exact`/`norm`/`fuzzy`), and verification status (`verified-retail` only if independently confirmed in retail; else `unverified`). `config/symbols.us.txt` and the curated retail Ghidra DB receive ONLY `verified-retail` data; unverified proto-derived names live exclusively in `config/symbols.proto-*.txt` + reports (never merged into `symbols.us.txt`); retail comments carrying proto info are prefixed `[PROTO:… UNVERIFIED]`. | Drew directive 2026-06-14: keep the deferred full-lift safe and never corrupt the crown-jewel symbol list with uncertain cross-build data. Extends G5/G6. |
| **R14 — Verify recon/sub-agent summary counts against the bytes.** A sub-agent's or reconnaissance pass's summarized counts/signals are claims, not ground truth; confirm against the actual bytes before relying on them. | A recon "Sep-8 is less-stripped (strong GO signal)" was a false positive — coincidental `X:\`/`DEBUG` byte sequences in compressed data — refuted by per-file byte comparison. Extends G1/X2. |
## PhaseEnd Changelog
**v1.3.0 → v1.3.1** — Phase 3.5 (inserted prototype research spike) complete. Both US prototypes extracted,
imported (PsyQ 4.0.0), and diffed against retail via a new read-only 3-tier signature pipeline. **Go/no-go:
the prototypes do NOT accelerate Gen1 matching** — neither carries symbols/debug-info/labels retail lacks
(*verified*; the demo's scene-select shares retail's 18-mode dispatch *architecture* but its handler code
diverged and is unnamed, so the "free labels" lead is refuted). They are **retained** as a Phase-6
compiler-determinism corroborant (Sep-8 = 99.6% byte-identical to retail; the entire pre-release delta is 3
functions) and Gen2 assets (Aug-31 = the same engine rebuilt, SC02 region, 862 1:1 correspondences). Open
Q#10 resolved. `extracted/` reorganized into per-ROM subfolders. New reusable tooling (proto extractor,
headless importer, signature dumper + matcher). Rules R13 (proto-provenance tagging) and R14 (verify recon
vs bytes). **Deferred (Drew):** the exhaustive Version-Tracking + manual near-miss full-lift to a later phase.
## 🛑 Stop Here
PhaseEnd written; `CURRENT_PHASE.md` absorbed and removed. **Drew commits AND pushes** this PhaseEnd
(R6/R8). Start a fresh session for **Phase 4 — Matching-build toolchain**. Keep this file forever.
+1 -1
View File
@@ -43,7 +43,7 @@ REPO = Path(__file__).resolve().parents[2]
BRAVE_DIR = REPO / "tools" / "brave-CUE"
BUILD_DIR = BRAVE_DIR / "_build"
SHIM = BRAVE_DIR / "posix_shim.h"
DEFAULT_EXTRACTED = REPO / "extracted"
DEFAULT_EXTRACTED = REPO / "extracted" / "retail"
def find_cc() -> str | None:
+2 -2
View File
@@ -11,7 +11,7 @@ Run from the repo root (use ``python3`` on Linux/WSL)::
python3 tools/bfm_extract/extract.py
python3 tools/bfm_extract/extract.py --list
python3 tools/bfm_extract/extract.py --bin path/to/track1.bin --out extracted
python3 tools/bfm_extract/extract.py --bin path/to/track1.bin --out extracted/retail
Output under ``extracted/`` is ROM-derived bulk; it is gitignored except the
committed EXE and the manifest. Re-running reproduces it byte-for-byte.
@@ -71,7 +71,7 @@ except ImportError: # pragma: no cover - exercised only as a loose script
# Disc staged on ext4 in Phase 2 (docs/SETUP.md §4.4).
DEFAULT_BIN = Path("disks") / "Brave Fencer Musashi (USA) (Track 1).bin"
DEFAULT_OUT = Path("extracted")
DEFAULT_OUT = Path("extracted") / "retail" # per-ROM subfolder (protos live in extracted/proto/)
# Each AUDIO track .bin carries a 150-sector (2s) INDEX 00->01 pregap before the
# audio data, per the .cue. The .DA files map to the audio (INDEX 01 onward).
+1 -1
View File
@@ -40,7 +40,7 @@ DEFAULT_BIN = (
Path("Brave Fencer Musashi (USA)")
/ "Brave Fencer Musashi (USA) (Track 1).bin"
)
DEFAULT_OUT = Path("extracted") / "SLUS_007.26"
DEFAULT_OUT = Path("extracted") / "retail" / "SLUS_007.26"
EXE_NAME = "SLUS_007.26"
EXPECTED_SIZE = 0x65000 # 413,696 bytes, header included
+156
View File
@@ -0,0 +1,156 @@
"""Extract a main executable from a Brave Fencer Musashi PROTOTYPE disc.
Companion to ``extract_exe.py``, which is deliberately retail-locked: it hard-
validates ``SLUS_007.26``'s exact size, SHA1, and PS-EXE header field *values*.
The prototypes differ from retail in all three, and one of them hides its real
executable in a subdirectory, so a separate tool is cleaner than loosening the
retail validator:
* Sep-8 1998 "Musashi Master" -> root ``SLUS_007.26`` (~413,696 B, near-retail)
* Aug-31 1998 "Musashi Demo" -> ``MUSASHI/USA_DEMO.EXE`` (415,744 B); the root
``LAUNCH.EXE`` is only a bootloader.
This tool reuses the general ``iso9660`` reader (which knows nothing about any
specific file), supports an optional ``--dir`` subdirectory path, and validates
only the ``PS-X EXE`` magic -- the header fields and SHA1 are printed for the
record (each header field is compared against retail's value purely as
information, so the diff is visible at a glance).
ROM-derived output under ``extracted/`` is gitignored; never commit the proto
binaries (the discs in ``disks/`` are gitignored and reproduce them).
Examples (run from the repo root)::
# Sep-8 Master (root SLUS_007.26)
python3 tools/bfm_extract/extract_proto_exe.py \\
--bin "disks/Brave Fencer Musashi (Sep 8, 1998 prototype)/PSX - Musashi Master.img" \\
--exe-name SLUS_007.26 --out extracted/proto/sep8_SLUS_007.26
# Aug-31 Demo (MUSASHI/USA_DEMO.EXE)
python3 tools/bfm_extract/extract_proto_exe.py \\
--bin "disks/Brave Fencer Musashi (Aug 31, 1998 prototype)/PSX - Musashi Demo.img" \\
--dir MUSASHI --exe-name USA_DEMO.EXE --out extracted/proto/aug31_USA_DEMO.EXE
# List a directory (root, or a subdir via --dir) and exit
python3 tools/bfm_extract/extract_proto_exe.py --bin <img> --list
python3 tools/bfm_extract/extract_proto_exe.py --bin <img> --dir MUSASHI --list
"""
from __future__ import annotations
import argparse
import hashlib
import sys
from pathlib import Path
# Allow running as a plain script as well as a module (mirrors extract_exe.py).
try:
from .iso9660 import Iso9660Image, Iso9660Error
from .extract_exe import PS_EXE_MAGIC, EXPECTED_HEADER_FIELDS, _u32
except ImportError: # pragma: no cover - exercised only as a loose script
sys.path.insert(0, str(Path(__file__).resolve().parent))
from iso9660 import Iso9660Image, Iso9660Error # type: ignore
from extract_exe import PS_EXE_MAGIC, EXPECTED_HEADER_FIELDS, _u32 # type: ignore
def resolve_dir(img: Iso9660Image, dirname: str | None) -> "FileRecord | None": # noqa: F821
"""Return the FileRecord for a named subdirectory, or None for the root."""
if not dirname:
return None
rec = img.find(dirname)
if rec is None or not rec.is_dir:
raise Iso9660Error(f"subdirectory not found: {dirname!r}")
return rec
def cmd_list(img: Iso9660Image, directory) -> int:
where = "<root>" if directory is None else directory.name
files = img.list_files(directory)
print(f"Volume: {img.volume_id!r} dir={where} ({len(files)} entries)")
print(f"{'LBA':>7} {'SIZE':>11} {'DIR':>3} NAME")
for rec in files:
print(
f"{rec.lba:>7} {rec.size:>11} "
f"{'yes' if rec.is_dir else ' -':>3} {rec.raw_name}"
)
return 0
def report_header(data: bytes) -> bool:
"""Print the PS-EXE magic + header fields. Returns True iff the magic is valid.
Header field values are shown against retail's for context ('same as retail'
vs 'differs') -- this is informational only; a proto is expected to differ.
"""
print("\nPS-EXE header (field values compared to retail SLUS_007.26 for context):")
magic = data[: len(PS_EXE_MAGIC)]
magic_ok = magic == PS_EXE_MAGIC
print(f" [{'PASS' if magic_ok else 'FAIL'}] magic 'PS-X EXE' found {magic!r}")
for label, off, retail in EXPECTED_HEADER_FIELDS:
actual = _u32(data, off) if len(data) >= off + 4 else None
if actual is None:
print(f" [ -- ] {label:<8} @0x{off:02X} = <truncated>")
continue
tag = "same as retail" if actual == retail else f"differs (retail 0x{retail:08X})"
print(f" [info] {label:<8} @0x{off:02X} = 0x{actual:08X} ({tag})")
return magic_ok
def cmd_extract(img: Iso9660Image, directory, exe_name: str, out_path: Path) -> int:
rec = img.find(exe_name, directory)
where = "<root>" if directory is None else directory.name
if rec is None:
print(f"FAIL: {exe_name!r} not found in {where}", file=sys.stderr)
return 1
if rec.is_dir:
print(f"FAIL: {exe_name!r} is a directory, not a file", file=sys.stderr)
return 1
print(f"Located {rec.raw_name} in {where} at LBA {rec.lba}, size {rec.size} bytes")
data = img.read_extent(rec.lba, rec.size)
out_path.parent.mkdir(parents=True, exist_ok=True)
out_path.write_bytes(data)
print(f"Wrote {len(data)} bytes -> {out_path}")
magic_ok = report_header(data)
sha1 = hashlib.sha1(data).hexdigest()
print(f"\nsize: {len(data)} bytes")
print(f"SHA1: {sha1}")
if magic_ok:
print("\nRESULT: PASS - PS-X EXE extracted (magic verified).")
return 0
print("\nRESULT: FAIL - extracted file is not a PS-X EXE.", file=sys.stderr)
return 1
def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
p = argparse.ArgumentParser(
description="Extract a main EXE from a BFM prototype disc (magic-only validation).",
)
p.add_argument("--bin", type=Path, required=True, help="Path to the proto MODE2/2352 data track (.img/.bin).")
p.add_argument("--dir", dest="subdir", default=None, help="Subdirectory holding the EXE (e.g. MUSASHI). Default: root.")
p.add_argument("--exe-name", default=None, help="EXE file name to extract (e.g. SLUS_007.26, USA_DEMO.EXE).")
p.add_argument("--out", type=Path, default=None, help="Output path for the extracted executable.")
p.add_argument("--list", action="store_true", help="List the directory (root, or --dir) and exit (no extraction).")
return p.parse_args(argv)
def main(argv: list[str] | None = None) -> int:
args = parse_args(argv)
try:
with Iso9660Image(args.bin) as img:
directory = resolve_dir(img, args.subdir)
if args.list:
return cmd_list(img, directory)
if not args.exe_name or args.out is None:
print("ERROR: --exe-name and --out are required (or use --list).", file=sys.stderr)
return 2
return cmd_extract(img, directory, args.exe_name, args.out)
except Iso9660Error as e:
print(f"ERROR: {e}", file=sys.stderr)
return 2
if __name__ == "__main__":
raise SystemExit(main())
+49
View File
@@ -0,0 +1,49 @@
#!/usr/bin/env bash
# tools/ghidra_import.sh <exe-path>
#
# Import a PS-X EXE into the "bfm" Ghidra project HEADLESS, the same way the retail
# SLUS_007.26 was imported (Phase 1): auto-detect the PSX loader, run auto-analysis
# (which applies PsyQ Signatures + DetectPsyQ), import the PsyQ 4.0 type archive
# (ImportPsyqGdt.java), then DumpProgramInfo.java to print language/base/func-count/
# PsyQ version. analyzeHeadless commits + saves the imported program on a clean exit.
#
# The program name in the project defaults to the EXE's basename (e.g. importing
# extracted/proto/sep8_SLUS_007.26 creates program "sep8_SLUS_007.26").
#
# PRECONDITION: the MCP server must be STOPPED (the project lock is exclusive).
# Run tools/ghidra_mcp_stop.sh first. Used in Phase 3.5 to add the two prototypes
# (sep8_SLUS_007.26, aug31_USA_DEMO.EXE) alongside retail; reusable for any PS-X EXE.
set -uo pipefail
EXE="${1:?usage: ghidra_import.sh <path-to-ps-x-exe>}"
GHIDRA="${GHIDRA_INSTALL_DIR:-$HOME/ghidra_12.1_PUBLIC}"
PROJ_DIR="$HOME/bfm-decomp/ghidra"
PROJ="bfm"
SCRIPTS="$HOME/bfm-decomp/tools/ghidra_scripts"
GDT="${PSYQ_GDT:-$GHIDRA/Ghidra/Extensions/ghidra_psx_ldr/data/psyq400.gdt}"
PORT="8080"
[ -f "$EXE" ] || { echo "import: ERROR — exe not found: $EXE" >&2; exit 2; }
[ -f "$GDT" ] || { echo "import: ERROR — PsyQ gdt not found: $GDT" >&2; exit 2; }
# Guard: a serving MCP server holds the exclusive project lock — refuse to collide.
if ss -tln 2>/dev/null | grep -qE ":$PORT([^0-9]|$)"; then
echo "import: ERROR — MCP server serving on :$PORT. Run tools/ghidra_mcp_stop.sh first." >&2
exit 2
fi
# Clear a stale lock only when no analyzer is alive (mirrors ghidra_mcp_start.sh).
if ! pgrep -f 'ghidra.app.util.headless.AnalyzeHeadless' >/dev/null 2>&1; then
rm -f "$PROJ_DIR/$PROJ.lock" "$PROJ_DIR/$PROJ.lock~" 2>/dev/null || true
fi
echo "import: ===== importing '$EXE' into project '$PROJ' ====="
echo "import: gdt=$GDT (program name = basename; -overwrite for idempotent re-import)"
"$GHIDRA/support/analyzeHeadless" "$PROJ_DIR" "$PROJ" \
-import "$EXE" -overwrite \
-scriptPath "$SCRIPTS" \
-postScript ImportPsyqGdt.java "$GDT" \
-postScript DumpProgramInfo.java
rc=$?
echo "import: ===== analyzeHeadless exit=$rc for '$EXE' ====="
exit $rc
+5 -2
View File
@@ -2,7 +2,10 @@
# tools/ghidra_mcp_start.sh
# Idempotent, fully-detached start of the headless GhidrAssistMCP server for BFM,
# using BfmMcpServer.java (server + clean save-on-shutdown — see that file).
# Serves SLUS_007.26 (the "bfm" Ghidra project) over MCP on 127.0.0.1:8080.
# Serves a program from the "bfm" Ghidra project over MCP on 127.0.0.1:8080.
# Program defaults to SLUS_007.26 (retail); pass an alternate as $1 to serve a
# prototype, e.g. tools/ghidra_mcp_start.sh sep8_SLUS_007.26
# (only ONE program is served per session; stop with ghidra_mcp_stop.sh to switch).
#
# Designed to run from a SessionStart hook:
# * no-op if the server is already serving on :8080 (safe to run every session),
@@ -20,7 +23,7 @@ set -uo pipefail
GHIDRA="${GHIDRA_INSTALL_DIR:-$HOME/ghidra_12.1_PUBLIC}"
PROJ_DIR="$HOME/bfm-decomp/ghidra"
PROJ="bfm"
PROG="SLUS_007.26"
PROG="${1:-SLUS_007.26}" # program to serve; default retail, pass a proto name to override
PORT="8080"
RUNDIR="$HOME/bfm-decomp/.run"; mkdir -p "$RUNDIR" # project-local runtime scratch (never /tmp)
LOG="$RUNDIR/ghidra-mcp.log"
@@ -0,0 +1,167 @@
// DumpFunctionSignatures.java — headless, READ-ONLY: dump a per-function fingerprint
// for cross-binary correspondence (Phase 3.5 proto<->retail diff). Three tiers so the
// match count is bracketed and trustworthy even if the middle tier is imperfect:
//
// h_exact : SHA1 of the raw instruction bytes (strict; same bytes, usually same addr).
// h_norm : SHA1 of a MIPS-normalized instruction stream that neutralizes ONLY the
// address/relocation-sensitive fields (j/jal absolute targets, lui high
// halves, %lo / gp-relative address immediates detected via Ghidra's
// analyzed references) and rewrites branch targets as PC-relative offsets,
// while KEEPING registers (regalloc matters) and true constants. This is the
// "same source compiled to a different address" workhorse.
// h_seq : SHA1 of the mnemonic-only sequence (loose; same ops, any regalloc/consts).
//
// Also emits nins, nbytes, ncalls and the ORDERED list of direct-call target addresses
// (for the T4 anchor-bootstrap call-graph BFS). The PSX loader emits no relocations, so
// normalization is derived from the analyzed disassembly, not a reloc table.
//
// analyzeHeadless ~/bfm-decomp/ghidra bfm -process <PROG> -noanalysis -readOnly \
// -scriptPath ~/bfm-decomp/tools/ghidra_scripts -postScript DumpFunctionSignatures.java
//
// Output: ~/bfm-decomp/.run/sig.<PROG>.jsonl (gitignored; R12 — never /tmp).
import ghidra.app.script.GhidraScript;
import ghidra.program.model.address.Address;
import ghidra.program.model.lang.Register;
import ghidra.program.model.listing.Function;
import ghidra.program.model.listing.FunctionIterator;
import ghidra.program.model.listing.Instruction;
import ghidra.program.model.listing.Listing;
import ghidra.program.model.scalar.Scalar;
import ghidra.program.model.symbol.RefType;
import ghidra.program.model.symbol.Reference;
import ghidra.program.model.symbol.SourceType;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.util.ArrayList;
public class DumpFunctionSignatures extends GhidraScript {
private static String hex(byte[] b) {
StringBuilder sb = new StringBuilder(b.length * 2);
for (byte x : b) sb.append(Character.forDigit((x >> 4) & 0xF, 16)).append(Character.forDigit(x & 0xF, 16));
return sb.toString();
}
private static String jsonEsc(String s) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '"' || c == '\\') sb.append('\\').append(c);
else if (c < 0x20) sb.append(String.format("\\u%04x", (int) c));
else sb.append(c);
}
return sb.toString();
}
// Normalized token for one instruction: mnemonic + per-operand canonical form.
private String normToken(Instruction ins) {
StringBuilder sb = new StringBuilder();
String m = ins.getMnemonicString();
sb.append(m);
String ml = m.toLowerCase();
boolean isAbsJump = ml.equals("j") || ml.equals("jal"); // J-type absolute target
int nops = ins.getNumOperands();
for (int i = 0; i < nops; i++) {
sb.append('|');
Reference[] refs = ins.getOperandReferences(i);
boolean flowRef = false, dataRef = false;
Address flowTgt = null;
for (Reference r : refs) {
RefType rt = r.getReferenceType();
if (rt.isFlow()) { flowRef = true; flowTgt = r.getToAddress(); }
if (rt.isData() || rt.isRead() || rt.isWrite()) dataRef = true;
}
Object[] objs = ins.getOpObjects(i);
boolean hasGp = false;
for (Object o : objs)
if (o instanceof Register && ((Register) o).getName().equals("gp")) hasGp = true;
// Direct flow target operand.
if (flowRef && flowTgt != null) {
if (isAbsJump) sb.append("@J"); // absolute j/jal -> neutralize
else sb.append("rel").append(flowTgt.subtract(ins.getAddress())); // PC-relative branch -> keep offset
continue;
}
// lui: the immediate is the high half of an address (PSX convention) -> neutralize.
if (ml.equals("lui")) {
for (Object o : objs) {
if (o instanceof Register) sb.append(((Register) o).getName()).append(',');
else if (o instanceof Scalar) sb.append("@HI,");
else sb.append("?,");
}
continue;
}
// Generic operand: keep registers + true constants; neutralize address immediates.
for (Object o : objs) {
if (o instanceof Register) {
sb.append(((Register) o).getName()).append(',');
} else if (o instanceof Scalar) {
if (dataRef || hasGp) sb.append("@LO,"); // %lo / gp-relative address
else sb.append(Long.toString(((Scalar) o).getValue())).append(','); // true constant
} else if (o instanceof Address) {
sb.append("@A,"); // resolved absolute address operand
} else {
sb.append(o.toString()).append(',');
}
}
}
return sb.toString();
}
@Override
public void run() throws Exception {
Listing listing = currentProgram.getListing();
String prog = currentProgram.getName();
Path out = Paths.get(System.getProperty("user.home"), "bfm-decomp", ".run", "sig." + prog + ".jsonl");
Files.createDirectories(out.getParent());
StringBuilder file = new StringBuilder();
FunctionIterator fns = currentProgram.getFunctionManager().getFunctions(true);
int nfuncs = 0;
while (fns.hasNext()) {
Function f = fns.next();
if (f.isExternal() || f.isThunk()) continue;
MessageDigest mdE = MessageDigest.getInstance("SHA-1");
MessageDigest mdN = MessageDigest.getInstance("SHA-1");
MessageDigest mdS = MessageDigest.getInstance("SHA-1");
int nins = 0, nbytes = 0;
ArrayList<String> calls = new ArrayList<>();
for (Instruction ins : listing.getInstructions(f.getBody(), true)) {
byte[] raw;
try { raw = ins.getBytes(); } catch (Exception e) { raw = new byte[0]; }
mdE.update(raw);
mdN.update(normToken(ins).getBytes("UTF-8"));
mdN.update((byte) '\n');
mdS.update(ins.getMnemonicString().getBytes("UTF-8"));
mdS.update((byte) ' ');
nins++;
nbytes += ins.getLength();
if (ins.getFlowType() != null && ins.getFlowType().isCall()) {
for (Reference r : ins.getReferencesFrom())
if (r.getReferenceType().isCall()) calls.add(r.getToAddress().toString());
}
}
String src = (f.getSymbol() != null) ? f.getSymbol().getSource().toString() : "UNKNOWN";
StringBuilder cj = new StringBuilder();
for (int i = 0; i < calls.size(); i++) {
if (i > 0) cj.append(',');
cj.append('"').append(calls.get(i)).append('"');
}
file.append("{\"addr\":\"0x").append(f.getEntryPoint().toString())
.append("\",\"name\":\"").append(jsonEsc(f.getName()))
.append("\",\"src\":\"").append(src)
.append("\",\"nins\":").append(nins)
.append(",\"nbytes\":").append(nbytes)
.append(",\"ncalls\":").append(calls.size())
.append(",\"h_exact\":\"").append(hex(mdE.digest()))
.append("\",\"h_norm\":\"").append(hex(mdN.digest()))
.append("\",\"h_seq\":\"").append(hex(mdS.digest()))
.append("\",\"calls\":[").append(cj).append("]}\n");
nfuncs++;
}
Files.write(out, file.toString().getBytes("UTF-8"));
println("BFMSIG wrote " + nfuncs + " function signatures -> " + out);
}
}
+140
View File
@@ -0,0 +1,140 @@
#!/usr/bin/env python3
"""Cross-binary function correspondence for the BFM prototype spike (Phase 3.5).
Reads the per-function signature dumps produced by
``tools/ghidra_scripts/DumpFunctionSignatures.java`` (``.run/sig.<prog>.jsonl``)
and reports, for each prototype vs retail, how many retail functions have a
counterpart at three tiers:
exact : identical raw instruction bytes (strict)
norm : identical MIPS-normalized stream (same source, relocation-insensitive)
seq : identical mnemonic-only sequence (loose; same ops, any regalloc/consts)
Counts are reported at two size thresholds -- all functions (>=1 instruction) and
"substantial" functions (>= MIN_SUBSTANTIAL instructions) -- so trivial-stub
collisions (e.g. ``jr ra; nop``) don't inflate the headline number. The trustworthy
output is the set of **1:1 unique h_norm correspondences** (a retail function whose
normalized stream matches exactly one proto function and vice-versa); these are
written to ``.run/correspondence.<proto>-vs-retail.tsv`` for T4/T6.
A small anchor sanity-check confirms the normalizer by checking known retail
functions (LZSS decoder, game-mode dispatch, loader) map into each proto.
Pure stdlib. Read-only. R12: outputs under ``.run/``.
"""
from __future__ import annotations
import json
from collections import defaultdict
from pathlib import Path
RUN = Path(__file__).resolve().parents[1] / ".run" # tools/ -> repo/.run
CONFIG = Path(__file__).resolve().parents[1] / "config" # committed symbol records
MIN_SUBSTANTIAL = 8
RETAIL = "SLUS_007.26"
PROTOS = ["sep8_SLUS_007.26", "aug31_USA_DEMO.EXE"]
SHORT = {"sep8_SLUS_007.26": "sep8", "aug31_USA_DEMO.EXE": "demo"}
# Known retail anchors (lowercase 0x) for the normalizer sanity check.
ANCHORS = {
"0x80018730": "LzssDecodeSector",
"0x80010b40": "GameModeDispatch",
"0x80011144": "DebugMenuHandler",
"0x8001971c": "LoaderInitFileTable",
"0x80019a24": "CdReadRequest",
"0x8002b154": "SaveLoadRoutine",
}
def load(prog: str) -> list[dict]:
p = RUN / f"sig.{prog}.jsonl"
rows = [json.loads(line) for line in p.read_text().splitlines() if line.strip()]
return [r for r in rows if r["nins"] > 0] # drop GTE-macro stubs / empty
def index(rows: list[dict], key: str) -> dict[str, list[dict]]:
d: dict[str, list[dict]] = defaultdict(list)
for r in rows:
d[r[key]].append(r)
return d
def emit_proto_symbols(proto: str, pairs: list[tuple[dict, dict]]) -> tuple[Path, int]:
"""Write config/symbols.proto-<short>.txt: retail names mapped onto the proto via
1:1 h_norm correspondence. PROTO-SIDE ONLY, provenance-tagged (R13) -- these are
inherited-from-retail labels to make the proto navigable for Phase-6/Gen2, and are
UNVERIFIED against the proto until independently confirmed. They are NOT retail
symbols and must never feed config/symbols.us.txt. Only meaningful (non-default)
retail names are emitted; FUN_/LAB_ defaults are noise and dropped."""
short = SHORT.get(proto, proto)
named = [(r, p) for r, p in pairs
if not (r["name"].startswith("FUN_") or r["name"].startswith("LAB_"))]
named.sort(key=lambda x: int(x[1]["addr"], 16))
lines = [
f"// config/symbols.proto-{short}.txt — retail symbol names mapped onto the {proto} prototype.",
"// Phase 3.5: generated by tools/match_protos.py from 1:1 h_norm correspondences (NOT byte-matches).",
"// PROVENANCE (R13): each name is INHERITED FROM RETAIL via normalized-instruction equality and is",
"// UNVERIFIED against the proto until independently confirmed. Proto-side navigation aid for",
"// Phase-6/Gen2 ONLY. These are NOT retail symbols; never merge into config/symbols.us.txt.",
f"// count={len(named)}",
"",
]
for r, p in named:
lines.append(f'{r["name"]:32} = 0x{int(p["addr"], 16):08X}; // func <- retail {r["addr"]} (norm-1to1, unverified)')
out = CONFIG / f"symbols.proto-{short}.txt"
out.write_text("\n".join(lines) + "\n")
return out, len(named)
def main() -> int:
retail = load(RETAIL)
print(f"retail {RETAIL}: {len(retail)} functions (nins>0)\n")
for proto in PROTOS:
prows = load(proto)
print(f"===== {proto} vs retail =====")
print(f" proto functions (nins>0): {len(prows)}")
for tier in ("h_exact", "h_norm", "h_seq"):
pset = {r[tier] for r in prows}
for thr, label in ((1, "all"), (MIN_SUBSTANTIAL, f">={MIN_SUBSTANTIAL}ins")):
rsub = [r for r in retail if r["nins"] >= thr]
m = sum(1 for r in rsub if r[tier] in pset)
pct = 100 * m / max(1, len(rsub))
print(f" {tier:8} {label:9}: {m:5}/{len(rsub):5} retail funcs matched ({pct:5.1f}%)")
# 1:1 unique h_norm correspondences (the trustworthy pairs)
rN, pN = index(retail, "h_norm"), index(prows, "h_norm")
pairs = [(rs[0], ps[0]) for h, rs in rN.items()
if (ps := pN.get(h)) and len(rs) == 1 and len(ps) == 1]
sub_pairs = [(r, p) for r, p in pairs if r["nins"] >= MIN_SUBSTANTIAL]
print(f" 1:1 unique h_norm correspondences: {len(pairs)} (>= {MIN_SUBSTANTIAL}ins: {len(sub_pairs)})")
out = RUN / f"correspondence.{proto}-vs-retail.tsv"
with out.open("w") as fh:
fh.write("retail_addr\tretail_name\tproto_addr\tproto_name\tnins\ttier\n")
for r, p in sorted(pairs, key=lambda x: x[0]["addr"]):
fh.write(f'{r["addr"]}\t{r["name"]}\t{p["addr"]}\t{p["name"]}\t{r["nins"]}\tnorm-1to1\n')
print(f" -> {out}")
sym_out, nsym = emit_proto_symbols(proto, pairs)
print(f" -> {sym_out} ({nsym} named retail funcs mapped onto the proto)")
# anchor sanity check
pN_all, pE_all = index(prows, "h_norm"), index(prows, "h_exact")
by_addr = {r["addr"].lower(): r for r in retail}
print(" anchor sanity (known retail func -> proto match?):")
for a, nm in ANCHORS.items():
r = by_addr.get(a)
if not r:
print(f" {a} {nm:20}: (not in retail dump)")
continue
em, nmatch = pE_all.get(r["h_exact"]), pN_all.get(r["h_norm"])
tag = "EXACT" if em else ("norm " if nmatch else " - ")
where = (em or nmatch or [{}])[0].get("addr", "")
print(f" {a} {nm:20} nins={r['nins']:4} [{tag}] {('-> ' + where) if where else '(no match)'}")
print()
return 0
if __name__ == "__main__":
raise SystemExit(main())