diff --git a/.gitignore b/.gitignore index 864f97e69..362c1b676 100644 --- a/.gitignore +++ b/.gitignore @@ -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. diff --git a/config/symbols.proto-demo.txt b/config/symbols.proto-demo.txt new file mode 100644 index 000000000..d6b4d123a --- /dev/null +++ b/config/symbols.proto-demo.txt @@ -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) diff --git a/config/symbols.proto-sep8.txt b/config/symbols.proto-sep8.txt new file mode 100644 index 000000000..23b2c8d0b --- /dev/null +++ b/config/symbols.proto-sep8.txt @@ -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) diff --git a/docs/memory-map.md b/docs/memory-map.md index 451e9a3da..050eebb17 100644 --- a/docs/memory-map.md +++ b/docs/memory-map.md @@ -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 | diff --git a/docs/proto-correspondence.md b/docs/proto-correspondence.md new file mode 100644 index 000000000..696ef5897 --- /dev/null +++ b/docs/proto-correspondence.md @@ -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 ` (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..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.-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` | diff --git a/extracted/manifest.jsonl b/extracted/retail/manifest.jsonl similarity index 100% rename from extracted/manifest.jsonl rename to extracted/retail/manifest.jsonl diff --git a/extracted/manifest.sha1 b/extracted/retail/manifest.sha1 similarity index 100% rename from extracted/manifest.sha1 rename to extracted/retail/manifest.sha1 diff --git a/phase-ends/PhaseEnd_Phase3_5.md b/phase-ends/PhaseEnd_Phase3_5.md new file mode 100644 index 000000000..a09879b41 --- /dev/null +++ b/phase-ends/PhaseEnd_Phase3_5.md @@ -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..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. diff --git a/tools/bfm_extract/crosscheck.py b/tools/bfm_extract/crosscheck.py index 94f8ecf17..b00fcbeb4 100644 --- a/tools/bfm_extract/crosscheck.py +++ b/tools/bfm_extract/crosscheck.py @@ -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: diff --git a/tools/bfm_extract/extract.py b/tools/bfm_extract/extract.py index d8669e639..01bba8313 100644 --- a/tools/bfm_extract/extract.py +++ b/tools/bfm_extract/extract.py @@ -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). diff --git a/tools/bfm_extract/extract_exe.py b/tools/bfm_extract/extract_exe.py index 12bebfda4..1ab4923ef 100644 --- a/tools/bfm_extract/extract_exe.py +++ b/tools/bfm_extract/extract_exe.py @@ -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 diff --git a/tools/bfm_extract/extract_proto_exe.py b/tools/bfm_extract/extract_proto_exe.py new file mode 100644 index 000000000..959dab3d1 --- /dev/null +++ b/tools/bfm_extract/extract_proto_exe.py @@ -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 --list + python3 tools/bfm_extract/extract_proto_exe.py --bin --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 = "" 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} = ") + 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 = "" 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()) diff --git a/tools/ghidra_import.sh b/tools/ghidra_import.sh new file mode 100644 index 000000000..46b90820f --- /dev/null +++ b/tools/ghidra_import.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# tools/ghidra_import.sh +# +# 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 }" +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 diff --git a/tools/ghidra_mcp_start.sh b/tools/ghidra_mcp_start.sh index cccc9ae26..aa6ce736f 100644 --- a/tools/ghidra_mcp_start.sh +++ b/tools/ghidra_mcp_start.sh @@ -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" diff --git a/tools/ghidra_scripts/DumpFunctionSignatures.java b/tools/ghidra_scripts/DumpFunctionSignatures.java new file mode 100644 index 000000000..7af8be408 --- /dev/null +++ b/tools/ghidra_scripts/DumpFunctionSignatures.java @@ -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 -noanalysis -readOnly \ +// -scriptPath ~/bfm-decomp/tools/ghidra_scripts -postScript DumpFunctionSignatures.java +// +// Output: ~/bfm-decomp/.run/sig..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 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); + } +} diff --git a/tools/match_protos.py b/tools/match_protos.py new file mode 100644 index 000000000..2cdb160ec --- /dev/null +++ b/tools/match_protos.py @@ -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..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.-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-.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())