drop map report generation

This commit is contained in:
patchzyy
2026-10-21 17:33:30 +02:00
parent a222d02fbf
commit 7db64ea00a
8 changed files with 12 additions and 2108 deletions
-1
View File
@@ -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
+1 -1
View File
@@ -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
-672
View File
@@ -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 (-) |
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
-948
View File
@@ -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<W_Itemboxline::Box>::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 (-) |
+1 -1
View File
@@ -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
+8 -483
View File
@@ -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