From 7db64ea00a161987f077e75bbaa70419aab2b036 Mon Sep 17 00:00:00 2001 From: patchzyy <64382339+patchzyy@users.noreply.github.com> Date: Wed, 21 Oct 2026 17:33:30 +0200 Subject: [PATCH] drop map report generation --- .gitattributes | 1 - projects/mkwii-ntsc-j/MAP.txt | 2 +- projects/mkwii-ntsc-j/MAP_REPORT.md | 672 -------------------- projects/mkwii-ntsc-j/recomp.yml | 2 +- projects/mkwii-ntsc-u/MAP.txt | 2 +- projects/mkwii-ntsc-u/MAP_REPORT.md | 948 ---------------------------- projects/mkwii-ntsc-u/recomp.yml | 2 +- tools/region/port_map.py | 491 +------------- 8 files changed, 12 insertions(+), 2108 deletions(-) delete mode 100644 projects/mkwii-ntsc-j/MAP_REPORT.md delete mode 100644 projects/mkwii-ntsc-u/MAP_REPORT.md diff --git a/.gitattributes b/.gitattributes index 6946e58..e410e21 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7,7 +7,6 @@ translator/tests/Translator.Tests/TestAssets/**/*.bin binary # Region tables reproduced by tools/region/ projects/mkwii-ntsc-*/MAP.txt linguist-generated=true -projects/mkwii-ntsc-*/MAP_REPORT.md linguist-generated=true projects/mkwii-ntsc-*/region_port.json linguist-generated=true projects/mkwii-ntsc-j/data_addresses.txt linguist-generated=true runtime/include/guest_abi/guest_address_table.inc linguist-generated=true diff --git a/projects/mkwii-ntsc-j/MAP.txt b/projects/mkwii-ntsc-j/MAP.txt index f8c5a84..d6384d9 100644 --- a/projects/mkwii-ntsc-j/MAP.txt +++ b/projects/mkwii-ntsc-j/MAP.txt @@ -1,5 +1,5 @@ # NTSC-J (RMCJ01) function map, ported from ../mkwii/MAP.txt (PAL RMCP01) by tools/region/port_map.py. -# Every entry was validated against the RMCJ01 main.dol/StaticR.rel; see MAP_REPORT.md next to this file. +# Every entry was validated against the RMCJ01 main.dol/StaticR.rel. # Verdicts: PROVEN=12202, REFERENCED=12693, PLAUSIBLE=4513, IDENTITY=15, INTERPOLATED=0, ADDED=6 (binary-proven entries no PAL entry covers); entries=29429 800018a8 0x800018a8 80001d50 0x80001d50 diff --git a/projects/mkwii-ntsc-j/MAP_REPORT.md b/projects/mkwii-ntsc-j/MAP_REPORT.md deleted file mode 100644 index 745cf59..0000000 --- a/projects/mkwii-ntsc-j/MAP_REPORT.md +++ /dev/null @@ -1,672 +0,0 @@ -# NTSC-J (RMCJ01) function map port report - -Generated by `tools/region/port_map.py`. Deterministic; no timestamps. - -## Summary - -- PAL map: `projects/mkwii/MAP.txt` (29792 entries, 20193 named) -- NTSC-J DOL: `main.dol` sha256 `1b9621ef7c5d97dada103e50e5389730e67f3c2545dda592edd4b5843655af91` entry `0x800060A4` -- NTSC-J REL: `StaticR.rel` sha256 `88539012d357a1420724e51dc7e351192ce696da4b0045994895518a3fad6fae` load `0x8050FC60` (module 1, v3, prolog `0x80554C9C`, epilog `0x80554CE8`, unresolved `0x80554D30`) -- Chunk table: 52 PAL->NTSC-J chunks (mkw-sp port.py, MIT); no overlaps, all deltas word-aligned -- Output map: `projects/mkwii-ntsc-j/MAP.txt` with **29423** entries (20022 named); `projects/mkwii-ntsc-j/region_port.json` carries the chunk table. - -### Verdict totals (all PAL entries) - -| verdict | entries | low-mem | DOL | REL | emitted | -|---|---|---|---|---|---| -| PROVEN | 12202 | 0 | 6573 | 5629 | yes | -| REFERENCED | 12693 | 0 | 3273 | 9420 | yes | -| PLAUSIBLE | 4513 | 0 | 856 | 3657 | yes | -| IDENTITY | 15 | 15 | 0 | 0 | yes | -| INTERPOLATED | 0 | 0 | 0 | 0 | yes | -| UNVERIFIED | 210 | 0 | 129 | 81 | no | -| DROPPED | 159 | 0 | 149 | 10 | no | -| total | 29792 | 15 | 10980 | 18797 | | - -Emitted after deduplication: PROVEN=12202, REFERENCED=12693, PLAUSIBLE=4513, IDENTITY=15, INTERPOLATED=0; total 29423 ported entries, plus 6 binary-proven entries no PAL entry covers (section below) = **29429** lines in MAP.txt. UNVERIFIED and DROPPED entries are never written to MAP.txt. - -### Binary-proven entries added (step H: NTSC-J entry points no ported PAL entry covers) - -Emitted as unnamed placeholders (`hexaddr 0xhexaddr`). Strong classes are taken as proven; the pointer-referenced classes must also pass the structural check (not a conditional-branch target, terminator before, decodable first instruction) because no PAL entry vouches for them. Each address is counted once, under the first class that applies. - -| evidence class | added | -|---|---| -| ctors/dtors table entry (DOL) | 0 | -| ctors/dtors table entry (REL) | 0 | -| REL prolog/epilog/unresolved | 0 | -| DOL entry point | 0 | -| bl target (DOL text) | 0 | -| bl target (REL R_PPC_REL24 relocation into the DOL) | 0 | -| bl target (REL text, link-resolved) | 1 | -| extabindex function record | 0 | -| pointer-referenced text address (DOL data word) | 0 | -| pointer-referenced text address (REL R_PPC_ADDR32) | 5 | -| total added | 6 | - -Constructor/destructor tables: DOL .ctors 43 entries, 0 previously missing from the map; DOL .dtors 2 entries, 0 previously missing from the map; REL .ctors 192 entries, 0 previously missing from the map; REL .dtors 1 entries, 0 previously missing from the map. -Not added: 61 pointer-referenced addresses that failed the structural check (jump-table targets and similar), 110021 addresses with only weak evidence (conditional/unconditional branch targets, lis/addi pairs, jump-table-like runs). Strong additions that are also a conditional-branch target: 0. - -bl target (REL text, link-resolved) (1): - -```text -80600198 -``` - -pointer-referenced text address (REL R_PPC_ADDR32) (5): - -```text -805cba28 805fefe0 805ff184 805ff224 8063b3e4 -``` - -First-instruction quality of emitted entries (strong = typical prologue/first instruction, valid = any decodable instruction): IDENTITY/n/a=15, PLAUSIBLE/strong=4238, PLAUSIBLE/valid=275, PROVEN/strong=12010, PROVEN/valid=192, REFERENCED/strong=12621, REFERENCED/valid=72 - -### Reading the numbers - -- 24895 of 29792 entries land on an address the NTSC-J binaries reference as code (call target, exception-table record, entry point, function-pointer table, jump table for case labels); 4513 more sit right after a function terminator (or are verified switch dispatch sites) with a decodable first instruction. -- 210 UNVERIFIED entries are withheld: see the per-class breakdown in the Unverified section. None of the no-evidence ones lies near a chunk edge; they are surrounded by validated neighbours inside their chunk, which points at PAL-map noise (mid-function addresses, round addresses, names misplaced by one instruction) rather than at the chunk table. -- 159 DROPPED entries: jump tables and other data symbols the PAL map carries, PAL-only code regions with no NTSC-J counterpart, and chunk-table holes with no interpolation gap. -- The PAL project uses sda_base/sda2_base 0x8038CC00/0x8038EFA0; the NTSC-J values read below are the ones an NTSC-J project must configure. - -### Non-function labels carried by the PAL map - -The PAL map contains Ghidra-style labels that are not function starts: `*_caseD_N` switch case labels (validated here by a jump-table reference at the ported address), `*_switch` dispatch points (validated as `mtctr`+`bctr`), and `switchdataD_*` jump tables (data, never code). They are ported with the same rules; the verdict spread per class: - -| class | entries | PROVEN | REFERENCED | PLAUSIBLE | IDENTITY | INTERPOLATED | UNVERIFIED | DROPPED | -|---|---|---|---|---|---|---|---|---| -| case | 2359 | 0 | 2355 | 1 | 0 | 0 | 0 | 3 | -| switch | 197 | 1 | 0 | 195 | 0 | 0 | 0 | 1 | -| data | 140 | 0 | 0 | 0 | 0 | 0 | 1 | 139 | - -### Chunk-edge extent check - -9 emitted chunk-ported entries sit at a chunk edge (their PAL successor is not ported by the same chunk). For these the PAL extent (distance to the next PAL entry) was compared with the NTSC-J extent (distance to the next emitted entry): 8 named and 0 unnamed entries differ. A difference means the function's size changed, the successor was dropped, or the chunk edge is sloppy; the address is still a verified entry point, but for named entries the name deserves a second look. - -| PAL | name | NTSC-J | verdict | PAL extent | NTSC-J extent | PAL successor | -|---|---|---|---|---|---|---| -| 80008004 | setDiscReadErrorMessage | 80008004 | PROVEN | 0xf0 | 0x4c | 0x800080f4 (PROVEN) | -| 8000ac50 | SystemManager::Init | 8000abac | PROVEN | 0x328 | 0x2f0 | SystemManager::GetCountry (PLAUSIBLE) | -| 805cbea4 | Pages::EndingMovie::OnInit | 805cb824 | REFERENCED | 0x204 | 0x270 | Pages::EndingMovie::OnActivate (DROPPED) | -| 805ff6c4 | Pages::MasterOptions::OnResume | 805fefa0 | REFERENCED | 0x3c | 0x850 | Pages::MasterOptions::OnResume_switch (DROPPED) | -| 806003e0 | Pages::MasterOptions::LoadOptionChoice | 805ffb98 | PROVEN | 0x3bc | 0x99c | Pages::MasterOptions::LoadOptionWaitingNetwork (DROPPED) | -| 80620c5c | RKSYSRequester::Init | 806203d0 | PROVEN | 0x148 | 0x120 | RKSYSRequester::Close (PROVEN) | -| 80637a20 | SystemBMGHolder::Init | 8063716c | PROVEN | 0x6c | 0xc | SystemBMGHolder::GetMessage (PROVEN) | -| 8063bbe4 | Pages::TitleMovie::OnInit | 8063b2d0 | REFERENCED | 0x114 | 0x1e0 | Pages::TitleMovie::OnActivate (DROPPED) | - -### SDA bases read from the NTSC-J `__init_registers` - -- `__init_registers` PAL `80006210` -> NTSC-J `80006210` -- Result: **r13=0x8038C580 (matches expectation); r2=0x8038E920 (matches expectation)** -- All lis/ori(addi) register values materialised in the function: r1=0x80398B00, r2=0x8038E920, r13=0x8038C580 - -```text -80006210 38000000 li r0,0 -80006214 38600000 li r3,0 -80006218 38800000 li r4,0 -8000621c 38a00000 li r5,0 -80006220 38c00000 li r6,0 -80006224 38e00000 li r7,0 -80006228 39000000 li r8,0 -8000622c 39200000 li r9,0 -80006230 39400000 li r10,0 -80006234 39600000 li r11,0 -80006238 39800000 li r12,0 -8000623c 39c00000 li r14,0 -80006240 39e00000 li r15,0 -80006244 3a000000 li r16,0 -80006248 3a200000 li r17,0 -8000624c 3a400000 li r18,0 -80006250 3a600000 li r19,0 -80006254 3a800000 li r20,0 -80006258 3aa00000 li r21,0 -8000625c 3ac00000 li r22,0 -80006260 3ae00000 li r23,0 -80006264 3b000000 li r24,0 -80006268 3b200000 li r25,0 -8000626c 3b400000 li r26,0 -80006270 3b600000 li r27,0 -80006274 3b800000 li r28,0 -80006278 3ba00000 li r29,0 -8000627c 3bc00000 li r30,0 -80006280 3be00000 li r31,0 -80006284 3c208039 lis r1,0x8039 -80006288 60218b00 ori r1,r1,0x8b00 -8000628c 3c408038 lis r2,0x8038 -80006290 6042e920 ori r2,r2,0xe920 -80006294 3da08038 lis r13,0x8038 -80006298 61adc580 ori r13,r13,0xc580 -8000629c 4e800020 blr -``` - -### Save/restore thunk families (resolved by name in GuestSaveRestoreThunks.cs) - -**`_save_gpr_N`** (stw rN,-off(r11)): OK - full run to r31 verified - -| name | PAL | NTSC-J | verdict | expected | actual | decoded | ok | -|---|---|---|---|---|---|---|---| -| _save_gpr_14 | 8002156c | 80021490 | PROVEN | 91cbffb8 | 91cbffb8 | stw r14,-72(r11) | yes | -| _save_gpr_15 | 80021570 | 80021494 | PROVEN | 91ebffbc | 91ebffbc | stw r15,-68(r11) | yes | -| _save_gpr_16 | 80021574 | 80021498 | PROVEN | 920bffc0 | 920bffc0 | stw r16,-64(r11) | yes | -| _save_gpr_17 | 80021578 | 8002149c | PROVEN | 922bffc4 | 922bffc4 | stw r17,-60(r11) | yes | -| _save_gpr_18 | 8002157c | 800214a0 | PROVEN | 924bffc8 | 924bffc8 | stw r18,-56(r11) | yes | -| _save_gpr_19 | 80021580 | 800214a4 | PROVEN | 926bffcc | 926bffcc | stw r19,-52(r11) | yes | -| _save_gpr_20 | 80021584 | 800214a8 | PROVEN | 928bffd0 | 928bffd0 | stw r20,-48(r11) | yes | -| _save_gpr_21 | 80021588 | 800214ac | PROVEN | 92abffd4 | 92abffd4 | stw r21,-44(r11) | yes | -| _save_gpr_22 | 8002158c | 800214b0 | PROVEN | 92cbffd8 | 92cbffd8 | stw r22,-40(r11) | yes | -| _save_gpr_23 | 80021590 | 800214b4 | PROVEN | 92ebffdc | 92ebffdc | stw r23,-36(r11) | yes | -| _save_gpr_24 | 80021594 | 800214b8 | PROVEN | 930bffe0 | 930bffe0 | stw r24,-32(r11) | yes | -| _save_gpr_25 | 80021598 | 800214bc | PROVEN | 932bffe4 | 932bffe4 | stw r25,-28(r11) | yes | -| _save_gpr_26 | 8002159c | 800214c0 | PROVEN | 934bffe8 | 934bffe8 | stw r26,-24(r11) | yes | -| _save_gpr_27 | 800215a0 | 800214c4 | PROVEN | 936bffec | 936bffec | stw r27,-20(r11) | yes | - -**`_rest_gpr_N`** (lwz rN,-off(r11)): OK - full run to r31 verified - -| name | PAL | NTSC-J | verdict | expected | actual | decoded | ok | -|---|---|---|---|---|---|---|---| -| _rest_gpr_14 | 800215b8 | 800214dc | PROVEN | 81cbffb8 | 81cbffb8 | lwz r14,-72(r11) | yes | -| _rest_gpr_15 | 800215bc | 800214e0 | PROVEN | 81ebffbc | 81ebffbc | lwz r15,-68(r11) | yes | -| _rest_gpr_16 | 800215c0 | 800214e4 | PROVEN | 820bffc0 | 820bffc0 | lwz r16,-64(r11) | yes | -| _rest_gpr_17 | 800215c4 | 800214e8 | PROVEN | 822bffc4 | 822bffc4 | lwz r17,-60(r11) | yes | -| _rest_gpr_18 | 800215c8 | 800214ec | PROVEN | 824bffc8 | 824bffc8 | lwz r18,-56(r11) | yes | -| _rest_gpr_19 | 800215cc | 800214f0 | PROVEN | 826bffcc | 826bffcc | lwz r19,-52(r11) | yes | -| _rest_gpr_20 | 800215d0 | 800214f4 | PROVEN | 828bffd0 | 828bffd0 | lwz r20,-48(r11) | yes | -| _rest_gpr_21 | 800215d4 | 800214f8 | PROVEN | 82abffd4 | 82abffd4 | lwz r21,-44(r11) | yes | -| _rest_gpr_22 | 800215d8 | 800214fc | PROVEN | 82cbffd8 | 82cbffd8 | lwz r22,-40(r11) | yes | -| _rest_gpr_23 | 800215dc | 80021500 | PROVEN | 82ebffdc | 82ebffdc | lwz r23,-36(r11) | yes | -| _rest_gpr_24 | 800215e0 | 80021504 | PROVEN | 830bffe0 | 830bffe0 | lwz r24,-32(r11) | yes | -| _rest_gpr_25 | 800215e4 | 80021508 | PROVEN | 832bffe4 | 832bffe4 | lwz r25,-28(r11) | yes | -| _rest_gpr_26 | 800215e8 | 8002150c | PROVEN | 834bffe8 | 834bffe8 | lwz r26,-24(r11) | yes | -| _rest_gpr_27 | 800215ec | 80021510 | PROVEN | 836bffec | 836bffec | lwz r27,-20(r11) | yes | - -**`_save_fpr_N`** (stfd rN,-off(r11)): OK - full run to r31 verified - -| name | PAL | NTSC-J | verdict | expected | actual | decoded | ok | -|---|---|---|---|---|---|---|---| -| _save_fpr_23 | 800214f8 | 8002141c | PROVEN | daebffb8 | daebffb8 | stfd f23,-72(r11) | yes | -| _save_fpr_28 | 8002150c | 80021430 | PROVEN | db8bffe0 | db8bffe0 | stfd f28,-32(r11) | yes | - -**`_rest_fpr_N`** (lfd rN,-off(r11)): OK - full run to r31 verified - -| name | PAL | NTSC-J | verdict | expected | actual | decoded | ok | -|---|---|---|---|---|---|---|---| -| _rest_fpr_23 | 80021544 | 80021468 | PROVEN | caebffb8 | caebffb8 | lfd f23,-72(r11) | yes | -| _rest_fpr_28 | 80021558 | 8002147c | PROVEN | cb8bffe0 | cb8bffe0 | lfd f28,-32(r11) | yes | - -## Evidence set K (NTSC-J function entry points proven by the binaries) - -- Strong (bl target / extabindex record / entry point): **12203** addresses -- Medium only (function-pointer word, ADDR32/ADDR16 relocation, lis/addi pair): **11603** addresses -- Weak only (`b` target, not used for verdicts): 22593 addresses -- Jump-table-like pointer runs (excluded from REFERENCED): 257 runs, 1748 addresses referenced only from them - -| source | count | -|---|---| -| dol.text0: bl sites | 18 | -| dol.text0: b sites | 11 | -| dol.text0: conditional-branch targets (negative signal) | 34 | -| dol.text0: lis/addi code-address pairs | 27 | -| dol.text1: bl sites | 36828 | -| dol.text1: b sites | 22752 | -| dol.text1: conditional-branch targets (negative signal) | 47324 | -| dol.text1: lis/addi code-address pairs | 858 | -| rel.text: bl sites | 37494 | -| rel.text: b sites | 25437 | -| rel.text: conditional-branch targets (negative signal) | 64497 | -| dol.ctors: table entries | 43 | -| dol.dtors: table entries | 2 | -| rel.ctors: table entries (unique targets) | 192 | -| rel.dtors: table entries (unique targets) | 1 | -| dol.extabindex: function records | 180 | -| dol.extabindex: non-record words (footer/padding) | 2 | -| rel: REL24 bl relocations | 18811 | -| rel: REL24 b relocations | 155 | -| rel: ADDR16_LO/HI/HA relocations into text | 2172 | -| rel: ADDR32 relocations into text | 31286 | -| rel: function-pointer words | 30116 | -| rel: pointer runs classified as jump tables (words) | 1170 | -| dol: function-pointer words | 4101 | -| dol: pointer runs classified as jump tables (words) | 1822 | - -REL relocation type counts (module, type): (0,1)=156, (0,4)=1686, (0,6)=1285, (0,10)=18966, (0,201)=1, (0,202)=2, (0,203)=1, (1,1)=33010, (1,4)=32000, (1,6)=27636, (1,202)=5, (1,203)=1 - -## Binary layout check (parsed headers vs vendored mkw-sp table) - -- DOL init: 80004000-80006460 OK -- DOL extab: 80006460-80006a20 OK -- DOL extabindex: 80006a20-800072c0 OK -- DOL text: 800072c0-80244d00 OK -- DOL ctors: 80244d00-80244dc0 OK -- DOL dtors: 80244dc0-80244de0 OK -- DOL rodata: 80244e00-80257f20 OK -- DOL data: 80257f20-802a39e0 OK -- DOL sdata: 80384580-80385940 OK -- DOL sdata2: 80386920-80388ac0 OK -- REL text: 8050fd34-8088ea6c OK -- REL ctors: 8088ea6c-8088ed70 OK -- REL dtors: 8088ed70-8088ed7c OK -- REL rodata: 8088ed80-808b1d30 OK -- REL data: 808b1d30-808dc524 OK -- REL bss: 809bc740-809c3ff0 OK - -## Interpolation gaps (step C.2) - -| PAL gap | NTSC-J gap | unported | K candidates | outcome | -|---|---|---|---|---| -| 80244c0c..80510468 | 80244b2c..8050fde8 | 150 | 0 | rejected: count mismatch | -| 805cbd88..805cc3b8 | 805cb708..805cbc94 | 1 | 0 | rejected: count mismatch | -| 805ff328..80600128 | 805fec04..805ff8e0 | 4 | 0 | rejected: count mismatch | -| 806003e0..80600dc0 | 805ffb98..80600534 | 3 | 1 | rejected: count mismatch | -| 8063bb08..8063c0ac | 8063b1f4..8063b718 | 1 | 0 | rejected: count mismatch | - -## Collisions (two PAL entries porting to one NTSC-J address) - -The named entry is kept (both PAL entries are functions, so the address is a real entry point either way; only the name is in question). Extents are the distance to the next PAL entry / next emitted NTSC-J entry: the PAL entry whose extent matches the NTSC-J extent is the likelier owner of the address. - -None. - -## Dropped entries (159) - -| PAL | name | reason | -|---|---|---| -| 802474a0 | switchdataD_802474a0 | outside every chunk; no interpolation gap | -| 80270e30 | switchdataD_80270e30 | outside every chunk; no interpolation gap | -| 80271190 | switchdataD_80271190 | outside every chunk; no interpolation gap | -| 80271270 | switchdataD_80271270 | outside every chunk; no interpolation gap | -| 802713c0 | switchdataD_802713c0 | outside every chunk; no interpolation gap | -| 802714a0 | switchdataD_802714a0 | outside every chunk; no interpolation gap | -| 802714c0 | switchdataD_802714c0 | outside every chunk; no interpolation gap | -| 802714e0 | switchdataD_802714e0 | outside every chunk; no interpolation gap | -| 80271630 | switchdataD_80271630 | outside every chunk; no interpolation gap | -| 80271710 | switchdataD_80271710 | outside every chunk; no interpolation gap | -| 802718d0 | switchdataD_802718d0 | outside every chunk; no interpolation gap | -| 80271ab8 | switchdataD_80271ab8 | outside every chunk; no interpolation gap | -| 80271ad4 | switchdataD_80271ad4 | outside every chunk; no interpolation gap | -| 802726a0 | rnd_3DModels(NW4R)_802726a0 | outside every chunk; no interpolation gap | -| 802726c0 | rnd_Palettes(NW4R)_802726c0 | outside every chunk; no interpolation gap | -| 802726e0 | rnd_Textures(NW4R)_802726e0 | outside every chunk; no interpolation gap | -| 80272700 | rnd_AnmChr(NW4R)_80272700 | outside every chunk; no interpolation gap | -| 80272720 | rnd_AnmVis(NW4R)_80272720 | outside every chunk; no interpolation gap | -| 80272740 | rnd_AnmClr(NW4R)_80272740 | outside every chunk; no interpolation gap | -| 80272760 | rnd_AnmTexPat(NW4R)_80272760 | outside every chunk; no interpolation gap | -| 80272780 | rnd_AnmTexSrt(NW4R)_80272780 | outside every chunk; no interpolation gap | -| 802727a0 | rnd_AnmShp(NW4R)_802727a0 | outside every chunk; no interpolation gap | -| 802727c0 | rnd_AnmScn(NW4R)_802727c0 | outside every chunk; no interpolation gap | -| 80272810 | switchdataD_80272810 | outside every chunk; no interpolation gap | -| 80273088 | switchdataD_80273088 | outside every chunk; no interpolation gap | -| 802730b0 | switchdataD_802730b0 | outside every chunk; no interpolation gap | -| 80274520 | switchdataD_80274520 | outside every chunk; no interpolation gap | -| 80274578 | switchdataD_80274578 | outside every chunk; no interpolation gap | -| 80275018 | switchdataD_80275018 | outside every chunk; no interpolation gap | -| 80275700 | switchdataD_80275700 | outside every chunk; no interpolation gap | -| 80275a20 | switchdataD_80275a20 | outside every chunk; no interpolation gap | -| 80275cfc | switchdataD_80275cfc | outside every chunk; no interpolation gap | -| 80276954 | switchdataD_80276954 | outside every chunk; no interpolation gap | -| 802775e8 | switchdataD_802775e8 | outside every chunk; no interpolation gap | -| 80277d68 | switchdataD_80277d68 | outside every chunk; no interpolation gap | -| 80278cf0 | switchdataD_80278cf0 | outside every chunk; no interpolation gap | -| 80279af0 | switchdataD_80279af0 | outside every chunk; no interpolation gap | -| 80279b10 | switchdataD_80279b10 | outside every chunk; no interpolation gap | -| 80279b30 | switchdataD_80279b30 | outside every chunk; no interpolation gap | -| 80279b50 | switchdataD_80279b50 | outside every chunk; no interpolation gap | -| 80279b94 | switchdataD_80279b94 | outside every chunk; no interpolation gap | -| 8027a200 | switchdataD_8027a200 | outside every chunk; no interpolation gap | -| 8027a2d8 | switchdataD_8027a2d8 | outside every chunk; no interpolation gap | -| 8027a314 | switchdataD_8027a314 | outside every chunk; no interpolation gap | -| 8027a350 | switchdataD_8027a350 | outside every chunk; no interpolation gap | -| 8027a624 | switchdataD_8027a624 | outside every chunk; no interpolation gap | -| 8027b878 | switchdataD_8027b878 | outside every chunk; no interpolation gap | -| 8027ba5c | switchdataD_8027ba5c | outside every chunk; no interpolation gap | -| 8027bb2c | switchdataD_8027bb2c | outside every chunk; no interpolation gap | -| 8027bc28 | switchdataD_8027bc28 | outside every chunk; no interpolation gap | -| 8027bc44 | switchdataD_8027bc44 | outside every chunk; no interpolation gap | -| 8027d1a8 | switchdataD_8027d1a8 | outside every chunk; no interpolation gap | -| 8027ddf8 | switchdataD_8027ddf8 | outside every chunk; no interpolation gap | -| 80282cb0 | switchdataD_80282cb0 | outside every chunk; no interpolation gap | -| 80282cd8 | switchdataD_80282cd8 | outside every chunk; no interpolation gap | -| 80282d5c | switchdataD_80282d5c | outside every chunk; no interpolation gap | -| 80282d84 | switchdataD_80282d84 | outside every chunk; no interpolation gap | -| 80282f08 | switchdataD_80282f08 | outside every chunk; no interpolation gap | -| 80282f2c | switchdataD_80282f2c | outside every chunk; no interpolation gap | -| 80283220 | switchdataD_80283220 | outside every chunk; no interpolation gap | -| 80284d2c | switchdataD_80284d2c | outside every chunk; no interpolation gap | -| 80284e58 | switchdataD_80284e58 | outside every chunk; no interpolation gap | -| 80284e7c | switchdataD_80284e7c | outside every chunk; no interpolation gap | -| 80284ee8 | switchdataD_80284ee8 | outside every chunk; no interpolation gap | -| 80284f08 | switchdataD_80284f08 | outside every chunk; no interpolation gap | -| 80285c30 | switchdataD_80285c30 | outside every chunk; no interpolation gap | -| 80285cf0 | switchdataD_80285cf0 | outside every chunk; no interpolation gap | -| 80285d94 | switchdataD_80285d94 | outside every chunk; no interpolation gap | -| 80285e58 | switchdataD_80285e58 | outside every chunk; no interpolation gap | -| 80285fc0 | switchdataD_80285fc0 | outside every chunk; no interpolation gap | -| 80286054 | switchdataD_80286054 | outside every chunk; no interpolation gap | -| 802861e8 | switchdataD_802861e8 | outside every chunk; no interpolation gap | -| 80286274 | switchdataD_80286274 | outside every chunk; no interpolation gap | -| 80286338 | switchdataD_80286338 | outside every chunk; no interpolation gap | -| 802863d0 | switchdataD_802863d0 | outside every chunk; no interpolation gap | -| 8028697c | switchdataD_8028697c | outside every chunk; no interpolation gap | -| 80287078 | switchdataD_80287078 | outside every chunk; no interpolation gap | -| 80287110 | switchdataD_80287110 | outside every chunk; no interpolation gap | -| 80287190 | switchdataD_80287190 | outside every chunk; no interpolation gap | -| 802871d8 | switchdataD_802871d8 | outside every chunk; no interpolation gap | -| 8028725c | switchdataD_8028725c | outside every chunk; no interpolation gap | -| 802872b4 | switchdataD_802872b4 | outside every chunk; no interpolation gap | -| 80287388 | switchdataD_80287388 | outside every chunk; no interpolation gap | -| 802873f0 | switchdataD_802873f0 | outside every chunk; no interpolation gap | -| 80287488 | switchdataD_80287488 | outside every chunk; no interpolation gap | -| 80287528 | switchdataD_80287528 | outside every chunk; no interpolation gap | -| 8028758c | switchdataD_8028758c | outside every chunk; no interpolation gap | -| 802875f4 | switchdataD_802875f4 | outside every chunk; no interpolation gap | -| 802879e0 | switchdataD_802879e0 | outside every chunk; no interpolation gap | -| 80287da8 | switchdataD_80287da8 | outside every chunk; no interpolation gap | -| 80287e40 | switchdataD_80287e40 | outside every chunk; no interpolation gap | -| 80287e60 | switchdataD_80287e60 | outside every chunk; no interpolation gap | -| 80287e80 | switchdataD_80287e80 | outside every chunk; no interpolation gap | -| 80288404 | switchdataD_80288404 | outside every chunk; no interpolation gap | -| 802884b0 | switchdataD_802884b0 | outside every chunk; no interpolation gap | -| 8028855c | switchdataD_8028855c | outside every chunk; no interpolation gap | -| 80288614 | switchdataD_80288614 | outside every chunk; no interpolation gap | -| 802886c0 | switchdataD_802886c0 | outside every chunk; no interpolation gap | -| 80289fd0 | switchdataD_80289fd0 | outside every chunk; no interpolation gap | -| 8028a0a0 | switchdataD_8028a0a0 | outside every chunk; no interpolation gap | -| 8028a108 | switchdataD_8028a108 | outside every chunk; no interpolation gap | -| 8028a14c | switchdataD_8028a14c | outside every chunk; no interpolation gap | -| 8028a190 | switchdataD_8028a190 | outside every chunk; no interpolation gap | -| 8028a1d4 | switchdataD_8028a1d4 | outside every chunk; no interpolation gap | -| 8028a1f0 | switchdataD_8028a1f0 | outside every chunk; no interpolation gap | -| 8028a378 | switchdataD_8028a378 | outside every chunk; no interpolation gap | -| 8028a398 | switchdataD_8028a398 | outside every chunk; no interpolation gap | -| 8028a48c | switchdataD_8028a48c | outside every chunk; no interpolation gap | -| 8028a580 | switchdataD_8028a580 | outside every chunk; no interpolation gap | -| 8028a658 | switchdataD_8028a658 | outside every chunk; no interpolation gap | -| 8028a6b4 | switchdataD_8028a6b4 | outside every chunk; no interpolation gap | -| 8028b988 | switchdataD_8028b988 | outside every chunk; no interpolation gap | -| 8028b9b0 | switchdataD_8028b9b0 | outside every chunk; no interpolation gap | -| 8028ee58 | switchdataD_8028ee58 | outside every chunk; no interpolation gap | -| 8028f7dc | switchdataD_8028f7dc | outside every chunk; no interpolation gap | -| 80290820 | switchdataD_80290820 | outside every chunk; no interpolation gap | -| 8029c884 | switchdataD_8029c884 | outside every chunk; no interpolation gap | -| 8029ce88 | switchdataD_8029ce88 | outside every chunk; no interpolation gap | -| 8029da00 | switchdataD_8029da00 | outside every chunk; no interpolation gap | -| 8029da24 | switchdataD_8029da24 | outside every chunk; no interpolation gap | -| 8029dab0 | switchdataD_8029dab0 | outside every chunk; no interpolation gap | -| 8029dc28 | switchdataD_8029dc28 | outside every chunk; no interpolation gap | -| 8029dc4c | switchdataD_8029dc4c | outside every chunk; no interpolation gap | -| 8029e530 | switchdataD_8029e530 | outside every chunk; no interpolation gap | -| 802a010c | switchdataD_802a010c | outside every chunk; no interpolation gap | -| 802a0870 | switchdataD_802a0870 | outside every chunk; no interpolation gap | -| 802a0f68 | switchdataD_802a0f68 | outside every chunk; no interpolation gap | -| 802a1870 | switchdataD_802a1870 | outside every chunk; no interpolation gap | -| 802a18f8 | switchdataD_802a18f8 | outside every chunk; no interpolation gap | -| 802a19dc | switchdataD_802a19dc | outside every chunk; no interpolation gap | -| 802a2370 | switchdataD_802a2370 | outside every chunk; no interpolation gap | -| 802a23f8 | switchdataD_802a23f8 | outside every chunk; no interpolation gap | -| 802a2480 | switchdataD_802a2480 | outside every chunk; no interpolation gap | -| 802a2658 | switchdataD_802a2658 | outside every chunk; no interpolation gap | -| 802a2ba0 | switchdataD_802a2ba0 | outside every chunk; no interpolation gap | -| 802a31d8 | switchdataD_802a31d8 | outside every chunk; no interpolation gap | -| 802a32a0 | switchdataD_802a32a0 | outside every chunk; no interpolation gap | -| 802a335c | switchdataD_802a335c | outside every chunk; no interpolation gap | -| 802a3418 | switchdataD_802a3418 | outside every chunk; no interpolation gap | -| 802a34d4 | switchdataD_802a34d4 | outside every chunk; no interpolation gap | -| 802a3590 | switchdataD_802a3590 | outside every chunk; no interpolation gap | -| 802a364c | switchdataD_802a364c | outside every chunk; no interpolation gap | -| 802a3708 | switchdataD_802a3708 | outside every chunk; no interpolation gap | -| 802a37c4 | switchdataD_802a37c4 | outside every chunk; no interpolation gap | -| 802a3880 | switchdataD_802a3880 | outside every chunk; no interpolation gap | -| 802a3940 | switchdataD_802a3940 | outside every chunk; no interpolation gap | -| 802a39fc | switchdataD_802a39fc | outside every chunk; no interpolation gap | -| 802a3b88 | switchdataD_802a3b88 | outside every chunk; no interpolation gap | -| 802a3e30 | switchdataD_802a3e30 | outside every chunk; no interpolation gap | -| 80510238 | RelStart | outside every chunk; no interpolation gap | -| 805cc0a8 | Pages::EndingMovie::OnActivate | outside every chunk; no interpolation gap | -| 805ff700 | Pages::MasterOptions::OnResume_switch | outside every chunk; no interpolation gap | -| 805ff704 | Pages::MasterOptions::OnResume_case0 | outside every chunk; no interpolation gap | -| 805ff8a8 | Pages::MasterOptions::OnResume_case1 | outside every chunk; no interpolation gap | -| 805ff948 | Pages::MasterOptions::OnResume_case2 | outside every chunk; no interpolation gap | -| 8060079c | Pages::MasterOptions::LoadOptionWaitingNetwork | outside every chunk; no interpolation gap | -| 806008cc | Pages::MasterOptions::LoadOptionWaiting | outside every chunk; no interpolation gap | -| 806009fc | Pages::MasterOptions::LoadOptionChoiceSaved | outside every chunk; no interpolation gap | -| 8063bcf8 | Pages::TitleMovie::OnActivate | outside every chunk; no interpolation gap | - -## Unverified entries (210; ported by the chunk table but not confirmed by the binary, not emitted) - -- conditional-branch target (inside a function): 39 -- conditional-branch target that is also jump-table referenced (a case label without a label name): 37 -- jump-table referenced but named/unnamed as a function: 1 -- lands on a padding word (real function usually at +4): 25 -- no evidence, predecessor is not a terminator: 102 -- outside text (data symbols): 6 - -| PAL | name | NTSC-J | evidence | detail | -|---|---|---|---|---| -| 8000a000 | 0x8000a000 | 80009f5c | - | prev=93e1000c (stw r31,12(r1)) word=800d93f8 (lwz r0,-27656(r13)) | -| 8000fb80 | 0x8000fb80 | 8000faa4 | - | prev=38000005 (li r0,5) word=9801000c (op38) | -| 8000fbb4 | 0x8000fbb4 | 8000fad8 | ptr+bc | conditional-branch target (inside a function); prev=4800000c (b) word=380000ff (li r0,255) | -| 80010000 | 0x80010000 | 8000ff24 | bc | conditional-branch target (inside a function); prev=41820010 (bc) word=8078000c (lwz r3,12(r24)) | -| 80010138 | 0x80010138 | 8001005c | bc | conditional-branch target (inside a function); prev=48000358 (b) word=3b800000 (li r28,0) | -| 80010dbc | 0x80010dbc | 80010ce0 | bc | conditional-branch target (inside a function); prev=48000844 (b) word=7de37b78 (mr r3,r15) | -| 8001237c | 0x8001237c | 800122a0 | bc | conditional-branch target (inside a function); prev=48000be8 (b) word=281600ff (cmplwi cr0,r22,255) | -| 80016e68 | 0x80016e68 | 80016d8c | bc | conditional-branch target (inside a function); prev=48000920 (b) word=7fc3f378 (mr r3,r30) | -| 80020000 | 0x80020000 | 8001ff24 | - | prev=60421548 (ori r2,r2,0x1548) word=38600001 (li r3,1) | -| 8002055c | 0x8002055c | 80020480 | - | prev=38845eb8 (addi r4,r4,24248) word=38a00001 (li r5,1) | -| 80020800 | 0x80020800 | 80020724 | - | prev=7fe3fb78 (mr r3,r31) word=38a55eb8 (addi r5,r5,24248); next proven start at +0x2c | -| 80021360 | 0x80021360 | 80021284 | bc | conditional-branch target (inside a function); prev=48000020 (b) word=80030000 (lwz r0,0(r3)) | -| 8002137c | 0x8002137c | 800212a0 | b | prev=4e800421 (op19) word=806d94ac (lwz r3,-27476(r13)) | -| 80021ba8 | 0x80021ba8 | 80021acc | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x4 | -| 80024870 | 0x80024870 | 80024790 | - | prev=48174915 (bl) word=3803ffe4 (addi r0,r3,-28) | -| 800259d0 | 0x800259d0 | 800258f0 | - | prev=7fa4eb78 (mr r4,r29) word=387c0004 (addi r3,r28,4) | -| 80046a40 | 0x80046a40 | 80046960 | - | prev=3c608004 (lis r3,0x8004) word=38636aa0 (addi r3,r3,27296) | -| 80046a50 | 0x80046a50 | 80046970 | - | prev=38630020 (addi r3,r3,32) word=4e800020 (blr) | -| 800495d0 | 0x800495d0 | 800494f0 | - | prev=7ee7bb78 (mr r7,r23) word=7f68db78 (mr r8,r27) | -| 8004b3a0 | 0x8004b3a0 | 8004b2c0 | - | prev=3c608005 (lis r3,0x8005) word=3863b400 (addi r3,r3,-19456) | -| 8004b3b0 | 0x8004b3b0 | 8004b2d0 | - | prev=38630020 (addi r3,r3,32) word=4e800020 (blr) | -| 8004f710 | 0x8004f710 | 8004f630 | - | prev=38630018 (addi r3,r3,24) word=80a1002c (lwz r5,44(r1)) | -| 80051c40 | 0x80051c40 | 80051b60 | - | prev=38000002 (li r0,2) word=48000010 (b) | -| 8005ee40 | 0x8005ee40 | 8005ed60 | - | prev=e03f0008 (op56) word=39210020 (addi r9,r1,32) | -| 8005fec0 | 0x8005fec0 | 8005fde0 | - | prev=90610008 (stw r3,8(r1)) word=40820014 (bc) | -| 80061c90 | 0x80061c90 | 80061bb0 | - | prev=4182000c (bc) word=80030018 (lwz r0,24(r3)) | -| 80068260 | 0x80068260 | 80068180 | - | prev=dbe10120 (stfd f31,288(r1)) word=f3e10128 (op60) | -| 8006b7a0 | 0x8006b7a0 | 8006b6c0 | - | prev=ec4a01b2 (op59) word=ec88202a (op59) | -| 8006d480 | 0x8006d480 | 8006d3a0 | - | prev=c1230004 (op48) word=ecc7102a (op59) | -| 80080000 | 0x80080000 | 8007ff20 | - | prev=80010034 (lwz r0,52(r1)) word=7c0803a6 (mtlr r0); next proven start at +0x10 | -| 80084780 | 0x80084780 | 800846a0 | - | prev=38a00001 (li r5,1) word=38c00004 (li r6,4); next proven start at +0x40 | -| 80088920 | 0x80088920 | 80088840 | - | prev=38800100 (li r4,256) word=48118d0d (bl) | -| 80089a00 | 0x80089a00 | 80089920 | - | prev=90810008 (stw r4,8(r1)) word=c0030040 (op48) | -| 8008bd70 | 0x8008bd70 | 8008bc90 | - | prev=7c040214 (op31) word=7fc01a14 (op31) | -| 8008c540 | 0x8008c540 | 8008c460 | - | prev=396100a0 (addi r11,r1,160) word=4bf95061 (bl) | -| 8008e170 | 0x8008e170 | 8008e090 | - | prev=90e300a0 (stw r7,160(r3)) word=90e300e0 (stw r7,224(r3)) | -| 80090000 | 0x80090000 | 8008ff20 | bc | conditional-branch target (inside a function); prev=4e800421 (op19) word=881e0037 (op34) | -| 8009716c | 0x8009716c | 8009708c | b+jt+bc | conditional-branch target (inside a function); prev=981f0008 (op38) word=39610030 (addi r11,r1,48) | -| 80097cf0 | 0x80097cf0 | 80097c10 | - | prev=80a30170 (lwz r5,368(r3)) word=7c042800 (op31) | -| 800aeed0 | nw4r::snd::detail::DecodeDspAdpcm | 800aedf0 | - | prev=54806326 (op21) word=a1230024 (op40) | -| 800aeee0 | nw4r::snd::detail::WsdPlayer::InvalidateWaveData | 800aee00 | - | prev=54e4073e (op21) word=54c7103a (op21) | -| 800b1a00 | 0x800b1a00 | 800b1920 | - | prev=80040004 (lwz r0,4(r4)) word=90030008 (stw r0,8(r3)); next proven start at +0x20 | -| 800b7fd8 | 0x800b7fd8 | 800b7ef8 | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 800b80ec | 0x800b80ec | 800b800c | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 800b8464 | 0x800b8464 | 800b8384 | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 800b87e4 | 0x800b87e4 | 800b8704 | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 800b90d4 | 0x800b90d4 | 800b8ff4 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0xc | -| 800b9384 | 0x800b9384 | 800b92a4 | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 800b9618 | 0x800b9618 | 800b9538 | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 800b9b7c | 0x800b9b7c | 800b9a9c | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x4 | -| 800b9d84 | 0x800b9d84 | 800b9ca4 | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 800b9e9c | 0x800b9e9c | 800b9dbc | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 800b9f48 | 0x800b9f48 | 800b9e68 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x8 | -| 800ba18c | 0x800ba18c | 800ba0ac | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x4 | -| 800ba814 | 0x800ba814 | 800ba734 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x1c | -| 800ba828 | 0x800ba828 | 800ba748 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x8 | -| 800bbae8 | 0x800bbae8 | 800bba08 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x8 | -| 800bc138 | bootloadDB2Res_ | 800bc058 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x8 | -| 800bed50 | 0x800bed50 | 800bec70 | - | prev=39610020 (addi r11,r1,32) word=4bf62855 (bl) | -| 800c5550 | 0x800c5550 | 800c5470 | - | prev=38c65340 (addi r6,r6,21312) word=38a00040 (li r5,64) | -| 800c686c | 0x800c686c | 800c678c | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x4 | -| 800c8214 | 0x800c8214 | 800c8134 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0xc | -| 800cbb4c | 0x800cbb4c | 800cba6c | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x4 | -| 800cbb84 | 0x800cbb84 | 800cbaa4 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0xc | -| 800cbde4 | 0x800cbde4 | 800cbd04 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0xc | -| 800cbe2c | 0x800cbe2c | 800cbd4c | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x4 | -| 800cc048 | RFL::SetToWiFiPacket | 800cbf68 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x8 | -| 800e5644 | 0x800e5644 | 800e5564 | - | prev=90010014 (stw r0,20(r1)) word=93e1000c (stw r31,12(r1)) | -| 800f0000 | 0x800f0000 | 800eff20 | - | prev=7c63f82e (op31) word=4bfff4e1 (bl); next proven start at +0x38 | -| 800f6d4c | 0x800f6d4c | 800f6c6c | - | prev=7c9b2378 (mr r27,r4) word=7cbc2b78 (mr r28,r5) | -| 800fb78c | 0x800fb78c | 800fb6ac | - | prev=93c10018 (stw r30,24(r1)) word=3bc00000 (li r30,0) | -| 800fedbc | 0x800fedbc | 800fecdc | - | prev=8063000c (lwz r3,12(r3)) word=93e3000c (stw r31,12(r3)) | -| 80100000 | 0x80100000 | 800fff20 | bc | conditional-branch target (inside a function); prev=4800013c (b) word=38800000 (li r4,0) | -| 8010f4b8 | 0x8010f4b8 | 8010f3d8 | - | prev=83e1001c (lwz r31,28(r1)) word=83c10018 (lwz r30,24(r1)); next proven start at +0x14 | -| 80128018 | 0x80128018 | 80127f38 | - | prev=7c002050 (op31) word=900d99b4 (stw r0,-26188(r13)); next proven start at +0x14 | -| 8012e5a8 | 0x8012e5a8 | 8012e4c8 | b | prev=7c0004ac (op31) word=60000000 (ori r0,r0,0x0000); next proven start at +0x10 | -| 80130000 | 0x80130000 | 8012ff20 | - | prev=90050000 (stw r0,0(r5)) word=48000054 (b) | -| 80134d98 | 0x80134d98 | 80134cb8 | - | prev=93810010 (stw r28,16(r1)) word=7c7c1b78 (mr r28,r3) | -| 80144610 | 0x80144610 | 80144530 | jt+bc | conditional-branch target (inside a function); prev=4e800020 (blr) word=38600114 (li r3,276); next proven start at +0x8 | -| 8015581c | 0x8015581c | 8015573c | - | prev=7c0802a6 (mflr r0) word=3ce08028 (lis r7,0x8028) | -| 8015b2bc | 0x8015b2bc | 8015b1dc | bc | conditional-branch target (inside a function); prev=48000258 (b) word=88e80000 (op34) | -| 8015b368 | 0x8015b368 | 8015b288 | ptr+bc | conditional-branch target (inside a function); prev=4800000c (b) word=38600000 (li r3,0) | -| 801656a4 | 0x801656a4 | 801655c4 | - | prev=7ca40214 (op31) word=806d8ce8 (lwz r3,-29464(r13)) | -| 80165d20 | 0x80165d20 | 80165c40 | - | prev=90010014 (stw r0,20(r1)) word=38e72e60 (addi r7,r7,11872) | -| 80166864 | 0x80166864 | 80166784 | - | prev=4cc63182 (op19) word=4803bd6d (bl) | -| 8016d61c | 0x8016d61c | 8016d53c | bc | conditional-branch target (inside a function); prev=480001a8 (b) word=80c30000 (lwz r6,0(r3)) | -| 8016d7bc | 0x8016d7bc | 8016d6dc | ptr+b+bc | conditional-branch target (inside a function); prev=90c50018 (stw r6,24(r5)) word=38630008 (addi r3,r3,8) | -| 8016de1c | 0x8016de1c | 8016dd3c | bc | conditional-branch target (inside a function); prev=48000178 (b) word=80c40000 (lwz r6,0(r4)) | -| 8016f240 | 0x8016f240 | 8016f160 | - | prev=80c29728 (lwz r6,-26840(r2)) word=3c60cc01 (lis r3,0xcc01) | -| 80171770 | 0x80171770 | 80171690 | - | prev=98038000 (op38) word=90a38000 (stw r5,-32768(r3)); next proven start at +0x3c | -| 8017cf40 | 0x8017cf40 | 8017ce60 | - | prev=801a0064 (lwz r0,100(r26)) word=2c000002 (cmpwi cr0,r0,2) | -| 8017ff60 | 0x8017ff60 | 8017fe80 | bc | conditional-branch target (inside a function); prev=48000250 (b) word=801a0000 (lwz r0,0(r26)) | -| 8017ffc4 | 0x8017ffc4 | 8017fee4 | bc | conditional-branch target (inside a function); prev=48000068 (b) word=80190000 (lwz r0,0(r25)) | -| 80180000 | 0x80180000 | 8017ff20 | - | prev=7cc00734 (op31) word=88940001 (op34) | -| 80192348 | 0x80192348 | 80192268 | - | prev=90a400aa (stw r5,170(r4)) word=90a400ae (stw r5,174(r4)) | -| 8019801c | 0x8019801c | 80197f3c | - | prev=2c000000 (cmpwi cr0,r0,0) word=4082004c (bc) | -| 8019d454 | 0x8019d454 | 8019d374 | - | prev=3ca08029 (lis r5,0x8029) word=387f0048 (addi r3,r31,72) | -| 801a0000 | 0x801a0000 | 8019ff20 | - | prev=41820018 (bc) word=3c800001 (lis r4,0x0001) | -| 801a0138 | 0x801a0138 | 801a0058 | - | prev=3c80801a (lis r4,0x801a) word=3ca0801a (lis r5,0x801a) | -| 801a0404 | 0x801a0404 | 801a0324 | - | prev=7c651b78 (mr r5,r3) word=60000000 (ori r0,r0,0x0000) | -| 801ad43c | 0x801ad43c | 801ad35c | - | prev=93c100a8 (stw r30,168(r1)) word=7cbe2b78 (mr r30,r5) | -| 801b1c60 | 0x801b1c60 | 801b1b80 | - | prev=98010008 (op38) word=48000030 (b) | -| 801bcc20 | 0x801bcc20 | 801bcb40 | - | prev=38210030 (addi r1,r1,48) word=4e800020 (blr); next proven start at +0x4 | -| 801d0eb0 | 0x801d0eb0 | 801d0dd0 | - | prev=7c7d1b78 (mr r29,r3) word=7c9e2378 (mr r30,r4) | -| 801da7e8 | 0x801da7e8 | 801da708 | bc | conditional-branch target (inside a function); prev=48000008 (b) word=3a940001 (addi r20,r20,1) | -| 801da7ec | 0x801da7ec | 801da70c | b+bc | conditional-branch target (inside a function); prev=3a940001 (addi r20,r20,1) word=88140000 (op34) | -| 801dab8c | 0x801dab8c | 801daaac | b+jt+bc | conditional-branch target (inside a function); prev=4180feb0 (bc) word=2c1e0000 (cmpwi cr0,r30,0) | -| 801dcecc | 0x801dcecc | 801dcdec | b+jt+bc | conditional-branch target (inside a function); prev=900da0cc (stw r0,-24372(r13)) word=80010024 (lwz r0,36(r1)); next proven start at +0x1c | -| 801dfb34 | 0x801dfb34 | 801dfa54 | - | prev=7c751b78 (mr r21,r3) word=41820008 (bc) | -| 801ec214 | 0x801ec214 | 801ec134 | bc | conditional-branch target (inside a function); prev=39c00002 (li r14,2) word=4bfba399 (bl) | -| 801f6708 | 0x801f6708 | 801f6628 | - | prev=3b400000 (li r26,0) word=48000028 (b) | -| 801ff230 | 0x801ff230 | 801ff150 | - | prev=9421ffd0 (stwu r1,-48(r1)) word=7c0802a6 (mflr r0) | -| 80211b40 | 0x80211b40 | 80211a60 | ptr+bc | conditional-branch target (inside a function); prev=48000010 (b) word=38800000 (li r4,0); next proven start at +0x1c | -| 80217e1c | 0x80217e1c | 80217d3c | bc | conditional-branch target (inside a function); prev=4080022c (bc) word=7ca66050 (op31) | -| 80218028 | 0x80218028 | 80217f48 | - | prev=80a1002c (lwz r5,44(r1)) word=d8410030 (stfd f2,48(r1)); next proven start at +0x34 | -| 8021b790 | 0x8021b790 | 8021b6b0 | bc | conditional-branch target (inside a function); prev=3dc0802a (lis r14,0x802a) word=386100c0 (addi r3,r1,192) | -| 8021ff0c | 0x8021ff0c | 8021fe2c | bc | conditional-branch target (inside a function); prev=c3c29cb0 (op48) word=c0580024 (op48) | -| 80220000 | 0x80220000 | 8021ff20 | - | prev=5400043e (op21) word=900100f4 (stw r0,244(r1)) | -| 8023152c | 0x8023152c | 8023144c | bc | conditional-branch target (inside a function); prev=480000d0 (b) word=80770000 (lwz r3,0(r23)) | -| 80232eec | 0x80232eec | 80232e0c | ptr+bc | conditional-branch target (inside a function); prev=48000014 (b) word=38000000 (li r0,0) | -| 8023bc00 | 0x8023bc00 | 8023bb20 | bc | conditional-branch target (inside a function); prev=480000fc (b) word=5605043e (op21) | -| 80240000 | 0x80240000 | 8023ff20 | bc | conditional-branch target (inside a function); prev=3bc00000 (li r30,0) word=807d0004 (lwz r3,4(r29)) | -| 80244dd4 | switchdataD_80274dd4 | 80244cf4 | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 802a4080 | rkSystem | 802a3a00 | - | not in a text section (unmapped) | -| 802a40f4 | r13_and_stacks | 802a3a74 | - | not in a text section (unmapped) | -| 80385920 | dev/fs_fd | 803852a0 | - | not in a text section (dol.data6) | -| 80385924 | r13_and_stacks | 803852a4 | - | not in a text section (dol.data6) | -| 80386000 | SystemManager | 80385980 | - | not in a text section (unmapped) | -| 80387100 | r13_and_stacks | 80386a80 | - | not in a text section (dol.data7) | -| 80528058 | 0x80528058 | 805279d8 | - | prev=83c10018 (lwz r30,24(r1)) word=80010024 (lwz r0,36(r1)) | -| 8052aea4 | 0x8052aea4 | 8052a824 | bc | conditional-branch target (inside a function); prev=3e808000 (lis r20,0x8000) word=7ee3bb78 (mr r3,r23) | -| 8053bcc8 | 0x8053bcc8 | 8053b648 | bc | conditional-branch target (inside a function); prev=48000414 (b) word=566315ba (op21) | -| 8053bcf4 | 0x8053bcf4 | 8053b674 | bc | conditional-branch target (inside a function); prev=b0010020 (op44) word=80150044 (lwz r0,68(r21)) | -| 80540000 | 0x80540000 | 8053f980 | - | prev=38a0001c (li r5,28) word=38c0000c (li r6,12) | -| 80550000 | 0x80550000 | 8054f980 | - | prev=5404063e (op21) word=380393f0 (addi r0,r3,-27664) | -| 805536d8 | 0x805536d8 | 80553058 | bc | conditional-branch target (inside a function); prev=48000094 (b) word=7f03c378 (mr r3,r24) | -| 80553730 | 0x80553730 | 805530b0 | jt+bc | conditional-branch target (inside a function); prev=48000008 (b) word=3b400008 (li r26,8) | -| 805658f0 | 0x805658f0 | 80565270 | - | prev=1ca5000c (op7) word=c8430000 (lfd f2,0(r3)) | -| 80565b50 | 0x80565b50 | 805654d0 | - | prev=7c0802a6 (mflr r0) word=2c030000 (cmpwi cr0,r3,0) | -| 80565d14 | 0x80565d14 | 80565694 | - | prev=d01e0028 (op52) word=d01e002c (op52) | -| 8058b164 | 0x8058b164 | 8058aae4 | - | prev=48000cc1 (bl) word=7fc3f378 (mr r3,r30); next proven start at +0x34 | -| 805abea8 | 0x805abea8 | 805ab828 | b+jt+bc | conditional-branch target (inside a function); prev=4819ee29 (bl) word=807f0000 (lwz r3,0(r31)) | -| 805b0000 | 0x805b0000 | 805af980 | - | prev=99410009 (op38) word=9921000a (op38) | -| 805cdf28 | 0x805cdf28 | 805cd804 | b+bc | conditional-branch target (inside a function); prev=d014001c (op52) word=5660103a (op21) | -| 805d2aa8 | 0x805d2aa8 | 805d2384 | bc | conditional-branch target (inside a function); prev=3a20ffff (li r17,-1) word=80100000 (lwz r0,0(r16)) | -| 805f98f4 | SimpleMessageWindowControl::GetClassName | 805f91d0 | - | prev=3c600000 (lis r3,0x0000) word=38630000 (addi r3,r3,0); next proven start at +0xc | -| 8060b73c | 0x8060b73c | 8060aeb0 | - | prev=38800037 (li r4,55) word=38a00038 (li r5,56) | -| 8060b82c | 0x8060b82c | 8060afa0 | - | prev=386100f8 (addi r3,r1,248) word=38840000 (addi r4,r4,0) | -| 8060ef44 | 0x8060ef44 | 8060e6b8 | ptr+b+bc | conditional-branch target (inside a function); prev=4bff3549 (bl) word=396100f0 (addi r11,r1,240); next proven start at +0x18 | -| 806116c0 | 0x806116c0 | 80610e34 | ptr+b+bc | conditional-branch target (inside a function); prev=4800005c (b) word=38610008 (addi r3,r1,8) | -| 8061f550 | 0x8061f550 | 8061ecc4 | b+jt+bc | conditional-branch target (inside a function); prev=48000088 (b) word=38610008 (addi r3,r1,8) | -| 80628068 | 0x80628068 | 806277b4 | - | prev=80010014 (lwz r0,20(r1)) word=7c0803a6 (mtlr r0) | -| 8064f7ec | 0x8064f7ec | 8064ee58 | bc | conditional-branch target (inside a function); prev=3fc00000 (lis r30,0x0000) word=5743063e (op21) | -| 8064f988 | 0x8064f988 | 8064eff4 | ptr+b+bc | conditional-branch target (inside a function); prev=4beca361 (bl) word=38c00001 (li r6,1) | -| 8065193c | 0x8065193c | 80650fa8 | bc | conditional-branch target (inside a function); prev=3dc00000 (lis r14,0x0000) word=807a0000 (lwz r3,0(r26)) | -| 80651984 | 0x80651984 | 80650ff0 | bc | conditional-branch target (inside a function); prev=480001f8 (b) word=9a3601f4 (op38) | -| 80651b1c | 0x80651b1c | 80651188 | ptr+b+bc | conditional-branch target (inside a function); prev=901601f8 (stw r0,504(r22)) word=807a0000 (lwz r3,0(r26)) | -| 80668558 | 0x80668558 | 80667bc4 | ptr+bc | conditional-branch target (inside a function); prev=48000068 (b) word=388018a6 (li r4,6310) | -| 8067b190 | 0x8067b190 | 8067a7fc | jt+bc | conditional-branch target (inside a function); prev=48000068 (b) word=388018a6 (li r4,6310) | -| 80688e48 | 0x80688e48 | 806884b4 | bc | conditional-branch target (inside a function); prev=d001008c (op52) word=281a0009 (cmplwi cr0,r26,9) | -| 80689d74 | 0x80689d74 | 806893e0 | bc | conditional-branch target (inside a function); prev=3a600001 (li r19,1) word=281b0009 (cmplwi cr0,r27,9) | -| 8068a3b4 | 0x8068a3b4 | 80689a20 | bc | conditional-branch target (inside a function); prev=3a600001 (li r19,1) word=281b0009 (cmplwi cr0,r27,9) | -| 8068a9fc | 0x8068a9fc | 8068a068 | bc | conditional-branch target (inside a function); prev=3a200001 (li r17,1) word=28190009 (cmplwi cr0,r25,9) | -| 8068b15c | 0x8068b15c | 8068a7c8 | bc | conditional-branch target (inside a function); prev=3a200001 (li r17,1) word=28190009 (cmplwi cr0,r25,9) | -| 80697c30 | 0x80697c30 | 8069729c | bc | conditional-branch target (inside a function); prev=3fc00000 (lis r30,0x0000) word=807d0164 (lwz r3,356(r29)) | -| 806a2460 | 0x806a2460 | 806a1acc | - | prev=38ff06f4 (addi r7,r31,1780) word=391f07c8 (addi r8,r31,1992) | -| 806afaf0 | 0x806afaf0 | 806af15c | - | prev=807e0318 (lwz r3,792(r30)) word=389f0738 (addi r4,r31,1848) | -| 806baad4 | 0x806baad4 | 806ba140 | - | prev=8001001c (lwz r0,28(r1)) word=b01e0182 (op44) | -| 806bd88c | 0x806bd88c | 806bcef8 | - | prev=80630028 (lwz r3,40(r3)) word=4be99dc9 (bl) | -| 806bf208 | 0x806bf208 | 806be874 | - | prev=7c9e002e (op31) word=38840030 (addi r4,r4,48) | -| 806bf228 | 0x806bf228 | 806be894 | - | prev=c0410020 (op48) word=60000001 (ori r0,r0,0x0001) | -| 806c9f90 | 0x806c9f90 | 806c95fc | - | prev=7c0803a6 (mtlr r0) word=38210020 (addi r1,r1,32) | -| 806c9fb0 | 0x806c9fb0 | 806c961c | - | prev=81830000 (lwz r12,0(r3)) word=3fc00000 (lis r30,0x0000) | -| 806e70c4 | 0x806e70c4 | 806e6730 | - | prev=c01e001c (op48) word=d03c0120 (op52) | -| 8070ecb4 | 0x8070ecb4 | 8070e320 | - | prev=90c30060 (stw r6,96(r3)) word=4d810020 (op19) | -| 8070ede4 | 0x8070ede4 | 8070e450 | jt | prev=90030060 (stw r0,96(r3)) word=4e800020 (blr) | -| 807123bc | 0x807123bc | 80711a28 | b+jt+bc | conditional-branch target (inside a function); prev=3ba00002 (li r29,2) word=2c1c0000 (cmpwi cr0,r28,0) | -| 80726cb0 | 0x80726cb0 | 8072631c | - | prev=ec460072 (op59) word=c0010024 (op48) | -| 80726e04 | 0x80726e04 | 80726470 | - | prev=ec6400f2 (op59) word=ec22082a (op59) | -| 8073e1b0 | 0x8073e1b0 | 8073d81c | ptr+b+bc | conditional-branch target (inside a function); prev=7c661b78 (mr r6,r3) word=83e1000c (lwz r31,12(r1)); next proven start at +0x1c | -| 8073eaf8 | 0x8073eaf8 | 8073e164 | ptr+b+bc | conditional-branch target (inside a function); prev=7c661b78 (mr r6,r3) word=83e1000c (lwz r31,12(r1)) | -| 80754cd8 | 0x80754cd8 | 80754344 | b+jt+bc | conditional-branch target (inside a function); prev=418202d8 (bc) word=38610068 (addi r3,r1,104) | -| 807604c4 | 0x807604c4 | 8075fb30 | - | prev=3400ffff (op13) word=900300c0 (stw r0,192(r3)) | -| 8078c3e0 | 0x8078c3e0 | 8078ba4c | - | prev=ec00102a (op59) word=fc00001e (op63) | -| 807c6b34 | 0x807c6b34 | 807c61a0 | ptr+bc | conditional-branch target (inside a function); prev=4800010c (b) word=839d0000 (lwz r28,0(r29)) | -| 807ce31c | 0x807ce31c | 807cd988 | ptr+bc | conditional-branch target (inside a function); prev=4e800420 (bctr) word=c05d0308 (op48) | -| 807d3358 | 0x807d3358 | 807d29c4 | ptr+b+bc | conditional-branch target (inside a function); prev=7cbc2b78 (mr r28,r5) word=2c1c0000 (cmpwi cr0,r28,0); next proven start at +0x34 | -| 807f8084 | 0x807f8084 | 807f76f0 | - | prev=38a10008 (addi r5,r1,8) word=38c1000a (addi r6,r1,10) | -| 807fda18 | 0x807fda18 | 807fd084 | - | prev=a804002e (op42) word=b01e013c (op44) | -| 80800000 | 0x80800000 | 807ff66c | - | prev=7c641b78 (mr r4,r3) word=7fc3f378 (mr r3,r30) | -| 80808080 | 0x80808080 | 808076ec | - | prev=3bde0000 (addi r30,r30,0) word=38800002 (li r4,2) | -| 80810000 | 0x80810000 | 8080f66c | - | prev=2c1a0001 (cmpwi cr0,r26,1) word=4182004c (bc) | -| 808148a4 | 0x808148a4 | 80813f10 | - | prev=c02a0000 (op48) word=480014c0 (b) | -| 8082b708 | 0x8082b708 | 8082ad74 | bc | conditional-branch target (inside a function); prev=3f800000 (lis r28,0x0000) word=81980000 (lwz r12,0(r24)) | -| 8082bd68 | 0x8082bd68 | 8082b3d4 | - | prev=80830000 (lwz r4,0(r3)) word=548005ef (op21) | -| 80830000 | 0x80830000 | 8082f66c | bc | conditional-branch target (inside a function); prev=4bd276e5 (bl) word=38610008 (addi r3,r1,8) | -| 80833800 | 0x80833800 | 80832e6c | ptr+bc | conditional-branch target (inside a function); prev=48000008 (b) word=3860ffff (li r3,-1); next proven start at +0x1c | -| 8085ade8 | 0x8085ade8 | 8085a454 | jt+bc | conditional-branch target (inside a function); prev=480001fc (b) word=80031780 (lwz r0,6016(r3)) | -| 8085bb9c | 0x8085bb9c | 8085b208 | jt+bc | conditional-branch target (inside a function); prev=48000048 (b) word=2c040016 (cmpwi cr0,r4,22) | -| 80860350 | 0x80860350 | 8085f9bc | ptr+bc | conditional-branch target (inside a function); prev=4e800020 (blr) word=3860ffff (li r3,-1); next proven start at +0x8 | -| 808603ac | 0x808603ac | 8085fa18 | ptr+bc | conditional-branch target (inside a function); prev=4e800020 (blr) word=3860ffff (li r3,-1); next proven start at +0x8 | -| 8086047c | 0x8086047c | 8085fae8 | ptr+bc | conditional-branch target (inside a function); prev=4e800020 (blr) word=38600000 (li r3,0); next proven start at +0x8 | -| 80862ab0 | 0x80862ab0 | 8086211c | ptr+bc | conditional-branch target (inside a function); prev=4e800020 (blr) word=3860ffff (li r3,-1); next proven start at +0x8 | -| 80862e1c | 0x80862e1c | 80862488 | ptr+bc | conditional-branch target (inside a function); prev=4e800020 (blr) word=3860ffff (li r3,-1); next proven start at +0x8 | -| 80863618 | 0x80863618 | 80862c84 | ptr+b+bc | conditional-branch target (inside a function); prev=90030000 (stw r0,0(r3)) word=2c040000 (cmpwi cr0,r4,0) | -| 80863710 | 0x80863710 | 80862d7c | ptr+b+bc | conditional-branch target (inside a function); prev=90030000 (stw r0,0(r3)) word=2c040000 (cmpwi cr0,r4,0) | -| 80863814 | 0x80863814 | 80862e80 | ptr+b+bc | conditional-branch target (inside a function); prev=901f0000 (stw r0,0(r31)) word=80010014 (lwz r0,20(r1)); next proven start at +0x18 | -| 80869368 | 0x80869368 | 808689d4 | jt+bc | conditional-branch target (inside a function); prev=4e800420 (bctr) word=38000000 (li r0,0) | -| 8086e824 | 0x8086e824 | 8086de90 | - | prev=3860007c (li r3,124) word=38840000 (addi r4,r4,0) | -| 80877b48 | 0x80877b48 | 808771b4 | - | prev=2c030000 (cmpwi cr0,r3,0) word=41820014 (bc) | - -## Identity (low-memory) entries (15) - -Below 0x80004000 the PAL address is kept unchanged. These addresses are outside every DOL/REL section, so the binaries cannot vouch for them; the evidence column shows whether any NTSC-J code branches to them. - -| address | name | binary evidence | -|---|---|---| -| 800018a8 | 0x800018a8 | low memory, binary evidence: UNVERIFIED (-) | -| 80001d50 | 0x80001d50 | low memory, binary evidence: UNVERIFIED (-) | -| 80001d6c | 0x80001d6c | low memory, binary evidence: UNVERIFIED (-) | -| 80001d90 | 0x80001d90 | low memory, binary evidence: UNVERIFIED (-) | -| 80001dc0 | 0x80001dc0 | low memory, binary evidence: UNVERIFIED (-) | -| 80001de8 | 0x80001de8 | low memory, binary evidence: UNVERIFIED (-) | -| 80001dec | 0x80001dec | low memory, binary evidence: UNVERIFIED (-) | -| 80001e14 | 0x80001e14 | low memory, binary evidence: UNVERIFIED (-) | -| 80001e30 | 0x80001e30 | low memory, binary evidence: UNVERIFIED (-) | -| 80001f1c | 0x80001f1c | low memory, binary evidence: UNVERIFIED (-) | -| 80001f40 | 0x80001f40 | low memory, binary evidence: UNVERIFIED (-) | -| 80001f54 | 0x80001f54 | low memory, binary evidence: UNVERIFIED (-) | -| 80002440 | 0x80002440 | low memory, binary evidence: UNVERIFIED (-) | -| 8000245c | 0x8000245c | low memory, binary evidence: UNVERIFIED (-) | -| 8000249c | __TRKreset | low memory, binary evidence: UNVERIFIED (-) | diff --git a/projects/mkwii-ntsc-j/recomp.yml b/projects/mkwii-ntsc-j/recomp.yml index 00e9001..545a758 100644 --- a/projects/mkwii-ntsc-j/recomp.yml +++ b/projects/mkwii-ntsc-j/recomp.yml @@ -5,7 +5,7 @@ workspace_root: ../.. # the facts that differ per region: the small-data bases the DOL's __init_registers installs, the # StaticR.rel load address and the clean-input digests. The function map is the PAL map ported # through the community region table and validated against these binaries by -# tools/region/port_map.py; MAP_REPORT.md next to it carries the numbers. +# tools/region/port_map.py. project: id: mkwii-rmcj01 display_name: Mario Kart Wii NTSC-J diff --git a/projects/mkwii-ntsc-u/MAP.txt b/projects/mkwii-ntsc-u/MAP.txt index da38be7..be0ff20 100644 --- a/projects/mkwii-ntsc-u/MAP.txt +++ b/projects/mkwii-ntsc-u/MAP.txt @@ -1,5 +1,5 @@ # NTSC-U (RMCE01) function map, ported from ../mkwii/MAP.txt (PAL RMCP01) by tools/region/port_map.py. -# Every entry was validated against the RMCE01 main.dol/StaticR.rel; see MAP_REPORT.md next to this file. +# Every entry was validated against the RMCE01 main.dol/StaticR.rel. # Verdicts: PROVEN=12178, REFERENCED=12573, PLAUSIBLE=4500, IDENTITY=15, INTERPOLATED=0, ADDED=143 (binary-proven entries no PAL entry covers); entries=29409 800018a8 0x800018a8 80001d50 0x80001d50 diff --git a/projects/mkwii-ntsc-u/MAP_REPORT.md b/projects/mkwii-ntsc-u/MAP_REPORT.md deleted file mode 100644 index af73bcd..0000000 --- a/projects/mkwii-ntsc-u/MAP_REPORT.md +++ /dev/null @@ -1,948 +0,0 @@ -# NTSC-U (RMCE01) function map port report - -Generated by `tools/region/port_map.py`. Deterministic; no timestamps. - -## Summary - -- PAL map: `projects/mkwii/MAP.txt` (29792 entries, 20193 named) -- NTSC-U DOL: `main.dol` sha256 `d2beec1b1645fcd134efe9e7e63774b546667764ed8d431029daccd725995694` entry `0x800060A4` -- NTSC-U REL: `StaticR.rel` sha256 `1168107f8fdef27a356df76036db55afe4fbf7752606dbac991726701133a617` load `0x8050BF60` (module 1, v3, prolog `0x8054F2FC`, epilog `0x8054F348`, unresolved `0x8054F390`) -- Chunk table: 299 PAL->NTSC-U chunks (mkw-sp port.py, MIT); no overlaps, all deltas word-aligned -- Output map: `projects/mkwii-ntsc-u/MAP.txt` with **29266** entries (19944 named); `projects/mkwii-ntsc-u/region_port.json` carries the chunk table. - -### Verdict totals (all PAL entries) - -| verdict | entries | low-mem | DOL | REL | emitted | -|---|---|---|---|---|---| -| PROVEN | 12178 | 0 | 6572 | 5606 | yes | -| REFERENCED | 12573 | 0 | 3273 | 9300 | yes | -| PLAUSIBLE | 4500 | 0 | 848 | 3652 | yes | -| IDENTITY | 15 | 15 | 0 | 0 | yes | -| INTERPOLATED | 0 | 0 | 0 | 0 | yes | -| UNVERIFIED | 206 | 0 | 125 | 81 | no | -| DROPPED | 320 | 0 | 162 | 158 | no | -| total | 29792 | 15 | 10980 | 18797 | | - -Emitted after deduplication: PROVEN=12178, REFERENCED=12573, PLAUSIBLE=4500, IDENTITY=15, INTERPOLATED=0; total 29266 ported entries, plus 143 binary-proven entries no PAL entry covers (section below) = **29409** lines in MAP.txt. UNVERIFIED and DROPPED entries are never written to MAP.txt. - -### Binary-proven entries added (step H: NTSC-U entry points no ported PAL entry covers) - -Emitted as unnamed placeholders (`hexaddr 0xhexaddr`). Strong classes are taken as proven; the pointer-referenced classes must also pass the structural check (not a conditional-branch target, terminator before, decodable first instruction) because no PAL entry vouches for them. Each address is counted once, under the first class that applies. - -| evidence class | added | -|---|---| -| ctors/dtors table entry (DOL) | 0 | -| ctors/dtors table entry (REL) | 11 | -| REL prolog/epilog/unresolved | 0 | -| DOL entry point | 0 | -| bl target (DOL text) | 0 | -| bl target (REL R_PPC_REL24 relocation into the DOL) | 1 | -| bl target (REL text, link-resolved) | 13 | -| extabindex function record | 0 | -| pointer-referenced text address (DOL data word) | 0 | -| pointer-referenced text address (REL R_PPC_ADDR32) | 118 | -| total added | 143 | - -Constructor/destructor tables: DOL .ctors 43 entries, 0 previously missing from the map; DOL .dtors 2 entries, 0 previously missing from the map; REL .ctors 192 entries, 11 previously missing from the map; REL .dtors 1 entries, 0 previously missing from the map. -Not added: 59 pointer-referenced addresses that failed the structural check (jump-table targets and similar), 110058 addresses with only weak evidence (conditional/unconditional branch targets, lis/addi pairs, jump-table-like runs). Strong additions that are also a conditional-branch target: 0. - -ctors/dtors table entry (REL) (11): - -```text -805b69b4 8061e8d8 80623dec 80625410 807d6b6c 807df5a0 807ede74 8083a93c 8083e2ec 808425bc 808428cc -``` - -bl target (REL R_PPC_REL24 relocation into the DOL) (1): - -```text -80243f18 -``` - -bl target (REL text, link-resolved) (13): - -```text -8054f70c 8054f734 805512e4 805b3a8c 8064c754 8065cbe0 8065cc44 8065cc98 807139a0 807dc484 807ede88 8083c2e0 -8086868c -``` - -pointer-referenced text address (REL R_PPC_ADDR32) (118): - -```text -80551328 80551380 80551384 80551388 80551394 805513a0 8059eea4 805a0544 805a0584 805a05c4 805a0d20 805a2e30 -805b6984 806065fc 8060a958 80623d14 80623d20 80623d2c 80623d5c 80623d8c 80623dbc 806266f0 806c708c 806c7090 -806c7094 806d92e0 806eca4c 806eca50 8070ff20 8072297c 80723690 80723694 80724760 80724768 80726c78 80726c7c -80726c84 80726c8c 80726c94 80726c9c 80726ca4 80726cac 80726cb4 80726cb8 80726cf8 80726d00 80726d08 80726d10 -80726d18 80726d20 80726d28 80726d70 80726da0 807276d0 807276d8 807276e0 807276e8 80727730 80727760 8073f38c -8076005c 807600c0 807600c8 807600d0 807683b8 80775640 80775648 80775650 80777cf4 80777db0 80777e4c 80777e58 -80777e64 8077b7b4 8077ccc8 8077ccd0 8079f1a8 8079f1fc 807d4ef8 807d6b50 807dad60 807dad68 807dad70 807df580 -807df588 807df594 807df5cc 807df5d4 807df5dc 807ede0c 807ede68 807edf58 807f7e94 8081bc00 8083e2d4 8083e2e0 -8083e318 8083e320 8083e328 8083e330 808425b0 808425d0 808425dc 8084264c 80842650 80842654 80842664 808426b8 -8084276c 808427fc 80842858 80842864 808428c0 808437f4 80850178 80852418 80855178 808587e8 -``` - -First-instruction quality of emitted entries (strong = typical prologue/first instruction, valid = any decodable instruction): IDENTITY/n/a=15, PLAUSIBLE/strong=4224, PLAUSIBLE/valid=276, PROVEN/strong=11986, PROVEN/valid=192, REFERENCED/strong=12503, REFERENCED/valid=70 - -### Reading the numbers - -- 24751 of 29792 entries land on an address the NTSC-U binaries reference as code (call target, exception-table record, entry point, function-pointer table, jump table for case labels); 4500 more sit right after a function terminator (or are verified switch dispatch sites) with a decodable first instruction. -- 206 UNVERIFIED entries are withheld: see the per-class breakdown in the Unverified section. None of the no-evidence ones lies near a chunk edge; they are surrounded by validated neighbours inside their chunk, which points at PAL-map noise (mid-function addresses, round addresses, names misplaced by one instruction) rather than at the chunk table. -- 320 DROPPED entries: jump tables and other data symbols the PAL map carries, PAL-only code regions with no NTSC-U counterpart, and chunk-table holes with no interpolation gap. -- The PAL project uses sda_base/sda2_base 0x8038CC00/0x8038EFA0; the NTSC-U values read below are the ones an NTSC-U project must configure. - -### Non-function labels carried by the PAL map - -The PAL map contains Ghidra-style labels that are not function starts: `*_caseD_N` switch case labels (validated here by a jump-table reference at the ported address), `*_switch` dispatch points (validated as `mtctr`+`bctr`), and `switchdataD_*` jump tables (data, never code). They are ported with the same rules; the verdict spread per class: - -| class | entries | PROVEN | REFERENCED | PLAUSIBLE | IDENTITY | INTERPOLATED | UNVERIFIED | DROPPED | -|---|---|---|---|---|---|---|---|---| -| case | 2359 | 0 | 2358 | 1 | 0 | 0 | 0 | 0 | -| switch | 197 | 1 | 0 | 196 | 0 | 0 | 0 | 0 | -| data | 140 | 0 | 0 | 0 | 0 | 0 | 0 | 140 | - -### Chunk-edge extent check - -249 emitted chunk-ported entries sit at a chunk edge (their PAL successor is not ported by the same chunk). For these the PAL extent (distance to the next PAL entry) was compared with the NTSC-U extent (distance to the next emitted entry): 48 named and 20 unnamed entries differ. A difference means the function's size changed, the successor was dropped, or the chunk edge is sloppy; the address is still a verified entry point, but for named entries the name deserves a second look. - -| PAL | name | NTSC-U | verdict | PAL extent | NTSC-U extent | PAL successor | -|---|---|---|---|---|---|---| -| 80008004 | setDiscReadErrorMessage | 80008004 | PROVEN | 0xf0 | 0xb0 | 0x800080f4 (PROVEN) | -| 8000ac50 | SystemManager::Init | 8000ac10 | PROVEN | 0x328 | 0x2c8 | SystemManager::GetCountry (PLAUSIBLE) | -| 8000c094 | __DBEXIWriteRam | 80021a28 | PROVEN | 0xe0 | 0xe8 | _ftell (PROVEN) | -| 80240e0c | EGG::EGG__GlobalScreenCapture__AsRGB565 | 80244d28 | PROVEN | 0xc | 0x2c7328 | EGG::StateGX::Initialize (PROVEN) | -| 80244d6c | nw4r::g3d::ScnRfl::IsDerivedFrom | 80243eb0 | REFERENCED | 0x68 | 0x34c | switchdataD_80274dd4 (DROPPED) | -| 80550468 | isFastStaffGhostUnlocked | 80551204 | PROVEN | 0xe0 | 0x1a8 | 0x80550548 (PLAUSIBLE) | -| 805556a8 | Random::NextFloatLimited | 8054f688 | PROVEN | 0x84 | 0x178 | 0x8055572c (PLAUSIBLE) | -| 805758a4 | Kart::Zipper::End | 805b042c | PROVEN | 0x40 | 0x160 | 0x805758e4 (DROPPED) | -| 80583b88 | Kart::Movement::UpdateStickyRoad | 8057d324 | PROVEN | 0x3a4 | 0x3e4 | 0x80583f2c (PROVEN) | -| 8059ea3c | ScnMgrMii::LoadLights | 805b3a24 | REFERENCED | 0x68 | 0xb8 | 0x8059eaa4 (PLAUSIBLE) | -| 805aaf64 | AutoCameraMoverRace::__ct | 8059ff34 | PROVEN | 0x610 | 0x6d0 | AutoCameraMoverRace::ResetActions (PROVEN) | -| 805be610 | PushButton::GetRuntimeTypeInfo | 805b6978 | REFERENCED | 0xc | 0x5c | PushButton::TriggerPtmf (DROPPED) | -| 805bf290 | Pages::MKChannelExplanation::OnBackPress | 80623ccc | REFERENCED | 0x48 | 0x13c | 0x805bf2d8 (REFERENCED) | -| 805c576c | TriggerPtmf | 806253e0 | REFERENCED | 0x30 | 0x44 | 0x805c579c (DROPPED) | -| 805cbea4 | Pages::EndingMovie::OnInit | 806264ec | REFERENCED | 0x204 | 0x270 | Pages::EndingMovie::OnActivate (DROPPED) | -| 80620c5c | RKSYSRequester::Init | 805efdd0 | PROVEN | 0x148 | 0x120 | RKSYSRequester::Close (PROVEN) | -| 80634e44 | SectionMgr::Init | 80603f90 | PROVEN | 0x15c | 0x178 | SectionMgr::GetBootSectionSceneId (PROVEN) | -| 8063748c | SheetSelectControlScaleFade::GetArrowAnimationType | 806065f4 | REFERENCED | 0x8 | 0xb0 | SheetSelectControlScaleFade::GetRuntimeTypeInfo (REFERENCED) | -| 80637a20 | SystemBMGHolder::Init | 8064c710 | PROVEN | 0x6c | 0x7c | SystemBMGHolder::GetMessage (DROPPED) | -| 8063bbe4 | Pages::TitleMovie::OnInit | 8060a844 | REFERENCED | 0x114 | 0x1e0 | Pages::TitleMovie::OnActivate (DROPPED) | -| 80651bbc | Pages::SELECTStageMgr::TriggerPtmf | 8061e8a8 | REFERENCED | 0x30 | 0x44 | CountDownTimerPage_cpp_sinit_ (PROVEN) | -| 80665480 | RKNet::RH1Handler::ExportDefaultPacket2 | 8065cb28 | PROVEN | 0xb8 | 0x24c | 0x80665538 (PROVEN) | -| 806d02b4 | Objects::Heyho::GetPropertiesBitfield | 806c3d28 | REFERENCED | 0x8 | 0x10 | 0x806d02bc (REFERENCED) | -| 806d5c1c | Objects::K_car_tire::__dt | 806c704c | REFERENCED | 0x40 | 0x4c | Objects::HighwayManager::LoadClipInfo (DROPPED) | -| 806ec7b8 | Objects::HwanwanBall::GetPropertiesBitfield | 806f1e64 | REFERENCED | 0x8 | 0x10 | Objects::HwanwanBall::__dt(thunk) (DROPPED) | -| 806f88f4 | Audio::Handle::__dt | 806f38e4 | PLAUSIBLE | 0x40 | 0x94 | Audio::SinglePlayer::__dt (PROVEN) | -| 806fa2ac | Audio::StreamsMgr::PrepareStreams | 806f52f0 | PROVEN | 0x150 | 0x1a4 | Audio::StreamsMgr::ChangeStreamVolume (PLAUSIBLE) | -| 806fe1b4 | EGG::SoundHeapMgr::LoadState(using) | 806f924c | PLAUSIBLE | 0x8c | 0xe4 | EGG::SoundHeapMgr::GetCurrentLevel(using) (REFERENCED) | -| 807179b4 | Audio::Manager::SetupMemoryArchive | 8070ff10 | REFERENCED | 0x10 | 0x9c | Audio::Manager::HoldSound (REFERENCED) | -| 8072a88c | AI::CPUDriving::IsBattle | 80723688 | REFERENCED | 0x8 | 0x10 | 0x8072a894 (REFERENCED) | -| 8076f2d8 | Objects::ItemDropper::OnNormalItemCollision | 8077b7b0 | REFERENCED | 0x4 | 0x8 | Objects::ItemDropper::OnImperviousItemCollision (PLAUSIBLE) | -| 80773c08 | Objects::MiiKanban::OnStart | 8077ccbc | REFERENCED | 0xc | 0x54 | Objects::MiiKanban::GetPropertiesBitfield (DROPPED) | -| 807a8138 | Item::ObjGesso::CreateArray | 8079f12c | REFERENCED | 0x7c | 0xec | Item::Player::UseBlooper (REFERENCED) | -| 807a9d3c | Item::Player::UseMushroom | 807d6afc | REFERENCED | 0x54 | 0x98 | Item::ObjKinoko::InitSelf (DROPPED) | -| 807d9b0c | DriverCalcWorldCB::ExecCallbackC | 807dacec | REFERENCED | 0x74 | 0x8c | DriverCalcWorldCB::ExecCallbackC(thunk) (DROPPED) | -| 807dbcc4 | ToadetteHair::CalcWorldCB::__dt(thunk) | 807dc47c | REFERENCED | 0x8 | 0x90 | 0x807dbccc (PLAUSIBLE) | -| 807e2514 | StageButton::GetRuntimeTypeInfo | 8083e2c8 | REFERENCED | 0xc | 0x74 | CtrlMenuMovieButton::GetMovieCount (DROPPED) | -| 807e5604 | CourseButton::GetRuntimeTypeInfo | 807df574 | REFERENCED | 0xc | 0x70 | CtrlMenuCourseSelectCup::GetRuntimeTypeInfo (DROPPED) | -| 807ee990 | CtrlRaceGhostDiffTime::__dt | 8084252c | REFERENCED | 0x84 | 0x3bc | CtrlRaceGhostDiffTime::GetRuntimeTypeInfo (REFERENCED) | -| 807f88e8 | CtrlRaceTime::OnFocus | 807edde8 | REFERENCED | 0x24 | 0x1b0 | CtrlRaceTime::__dt (DROPPED) | -| 807f9278 | GeoHitTableHolder::__ct | 808436b0 | PROVEN | 0xd0 | 0x1f4 | GeoHitTableHolder::__dt (DROPPED) | -| 8080597c | Objects::bblock::UpdateModelScale | 807f7e04 | REFERENCED | 0x90 | 0xd0 | Objects::bblock::__dt (REFERENCED) | -| 80833474 | MenuKartModelMgr::GetMenuKartModel | 8085014c | PROVEN | 0x2c | 0x6c | MenuKartModelMgr::__dt (DROPPED) | -| 80833840 | ObjectCollisionCuboid::__ct | 8081b940 | PROVEN | 0x2c0 | 0x2c8 | ObjectCollisionCuboid::SetPositionAndScale (REFERENCED) | -| 8083b014 | Pages::BattleKartSelect::__dt | 8085236c | REFERENCED | 0xac | 0xb8 | Pages::BattleKartSelect::GetRuntimeTypeInfo (DROPPED) | -| 80852be0 | Pages::VSModeSelect::__dt | 80858768 | REFERENCED | 0x80 | 0x8c | Pages::VSModeSelect::GetRuntimeTypeInfo (REFERENCED) | -| 8085c39c | TriggerPtmf | 8083a90c | REFERENCED | 0x30 | 0x44 | 0x8085c3cc (PROVEN) | -| 80860e08 | GetMapIconPaneName | 8083c1bc | PROVEN | 0x124 | 0x534 | 0x80860f2c (PROVEN) | - -### SDA bases read from the NTSC-U `__init_registers` - -- `__init_registers` PAL `80006210` -> NTSC-U `80006210` -- Result: **r13=0x80388880 (matches expectation); r2=0x8038AC20 (matches expectation)** -- All lis/ori(addi) register values materialised in the function: r1=0x80394E00, r2=0x8038AC20, r13=0x80388880 - -```text -80006210 38000000 li r0,0 -80006214 38600000 li r3,0 -80006218 38800000 li r4,0 -8000621c 38a00000 li r5,0 -80006220 38c00000 li r6,0 -80006224 38e00000 li r7,0 -80006228 39000000 li r8,0 -8000622c 39200000 li r9,0 -80006230 39400000 li r10,0 -80006234 39600000 li r11,0 -80006238 39800000 li r12,0 -8000623c 39c00000 li r14,0 -80006240 39e00000 li r15,0 -80006244 3a000000 li r16,0 -80006248 3a200000 li r17,0 -8000624c 3a400000 li r18,0 -80006250 3a600000 li r19,0 -80006254 3a800000 li r20,0 -80006258 3aa00000 li r21,0 -8000625c 3ac00000 li r22,0 -80006260 3ae00000 li r23,0 -80006264 3b000000 li r24,0 -80006268 3b200000 li r25,0 -8000626c 3b400000 li r26,0 -80006270 3b600000 li r27,0 -80006274 3b800000 li r28,0 -80006278 3ba00000 li r29,0 -8000627c 3bc00000 li r30,0 -80006280 3be00000 li r31,0 -80006284 3c208039 lis r1,0x8039 -80006288 60214e00 ori r1,r1,0x4e00 -8000628c 3c408038 lis r2,0x8038 -80006290 6042ac20 ori r2,r2,0xac20 -80006294 3da08038 lis r13,0x8038 -80006298 61ad8880 ori r13,r13,0x8880 -8000629c 4e800020 blr -``` - -### Save/restore thunk families (resolved by name in GuestSaveRestoreThunks.cs) - -**`_save_gpr_N`** (stw rN,-off(r11)): OK - full run to r31 verified - -| name | PAL | NTSC-U | verdict | expected | actual | decoded | ok | -|---|---|---|---|---|---|---|---| -| _save_gpr_14 | 8002156c | 80020a0c | PROVEN | 91cbffb8 | 91cbffb8 | stw r14,-72(r11) | yes | -| _save_gpr_15 | 80021570 | 80020a10 | PROVEN | 91ebffbc | 91ebffbc | stw r15,-68(r11) | yes | -| _save_gpr_16 | 80021574 | 80020a14 | PROVEN | 920bffc0 | 920bffc0 | stw r16,-64(r11) | yes | -| _save_gpr_17 | 80021578 | 80020a18 | PROVEN | 922bffc4 | 922bffc4 | stw r17,-60(r11) | yes | -| _save_gpr_18 | 8002157c | 80020a1c | PROVEN | 924bffc8 | 924bffc8 | stw r18,-56(r11) | yes | -| _save_gpr_19 | 80021580 | 80020a20 | PROVEN | 926bffcc | 926bffcc | stw r19,-52(r11) | yes | -| _save_gpr_20 | 80021584 | 80020a24 | PROVEN | 928bffd0 | 928bffd0 | stw r20,-48(r11) | yes | -| _save_gpr_21 | 80021588 | 80020a28 | PROVEN | 92abffd4 | 92abffd4 | stw r21,-44(r11) | yes | -| _save_gpr_22 | 8002158c | 80020a2c | PROVEN | 92cbffd8 | 92cbffd8 | stw r22,-40(r11) | yes | -| _save_gpr_23 | 80021590 | 80020a30 | PROVEN | 92ebffdc | 92ebffdc | stw r23,-36(r11) | yes | -| _save_gpr_24 | 80021594 | 80020a34 | PROVEN | 930bffe0 | 930bffe0 | stw r24,-32(r11) | yes | -| _save_gpr_25 | 80021598 | 80020a38 | PROVEN | 932bffe4 | 932bffe4 | stw r25,-28(r11) | yes | -| _save_gpr_26 | 8002159c | 80020a3c | PROVEN | 934bffe8 | 934bffe8 | stw r26,-24(r11) | yes | -| _save_gpr_27 | 800215a0 | 80020a40 | PROVEN | 936bffec | 936bffec | stw r27,-20(r11) | yes | - -**`_rest_gpr_N`** (lwz rN,-off(r11)): OK - full run to r31 verified - -| name | PAL | NTSC-U | verdict | expected | actual | decoded | ok | -|---|---|---|---|---|---|---|---| -| _rest_gpr_14 | 800215b8 | 80020a58 | PROVEN | 81cbffb8 | 81cbffb8 | lwz r14,-72(r11) | yes | -| _rest_gpr_15 | 800215bc | 80020a5c | PROVEN | 81ebffbc | 81ebffbc | lwz r15,-68(r11) | yes | -| _rest_gpr_16 | 800215c0 | 80020a60 | PROVEN | 820bffc0 | 820bffc0 | lwz r16,-64(r11) | yes | -| _rest_gpr_17 | 800215c4 | 80020a64 | PROVEN | 822bffc4 | 822bffc4 | lwz r17,-60(r11) | yes | -| _rest_gpr_18 | 800215c8 | 80020a68 | PROVEN | 824bffc8 | 824bffc8 | lwz r18,-56(r11) | yes | -| _rest_gpr_19 | 800215cc | 80020a6c | PROVEN | 826bffcc | 826bffcc | lwz r19,-52(r11) | yes | -| _rest_gpr_20 | 800215d0 | 80020a70 | PROVEN | 828bffd0 | 828bffd0 | lwz r20,-48(r11) | yes | -| _rest_gpr_21 | 800215d4 | 80020a74 | PROVEN | 82abffd4 | 82abffd4 | lwz r21,-44(r11) | yes | -| _rest_gpr_22 | 800215d8 | 80020a78 | PROVEN | 82cbffd8 | 82cbffd8 | lwz r22,-40(r11) | yes | -| _rest_gpr_23 | 800215dc | 80020a7c | PROVEN | 82ebffdc | 82ebffdc | lwz r23,-36(r11) | yes | -| _rest_gpr_24 | 800215e0 | 80020a80 | PROVEN | 830bffe0 | 830bffe0 | lwz r24,-32(r11) | yes | -| _rest_gpr_25 | 800215e4 | 80020a84 | PROVEN | 832bffe4 | 832bffe4 | lwz r25,-28(r11) | yes | -| _rest_gpr_26 | 800215e8 | 80020a88 | PROVEN | 834bffe8 | 834bffe8 | lwz r26,-24(r11) | yes | -| _rest_gpr_27 | 800215ec | 80020a8c | PROVEN | 836bffec | 836bffec | lwz r27,-20(r11) | yes | - -**`_save_fpr_N`** (stfd rN,-off(r11)): OK - full run to r31 verified - -| name | PAL | NTSC-U | verdict | expected | actual | decoded | ok | -|---|---|---|---|---|---|---|---| -| _save_fpr_23 | 800214f8 | 80020998 | PROVEN | daebffb8 | daebffb8 | stfd f23,-72(r11) | yes | -| _save_fpr_28 | 8002150c | 800209ac | PROVEN | db8bffe0 | db8bffe0 | stfd f28,-32(r11) | yes | - -**`_rest_fpr_N`** (lfd rN,-off(r11)): OK - full run to r31 verified - -| name | PAL | NTSC-U | verdict | expected | actual | decoded | ok | -|---|---|---|---|---|---|---|---| -| _rest_fpr_23 | 80021544 | 800209e4 | PROVEN | caebffb8 | caebffb8 | lfd f23,-72(r11) | yes | -| _rest_fpr_28 | 80021558 | 800209f8 | PROVEN | cb8bffe0 | cb8bffe0 | lfd f28,-32(r11) | yes | - -## Evidence set K (NTSC-U function entry points proven by the binaries) - -- Strong (bl target / extabindex record / entry point): **12203** addresses -- Medium only (function-pointer word, ADDR32/ADDR16 relocation, lis/addi pair): **11591** addresses -- Weak only (`b` target, not used for verdicts): 22598 addresses -- Jump-table-like pointer runs (excluded from REFERENCED): 260 runs, 1756 addresses referenced only from them - -| source | count | -|---|---| -| dol.text0: bl sites | 18 | -| dol.text0: b sites | 11 | -| dol.text0: conditional-branch targets (negative signal) | 34 | -| dol.text0: lis/addi code-address pairs | 27 | -| dol.text1: bl sites | 36828 | -| dol.text1: b sites | 22755 | -| dol.text1: conditional-branch targets (negative signal) | 47327 | -| dol.text1: lis/addi code-address pairs | 858 | -| rel.text: bl sites | 37502 | -| rel.text: b sites | 25447 | -| rel.text: conditional-branch targets (negative signal) | 64515 | -| dol.ctors: table entries | 43 | -| dol.dtors: table entries | 2 | -| rel.ctors: table entries (unique targets) | 192 | -| rel.dtors: table entries (unique targets) | 1 | -| dol.extabindex: function records | 180 | -| dol.extabindex: non-record words (footer/padding) | 2 | -| rel: REL24 bl relocations | 18813 | -| rel: REL24 b relocations | 155 | -| rel: ADDR16_LO/HI/HA relocations into text | 2172 | -| rel: ADDR32 relocations into text | 31286 | -| rel: function-pointer words | 30068 | -| rel: pointer runs classified as jump tables (words) | 1218 | -| dol: function-pointer words | 4096 | -| dol: pointer runs classified as jump tables (words) | 1824 | - -REL relocation type counts (module, type): (0,1)=156, (0,4)=1688, (0,6)=1287, (0,10)=18968, (0,201)=1, (0,202)=2, (0,203)=1, (1,1)=33010, (1,4)=32005, (1,6)=27641, (1,202)=5, (1,203)=1 - -## Binary layout check (parsed headers vs vendored mkw-sp table) - -- DOL init: 80004000-80006460 OK -- DOL extab: 80006460-80006a20 OK -- DOL extabindex: 80006a20-800072c0 OK -- DOL text: 800072c0-80244d40 OK -- DOL ctors: 80244d40-80244e00 OK -- DOL dtors: 80244e00-80244e20 OK -- DOL rodata: 80244e40-80258260 OK -- DOL data: 80258260-8029fd00 OK -- DOL sdata: 80380880-80381c40 OK -- DOL sdata2: 80382c20-80384dc0 OK -- REL text: 8050c034-8088afd0 OK -- REL ctors: 8088afd0-8088b2d4 OK -- REL dtors: 8088b2d4-8088b2e0 OK -- REL rodata: 8088b2e0-808ae520 OK -- REL data: 808ae520-808d8c7c OK -- REL bss: 809b8f20-809c07d0 OK - -## Interpolation gaps (step C.2) - -| PAL gap | NTSC-U gap | unported | K candidates | outcome | -|---|---|---|---|---| -| 80225f04..80226734 | 80225e64..802263b0 | 8 | 0 | rejected: count mismatch | -| 80244c0c..80510468 | 80243d50..8050c0e8 | 154 | 0 | rejected: 8 entries from other chunks land inside the NTSC gap | -| 8051088c..80510d7c | 8050c50c..8050c908 | 2 | 0 | rejected: count mismatch | -| 80553788..80553b88 | 8054d830..8054db68 | 7 | 0 | rejected: count mismatch | -| 805758a4..80575a44 | 805b042c..8056f1e0 | 1 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 805a0550..805a0868 | 8059682c..805b3ca4 | 4 | 0 | rejected: 502 entries from other chunks land inside the NTSC gap | -| 805a1424..805a15e0 | 805b4860..805b4a0c | 2 | 0 | rejected: count mismatch | -| 805be430..805be66c | 805b678c..8062310c | 2 | 0 | rejected: 3323 entries from other chunks land inside the NTSC gap | -| 805bee4c..805bfbf4 | 80623888..805b71f8 | 7 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 805c4768..805c57b0 | 806243dc..805bb800 | 1 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 805cbd88..805cc3b8 | 806263d0..8062695c | 1 | 0 | rejected: count mismatch | -| 805dbd94..805dc840 | 8062c308..8062cd5c | 1 | 0 | rejected: count mismatch | -| 80637a20..80637ad0 | 8064c710..80606730 | 1 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 8063bb08..8063c0ac | 8060a768..8060ac8c | 1 | 0 | rejected: count mismatch | -| 8064ab08..8064aef8 | 8064e290..80617be4 | 1 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 8065b048..8065b4e8 | 80656bc0..80656ecc | 5 | 0 | rejected: count mismatch | -| 806c48a8..806c5354 | 806e6594..806e7024 | 1 | 0 | rejected: count mismatch | -| 806c5de0..806c63b0 | 806e7ab0..806e8078 | 1 | 0 | rejected: count mismatch | -| 806ce03c..806ce828 | 806e99b8..806c229c | 1 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 806d2368..806d2908 | 806ec248..806c3d38 | 4 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 806d5700..806d5c74 | 806c6b30..806ec7e8 | 1 | 0 | rejected: 715 entries from other chunks land inside the NTSC gap | -| 806f7610..806f7828 | 806f3188..80713adc | 4 | 0 | rejected: 834 entries from other chunks land inside the NTSC gap | -| 806f7828..806f7aa8 | 80713adc..80713d08 | 1 | 0 | rejected: count mismatch | -| 80700184..80700230 | 80715c24..80715c44 | 1 | 0 | rejected: count mismatch | -| 80728088..807284d0 | 8073e0f0..8073e528 | 3 | 0 | rejected: count mismatch | -| 807284d0..8072868c | 8073e528..8073e6e0 | 1 | 0 | rejected: count mismatch | -| 80729218..80729350 | 8073f26c..80722144 | 3 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 8072d9d4..8072dfd0 | 807267e8..8073f394 | 18 | 0 | rejected: 612 entries from other chunks land inside the NTSC gap | -| 8072fb7c..80730108 | 80740f40..807414b4 | 3 | 0 | rejected: count mismatch | -| 807308dc..80730b40 | 8072752c..80741544 | 3 | 0 | rejected: 664 entries from other chunks land inside the NTSC gap | -| 8075daec..8075db3c | 80775608..80750f60 | 3 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 80769280..80769634 | 80777b88..80777e90 | 8 | 0 | rejected: count mismatch | -| 8076d044..8076ebe0 | 8075a95c..8077b0b8 | 1 | 0 | rejected: 665 entries from other chunks land inside the NTSC gap | -| 80771fb0..80772704 | 8075f1c8..8077b7b8 | 1 | 0 | rejected: 627 entries from other chunks land inside the NTSC gap | -| 80773930..80773c5c | 8077c9e4..8075f91c | 1 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 80773d00..807743a4 | 8075f9c0..80760110 | 1 | 0 | rejected: count mismatch | -| 8077c8f4..8077cec8 | 80767e24..8077d54c | 1 | 0 | rejected: 464 entries from other chunks land inside the NTSC gap | -| 807a9c98..807a9ec0 | 807d6a58..8079f218 | 5 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 807d9798..807d9b98 | 807da978..807cad0c | 3 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 807dc8b8..807dcda0 | 807cc320..807cc780 | 1 | 0 | rejected: count mismatch | -| 807e1d80..807e25a8 | 8083db34..807dc518 | 10 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 807e4f7c..807e5688 | 807deeec..807df618 | 3 | 1 | rejected: count mismatch | -| 807e9c10..807e9cd0 | 80841b38..807e0424 | 1 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 807edda4..807ee474 | 80841b78..80842010 | 2 | 0 | rejected: a ported entry inside the PAL gap lies outside the NTSC gap | -| 807ef9e4..807efd18 | 807e56d4..807e56f0 | 13 | 0 | rejected: count mismatch | -| 807f7970..807f7bd0 | 80842b6c..807ed0d0 | 2 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 807f8878..807f8974 | 807edd78..80842dac | 1 | 0 | rejected: 1583 entries from other chunks land inside the NTSC gap | -| 807f9278..807fab58 | 808436b0..807edf98 | 5 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 807fed80..807ffb20 | 80845090..807f1fa8 | 1 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 80833474..808334e0 | 8085014c..8081b5e0 | 1 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 80838b18..80838e60 | 80820c20..808501b8 | 1 | 0 | rejected: 946 entries from other chunks land inside the NTSC gap | -| 8083ad54..8083b0cc | 808520ac..80820f54 | 1 | 0 | rejected: NTSC neighbours not ascending (chunk reordering) | -| 80841744..80842340 | 80826ce4..80852d0c | 1 | 0 | rejected: 864 entries from other chunks land inside the NTSC gap | -| 808516bc..80851d38 | 808320a8..808578c0 | 1 | 0 | rejected: 810 entries from other chunks land inside the NTSC gap | -| 80862d58..8086382c | 8085ed38..8085f3fc | 1 | 0 | rejected: count mismatch | -| 8086bc1c..8086c68c | 808780bc..80878abc | 1 | 0 | rejected: count mismatch | -| 8086c68c..8086e224 | 80878abc..8087a59c | 3 | 0 | rejected: count mismatch | - -## Collisions (two PAL entries porting to one NTSC-U address) - -The named entry is kept (both PAL entries are functions, so the address is a real entry point either way; only the name is in question). Extents are the distance to the next PAL entry / next emitted NTSC-U entry: the PAL entry whose extent matches the NTSC-U extent is the likelier owner of the address. - -| NTSC-U | PAL entries | NTSC-U extent | kept | -|---|---|---|---| -| 80225e74 | 0x80225f14 (PAL 80225f14, chunk, extent 0x50); EGG:ExpParticleManager::__ct (PAL 802261f8, chunk, extent 0x58) | 0x58 | EGG:ExpParticleManager::__ct | -| 8059682c | 0x805a0550 (PAL 805a0550, chunk, extent 0x50); CameraLink::__ct (PAL 805a1864, chunk, extent 0x58) | 0x58 | CameraLink::__ct | -| 80660694 | 0x8065fa0c (PAL 8065fa0c, chunk, extent 0x40); RKNet::USERHandler::CreateInstance (PAL 80662778, chunk, extent 0x80) | 0x80 | RKNet::USERHandler::CreateInstance | -| 806d8564 | Objects::Wanwan::__dt (PAL 806e95a8, chunk, extent 0x8); Objects::HwanwanBall::__dt(thunk) (PAL 806ec7c0, chunk, extent 0x8) | 0x8 | Objects::Wanwan::__dt | - -## Dropped entries (320) - -| PAL | name | reason | -|---|---|---| -| 80225f14 | 0x80225f14 | collision at 80225e74; kept 'EGG:ExpParticleManager::__ct' (PAL 802261f8) | -| 80225f64 | 0x80225f64 | outside every chunk; no interpolation gap | -| 80225fa4 | 0x80225fa4 | outside every chunk; no interpolation gap | -| 8022600c | 0x8022600c | outside every chunk; no interpolation gap | -| 80226060 | 0x80226060 | outside every chunk; no interpolation gap | -| 8022609c | 0x8022609c | outside every chunk; no interpolation gap | -| 802260f4 | 0x802260f4 | outside every chunk; no interpolation gap | -| 802261a8 | 0x802261a8 | outside every chunk; no interpolation gap | -| 802261ec | 0x802261ec | outside every chunk; no interpolation gap | -| 80244dd4 | switchdataD_80274dd4 | outside every chunk; no interpolation gap | -| 802474a0 | switchdataD_802474a0 | outside every chunk; no interpolation gap | -| 80270e30 | switchdataD_80270e30 | outside every chunk; no interpolation gap | -| 80271190 | switchdataD_80271190 | outside every chunk; no interpolation gap | -| 80271270 | switchdataD_80271270 | outside every chunk; no interpolation gap | -| 802713c0 | switchdataD_802713c0 | outside every chunk; no interpolation gap | -| 802714a0 | switchdataD_802714a0 | outside every chunk; no interpolation gap | -| 802714c0 | switchdataD_802714c0 | outside every chunk; no interpolation gap | -| 802714e0 | switchdataD_802714e0 | outside every chunk; no interpolation gap | -| 80271630 | switchdataD_80271630 | outside every chunk; no interpolation gap | -| 80271710 | switchdataD_80271710 | outside every chunk; no interpolation gap | -| 802718d0 | switchdataD_802718d0 | outside every chunk; no interpolation gap | -| 80271ab8 | switchdataD_80271ab8 | outside every chunk; no interpolation gap | -| 80271ad4 | switchdataD_80271ad4 | outside every chunk; no interpolation gap | -| 802726a0 | rnd_3DModels(NW4R)_802726a0 | outside every chunk; no interpolation gap | -| 802726c0 | rnd_Palettes(NW4R)_802726c0 | outside every chunk; no interpolation gap | -| 802726e0 | rnd_Textures(NW4R)_802726e0 | outside every chunk; no interpolation gap | -| 80272700 | rnd_AnmChr(NW4R)_80272700 | outside every chunk; no interpolation gap | -| 80272720 | rnd_AnmVis(NW4R)_80272720 | outside every chunk; no interpolation gap | -| 80272740 | rnd_AnmClr(NW4R)_80272740 | outside every chunk; no interpolation gap | -| 80272760 | rnd_AnmTexPat(NW4R)_80272760 | outside every chunk; no interpolation gap | -| 80272780 | rnd_AnmTexSrt(NW4R)_80272780 | outside every chunk; no interpolation gap | -| 802727a0 | rnd_AnmShp(NW4R)_802727a0 | outside every chunk; no interpolation gap | -| 802727c0 | rnd_AnmScn(NW4R)_802727c0 | outside every chunk; no interpolation gap | -| 80272810 | switchdataD_80272810 | outside every chunk; no interpolation gap | -| 80273088 | switchdataD_80273088 | outside every chunk; no interpolation gap | -| 802730b0 | switchdataD_802730b0 | outside every chunk; no interpolation gap | -| 80274520 | switchdataD_80274520 | outside every chunk; no interpolation gap | -| 80274578 | switchdataD_80274578 | outside every chunk; no interpolation gap | -| 80275018 | switchdataD_80275018 | outside every chunk; no interpolation gap | -| 80275700 | switchdataD_80275700 | outside every chunk; no interpolation gap | -| 80275a20 | switchdataD_80275a20 | outside every chunk; no interpolation gap | -| 80275cfc | switchdataD_80275cfc | outside every chunk; no interpolation gap | -| 80276954 | switchdataD_80276954 | outside every chunk; no interpolation gap | -| 802775e8 | switchdataD_802775e8 | outside every chunk; no interpolation gap | -| 80277d68 | switchdataD_80277d68 | outside every chunk; no interpolation gap | -| 80278cf0 | switchdataD_80278cf0 | outside every chunk; no interpolation gap | -| 80279af0 | switchdataD_80279af0 | outside every chunk; no interpolation gap | -| 80279b10 | switchdataD_80279b10 | outside every chunk; no interpolation gap | -| 80279b30 | switchdataD_80279b30 | outside every chunk; no interpolation gap | -| 80279b50 | switchdataD_80279b50 | outside every chunk; no interpolation gap | -| 80279b94 | switchdataD_80279b94 | outside every chunk; no interpolation gap | -| 8027a200 | switchdataD_8027a200 | outside every chunk; no interpolation gap | -| 8027a2d8 | switchdataD_8027a2d8 | outside every chunk; no interpolation gap | -| 8027a314 | switchdataD_8027a314 | outside every chunk; no interpolation gap | -| 8027a350 | switchdataD_8027a350 | outside every chunk; no interpolation gap | -| 8027a624 | switchdataD_8027a624 | outside every chunk; no interpolation gap | -| 8027b878 | switchdataD_8027b878 | outside every chunk; no interpolation gap | -| 8027ba5c | switchdataD_8027ba5c | outside every chunk; no interpolation gap | -| 8027bb2c | switchdataD_8027bb2c | outside every chunk; no interpolation gap | -| 8027bc28 | switchdataD_8027bc28 | outside every chunk; no interpolation gap | -| 8027bc44 | switchdataD_8027bc44 | outside every chunk; no interpolation gap | -| 8027d1a8 | switchdataD_8027d1a8 | outside every chunk; no interpolation gap | -| 8027ddf8 | switchdataD_8027ddf8 | outside every chunk; no interpolation gap | -| 80282cb0 | switchdataD_80282cb0 | outside every chunk; no interpolation gap | -| 80282cd8 | switchdataD_80282cd8 | outside every chunk; no interpolation gap | -| 80282d5c | switchdataD_80282d5c | outside every chunk; no interpolation gap | -| 80282d84 | switchdataD_80282d84 | outside every chunk; no interpolation gap | -| 80282f08 | switchdataD_80282f08 | outside every chunk; no interpolation gap | -| 80282f2c | switchdataD_80282f2c | outside every chunk; no interpolation gap | -| 80283220 | switchdataD_80283220 | outside every chunk; no interpolation gap | -| 80284d2c | switchdataD_80284d2c | outside every chunk; no interpolation gap | -| 80284e58 | switchdataD_80284e58 | outside every chunk; no interpolation gap | -| 80284e7c | switchdataD_80284e7c | outside every chunk; no interpolation gap | -| 80284ee8 | switchdataD_80284ee8 | outside every chunk; no interpolation gap | -| 80284f08 | switchdataD_80284f08 | outside every chunk; no interpolation gap | -| 80285c30 | switchdataD_80285c30 | outside every chunk; no interpolation gap | -| 80285cf0 | switchdataD_80285cf0 | outside every chunk; no interpolation gap | -| 80285d94 | switchdataD_80285d94 | outside every chunk; no interpolation gap | -| 80285e58 | switchdataD_80285e58 | outside every chunk; no interpolation gap | -| 80285fc0 | switchdataD_80285fc0 | outside every chunk; no interpolation gap | -| 80286054 | switchdataD_80286054 | outside every chunk; no interpolation gap | -| 802861e8 | switchdataD_802861e8 | outside every chunk; no interpolation gap | -| 80286274 | switchdataD_80286274 | outside every chunk; no interpolation gap | -| 80286338 | switchdataD_80286338 | outside every chunk; no interpolation gap | -| 802863d0 | switchdataD_802863d0 | outside every chunk; no interpolation gap | -| 8028697c | switchdataD_8028697c | outside every chunk; no interpolation gap | -| 80287078 | switchdataD_80287078 | outside every chunk; no interpolation gap | -| 80287110 | switchdataD_80287110 | outside every chunk; no interpolation gap | -| 80287190 | switchdataD_80287190 | outside every chunk; no interpolation gap | -| 802871d8 | switchdataD_802871d8 | outside every chunk; no interpolation gap | -| 8028725c | switchdataD_8028725c | outside every chunk; no interpolation gap | -| 802872b4 | switchdataD_802872b4 | outside every chunk; no interpolation gap | -| 80287388 | switchdataD_80287388 | outside every chunk; no interpolation gap | -| 802873f0 | switchdataD_802873f0 | outside every chunk; no interpolation gap | -| 80287488 | switchdataD_80287488 | outside every chunk; no interpolation gap | -| 80287528 | switchdataD_80287528 | outside every chunk; no interpolation gap | -| 8028758c | switchdataD_8028758c | outside every chunk; no interpolation gap | -| 802875f4 | switchdataD_802875f4 | outside every chunk; no interpolation gap | -| 802879e0 | switchdataD_802879e0 | outside every chunk; no interpolation gap | -| 80287da8 | switchdataD_80287da8 | outside every chunk; no interpolation gap | -| 80287e40 | switchdataD_80287e40 | outside every chunk; no interpolation gap | -| 80287e60 | switchdataD_80287e60 | outside every chunk; no interpolation gap | -| 80287e80 | switchdataD_80287e80 | outside every chunk; no interpolation gap | -| 80288404 | switchdataD_80288404 | outside every chunk; no interpolation gap | -| 802884b0 | switchdataD_802884b0 | outside every chunk; no interpolation gap | -| 8028855c | switchdataD_8028855c | outside every chunk; no interpolation gap | -| 80288614 | switchdataD_80288614 | outside every chunk; no interpolation gap | -| 802886c0 | switchdataD_802886c0 | outside every chunk; no interpolation gap | -| 80289fd0 | switchdataD_80289fd0 | outside every chunk; no interpolation gap | -| 8028a0a0 | switchdataD_8028a0a0 | outside every chunk; no interpolation gap | -| 8028a108 | switchdataD_8028a108 | outside every chunk; no interpolation gap | -| 8028a14c | switchdataD_8028a14c | outside every chunk; no interpolation gap | -| 8028a190 | switchdataD_8028a190 | outside every chunk; no interpolation gap | -| 8028a1d4 | switchdataD_8028a1d4 | outside every chunk; no interpolation gap | -| 8028a1f0 | switchdataD_8028a1f0 | outside every chunk; no interpolation gap | -| 8028a378 | switchdataD_8028a378 | outside every chunk; no interpolation gap | -| 8028a398 | switchdataD_8028a398 | outside every chunk; no interpolation gap | -| 8028a48c | switchdataD_8028a48c | outside every chunk; no interpolation gap | -| 8028a580 | switchdataD_8028a580 | outside every chunk; no interpolation gap | -| 8028a658 | switchdataD_8028a658 | outside every chunk; no interpolation gap | -| 8028a6b4 | switchdataD_8028a6b4 | outside every chunk; no interpolation gap | -| 8028b988 | switchdataD_8028b988 | outside every chunk; no interpolation gap | -| 8028b9b0 | switchdataD_8028b9b0 | outside every chunk; no interpolation gap | -| 8028ee58 | switchdataD_8028ee58 | outside every chunk; no interpolation gap | -| 8028f7dc | switchdataD_8028f7dc | outside every chunk; no interpolation gap | -| 80290820 | switchdataD_80290820 | outside every chunk; no interpolation gap | -| 8029c884 | switchdataD_8029c884 | outside every chunk; no interpolation gap | -| 8029ce88 | switchdataD_8029ce88 | outside every chunk; no interpolation gap | -| 8029da00 | switchdataD_8029da00 | outside every chunk; no interpolation gap | -| 8029da24 | switchdataD_8029da24 | outside every chunk; no interpolation gap | -| 8029dab0 | switchdataD_8029dab0 | outside every chunk; no interpolation gap | -| 8029dc28 | switchdataD_8029dc28 | outside every chunk; no interpolation gap | -| 8029dc4c | switchdataD_8029dc4c | outside every chunk; no interpolation gap | -| 8029e530 | switchdataD_8029e530 | outside every chunk; no interpolation gap | -| 802a010c | switchdataD_802a010c | outside every chunk; no interpolation gap | -| 802a0870 | switchdataD_802a0870 | outside every chunk; no interpolation gap | -| 802a0f68 | switchdataD_802a0f68 | outside every chunk; no interpolation gap | -| 802a1870 | switchdataD_802a1870 | outside every chunk; no interpolation gap | -| 802a18f8 | switchdataD_802a18f8 | outside every chunk; no interpolation gap | -| 802a19dc | switchdataD_802a19dc | outside every chunk; no interpolation gap | -| 802a2370 | switchdataD_802a2370 | outside every chunk; no interpolation gap | -| 802a23f8 | switchdataD_802a23f8 | outside every chunk; no interpolation gap | -| 802a2480 | switchdataD_802a2480 | outside every chunk; no interpolation gap | -| 802a2658 | switchdataD_802a2658 | outside every chunk; no interpolation gap | -| 802a2ba0 | switchdataD_802a2ba0 | outside every chunk; no interpolation gap | -| 802a31d8 | switchdataD_802a31d8 | outside every chunk; no interpolation gap | -| 802a32a0 | switchdataD_802a32a0 | outside every chunk; no interpolation gap | -| 802a335c | switchdataD_802a335c | outside every chunk; no interpolation gap | -| 802a3418 | switchdataD_802a3418 | outside every chunk; no interpolation gap | -| 802a34d4 | switchdataD_802a34d4 | outside every chunk; no interpolation gap | -| 802a3590 | switchdataD_802a3590 | outside every chunk; no interpolation gap | -| 802a364c | switchdataD_802a364c | outside every chunk; no interpolation gap | -| 802a3708 | switchdataD_802a3708 | outside every chunk; no interpolation gap | -| 802a37c4 | switchdataD_802a37c4 | outside every chunk; no interpolation gap | -| 802a3880 | switchdataD_802a3880 | outside every chunk; no interpolation gap | -| 802a3940 | switchdataD_802a3940 | outside every chunk; no interpolation gap | -| 802a39fc | switchdataD_802a39fc | outside every chunk; no interpolation gap | -| 802a3b88 | switchdataD_802a3b88 | outside every chunk; no interpolation gap | -| 802a3e30 | switchdataD_802a3e30 | outside every chunk; no interpolation gap | -| 80385920 | dev/fs_fd | outside every chunk; no interpolation gap | -| 80385924 | r13_and_stacks | outside every chunk; no interpolation gap | -| 80387100 | r13_and_stacks | outside every chunk; no interpolation gap | -| 80510238 | RelStart | outside every chunk; no interpolation gap | -| 80510a90 | isCompetitionValid | outside every chunk; no interpolation gap | -| 80510ab8 | 0x80510ab8 | outside every chunk; no interpolation gap | -| 805537cc | 0x805537cc | outside every chunk; no interpolation gap | -| 80553824 | 0x80553824 | outside every chunk; no interpolation gap | -| 80553828 | 0x80553828 | outside every chunk; no interpolation gap | -| 8055382c | 0x8055382c | outside every chunk; no interpolation gap | -| 80553838 | 0x80553838 | outside every chunk; no interpolation gap | -| 80553844 | 0x80553844 | outside every chunk; no interpolation gap | -| 80553850 | GlobeScene::__ct | outside every chunk; no interpolation gap | -| 805758e4 | 0x805758e4 | outside every chunk; no interpolation gap | -| 805a0550 | 0x805a0550 | collision at 8059682c; kept 'CameraLink::__ct' (PAL 805a1864) | -| 805a05a0 | AutoCameraMoverRace::__dt | outside every chunk; no interpolation gap | -| 805a05e0 | CamMove::__dt | outside every chunk; no interpolation gap | -| 805a0620 | 0x805a0620 | outside every chunk; no interpolation gap | -| 805a0660 | AutoCameraMover::__dt | outside every chunk; no interpolation gap | -| 805a1478 | AutoCameraMoverRace::vf_0x14 | outside every chunk; no interpolation gap | -| 805a1480 | AutoCameraMoverRace::vf_0x18 | outside every chunk; no interpolation gap | -| 805be61c | PushButton::TriggerPtmf | outside every chunk; no interpolation gap | -| 805be64c | PushButton_cpp_sinit_ | outside every chunk; no interpolation gap | -| 805bf2dc | Pages::MKChannelExplanation::GetRuntimeTypeInfo | outside every chunk; no interpolation gap | -| 805bf2e8 | Pages::AddMKChannel::GetRuntimeTypeInfo | outside every chunk; no interpolation gap | -| 805bf2f4 | Pages::MKChannelExplanation::TriggerButtonPtmf | outside every chunk; no interpolation gap | -| 805bf324 | Pages::AddMKChannel::TriggerButtonPtmf | outside every chunk; no interpolation gap | -| 805bf354 | Pages::MKChannelExplanation::TriggerBackPtmf | outside every chunk; no interpolation gap | -| 805bf384 | Pages::AddMKChannel::TriggerBackPtmf | outside every chunk; no interpolation gap | -| 805bf3b4 | AddMKChannelPage_cpp_sinit_ | outside every chunk; no interpolation gap | -| 805c579c | 0x805c579c | outside every chunk; no interpolation gap | -| 805cc0a8 | Pages::EndingMovie::OnActivate | outside every chunk; no interpolation gap | -| 805dbfdc | SheetSelectControlScaleFade::__dt | outside every chunk; no interpolation gap | -| 80637a8c | SystemBMGHolder::GetMessage | outside every chunk; no interpolation gap | -| 8063bcf8 | Pages::TitleMovie::OnActivate | outside every chunk; no interpolation gap | -| 8064aee4 | VRPage_cpp_sinit_ | outside every chunk; no interpolation gap | -| 8065b354 | 0x8065b354 | outside every chunk; no interpolation gap | -| 8065b3b8 | 0x8065b3b8 | outside every chunk; no interpolation gap | -| 8065b40c | 0x8065b40c | outside every chunk; no interpolation gap | -| 8065b450 | 0x8065b450 | outside every chunk; no interpolation gap | -| 8065b490 | 0x8065b490 | outside every chunk; no interpolation gap | -| 8065fa0c | 0x8065fa0c | collision at 80660694; kept 'RKNet::USERHandler::CreateInstance' (PAL 80662778) | -| 806c4ed4 | ManagedObjects::RegisterObject | outside every chunk; no interpolation gap | -| 806c63a8 | RouteController::SetPercent | outside every chunk; no interpolation gap | -| 806ce820 | 0x806ce820 | outside every chunk; no interpolation gap | -| 806d28f4 | Objects::MapObjSniper::LoadCollision | outside every chunk; no interpolation gap | -| 806d28f8 | Objects::MapObjSniper::LoadRoute | outside every chunk; no interpolation gap | -| 806d28fc | Objects::MapObjSniper::LoadModels | outside every chunk; no interpolation gap | -| 806d2900 | Objects::MapObjSniper::GetPropertiesBitfield | outside every chunk; no interpolation gap | -| 806d5c5c | Objects::HighwayManager::LoadClipInfo | outside every chunk; no interpolation gap | -| 806ec7c0 | Objects::HwanwanBall::__dt(thunk) | collision at 806d8564; kept 'Objects::Wanwan::__dt' (PAL 806e95a8) | -| 806f7698 | Audio::ItemWarning::GetPan | outside every chunk; no interpolation gap | -| 806f772c | Audio::ItemWarning::__ct | outside every chunk; no interpolation gap | -| 806f7740 | 0x806f7740 | outside every chunk; no interpolation gap | -| 806f7780 | 0x806f7780 | outside every chunk; no interpolation gap | -| 806f7a54 | 0x806f7a54 | outside every chunk; no interpolation gap | -| 807001a4 | Audio::Manager::LoadState | outside every chunk; no interpolation gap | -| 8072820c | 0x8072820c | outside every chunk; no interpolation gap | -| 80728210 | 0x80728210 | outside every chunk; no interpolation gap | -| 80728214 | AI::CPUDriving::GetCalculator | outside every chunk; no interpolation gap | -| 807285c8 | 0x807285c8 | outside every chunk; no interpolation gap | -| 80729338 | 0x80729338 | outside every chunk; no interpolation gap | -| 80729340 | 0x80729340 | outside every chunk; no interpolation gap | -| 80729348 | 0x80729348 | outside every chunk; no interpolation gap | -| 8072de64 | 0x8072de64 | outside every chunk; no interpolation gap | -| 8072de6c | 0x8072de6c | outside every chunk; no interpolation gap | -| 8072de74 | 0x8072de74 | outside every chunk; no interpolation gap | -| 8072de7c | 0x8072de7c | outside every chunk; no interpolation gap | -| 8072de84 | 0x8072de84 | outside every chunk; no interpolation gap | -| 8072de8c | 0x8072de8c | outside every chunk; no interpolation gap | -| 8072de94 | 0x8072de94 | outside every chunk; no interpolation gap | -| 8072de9c | 0x8072de9c | outside every chunk; no interpolation gap | -| 8072dea0 | 0x8072dea0 | outside every chunk; no interpolation gap | -| 8072dee0 | 0x8072dee0 | outside every chunk; no interpolation gap | -| 8072dee8 | 0x8072dee8 | outside every chunk; no interpolation gap | -| 8072def0 | 0x8072def0 | outside every chunk; no interpolation gap | -| 8072def8 | 0x8072def8 | outside every chunk; no interpolation gap | -| 8072df00 | 0x8072df00 | outside every chunk; no interpolation gap | -| 8072df08 | 0x8072df08 | outside every chunk; no interpolation gap | -| 8072df10 | 0x8072df10 | outside every chunk; no interpolation gap | -| 8072df58 | 0x8072df58 | outside every chunk; no interpolation gap | -| 8072df88 | 0x8072df88 | outside every chunk; no interpolation gap | -| 8072ff60 | 0x8072ff60 | outside every chunk; no interpolation gap | -| 8072ff68 | 0x8072ff68 | outside every chunk; no interpolation gap | -| 8072ff70 | 0x8072ff70 | outside every chunk; no interpolation gap | -| 80730a80 | AI::CPUDrivingAction::OnStart | outside every chunk; no interpolation gap | -| 80730ac8 | AI::CPUDrivingAction::Update | outside every chunk; no interpolation gap | -| 80730af8 | AI::CPUDrivingAction::OnEnd | outside every chunk; no interpolation gap | -| 8075db24 | 0x8075db24 | outside every chunk; no interpolation gap | -| 8075db2c | 0x8075db2c | outside every chunk; no interpolation gap | -| 8075db34 | 0x8075db34 | outside every chunk; no interpolation gap | -| 807693ec | 0x807693ec | outside every chunk; no interpolation gap | -| 8076942c | 0x8076942c | outside every chunk; no interpolation gap | -| 807694e8 | 0x807694e8 | outside every chunk; no interpolation gap | -| 80769584 | 0x80769584 | outside every chunk; no interpolation gap | -| 80769590 | 0x80769590 | outside every chunk; no interpolation gap | -| 8076959c | 0x8076959c | outside every chunk; no interpolation gap | -| 807695a4 | 0x807695a4 | outside every chunk; no interpolation gap | -| 80769608 | 0x80769608 | outside every chunk; no interpolation gap | -| 8076ebdc | Objects::SubObjectArray::vf_0x14 | outside every chunk; no interpolation gap | -| 807726c4 | 0x807726c4 | outside every chunk; no interpolation gap | -| 80773c14 | Objects::MiiKanban::GetPropertiesBitfield | outside every chunk; no interpolation gap | -| 8077439c | 0x8077439c | outside every chunk; no interpolation gap | -| 8077ce88 | 0x8077ce88 | outside every chunk; no interpolation gap | -| 807a9d90 | Item::ObjKinoko::InitSelf | outside every chunk; no interpolation gap | -| 807a9dac | __sinit_ItemObjKinoko_cpp | outside every chunk; no interpolation gap | -| 807a9dd4 | Item::ObjKinokoBig::CreateArray | outside every chunk; no interpolation gap | -| 807a9e50 | Item::Player::UseMegaMushroom | outside every chunk; no interpolation gap | -| 807a9ea4 | Item::ObjKinokoBig::InitSelf | outside every chunk; no interpolation gap | -| 807d9b80 | DriverCalcWorldCB::ExecCallbackC(thunk) | outside every chunk; no interpolation gap | -| 807d9b88 | DriverCalcWorldCB::ExecCallbackB(thunk) | outside every chunk; no interpolation gap | -| 807d9b90 | DriverCalcWorldCB::__dt(thunk) | outside every chunk; no interpolation gap | -| 807dc8c8 | 0x807dc8c8 | outside every chunk; no interpolation gap | -| 807e2520 | CtrlMenuMovieButton::GetMovieCount | outside every chunk; no interpolation gap | -| 807e2528 | CtrlMenuBattleStageSelectCup::GetRuntimeTypeInfo | outside every chunk; no interpolation gap | -| 807e2534 | CtrlMenuBattleStageSelectCupSub::GetRuntimeTypeInfo | outside every chunk; no interpolation gap | -| 807e2540 | CtrlMenuBattleStage_cpp_sinit_ | outside every chunk; no interpolation gap | -| 807e256c | CtrlMenuMovieButton::OnUpdate(PushButton) | outside every chunk; no interpolation gap | -| 807e2574 | CtrlMenuMovieButton::InitSelf(PushButton) | outside every chunk; no interpolation gap | -| 807e257c | CtrlMenuMovieButton::OnLoad(PushButton) | outside every chunk; no interpolation gap | -| 807e2584 | StageButton::__dt(PushButton) | outside every chunk; no interpolation gap | -| 807e258c | StageButton::GetClassName(PushButton) | outside every chunk; no interpolation gap | -| 807e2594 | StageButton::GetRuntimeTypeInfo(PushButton) | outside every chunk; no interpolation gap | -| 807e5610 | CtrlMenuCourseSelectCup::GetRuntimeTypeInfo | outside every chunk; no interpolation gap | -| 807e561c | CtrlMenuCourseSelectCupSub::GetRuntimeTypeInfo | outside every chunk; no interpolation gap | -| 807e5628 | CtrlMenuCoursecpp_sinit_ | outside every chunk; no interpolation gap | -| 807e9c44 | CtrlMenuPressStart::GetClassName | outside every chunk; no interpolation gap | -| 807ee23c | CtrlRaceBattleSetPoint_cpp_sinit_ | outside every chunk; no interpolation gap | -| 807ee468 | CtrlRaceCount::GetRuntimeTypeInfo | outside every chunk; no interpolation gap | -| 807ef9f4 | CtrlRaceLive::getClassName | outside every chunk; no interpolation gap | -| 807efa00 | CtrlRaceLive::initLayout | outside every chunk; no interpolation gap | -| 807efa70 | screenElement_setupPauseMovement | outside every chunk; no interpolation gap | -| 807efa74 | 0x807efa74 | outside every chunk; no interpolation gap | -| 807efa78 | CtrlRaceLiveMessage::getClassName | outside every chunk; no interpolation gap | -| 807efa88 | CtrlRaceLiveMessage::initLayout | outside every chunk; no interpolation gap | -| 807efadc | CtrlRaceLiveMessage::onInit | outside every chunk; no interpolation gap | -| 807efb90 | CtrlRaceLiveMessage::onUpdate | outside every chunk; no interpolation gap | -| 807efc20 | CtrlRaceLiveMessage::__dt | outside every chunk; no interpolation gap | -| 807efc7c | CtrlRaceLiveMessage::getInstance | outside every chunk; no interpolation gap | -| 807efc88 | CtrlRaceLive::__dt | outside every chunk; no interpolation gap | -| 807efce4 | 0x807efce4 | outside every chunk; no interpolation gap | -| 807efcf0 | __sinit_CtrlRaceLive_cpp | outside every chunk; no interpolation gap | -| 807f7ba4 | CtrlRaceScore::GetRuntimeTypeInfo | outside every chunk; no interpolation gap | -| 807f7bb0 | CtrlRaceScore_cpp_sinit_ | outside every chunk; no interpolation gap | -| 807f890c | CtrlRaceTime::__dt | outside every chunk; no interpolation gap | -| 807f9348 | GeoHitTableHolder::__dt | outside every chunk; no interpolation gap | -| 807f9388 | Objects::Airblock::__ct | outside every chunk; no interpolation gap | -| 807f9424 | Objects::Airblock::__ct(Vec3s) | outside every chunk; no interpolation gap | -| 807f94cc | Objects::Airblock::OnStart | outside every chunk; no interpolation gap | -| 807f957c | ObjectCollisionPolyhedra::GetRadius | outside every chunk; no interpolation gap | -| 807ffae0 | 0x807ffae0 | outside every chunk; no interpolation gap | -| 808334a0 | MenuKartModelMgr::__dt | outside every chunk; no interpolation gap | -| 80838e4c | MenuBGPage_cpp_sinit_ | outside every chunk; no interpolation gap | -| 8083b0c0 | Pages::BattleKartSelect::GetRuntimeTypeInfo | outside every chunk; no interpolation gap | -| 80842334 | Pages::CupSelect::GetRuntimeTypeInfo | outside every chunk; no interpolation gap | -| 80851d2c | Pages::MainMenu::GetRuntimeTypeInfo | outside every chunk; no interpolation gap | -| 80862e24 | 0x80862e24 | outside every chunk; no interpolation gap | -| 8086c098 | Objects::WLwallGC::CalcNextPosition | outside every chunk; no interpolation gap | -| 8086c988 | 0x8086c988 | outside every chunk; no interpolation gap | -| 8086c98c | 0x8086c98c | outside every chunk; no interpolation gap | -| 8086c9cc | 0x8086c9cc | outside every chunk; no interpolation gap | - -## Unverified entries (206; ported by the chunk table but not confirmed by the binary, not emitted) - -- conditional-branch target (inside a function): 38 -- conditional-branch target that is also jump-table referenced (a case label without a label name): 38 -- jump-table referenced but named/unnamed as a function: 1 -- lands on a padding word (real function usually at +4): 24 -- no evidence, predecessor is not a terminator: 102 -- outside text (data symbols): 3 - -| PAL | name | NTSC-U | evidence | detail | -|---|---|---|---|---| -| 8000a000 | 0x8000a000 | 80009fc0 | - | prev=93e1000c (stw r31,12(r1)) word=800d93f8 (lwz r0,-27656(r13)) | -| 8000fb80 | 0x8000fb80 | 8000f020 | - | prev=38000005 (li r0,5) word=9801000c (op38) | -| 8000fbb4 | 0x8000fbb4 | 8000f054 | ptr+bc | conditional-branch target (inside a function); prev=4800000c (b) word=380000ff (li r0,255) | -| 80010000 | 0x80010000 | 8000f4a0 | bc | conditional-branch target (inside a function); prev=41820010 (bc) word=8078000c (lwz r3,12(r24)) | -| 80010138 | 0x80010138 | 8000f5d8 | bc | conditional-branch target (inside a function); prev=48000358 (b) word=3b800000 (li r28,0) | -| 80010dbc | 0x80010dbc | 8001025c | bc | conditional-branch target (inside a function); prev=48000844 (b) word=7de37b78 (mr r3,r15) | -| 8001237c | 0x8001237c | 8001181c | bc | conditional-branch target (inside a function); prev=48000be8 (b) word=281600ff (cmplwi cr0,r22,255) | -| 80016e68 | 0x80016e68 | 80016308 | bc | conditional-branch target (inside a function); prev=48000920 (b) word=7fc3f378 (mr r3,r30) | -| 80020000 | 0x80020000 | 8001f4a0 | - | prev=6042d868 (ori r2,r2,0xd868) word=38600001 (li r3,1) | -| 8002055c | 0x8002055c | 8001f9fc | - | prev=388421b8 (addi r4,r4,8632) word=38a00001 (li r5,1) | -| 80020800 | 0x80020800 | 8001fca0 | - | prev=7fe3fb78 (mr r3,r31) word=38a521b8 (addi r5,r5,8632); next proven start at +0x2c | -| 80021360 | 0x80021360 | 80020800 | ptr+bc | conditional-branch target (inside a function); prev=48000020 (b) word=80030000 (lwz r0,0(r3)) | -| 8002137c | 0x8002137c | 8002081c | b | prev=4e800421 (op19) word=806d9494 (lwz r3,-27500(r13)) | -| 80021ba8 | 0x80021ba8 | 80021b08 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x8 | -| 80024870 | 0x80024870 | 800247d0 | - | prev=48174915 (bl) word=3803ffe4 (addi r0,r3,-28) | -| 800259d0 | 0x800259d0 | 80025930 | - | prev=7fa4eb78 (mr r4,r29) word=387c0004 (addi r3,r28,4) | -| 80046a40 | 0x80046a40 | 800469a0 | - | prev=3c608004 (lis r3,0x8004) word=38636ae0 (addi r3,r3,27360) | -| 80046a50 | 0x80046a50 | 800469b0 | - | prev=38630060 (addi r3,r3,96) word=4e800020 (blr) | -| 800495d0 | 0x800495d0 | 80049530 | - | prev=7ee7bb78 (mr r7,r23) word=7f68db78 (mr r8,r27) | -| 8004b3a0 | 0x8004b3a0 | 8004b300 | - | prev=3c608005 (lis r3,0x8005) word=3863b440 (addi r3,r3,-19392) | -| 8004b3b0 | 0x8004b3b0 | 8004b310 | - | prev=38630060 (addi r3,r3,96) word=4e800020 (blr) | -| 8004f710 | 0x8004f710 | 8004f670 | - | prev=38630018 (addi r3,r3,24) word=80a1002c (lwz r5,44(r1)) | -| 80051c40 | 0x80051c40 | 80051ba0 | - | prev=38000002 (li r0,2) word=48000010 (b) | -| 8005ee40 | 0x8005ee40 | 8005eda0 | - | prev=e03f0008 (op56) word=39210020 (addi r9,r1,32) | -| 8005fec0 | 0x8005fec0 | 8005fe20 | - | prev=90610008 (stw r3,8(r1)) word=40820014 (bc) | -| 80061c90 | 0x80061c90 | 80061bf0 | - | prev=4182000c (bc) word=80030018 (lwz r0,24(r3)) | -| 80068260 | 0x80068260 | 800681c0 | - | prev=dbe10120 (stfd f31,288(r1)) word=f3e10128 (op60) | -| 8006b7a0 | 0x8006b7a0 | 8006b700 | - | prev=ec4a01b2 (op59) word=ec88202a (op59) | -| 8006d480 | 0x8006d480 | 8006d3e0 | - | prev=c1230004 (op48) word=ecc7102a (op59) | -| 80080000 | 0x80080000 | 8007ff60 | - | prev=80010034 (lwz r0,52(r1)) word=7c0803a6 (mtlr r0); next proven start at +0x10 | -| 80084780 | 0x80084780 | 800846e0 | - | prev=38a00001 (li r5,1) word=38c00004 (li r6,4); next proven start at +0x40 | -| 80088920 | 0x80088920 | 80088880 | - | prev=38800100 (li r4,256) word=48118d0d (bl) | -| 80089a00 | 0x80089a00 | 80089960 | - | prev=90810008 (stw r4,8(r1)) word=c0030040 (op48) | -| 8008bd70 | 0x8008bd70 | 8008bcd0 | - | prev=7c040214 (op31) word=7fc01a14 (op31) | -| 8008c540 | 0x8008c540 | 8008c4a0 | - | prev=396100a0 (addi r11,r1,160) word=4bf9459d (bl) | -| 8008e170 | 0x8008e170 | 8008e0d0 | - | prev=90e300a0 (stw r7,160(r3)) word=90e300e0 (stw r7,224(r3)) | -| 80090000 | 0x80090000 | 8008ff60 | bc | conditional-branch target (inside a function); prev=4e800421 (op19) word=881e0037 (op34) | -| 8009716c | 0x8009716c | 800970cc | b+jt+bc | conditional-branch target (inside a function); prev=981f0008 (op38) word=39610030 (addi r11,r1,48) | -| 80097cf0 | 0x80097cf0 | 80097c50 | - | prev=80a30170 (lwz r5,368(r3)) word=7c042800 (op31) | -| 800aeed0 | nw4r::snd::detail::DecodeDspAdpcm | 800aee30 | - | prev=54806326 (op21) word=a1230024 (op40) | -| 800aeee0 | nw4r::snd::detail::WsdPlayer::InvalidateWaveData | 800aee40 | - | prev=54e4073e (op21) word=54c7103a (op21) | -| 800b1a00 | 0x800b1a00 | 800b1960 | - | prev=80040004 (lwz r0,4(r4)) word=90030008 (stw r0,8(r3)); next proven start at +0x20 | -| 800b7fd8 | 0x800b7fd8 | 800b7f38 | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 800b80ec | 0x800b80ec | 800b804c | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 800b8464 | 0x800b8464 | 800b83c4 | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 800b87e4 | 0x800b87e4 | 800b8744 | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 800b90d4 | 0x800b90d4 | 800b9034 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0xc | -| 800b9384 | 0x800b9384 | 800b92e4 | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 800b9618 | 0x800b9618 | 800b9578 | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 800b9b7c | 0x800b9b7c | 800b9adc | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x4 | -| 800b9d84 | 0x800b9d84 | 800b9ce4 | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 800b9e9c | 0x800b9e9c | 800b9dfc | - | prev=4e800020 (blr) word=00000000 (.long 0) | -| 800b9f48 | 0x800b9f48 | 800b9ea8 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x8 | -| 800ba18c | 0x800ba18c | 800ba0ec | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x4 | -| 800ba814 | 0x800ba814 | 800ba774 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x1c | -| 800ba828 | 0x800ba828 | 800ba788 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x8 | -| 800bbae8 | 0x800bbae8 | 800bba48 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x8 | -| 800bc138 | bootloadDB2Res_ | 800bc098 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x8 | -| 800bed50 | 0x800bed50 | 800becb0 | - | prev=39610020 (addi r11,r1,32) word=4bf61d91 (bl) | -| 800c5550 | 0x800c5550 | 800c54b0 | - | prev=38c65380 (addi r6,r6,21376) word=38a00040 (li r5,64) | -| 800c686c | 0x800c686c | 800c67cc | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x4 | -| 800c8214 | 0x800c8214 | 800c8174 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0xc | -| 800cbb4c | 0x800cbb4c | 800cbaac | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x4 | -| 800cbb84 | 0x800cbb84 | 800cbae4 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0xc | -| 800cbde4 | 0x800cbde4 | 800cbd44 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0xc | -| 800cbe2c | 0x800cbe2c | 800cbd8c | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x4 | -| 800cc048 | RFL::SetToWiFiPacket | 800cbfa8 | - | prev=4e800020 (blr) word=00000000 (.long 0); next proven start at +0x8 | -| 800e5644 | 0x800e5644 | 800e55a4 | - | prev=90010014 (stw r0,20(r1)) word=93e1000c (stw r31,12(r1)) | -| 800f0000 | 0x800f0000 | 800eff60 | - | prev=7c63f82e (op31) word=4bfff4e1 (bl); next proven start at +0x38 | -| 800f6d4c | 0x800f6d4c | 800f6cac | - | prev=7c9b2378 (mr r27,r4) word=7cbc2b78 (mr r28,r5) | -| 800fb78c | 0x800fb78c | 800fb6ec | - | prev=93c10018 (stw r30,24(r1)) word=3bc00000 (li r30,0) | -| 800fedbc | 0x800fedbc | 800fed1c | - | prev=8063000c (lwz r3,12(r3)) word=93e3000c (stw r31,12(r3)) | -| 80100000 | 0x80100000 | 800fff60 | bc | conditional-branch target (inside a function); prev=4800013c (b) word=38800000 (li r4,0) | -| 8010f4b8 | 0x8010f4b8 | 8010f418 | - | prev=83e1001c (lwz r31,28(r1)) word=83c10018 (lwz r30,24(r1)); next proven start at +0x14 | -| 80128018 | 0x80128018 | 80127f78 | - | prev=7c002050 (op31) word=900d99b4 (stw r0,-26188(r13)); next proven start at +0x14 | -| 8012e5a8 | 0x8012e5a8 | 8012e508 | b | prev=7c0004ac (op31) word=60000000 (ori r0,r0,0x0000); next proven start at +0x10 | -| 80130000 | 0x80130000 | 8012ff60 | - | prev=90050000 (stw r0,0(r5)) word=48000054 (b) | -| 80134d98 | 0x80134d98 | 80134cf8 | - | prev=93810010 (stw r28,16(r1)) word=7c7c1b78 (mr r28,r3) | -| 80144610 | 0x80144610 | 80144570 | jt+bc | conditional-branch target (inside a function); prev=4e800020 (blr) word=38600114 (li r3,276); next proven start at +0x8 | -| 8015581c | 0x8015581c | 8015577c | - | prev=7c0802a6 (mflr r0) word=3ce08028 (lis r7,0x8028) | -| 8015b2bc | 0x8015b2bc | 8015b21c | bc | conditional-branch target (inside a function); prev=48000258 (b) word=88e80000 (op34) | -| 8015b368 | 0x8015b368 | 8015b2c8 | ptr+bc | conditional-branch target (inside a function); prev=4800000c (b) word=38600000 (li r3,0) | -| 801656a4 | 0x801656a4 | 80165604 | - | prev=7ca40214 (op31) word=806d8ce8 (lwz r3,-29464(r13)) | -| 80165d20 | 0x80165d20 | 80165c80 | - | prev=90010014 (stw r0,20(r1)) word=38e7f160 (addi r7,r7,-3744) | -| 80166864 | 0x80166864 | 801667c4 | - | prev=4cc63182 (op19) word=4803bd6d (bl) | -| 8016d61c | 0x8016d61c | 8016d57c | bc | conditional-branch target (inside a function); prev=480001a8 (b) word=80c30000 (lwz r6,0(r3)) | -| 8016d7bc | 0x8016d7bc | 8016d71c | ptr+b+bc | conditional-branch target (inside a function); prev=90c50018 (stw r6,24(r5)) word=38630008 (addi r3,r3,8) | -| 8016de1c | 0x8016de1c | 8016dd7c | bc | conditional-branch target (inside a function); prev=48000178 (b) word=80c40000 (lwz r6,0(r4)) | -| 8016f240 | 0x8016f240 | 8016f1a0 | - | prev=80c29728 (lwz r6,-26840(r2)) word=3c60cc01 (lis r3,0xcc01) | -| 80171770 | 0x80171770 | 801716d0 | - | prev=98038000 (op38) word=90a38000 (stw r5,-32768(r3)); next proven start at +0x3c | -| 8017cf40 | 0x8017cf40 | 8017cea0 | - | prev=801a0064 (lwz r0,100(r26)) word=2c000002 (cmpwi cr0,r0,2) | -| 8017ff60 | 0x8017ff60 | 8017fec0 | bc | conditional-branch target (inside a function); prev=48000250 (b) word=801a0000 (lwz r0,0(r26)) | -| 8017ffc4 | 0x8017ffc4 | 8017ff24 | bc | conditional-branch target (inside a function); prev=48000068 (b) word=80190000 (lwz r0,0(r25)) | -| 80180000 | 0x80180000 | 8017ff60 | - | prev=7cc00734 (op31) word=88940001 (op34) | -| 80192348 | 0x80192348 | 801922a8 | - | prev=90a400aa (stw r5,170(r4)) word=90a400ae (stw r5,174(r4)) | -| 8019801c | 0x8019801c | 80197f7c | - | prev=2c000000 (cmpwi cr0,r0,0) word=4082004c (bc) | -| 8019d454 | 0x8019d454 | 8019d3b4 | - | prev=3ca08029 (lis r5,0x8029) word=387f0048 (addi r3,r31,72) | -| 801a0000 | 0x801a0000 | 8019ff60 | - | prev=41820018 (bc) word=3c800001 (lis r4,0x0001) | -| 801a0138 | 0x801a0138 | 801a0098 | - | prev=3c80801a (lis r4,0x801a) word=3ca0801a (lis r5,0x801a) | -| 801a0404 | 0x801a0404 | 801a0364 | - | prev=7c651b78 (mr r5,r3) word=60000000 (ori r0,r0,0x0000) | -| 801ad43c | 0x801ad43c | 801ad39c | - | prev=93c100a8 (stw r30,168(r1)) word=7cbe2b78 (mr r30,r5) | -| 801b1c60 | 0x801b1c60 | 801b1bc0 | - | prev=98010008 (op38) word=48000030 (b) | -| 801bcc20 | 0x801bcc20 | 801bcb80 | - | prev=38210030 (addi r1,r1,48) word=4e800020 (blr); next proven start at +0x4 | -| 801d0eb0 | 0x801d0eb0 | 801d0e10 | - | prev=7c7d1b78 (mr r29,r3) word=7c9e2378 (mr r30,r4) | -| 801da7e8 | 0x801da7e8 | 801da748 | bc | conditional-branch target (inside a function); prev=48000008 (b) word=3a940001 (addi r20,r20,1) | -| 801da7ec | 0x801da7ec | 801da74c | b+bc | conditional-branch target (inside a function); prev=3a940001 (addi r20,r20,1) word=88140000 (op34) | -| 801dab8c | 0x801dab8c | 801daaec | b+jt+bc | conditional-branch target (inside a function); prev=4180feb0 (bc) word=2c1e0000 (cmpwi cr0,r30,0) | -| 801dcecc | 0x801dcecc | 801dce2c | b+jt+bc | conditional-branch target (inside a function); prev=900da0cc (stw r0,-24372(r13)) word=80010024 (lwz r0,36(r1)); next proven start at +0x1c | -| 801dfb34 | 0x801dfb34 | 801dfa94 | - | prev=7c751b78 (mr r21,r3) word=41820008 (bc) | -| 801ec214 | 0x801ec214 | 801ec174 | bc | conditional-branch target (inside a function); prev=39c00002 (li r14,2) word=4bfba399 (bl) | -| 801f6708 | 0x801f6708 | 801f6668 | - | prev=3b400000 (li r26,0) word=48000028 (b) | -| 801ff230 | 0x801ff230 | 801ff190 | - | prev=9421ffd0 (stwu r1,-48(r1)) word=7c0802a6 (mflr r0) | -| 80211b40 | 0x80211b40 | 80211aa0 | ptr+bc | conditional-branch target (inside a function); prev=48000010 (b) word=38800000 (li r4,0); next proven start at +0x1c | -| 80217e1c | 0x80217e1c | 80217d7c | bc | conditional-branch target (inside a function); prev=4080022c (bc) word=7ca66050 (op31) | -| 80218028 | 0x80218028 | 80217f88 | - | prev=80a1002c (lwz r5,44(r1)) word=d8410030 (stfd f2,48(r1)); next proven start at +0x34 | -| 8021b790 | 0x8021b790 | 8021b6f0 | bc | conditional-branch target (inside a function); prev=3dc0802a (lis r14,0x802a) word=386100c0 (addi r3,r1,192) | -| 8021ff0c | 0x8021ff0c | 8021fe6c | bc | conditional-branch target (inside a function); prev=c3c29cb0 (op48) word=c0580024 (op48) | -| 80220000 | 0x80220000 | 8021ff60 | - | prev=5400043e (op21) word=900100f4 (stw r0,244(r1)) | -| 8023152c | 0x8023152c | 802311a8 | bc | conditional-branch target (inside a function); prev=480000d0 (b) word=80770000 (lwz r3,0(r23)) | -| 80232eec | 0x80232eec | 80232b68 | ptr+bc | conditional-branch target (inside a function); prev=48000014 (b) word=38000000 (li r0,0) | -| 8023bc00 | 0x8023bc00 | 8023b87c | bc | conditional-branch target (inside a function); prev=480000fc (b) word=5605043e (op21) | -| 80240000 | 0x80240000 | 8023fc7c | bc | conditional-branch target (inside a function); prev=3bc00000 (li r30,0) word=807d0004 (lwz r3,4(r29)) | -| 802a4080 | rkSystem | 8029fd00 | - | not in a text section (unmapped) | -| 802a40f4 | r13_and_stacks | 8029fd74 | - | not in a text section (unmapped) | -| 80386000 | SystemManager | 80381c80 | - | not in a text section (unmapped) | -| 80528058 | 0x80528058 | 80523be4 | - | prev=83c10018 (lwz r30,24(r1)) word=80010024 (lwz r0,36(r1)) | -| 8052aea4 | 0x8052aea4 | 80526a30 | bc | conditional-branch target (inside a function); prev=3e808000 (lis r20,0x8000) word=7ee3bb78 (mr r3,r23) | -| 8053bcc8 | 0x8053bcc8 | 80537180 | bc | conditional-branch target (inside a function); prev=48000414 (b) word=566315ba (op21) | -| 8053bcf4 | 0x8053bcf4 | 805371ac | bc | conditional-branch target (inside a function); prev=b0010020 (op44) word=80150044 (lwz r0,68(r21)) | -| 80540000 | 0x80540000 | 8053aac4 | - | prev=38a0001c (li r5,28) word=38c0000c (li r6,12) | -| 80550000 | 0x80550000 | 80550d9c | - | prev=5404063e (op21) word=380393f0 (addi r0,r3,-27664) | -| 805536d8 | 0x805536d8 | 8054d780 | bc | conditional-branch target (inside a function); prev=48000094 (b) word=7f03c378 (mr r3,r24) | -| 80553730 | 0x80553730 | 8054d7d8 | jt+bc | conditional-branch target (inside a function); prev=48000008 (b) word=3b400008 (li r26,8) | -| 805658f0 | 0x805658f0 | 80561570 | - | prev=1ca5000c (op7) word=c8430000 (lfd f2,0(r3)) | -| 80565b50 | 0x80565b50 | 805617d0 | - | prev=7c0802a6 (mflr r0) word=2c030000 (cmpwi cr0,r3,0) | -| 80565d14 | 0x80565d14 | 80561994 | - | prev=d01e0028 (op52) word=d01e002c (op52) | -| 8058b164 | 0x8058b164 | 80584940 | - | prev=48000cc1 (bl) word=7fc3f378 (mr r3,r30); next proven start at +0x34 | -| 805abea8 | 0x805abea8 | 805a0f40 | b+jt+bc | conditional-branch target (inside a function); prev=4819a1d9 (bl) word=807f0000 (lwz r3,0(r31)) | -| 805b0000 | 0x805b0000 | 805a50d8 | - | prev=99410009 (op38) word=9921000a (op38) | -| 805cdf28 | 0x805cdf28 | 805c1408 | b+bc | conditional-branch target (inside a function); prev=d014001c (op52) word=5660103a (op21) | -| 805d2aa8 | 0x805d2aa8 | 805c598c | bc | conditional-branch target (inside a function); prev=3a20ffff (li r17,-1) word=80100000 (lwz r0,0(r16)) | -| 805f98f4 | SimpleMessageWindowControl::GetClassName | 805d9010 | - | prev=3c600000 (lis r3,0x0000) word=38630000 (addi r3,r3,0); next proven start at +0xc | -| 8060b73c | 0x8060b73c | 80640c5c | - | prev=38800037 (li r4,55) word=38a00038 (li r5,56) | -| 8060b82c | 0x8060b82c | 80640d4c | - | prev=386100f8 (addi r3,r1,248) word=38840000 (addi r4,r4,0) | -| 8060ef44 | 0x8060ef44 | 80644464 | ptr+b+bc | conditional-branch target (inside a function); prev=4bf99749 (bl) word=396100f0 (addi r11,r1,240); next proven start at +0x18 | -| 806116c0 | 0x806116c0 | 80646be0 | ptr+b+bc | conditional-branch target (inside a function); prev=4800005c (b) word=38610008 (addi r3,r1,8) | -| 8061f550 | 0x8061f550 | 8064c06c | b+jt+bc | conditional-branch target (inside a function); prev=48000088 (b) word=38610008 (addi r3,r1,8) | -| 80628068 | 0x80628068 | 805f71b4 | - | prev=80010014 (lwz r0,20(r1)) word=7c0803a6 (mtlr r0) | -| 8064f7ec | 0x8064f7ec | 8061c4d8 | bc | conditional-branch target (inside a function); prev=3fc00000 (lis r30,0x0000) word=5743063e (op21) | -| 8064f988 | 0x8064f988 | 8061c674 | ptr+b+bc | conditional-branch target (inside a function); prev=4bef8eed (bl) word=38c00001 (li r6,1) | -| 8065193c | 0x8065193c | 8061e628 | bc | conditional-branch target (inside a function); prev=3dc00000 (lis r14,0x0000) word=807a0000 (lwz r3,0(r26)) | -| 80651984 | 0x80651984 | 8061e670 | bc | conditional-branch target (inside a function); prev=480001f8 (b) word=9a3601f4 (op38) | -| 80651b1c | 0x80651b1c | 8061e808 | ptr+b+bc | conditional-branch target (inside a function); prev=901601f8 (stw r0,504(r22)) word=807a0000 (lwz r3,0(r26)) | -| 80668558 | 0x80668558 | 806761a8 | ptr+bc | conditional-branch target (inside a function); prev=48000068 (b) word=388018a6 (li r4,6310) | -| 8067b190 | 0x8067b190 | 80676d08 | jt+bc | conditional-branch target (inside a function); prev=48000068 (b) word=388018a6 (li r4,6310) | -| 80688e48 | 0x80688e48 | 806849c0 | bc | conditional-branch target (inside a function); prev=d001008c (op52) word=281a0009 (cmplwi cr0,r26,9) | -| 80689d74 | 0x80689d74 | 806858ec | bc | conditional-branch target (inside a function); prev=3a600001 (li r19,1) word=281b0009 (cmplwi cr0,r27,9) | -| 8068a3b4 | 0x8068a3b4 | 80685f2c | bc | conditional-branch target (inside a function); prev=3a600001 (li r19,1) word=281b0009 (cmplwi cr0,r27,9) | -| 8068a9fc | 0x8068a9fc | 80686574 | bc | conditional-branch target (inside a function); prev=3a200001 (li r17,1) word=28190009 (cmplwi cr0,r25,9) | -| 8068b15c | 0x8068b15c | 80686cd4 | bc | conditional-branch target (inside a function); prev=3a200001 (li r17,1) word=28190009 (cmplwi cr0,r25,9) | -| 80697c30 | 0x80697c30 | 806937a8 | bc | conditional-branch target (inside a function); prev=3fc00000 (lis r30,0x0000) word=807d0164 (lwz r3,356(r29)) | -| 806a2460 | 0x806a2460 | 8069dfd8 | - | prev=38ff06f4 (addi r7,r31,1780) word=391f07c8 (addi r8,r31,1992) | -| 806afaf0 | 0x806afaf0 | 806ab668 | - | prev=807e0318 (lwz r3,792(r30)) word=389f0738 (addi r4,r31,1848) | -| 806baad4 | 0x806baad4 | 806b664c | - | prev=8001001c (lwz r0,28(r1)) word=b01e0182 (op44) | -| 806bd88c | 0x806bd88c | 806b9404 | - | prev=80630028 (lwz r3,40(r3)) word=4be99bbd (bl) | -| 806bf208 | 0x806bf208 | 806bad80 | - | prev=7c9e002e (op31) word=38840030 (addi r4,r4,48) | -| 806bf228 | 0x806bf228 | 806bada0 | - | prev=c0410020 (op48) word=60000001 (ori r0,r0,0x0001) | -| 806c9f90 | 0x806c9f90 | 806bf39c | - | prev=7c0803a6 (mtlr r0) word=38210020 (addi r1,r1,32) | -| 806c9fb0 | 0x806c9fb0 | 806bf3bc | - | prev=81830000 (lwz r12,0(r3)) word=3fc00000 (lis r30,0x0000) | -| 806e70c4 | 0x806e70c4 | 806d6080 | - | prev=c01e001c (op48) word=d03c0120 (op52) | -| 8070ecb4 | 0x8070ecb4 | 80716384 | - | prev=90c30060 (stw r6,96(r3)) word=4d810020 (op19) | -| 8070ede4 | 0x8070ede4 | 807164b4 | jt | prev=90030060 (stw r0,96(r3)) word=4e800020 (blr) | -| 807123bc | 0x807123bc | 8070a918 | b+jt+bc | conditional-branch target (inside a function); prev=3ba00002 (li r29,2) word=2c1c0000 (cmpwi cr0,r28,0) | -| 80726cb0 | 0x80726cb0 | 8073cd18 | - | prev=ec460072 (op59) word=c0010024 (op48) | -| 80726e04 | 0x80726e04 | 8073ce6c | - | prev=ec6400f2 (op59) word=ec22082a (op59) | -| 8073e1b0 | 0x8073e1b0 | 80747438 | ptr+b+bc | conditional-branch target (inside a function); prev=7c661b78 (mr r6,r3) word=83e1000c (lwz r31,12(r1)); next proven start at +0x1c | -| 8073eaf8 | 0x8073eaf8 | 80747d80 | ptr+b+bc | conditional-branch target (inside a function); prev=7c661b78 (mr r6,r3) word=83e1000c (lwz r31,12(r1)) | -| 80754cd8 | 0x80754cd8 | 8074d05c | b+jt+bc | conditional-branch target (inside a function); prev=418202d8 (bc) word=38610068 (addi r3,r1,104) | -| 807604c4 | 0x807604c4 | 80753578 | - | prev=3400ffff (op13) word=900300c0 (stw r0,192(r3)) | -| 8078c3e0 | 0x8078c3e0 | 807d4978 | - | prev=ec00102a (op59) word=fc00001e (op63) | -| 807c6b34 | 0x807c6b34 | 807b80d4 | ptr+bc | conditional-branch target (inside a function); prev=4800010c (b) word=839d0000 (lwz r28,0(r29)) | -| 807ce31c | 0x807ce31c | 807bf8bc | ptr+bc | conditional-branch target (inside a function); prev=4e800420 (bctr) word=c05d0308 (op48) | -| 807d3358 | 0x807d3358 | 807c48f8 | ptr+b+bc | conditional-branch target (inside a function); prev=7cbc2b78 (mr r28,r5) word=2c1c0000 (cmpwi cr0,r28,0); next proven start at +0x34 | -| 807f8084 | 0x807f8084 | 807ed584 | - | prev=38a10008 (addi r5,r1,8) word=38c1000a (addi r6,r1,10) | -| 807fda18 | 0x807fda18 | 807f0e58 | - | prev=a804002e (op42) word=b01e013c (op44) | -| 80800000 | 0x80800000 | 807f2488 | - | prev=7c641b78 (mr r4,r3) word=7fc3f378 (mr r3,r30) | -| 80808080 | 0x80808080 | 807f8938 | - | prev=3bde0000 (addi r30,r30,0) word=38800002 (li r4,2) | -| 80810000 | 0x80810000 | 807fefe0 | - | prev=2c1a0001 (cmpwi cr0,r26,1) word=4182004c (bc) | -| 808148a4 | 0x808148a4 | 80801af8 | - | prev=c02a0000 (op48) word=480014c0 (b) | -| 8082b708 | 0x8082b708 | 80817bf4 | bc | conditional-branch target (inside a function); prev=3f800000 (lis r28,0x0000) word=81980000 (lwz r12,0(r24)) | -| 8082bd68 | 0x8082bd68 | 80818254 | - | prev=80830000 (lwz r4,0(r3)) word=548005ef (op21) | -| 80830000 | 0x80830000 | 8084ccd8 | bc | conditional-branch target (inside a function); prev=4bd06379 (bl) word=38610008 (addi r3,r1,8) | -| 80833800 | 0x80833800 | 8081b900 | jt+bc | conditional-branch target (inside a function); prev=48000008 (b) word=3860ffff (li r3,-1); next proven start at +0x1c | -| 8085ade8 | 0x8085ade8 | 80839358 | jt+bc | conditional-branch target (inside a function); prev=480001fc (b) word=80031780 (lwz r0,6016(r3)) | -| 8085bb9c | 0x8085bb9c | 8083a10c | jt+bc | conditional-branch target (inside a function); prev=48000048 (b) word=2c040016 (cmpwi cr0,r4,22) | -| 80860350 | 0x80860350 | 8083b704 | ptr+bc | conditional-branch target (inside a function); prev=4e800020 (blr) word=3860ffff (li r3,-1); next proven start at +0x8 | -| 808603ac | 0x808603ac | 8083b760 | ptr+bc | conditional-branch target (inside a function); prev=4e800020 (blr) word=3860ffff (li r3,-1); next proven start at +0x8 | -| 8086047c | 0x8086047c | 8083b830 | ptr+bc | conditional-branch target (inside a function); prev=4e800020 (blr) word=38600000 (li r3,0); next proven start at +0x8 | -| 80862ab0 | 0x80862ab0 | 8085ea90 | ptr+bc | conditional-branch target (inside a function); prev=4e800020 (blr) word=3860ffff (li r3,-1); next proven start at +0x8 | -| 80862e1c | 0x80862e1c | 8085edfc | ptr+bc | conditional-branch target (inside a function); prev=4e800020 (blr) word=3860ffff (li r3,-1) | -| 80863618 | 0x80863618 | 8085f1e8 | ptr+b+bc | conditional-branch target (inside a function); prev=90030000 (stw r0,0(r3)) word=2c040000 (cmpwi cr0,r4,0) | -| 80863710 | 0x80863710 | 8085f2e0 | ptr+b+bc | conditional-branch target (inside a function); prev=90030000 (stw r0,0(r3)) word=2c040000 (cmpwi cr0,r4,0) | -| 80863814 | 0x80863814 | 8085f3e4 | ptr+b+bc | conditional-branch target (inside a function); prev=901f0000 (stw r0,0(r31)) word=80010014 (lwz r0,20(r1)); next proven start at +0x18 | -| 80869368 | 0x80869368 | 808648e4 | jt+bc | conditional-branch target (inside a function); prev=4e800420 (bctr) word=38000000 (li r0,0) | -| 8086e824 | 0x8086e824 | 8087ab9c | - | prev=3860007c (li r3,124) word=38840000 (addi r4,r4,0) | -| 80877b48 | 0x80877b48 | 8086adf0 | - | prev=2c030000 (cmpwi cr0,r3,0) word=41820014 (bc) | - -## Identity (low-memory) entries (15) - -Below 0x80004000 the PAL address is kept unchanged. These addresses are outside every DOL/REL section, so the binaries cannot vouch for them; the evidence column shows whether any NTSC-U code branches to them. - -| address | name | binary evidence | -|---|---|---| -| 800018a8 | 0x800018a8 | low memory, binary evidence: UNVERIFIED (-) | -| 80001d50 | 0x80001d50 | low memory, binary evidence: UNVERIFIED (-) | -| 80001d6c | 0x80001d6c | low memory, binary evidence: UNVERIFIED (-) | -| 80001d90 | 0x80001d90 | low memory, binary evidence: UNVERIFIED (-) | -| 80001dc0 | 0x80001dc0 | low memory, binary evidence: UNVERIFIED (-) | -| 80001de8 | 0x80001de8 | low memory, binary evidence: UNVERIFIED (-) | -| 80001dec | 0x80001dec | low memory, binary evidence: UNVERIFIED (-) | -| 80001e14 | 0x80001e14 | low memory, binary evidence: UNVERIFIED (-) | -| 80001e30 | 0x80001e30 | low memory, binary evidence: UNVERIFIED (-) | -| 80001f1c | 0x80001f1c | low memory, binary evidence: UNVERIFIED (-) | -| 80001f40 | 0x80001f40 | low memory, binary evidence: UNVERIFIED (-) | -| 80001f54 | 0x80001f54 | low memory, binary evidence: UNVERIFIED (-) | -| 80002440 | 0x80002440 | low memory, binary evidence: UNVERIFIED (-) | -| 8000245c | 0x8000245c | low memory, binary evidence: UNVERIFIED (-) | -| 8000249c | __TRKreset | low memory, binary evidence: UNVERIFIED (-) | diff --git a/projects/mkwii-ntsc-u/recomp.yml b/projects/mkwii-ntsc-u/recomp.yml index 4749164..c2d4258 100644 --- a/projects/mkwii-ntsc-u/recomp.yml +++ b/projects/mkwii-ntsc-u/recomp.yml @@ -5,7 +5,7 @@ workspace_root: ../.. # the facts that differ per region: the small-data bases the DOL's __init_registers installs, the # StaticR.rel load address and the clean-input digests. The function map is the PAL map ported # through the community region table and validated against these binaries by -# tools/region/port_map.py; MAP_REPORT.md next to it carries the numbers. +# tools/region/port_map.py. project: id: mkwii-rmce01 display_name: Mario Kart Wii NTSC-U diff --git a/tools/region/port_map.py b/tools/region/port_map.py index 3ff0204..7207245 100644 --- a/tools/region/port_map.py +++ b/tools/region/port_map.py @@ -11,7 +11,7 @@ exception-table records, function-pointer tables, or at least a terminator/prolo Plain Python 3 stdlib only. Output is deterministic (no timestamps, sorted everywhere). -Method (see MAP_REPORT.md for the numbers of a given run): +Method: A. Build the evidence set K of target function entry points proven by the binaries: - DOL text: `bl` targets (strong), `b` targets (weak), lis/addi(ori) pairs that materialise a code address (medium), the DOL entry point (strong). @@ -36,13 +36,11 @@ Method (see MAP_REPORT.md for the numbers of a given run): C. Entries the chunk table cannot port: IDENTITY below 0x80004000, else INTERPOLATED when the PAL gap and the target gap between the nearest PROVEN neighbours hold the same number of entries, else DROPPED. - D. Verify the CodeWarrior save/restore thunk families the recompiler resolves by name. E. Emit MAP.txt sorted by target address, deduplicated, parseable by FunctionMap.cs. H. Append every target entry point K proves that no ported PAL entry covers (bl targets, .ctors/.dtors entries, REL prolog/epilog/unresolved, extabindex records, function-pointer - tables) as unnamed placeholder entries, reported per evidence class. + tables) as unnamed placeholder entries. F. Emit region_port.json with the vendored chunk table for other tooling. - G. Emit MAP_REPORT.md. Usage: port_map.py --region E --disc-root DIR # DIR/RMCE01/sys/main.dol, DIR/RMCE01/files/rel/StaticR.rel @@ -98,7 +96,7 @@ SDA_BASES = {"P": (0x8038CC00, 0x8038EFA0), "E": (0x80388880, 0x8038AC20), # Output project directory per destination region. PROJECT_DIR = {"E": "mkwii-ntsc-u", "J": "mkwii-ntsc-j"} -# Display name and game ID of each target region, for the map header and the report. +# Display name and game ID of each target region, for the map header. REGION_NAME = {"E": ("NTSC-U", "RMCE01"), "J": ("NTSC-J", "RMCJ01")} DOL_SECTIONS = { @@ -321,18 +319,7 @@ def rel_secs(): LOW_MEMORY_LIMIT = 0x80004000 # below this: exception vectors / runtime-copied code -REL_MODULE_ID = 1 -INIT_REGISTERS_SYMBOL = "__init_registers" -INIT_REGISTERS_PAL = 0x80006210 -# Save/restore thunk families resolved by name in GuestSaveRestoreThunks.cs: -# (prefix, mnemonic, primary opcode, bytes per register) -THUNK_FAMILIES = [ - ("_save_gpr_", "stw", 36, 4), - ("_rest_gpr_", "lwz", 32, 4), - ("_save_fpr_", "stfd", 54, 8), - ("_rest_fpr_", "lfd", 50, 8), -] # REL relocation types R_PPC_NONE, R_PPC_ADDR32, R_PPC_ADDR24, R_PPC_ADDR16 = 0, 1, 2, 3 @@ -376,8 +363,6 @@ ADDITION_CLASSES = [ ] EMITTED_VERDICTS = ("PROVEN", "REFERENCED", "PLAUSIBLE", "IDENTITY", "INTERPOLATED") -VERDICT_ORDER = ("PROVEN", "REFERENCED", "PLAUSIBLE", "IDENTITY", "INTERPOLATED", - "UNVERIFIED", "DROPPED") # --------------------------------------------------------------------------------------- @@ -461,7 +446,7 @@ def first_insn_quality(w: int) -> str: def decode_simple(w: int) -> str: - """Tiny disassembler for the instructions the report needs to show.""" + """Tiny disassembler for the evidence notes.""" op = opcd(w) if op == 36: return f"stw r{reg_d(w)},{simm(w)}(r{reg_a(w)})" @@ -1243,105 +1228,6 @@ def finish_unported(entries: List[Entry]) -> None: e.note = "outside every chunk; no interpolation gap" -# --------------------------------------------------------------------------------------- -# Special checks -# --------------------------------------------------------------------------------------- -def thunk_expected(opcode: int, reg: int, step: int) -> int: - return ((opcode << 26) | (reg << 21) | (11 << 16) | ((-(step * (32 - reg))) & 0xFFFF)) & 0xFFFFFFFF - - -def check_thunks(entries: List[Entry], mem: Memory) -> List[dict]: - by_name: Dict[str, Entry] = {} - for e in entries: - if e.named and e.name not in by_name: - by_name[e.name] = e - results = [] - for prefix, mnemonic, opcode, step in THUNK_FAMILIES: - members = [] - for name, e in by_name.items(): - if name.startswith(prefix): - suffix = name[len(prefix):] - if suffix.isdigit(): - members.append((int(suffix), e)) - members.sort() - rows = [] - family_ok = True - for reg, e in members: - expected = thunk_expected(opcode, reg, step) - actual = mem.read_u32(e.ntsc) if e.ntsc is not None else None - ok = actual == expected and e.verdict in EMITTED_VERDICTS - family_ok &= ok - rows.append({ - "name": e.name, "pal": e.pal, "ntsc": e.ntsc, "verdict": e.verdict, - "expected": expected, "actual": actual, - "decoded": decode_simple(actual) if actual is not None else "n/a", "ok": ok, - }) - run_ok = True - run_note = "" - if len(members) >= 2: - first_reg, first = members[0] - last_reg, last = members[-1] - if first.ntsc is not None and last.ntsc is not None: - if last.ntsc != first.ntsc + 4 * (last_reg - first_reg): - run_ok = False - run_note = "family is not a four-byte-per-register run (FunctionMap.ResolveRange would throw)" - # full run: registers first..31 must all decode as expected - for reg in range(first_reg, 32): - a = first.ntsc + 4 * (reg - first_reg) - w = mem.read_u32(a) - if w != thunk_expected(opcode, reg, step): - run_ok = False - run_note = f"register {reg} at {a:08x} decodes as {decode_simple(w) if w is not None else 'n/a'}" - break - else: - run_ok = False - run_note = "fewer than two named members" - results.append({"prefix": prefix, "mnemonic": mnemonic, "rows": rows, "family_ok": family_ok and run_ok, - "run_note": run_note}) - return results - - -def read_sda_bases(entries: List[Entry], mem: Memory) -> dict: - init = next((e for e in entries if e.named and e.name == INIT_REGISTERS_SYMBOL), None) - result = {"symbol": INIT_REGISTERS_SYMBOL, "pal": None, "ntsc": None, "values": {}, "listing": [], "status": ""} - if init is None or init.ntsc is None: - result["status"] = "symbol not found or not ported" - return result - result["pal"] = init.pal - result["ntsc"] = init.ntsc - pending: Dict[int, int] = {} - values: Dict[int, int] = {} - for i in range(48): - a = init.ntsc + 4 * i - w = mem.read_u32(a) - if w is None: - break - result["listing"].append((a, w, decode_simple(w))) - op = opcd(w) - if op == 15 and reg_a(w) == 0: # lis rD, hi - pending[reg_d(w)] = uimm(w) << 16 - elif op == 24 and reg_a(w) == reg_d(w) and reg_d(w) in pending: # ori rX,rX,lo - values[reg_a(w)] = (pending.pop(reg_a(w)) | uimm(w)) & 0xFFFFFFFF - elif op == 14 and reg_a(w) == reg_d(w) and reg_a(w) != 0 and reg_d(w) in pending: # addi rX,rX,lo - values[reg_a(w)] = (pending.pop(reg_a(w)) + simm(w)) & 0xFFFFFFFF - if w == 0x4E800020: - break - result["values"] = {f"r{r}": v for r, v in sorted(values.items())} - r13 = values.get(13) - r2 = values.get(2) - checks = [] - for reg, val in (("r13", r13), ("r2", r2)): - exp = SDA_BASES[TARGET][0 if reg == "r13" else 1] - if val is None: - checks.append(f"{reg}: not found") - elif val == exp: - checks.append(f"{reg}=0x{val:08X} (matches expectation)") - else: - checks.append(f"{reg}=0x{val:08X} (EXPECTED 0x{exp:08X})") - result["status"] = "; ".join(checks) - return result - - # --------------------------------------------------------------------------------------- # Output # --------------------------------------------------------------------------------------- @@ -1437,7 +1323,7 @@ def write_map(path: str, kept: List[Entry], counts: Dict[str, int], pal_map: str os.makedirs(os.path.dirname(os.path.abspath(path)), exist_ok=True) lines = [ f"# {TN} ({TI}) function map, ported from {pal_map} (PAL RMCP01) by {TOOL_ID}.", - f"# Every entry was validated against the {TI} main.dol/StaticR.rel; see MAP_REPORT.md next to this file.", + f"# Every entry was validated against the {TI} main.dol/StaticR.rel.", "# Verdicts: " + ", ".join(f"{k}={counts.get(k, 0)}" for k in EMITTED_VERDICTS) + f", ADDED={counts.get('ADDED', 0)} (binary-proven entries no PAL entry covers); entries={len(kept)}", ] @@ -1473,350 +1359,6 @@ def write_json(path: str, table: ChunkTable, dol: Dol, rel: Rel) -> None: write_if_changed(path, json.dumps(payload, indent=2) + "\n") -def layout_check(dol: Dol, rel: Rel) -> List[str]: - """Compare the parsed target binaries with the vendored mkw-sp layout for that region.""" - notes = [] - parsed = {s.start: s for s in dol.sections} - for name, start, end in dol_secs(): - if name in ("bss", "sbss", "sbss2"): - continue - s = parsed.get(start) - if s is None: - notes.append(f"DOL {name}: expected a section at {start:08x}, none parsed") - elif s.end != end: - notes.append(f"DOL {name}: parsed {s.start:08x}-{s.end:08x}, table says {start:08x}-{end:08x}") - else: - notes.append(f"DOL {name}: {start:08x}-{end:08x} OK") - if dol.bss_addr != dol_secs()[8][1]: - notes.append(f"DOL bss: header says {dol.bss_addr:08x}, table says {dol_secs()[8][1]:08x}") - parsed_rel = {s.start: s for s in rel.sections} - for name, start, end in rel_secs(): - s = parsed_rel.get(start) - if s is None: - notes.append(f"REL {name}: expected a section at {start:08x}, none parsed") - elif s.end != end: - notes.append(f"REL {name}: parsed {s.start:08x}-{s.end:08x}, table says {start:08x}-{end:08x}") - else: - notes.append(f"REL {name}: {start:08x}-{end:08x} OK") - return notes - - -def label_class_rows(entries: List[Entry]) -> List[List[str]]: - classes: Dict[str, collections.Counter] = collections.OrderedDict( - (k, collections.Counter()) for k in ("case", "switch", "data")) - for e in entries: - k = entry_kind(e.name) - if k in classes: - classes[k][e.verdict] += 1 - rows = [] - for k, c in classes.items(): - rows.append([k, sum(c.values())] + [c.get(v, 0) for v in VERDICT_ORDER]) - return rows - - -def extent_check(entries: List[Entry], kept: List[Entry], table: ChunkTable) -> Tuple[int, List[List[str]], int]: - """For chunk-ported entries whose PAL successor is not ported by the same chunk (chunk tails and - entries next to holes), compare the PAL extent (distance to the next PAL entry) with the NTSC-U - extent (distance to the next emitted entry). Inside a chunk the two are equal by construction, - so a mismatch here marks exactly the places where the chunk table's edges may be sloppy.""" - kept_addrs = sorted(e.ntsc for e in kept) - rows: List[List[str]] = [] - unnamed_mismatch = checked = 0 - for i, e in enumerate(entries): - if e.method != "chunk" or e.verdict not in EMITTED_VERDICTS or i + 1 >= len(entries): - continue - s = entries[i + 1] - if s.method == "chunk" and table.find(s.pal) == table.find(e.pal): - continue - checked += 1 - ext_pal = s.pal - e.pal - j = bisect.bisect_right(kept_addrs, e.ntsc) - ext_ntsc = kept_addrs[j] - e.ntsc if j < len(kept_addrs) else None - if ext_ntsc == ext_pal: - continue - if e.named: - rows.append([hx(e.pal), e.display_name, hx(e.ntsc), e.verdict, f"{ext_pal:#x}", - f"{ext_ntsc:#x}" if ext_ntsc is not None else "-", f"{s.display_name} ({s.verdict})"]) - else: - unnamed_mismatch += 1 - return checked, rows, unnamed_mismatch - - -def md_table(header: List[str], rows: List[List[str]]) -> List[str]: - out = ["| " + " | ".join(header) + " |", "|" + "|".join("---" for _ in header) + "|"] - for r in rows: - out.append("| " + " | ".join(str(c).replace("|", "\\|") for c in r) + " |") - return out - - -def hx(a: Optional[int]) -> str: - return "-" if a is None else f"{a:08x}" - - -def write_report(path: str, args: argparse.Namespace, dol: Dol, rel: Rel, table: ChunkTable, ev: Evidence, - entries: List[Entry], kept: List[Entry], collisions: List[List[Entry]], gaps: List[GapResult], - thunks: List[dict], sda: dict, added: List[Entry], add_stats: AdditionStats) -> str: - L: List[str] = [] - counts = collections.Counter(e.verdict for e in entries) - per_module: Dict[str, collections.Counter] = collections.defaultdict(collections.Counter) - for e in entries: - per_module[e.module][e.verdict] += 1 - emitted_counts = collections.Counter(e.verdict for e in kept) - L.append(f"# {TN} ({TI}) function map port report") - L.append("") - L.append(f"Generated by `{TOOL_ID}`. Deterministic; no timestamps.") - L.append("") - L.append("## Summary") - L.append("") - L.append(f"- PAL map: `{repo_relative(args.pal_map)}` ({len(entries)} entries, {sum(1 for e in entries if e.named)} named)") - L.append(f"- {TN} DOL: `{os.path.basename(dol.path)}` sha256 `{dol.sha256}` entry `0x{dol.entry:08X}`") - L.append(f"- {TN} REL: `{os.path.basename(rel.path)}` sha256 `{rel.sha256}` load `0x{rel.load_address:08X}` " - f"(module {rel.module_id}, v{rel.version}, prolog `0x{rel.prolog:08X}`, epilog `0x{rel.epilog:08X}`, " - f"unresolved `0x{rel.unresolved:08X}`)") - L.append(f"- Chunk table: {len(table.chunks)} PAL->{TN} chunks (mkw-sp port.py, MIT)" - + (f"; problems: {'; '.join(table.problems)}" if table.problems else "; no overlaps, all deltas word-aligned")) - L.append(f"- Output map: `{repo_relative(args.out_map)}` with **{len(kept)}** entries " - f"({sum(1 for e in kept if e.named)} named); `{repo_relative(args.out_json)}` carries the chunk table.") - L.append("") - L.append("### Verdict totals (all PAL entries)") - L.append("") - rows = [] - for v in VERDICT_ORDER: - rows.append([v, counts.get(v, 0), per_module["low"].get(v, 0), per_module["dol"].get(v, 0), - per_module["rel"].get(v, 0), "yes" if v in EMITTED_VERDICTS else "no"]) - rows.append(["total", len(entries), sum(per_module["low"].values()), sum(per_module["dol"].values()), - sum(per_module["rel"].values()), ""]) - L += md_table(["verdict", "entries", "low-mem", "DOL", "REL", "emitted"], rows) - L.append("") - L.append("Emitted after deduplication: " + ", ".join(f"{v}={emitted_counts.get(v, 0)}" for v in EMITTED_VERDICTS) - + f"; total {len(kept)} ported entries, plus {len(added)} binary-proven entries no PAL entry covers " - f"(section below) = **{len(kept) + len(added)}** lines in MAP.txt. UNVERIFIED and DROPPED entries are " - f"never written to MAP.txt.") - L.append("") - L.append(f"### Binary-proven entries added (step H: {TN} entry points no ported PAL entry covers)") - L.append("") - L.append("Emitted as unnamed placeholders (`hexaddr 0xhexaddr`). Strong classes are taken as proven; the " - "pointer-referenced classes must also pass the structural check (not a conditional-branch target, " - "terminator before, decodable first instruction) because no PAL entry vouches for them. Each address " - "is counted once, under the first class that applies.") - L.append("") - L += md_table(["evidence class", "added"], [[k, v] for k, v in add_stats.per_class.items()] - + [["total added", len(added)]]) - L.append("") - ctor_labels = {"ctor:dol": "DOL .ctors", "dtor:dol": "DOL .dtors", "ctor:rel": "REL .ctors", "dtor:rel": "REL .dtors"} - L.append("Constructor/destructor tables: " - + "; ".join(f"{ctor_labels[t]} {add_stats.ctor_total.get(t, 0)} entries, " - f"{add_stats.ctor_missing.get(t, 0)} previously missing from the map" - for t in ("ctor:dol", "dtor:dol", "ctor:rel", "dtor:rel")) + ".") - L.append(f"Not added: {add_stats.rejected_medium} pointer-referenced addresses that failed the structural check " - f"(jump-table targets and similar), {add_stats.skipped_weak} addresses with only weak evidence " - f"(conditional/unconditional branch targets, lis/addi pairs, jump-table-like runs). Strong additions " - f"that are also a conditional-branch target: {add_stats.strong_bc_anomalies}.") - L.append("") - for label, addrs in add_stats.per_class_addrs.items(): - if not addrs: - continue - L.append(f"{label} ({len(addrs)}):") - L.append("") - L.append("```text") - for i in range(0, len(addrs), 12): - L.append(" ".join(f"{a:08x}" for a in addrs[i:i + 12])) - L.append("```") - L.append("") - strong_q = collections.Counter() - for e in kept: - strong_q[(e.verdict, e.quality)] += 1 - L.append("First-instruction quality of emitted entries (strong = typical prologue/first instruction, " - "valid = any decodable instruction): " - + ", ".join(f"{v}/{q}={n}" for (v, q), n in sorted(strong_q.items()))) - L.append("") - dropped_n = counts.get("DROPPED", 0) - unv_n = counts.get("UNVERIFIED", 0) - L.append("### Reading the numbers") - L.append("") - L.append(f"- {counts.get('PROVEN', 0) + counts.get('REFERENCED', 0)} of {len(entries)} entries land on an address the " - f"{TN} binaries reference as code (call target, exception-table record, entry point, function-pointer " - f"table, jump table for case labels); {counts.get('PLAUSIBLE', 0)} more sit right after a function " - f"terminator (or are verified switch dispatch sites) with a decodable first instruction.") - L.append(f"- {unv_n} UNVERIFIED entries are withheld: see the per-class breakdown in the Unverified section. None of " - f"the no-evidence ones lies near a chunk edge; they are surrounded by validated neighbours inside their " - f"chunk, which points at PAL-map noise (mid-function addresses, round addresses, names misplaced by one " - f"instruction) rather than at the chunk table.") - L.append(f"- {dropped_n} DROPPED entries: jump tables and other data symbols the PAL map carries, PAL-only code " - f"regions with no {TN} counterpart, and chunk-table holes with no interpolation gap.") - L.append(f"- The PAL project uses sda_base/sda2_base 0x8038CC00/0x8038EFA0; the {TN} values read below are the " - f"ones an {TN} project must configure.") - L.append("") - L.append("### Non-function labels carried by the PAL map") - L.append("") - L.append("The PAL map contains Ghidra-style labels that are not function starts: `*_caseD_N` switch case " - "labels (validated here by a jump-table reference at the ported address), `*_switch` dispatch " - "points (validated as `mtctr`+`bctr`), and `switchdataD_*` jump tables (data, never code). " - "They are ported with the same rules; the verdict spread per class:") - L.append("") - L += md_table(["class", "entries"] + list(VERDICT_ORDER), label_class_rows(entries)) - L.append("") - checked, ext_rows, ext_unnamed = extent_check(entries, kept, table) - L.append("### Chunk-edge extent check") - L.append("") - L.append(f"{checked} emitted chunk-ported entries sit at a chunk edge (their PAL successor is not ported by the " - f"same chunk). For these the PAL extent (distance to the next PAL entry) was compared with the " - f"{TN} extent (distance to the next emitted entry): {len(ext_rows)} named and {ext_unnamed} unnamed " - f"entries differ. A difference means the function's size changed, the successor was dropped, or the " - f"chunk edge is sloppy; the address is still a verified entry point, but for named entries the name " - f"deserves a second look.") - L.append("") - if ext_rows: - L += md_table(["PAL", "name", f"{TN}", "verdict", "PAL extent", f"{TN} extent", "PAL successor"], ext_rows) - L.append("") - - L.append(f"### SDA bases read from the {TN} `__init_registers`") - L.append("") - L.append(f"- `{sda['symbol']}` PAL `{hx(sda['pal'])}` -> {TN} `{hx(sda['ntsc'])}`") - L.append(f"- Result: **{sda['status']}**") - if sda["values"]: - L.append("- All lis/ori(addi) register values materialised in the function: " - + ", ".join(f"{r}=0x{v:08X}" for r, v in sda["values"].items())) - L.append("") - if sda["listing"]: - L.append("```text") - for a, w, d in sda["listing"]: - L.append(f"{a:08x} {w:08x} {d}") - L.append("```") - L.append("") - - L.append("### Save/restore thunk families (resolved by name in GuestSaveRestoreThunks.cs)") - L.append("") - for fam in thunks: - status = "OK" if fam["family_ok"] else "PROBLEM" - L.append(f"**`{fam['prefix']}N`** ({fam['mnemonic']} rN,-off(r11)): {status}" - + (f" - {fam['run_note']}" if fam["run_note"] else " - full run to r31 verified")) - L.append("") - L += md_table(["name", "PAL", f"{TN}", "verdict", "expected", "actual", "decoded", "ok"], - [[r["name"], hx(r["pal"]), hx(r["ntsc"]), r["verdict"], f"{r['expected']:08x}", - hx(r["actual"]), r["decoded"], "yes" if r["ok"] else "NO"] for r in fam["rows"]]) - L.append("") - - L.append(f"## Evidence set K ({TN} function entry points proven by the binaries)") - L.append("") - strong_n = sum(1 for f in ev.flags.values() if f & STRONG) - medium_only = sum(1 for f in ev.flags.values() if (f & MEDIUM) and not (f & STRONG)) - b_only = sum(1 for f in ev.flags.values() if f == F_B) - jt_only = sum(1 for f in ev.flags.values() if f == F_JT) - L.append(f"- Strong (bl target / extabindex record / entry point): **{strong_n}** addresses") - L.append(f"- Medium only (function-pointer word, ADDR32/ADDR16 relocation, lis/addi pair): **{medium_only}** addresses") - L.append(f"- Weak only (`b` target, not used for verdicts): {b_only} addresses") - L.append(f"- Jump-table-like pointer runs (excluded from REFERENCED): {len(ev.jump_table_runs)} runs, " - f"{jt_only} addresses referenced only from them") - L.append("") - L += md_table(["source", "count"], [[k, v] for k, v in ev.stats.items()]) - L.append("") - L.append("REL relocation type counts (module, type): " - + ", ".join(f"({m},{t})={n}" for (m, t), n in sorted(rel.reloc_type_counts.items()))) - L.append("") - - L.append("## Binary layout check (parsed headers vs vendored mkw-sp table)") - L.append("") - for n in layout_check(dol, rel): - L.append(f"- {n}") - L.append("") - - L.append("## Interpolation gaps (step C.2)") - L.append("") - if gaps: - L += md_table(["PAL gap", f"{TN} gap", "unported", "K candidates", "outcome"], - [[f"{g.pal_lo:08x}..{g.pal_hi:08x}", f"{g.ntsc_lo:08x}..{g.ntsc_hi:08x}", g.unported, - g.candidates, g.outcome] for g in gaps]) - else: - L.append("No gaps needed interpolation.") - L.append("") - interp = [e for e in entries if e.verdict == "INTERPOLATED"] - if interp: - L.append("Interpolated entries:") - L.append("") - L += md_table(["PAL", "name", f"{TN}", "evidence", "gap"], - [[hx(e.pal), e.display_name, hx(e.ntsc), e.evidence, e.note] for e in interp]) - L.append("") - - L.append(f"## Collisions (two PAL entries porting to one {TN} address)") - L.append("") - L.append("The named entry is kept (both PAL entries are functions, so the address is a real entry point either " - "way; only the name is in question). Extents are the distance to the next PAL entry / next emitted " - f"{TN} entry: the PAL entry whose extent matches the {TN} extent is the likelier owner of the address.") - L.append("") - if collisions: - kept_addrs = sorted(e.ntsc for e in kept) - rows = [] - for group in collisions: - kept_e = next(e for e in group if e.verdict in EMITTED_VERDICTS) - addr = group[0].ntsc - j = bisect.bisect_right(kept_addrs, addr) - ext_ntsc = f"{kept_addrs[j] - addr:#x}" if j < len(kept_addrs) else "-" - parts = [] - for e in group: - ext_pal = f"{entries[e.index + 1].pal - e.pal:#x}" if e.index + 1 < len(entries) else "-" - parts.append(f"{e.display_name} (PAL {e.pal:08x}, {e.method}, extent {ext_pal})") - rows.append([hx(addr), "; ".join(parts), ext_ntsc, kept_e.display_name]) - L += md_table([f"{TN}", "PAL entries", f"{TN} extent", "kept"], rows) - else: - L.append("None.") - L.append("") - - dropped = [e for e in entries if e.verdict == "DROPPED"] - L.append(f"## Dropped entries ({len(dropped)})") - L.append("") - if dropped: - L += md_table(["PAL", "name", "reason"], [[hx(e.pal), e.display_name, e.note] for e in dropped]) - else: - L.append("None.") - L.append("") - - unv = [e for e in entries if e.verdict == "UNVERIFIED"] - L.append(f"## Unverified entries ({len(unv)}; ported by the chunk table but not confirmed by the binary, not emitted)") - L.append("") - sub = collections.Counter() - for e in unv: - if "not in a text section" in e.note: - sub["outside text (data symbols)"] += 1 - elif "conditional-branch target" in e.note and ("jt" in e.evidence or "ptr" in e.evidence): - sub["conditional-branch target that is also jump-table referenced (a case label without a label name)"] += 1 - elif "conditional-branch target" in e.note: - sub["conditional-branch target (inside a function)"] += 1 - elif "word=00000000" in e.note: - sub["lands on a padding word (real function usually at +4)"] += 1 - elif "jt" in e.evidence or "ptr" in e.evidence: - sub["jump-table referenced but named/unnamed as a function"] += 1 - else: - sub["no evidence, predecessor is not a terminator"] += 1 - for k, v in sorted(sub.items()): - L.append(f"- {k}: {v}") - L.append("") - if unv: - L += md_table(["PAL", "name", f"{TN}", "evidence", "detail"], - [[hx(e.pal), e.display_name, hx(e.ntsc), e.evidence, e.note] for e in unv]) - else: - L.append("None.") - L.append("") - - ident = [e for e in entries if e.verdict == "IDENTITY"] - L.append(f"## Identity (low-memory) entries ({len(ident)})") - L.append("") - L.append("Below 0x80004000 the PAL address is kept unchanged. These addresses are outside every DOL/REL " - f"section, so the binaries cannot vouch for them; the evidence column shows whether any {TN} code " - "branches to them.") - L.append("") - if ident: - L += md_table(["address", "name", "binary evidence"], - [[hx(e.pal), e.display_name, f"{e.note} ({e.evidence})"] for e in ident]) - L.append("") - - while L and L[-1] == "": - L.pop() - text = "\n".join(L) + "\n" - write_if_changed(path, text) - return text - - # --------------------------------------------------------------------------------------- # main # --------------------------------------------------------------------------------------- @@ -1824,17 +1366,11 @@ def repo_root() -> str: return os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..")) -def repo_relative(path: str) -> str: - """A path as it should read in a committed report: relative to the repository, forward slashes.""" - return os.path.relpath(os.path.abspath(path), repo_root()).replace(os.sep, "/") - - def default_paths(region: str = "E") -> dict: repo = repo_root() return { "pal_map": os.path.join(repo, "projects", "mkwii", "MAP.txt"), "out_map": os.path.join(repo, "projects", PROJECT_DIR[region], "MAP.txt"), - "out_report": os.path.join(repo, "projects", PROJECT_DIR[region], "MAP_REPORT.md"), "out_json": os.path.join(repo, "projects", PROJECT_DIR[region], "region_port.json"), } @@ -1858,9 +1394,7 @@ def main(argv: Optional[List[str]] = None) -> int: ap.add_argument("--rel", help=f"{TN} files/rel/StaticR.rel (overrides --disc-root)") ap.add_argument("--rel-load", default=None, help="target REL load address (default: the region's)") ap.add_argument("--out-map", default=d["out_map"]) - ap.add_argument("--out-report", default=d["out_report"]) ap.add_argument("--out-json", default=d["out_json"]) - ap.add_argument("--quiet", action="store_true") args = ap.parse_args(argv) if args.disc_root: disc = os.path.join(args.disc_root, f"RMC{TARGET}01") @@ -1883,25 +1417,16 @@ def main(argv: Optional[List[str]] = None) -> int: entries = load_pal_map(args.pal_map) port_entries(entries, table, ev, mem) - gaps = interpolate_unported(entries, ev, mem) + interpolate_unported(entries, ev, mem) finish_unported(entries) - kept, collisions = dedupe(entries) + kept, _ = dedupe(entries) - thunks = check_thunks(entries, mem) - sda = read_sda_bases(entries, mem) - - added, add_stats = binary_additions(ev, mem, {e.ntsc for e in kept}) + added, _ = binary_additions(ev, mem, {e.ntsc for e in kept}) counts = collections.Counter(e.verdict for e in kept) counts["ADDED"] = len(added) write_map(args.out_map, kept + added, counts, os.path.relpath(args.pal_map, os.path.dirname(os.path.abspath(args.out_map))).replace(os.sep, "/")) write_json(args.out_json, table, dol, rel) - report = write_report(args.out_report, args, dol, rel, table, ev, entries, kept, collisions, gaps, thunks, sda, - added, add_stats) - if not args.quiet: - # print the summary section (up to the evidence section) - cut = report.find("## Evidence set K") - sys.stdout.write(report[:cut] if cut > 0 else report) return 0