From 94aeb2ed8ced0b5a987cf93701c82688e3cc6df5 Mon Sep 17 00:00:00 2001 From: Yotona Date: Tue, 4 Aug 2026 17:21:04 -0600 Subject: [PATCH 1/7] splat bump? more like KH 0.50 Repo Necro ReMix, amirite --- README.md | 13 +- config/fm/checksum.sha1 | 2 +- config/jp/checksum.sha1 | 2 +- config/jp/symbol_addrs.txt | 5 + config/kh.fm.yaml | 556 ++++++++------- config/kh.jp.yaml | 1389 ++++++++++++++++++------------------ configure.py | 173 +++-- include/include_asm.h | 44 +- include/labels.inc | 58 ++ include/macro.inc | 70 +- linker_script_extra.ld | 2 + requirements.txt | 7 +- src/lib/crt0.s | 6 +- src/xrodent.c | 2 - 14 files changed, 1280 insertions(+), 1049 deletions(-) create mode 100644 include/labels.inc create mode 100644 linker_script_extra.ld diff --git a/README.md b/README.md index b9a4ca2..be0299c 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,23 @@ A decompilation of the Playstation 2 releases of Kingdom Hearts. | Original Japanese | `SLPS_251.05` |`9dabbf867a7ec2a030df99ba1ed969f2deef0488`| | Final Mix (JP Exclusive) | `SLPS_251.98` |`e70bda789916142aafb53d85cef2e806b35ad8d8`| +splat is pointed at a flat image of the elf's code and data rather than at the +elf itself. `configure.py` extracts one with `objcopy`, and that image is what +the build is checksummed against: + +| Game Version | ROM | Sha1 | +|--------------------------|-------------------|------------------------------------------| +| Original Japanese | `SLPS_251.05.rom` |`cb85dbab6c05667ed11d94e94abfa079baaf12c2`| +| Final Mix (JP Exclusive) | `SLPS_251.98.rom` |`b62bf252fdaf0b1a726668e28c244e1d83bcb146`| + --- ### Dependencies Some python dependencies are required, which you can obtain by running `pip install -U -r requirements.txt`. +A `mips-linux-gnu` binutils toolchain (`objcopy`, `as`, `ld`) and `ninja` are also required. + --- ### Setup @@ -25,7 +36,7 @@ Some python dependencies are required, which you can obtain by running `pip inst - You can clear existing configurations with the `--clean`/`-c` flag - eg: `./configure.py -c -v fm` will clear the existing build configuration and generate a new one for the Final Mix version. -3. Run `ninja` to build the project. Final output will be stored by version in the `build` directory. +3. Run `ninja` to build the project. Final output will be stored by version in the `build` directory. A build that matches ends with `build//.rom: OK`. --- diff --git a/config/fm/checksum.sha1 b/config/fm/checksum.sha1 index f202cbe..df64c87 100644 --- a/config/fm/checksum.sha1 +++ b/config/fm/checksum.sha1 @@ -1 +1 @@ -e70bda789916142aafb53d85cef2e806b35ad8d8 build/fm/SLPS_251.98 +b62bf252fdaf0b1a726668e28c244e1d83bcb146 build/fm/SLPS_251.98.rom diff --git a/config/jp/checksum.sha1 b/config/jp/checksum.sha1 index 3941847..54012bf 100644 --- a/config/jp/checksum.sha1 +++ b/config/jp/checksum.sha1 @@ -1 +1 @@ -9dabbf867a7ec2a030df99ba1ed969f2deef0488 build/jp/SLPS_251.05 +cb85dbab6c05667ed11d94e94abfa079baaf12c2 build/jp/SLPS_251.05.rom diff --git a/config/jp/symbol_addrs.txt b/config/jp/symbol_addrs.txt index f43e915..8fd770a 100644 --- a/config/jp/symbol_addrs.txt +++ b/config/jp/symbol_addrs.txt @@ -1120,3 +1120,8 @@ memcardFileHandle = 0x00642040; // disk.c //============================= disk_ThreadStack = 0x00663A90; //size:0x1000 + +//============================= +// xturtle.c +//============================= +D_00486E60 = 0x00486E60; // type:asciz force_not_migration:True diff --git a/config/kh.fm.yaml b/config/kh.fm.yaml index cddd900..824e184 100644 --- a/config/kh.fm.yaml +++ b/config/kh.fm.yaml @@ -1,287 +1,307 @@ name: Kingdom Hearts (Final Mix) -sha1: e70bda789916142aafb53d85cef2e806b35ad8d8 +sha1: b62bf252fdaf0b1a726668e28c244e1d83bcb146 options: basename: SLPS_251.98 - target_path: SLPS_251.98 + target_path: SLPS_251.98.rom + elf_path: build/fm/SLPS_251.98.elf base_path: .. - compiler: EEGCC - find_file_boundaries: False + platform: ps2 - create_undefined_funcs_auto: True - undefined_funcs_auto_path: config/fm/undefined_funcs_auto.txt - create_undefined_syms_auto: True - undefined_syms_auto_path: config/fm/undefined_syms_auto.txt - symbol_addrs_path: [config/fm/symbol_addrs.txt, config/fm/lib_symbol_addrs.txt] + compiler: EEGCC + asm_path: asm src_path: src build_path: build/fm - extensions_path: tools/splat_ext - section_order: [".text", ".data", ".rodata", ".bss"] - auto_link_sections: [".data", ".rodata", ".bss"] - subalign: 8 + + ld_script_path: SLPS_251.98.ld + ld_dependencies: True + ld_wildcard_sections: True + ld_bss_contains_common: True + + create_asm_dependencies: True + generate_asm_macros_files: False + find_file_boundaries: False disasm_unknown: True named_regs_for_c_funcs: False + hasm_in_src_path: True + subalign: 8 + gp_value: 0x494050 + + symbol_addrs_path: + - config/fm/symbol_addrs.txt + - config/fm/lib_symbol_addrs.txt + + create_undefined_funcs_auto: True + undefined_funcs_auto_path: config/fm/undefined_funcs_auto.txt + create_undefined_syms_auto: True + undefined_syms_auto_path: config/fm/undefined_syms_auto.txt + + string_encoding: ASCII + data_string_encoding: ASCII + rodata_string_guesser_level: 2 + data_string_guesser_level: 2 + + section_order: [ ".text", ".data", ".rodata", ".bss" ] + auto_link_sections: [ ".data", ".rodata", ".bss" ] + segments: - - [0, databin, elf_header] - - name: main - type: code - start: 0x80 - vram: 0x100000 - bss_size: 0x1E0F80 - subsegments: - - [0x80, asm, crt0] - - [0x258, asm] - - [0x122F0, c, worldfile] - - [0x12518, asm] +- name: main + type: code + start: 0x0 + vram: 0x100000 + bss_size: 0x1e0f80 + subsegments: + - [ 0x0, asm, crt0 ] + - [ 0x1d8, asm ] + - [ 0x12270, c, worldfile ] + - [ 0x12498, asm ] - - [0x14F398, asm, lib/libc/bsearch] - - [0x14F468, asm, lib/libc/exit] - - [0x14F518, asm, lib/libc/fiprintf] - - [0x14F570, asm, lib/libc/malloc] - - [0x14F610, asm, lib/libc/malloc_r] - - [0x14FF90, asm, lib/libc/memcmp] - # - [0x150024, asm, lib/libc/memcpy] - # - [0x1500D4, asm, lib/libc/memset] - - [0x150198, asm, lib/libc/mloc] - - [0x150268, asm, lib/libc/printf] - - [0x150338, asm, lib/libc/puts] - - [0x1503E0, asm, lib/libc/qsort] - - [0x150DD0, asm, lib/libc/rand] - - [0x150E50, asm, lib/libc/sbrkr] - - [0x150EA8, asm, lib/libc/sprintf] - - [0x150FC0, asm, lib/libc/strcat] - # - [0x1510EC, asm, lib/libc/strcmp] - - [0x151230, asm, lib/libc/strcpy] - # - [0x151344, asm, lib/libc/strlen] - - [0x151480, asm, lib/libc/strncmp] - - [0x151638, asm, lib/libc/vfiprintf] - - [0x1523A8, asm, lib/libc/vfprintf] - - [0x153E30, asm, lib/libc/vsprintf] - - [0x153EE0, asm, lib/libc/wsetup] - - [0x153FF0, asm, lib/libc/abort] - - [0x154008, asm, lib/libc/dtoa] - - [0x1554A0, asm, lib/libc/fflush] - - [0x1555B8, asm, lib/libc/findfp] - - [0x155858, asm, lib/libc/freer] - - [0x155CC0, asm, lib/libc/fvwrite] - - [0x1560A0, asm, lib/libc/fwalk] - - [0x156138, asm, lib/libc/locale] - - [0x156220, asm, lib/libc/makebuf] - - [0x156378, asm, lib/libc/mbtowc_r] - # - [0x1563AC, asm, lib/libc/memchr] - # - [0x15648C, asm, lib/libc/memmove] - - [0x156590, asm, lib/libc/mprec] - - [0x1575A8, asm, lib/libc/s_isinf] - - [0x1575F0, asm, lib/libc/s_isnan] - - [0x157630, asm, lib/libc/signal] - - [0x157918, asm, lib/libc/signalr] - - [0x157990, asm, lib/libc/stdio] - - [0x157B00, asm, lib/libc/writer] - - [0x157B60, asm, lib/libc/callocr] - - [0x157C18, asm, lib/libc/closer] - - [0x157C70, asm, lib/libc/fstatr] - - [0x157CD0, asm, lib/libc/lseekr] - - [0x157D30, asm, lib/libc/readr] + - [ 0x14f318, asm, lib/libc/bsearch ] + - [ 0x14f3e8, asm, lib/libc/exit ] + - [ 0x14f498, asm, lib/libc/fiprintf ] + - [ 0x14f4f0, asm, lib/libc/malloc ] + - [ 0x14f590, asm, lib/libc/malloc_r ] + - [ 0x14ff10, asm, lib/libc/memcmp ] + # - [0x14FFA4, asm, lib/libc/memcpy] + # - [0x150054, asm, lib/libc/memset] + - [ 0x150118, asm, lib/libc/mloc ] + - [ 0x1501e8, asm, lib/libc/printf ] + - [ 0x1502b8, asm, lib/libc/puts ] + - [ 0x150360, asm, lib/libc/qsort ] + - [ 0x150d50, asm, lib/libc/rand ] + - [ 0x150dd0, asm, lib/libc/sbrkr ] + - [ 0x150e28, asm, lib/libc/sprintf ] + - [ 0x150f40, asm, lib/libc/strcat ] + # - [0x15106C, asm, lib/libc/strcmp] + - [ 0x1511b0, asm, lib/libc/strcpy ] + # - [0x1512C4, asm, lib/libc/strlen] + - [ 0x151400, asm, lib/libc/strncmp ] + - [ 0x1515b8, asm, lib/libc/vfiprintf ] + - [ 0x152328, asm, lib/libc/vfprintf ] + - [ 0x153db0, asm, lib/libc/vsprintf ] + - [ 0x153e60, asm, lib/libc/wsetup ] + - [ 0x153f70, asm, lib/libc/abort ] + - [ 0x153f88, asm, lib/libc/dtoa ] + - [ 0x155420, asm, lib/libc/fflush ] + - [ 0x155538, asm, lib/libc/findfp ] + - [ 0x1557d8, asm, lib/libc/freer ] + - [ 0x155c40, asm, lib/libc/fvwrite ] + - [ 0x156020, asm, lib/libc/fwalk ] + - [ 0x1560b8, asm, lib/libc/locale ] + - [ 0x1561a0, asm, lib/libc/makebuf ] + - [ 0x1562f8, asm, lib/libc/mbtowc_r ] + # - [0x15632C, asm, lib/libc/memchr] + # - [0x15640C, asm, lib/libc/memmove] + - [ 0x156510, asm, lib/libc/mprec ] + - [ 0x157528, asm, lib/libc/s_isinf ] + - [ 0x157570, asm, lib/libc/s_isnan ] + - [ 0x1575b0, asm, lib/libc/signal ] + - [ 0x157898, asm, lib/libc/signalr ] + - [ 0x157910, asm, lib/libc/stdio ] + - [ 0x157a80, asm, lib/libc/writer ] + - [ 0x157ae0, asm, lib/libc/callocr ] + - [ 0x157b98, asm, lib/libc/closer ] + - [ 0x157bf0, asm, lib/libc/fstatr ] + - [ 0x157c50, asm, lib/libc/lseekr ] + - [ 0x157cb0, asm, lib/libc/readr ] - # lib/libkernl # - - [0x157DC0, asm, lib/libkernl/klib] - - [0x158660, asm, lib/libkernl/glue] - - [0x158A30, asm, lib/libkernl/cache] - - [0x158CB0, asm, lib/libkernl/intr] - - [0x158EE0, asm, lib/libkernl/tty] - - [0x159400, asm, lib/libkernl/kprintf] - - [0x159DA0, asm, lib/libkernl/sifrpc] - - [0x15AD00, asm, lib/libkernl/filestub] - - [0x15E3A8, asm, lib/libkernl/eeloadfile] - - [0x15F108, asm, lib/libkernl/iopreset] - - [0x15F3B8, asm, lib/libkernl/diei] - - [0x15F418, asm, lib/libkernl/initsys] - - [0x15F680, asm, lib/libkernl/libosd] - - [0x15FAA0, asm, lib/libkernl/alarm] - - [0x15FBE0, asm, lib/libkernl/thread] - - [0x15FF40, asm, lib/libkernl/deci2] - - [0x160120, asm, lib/libkernl/sifcmd] - - [0x160868, asm, lib/libkernl/tlbfunc] - - [0x160D80, asm, lib/libkernl/tlbtrap] + # lib/libkernl # + - [ 0x157d40, asm, lib/libkernl/klib ] + - [ 0x1585e0, asm, lib/libkernl/glue ] + - [ 0x1589b0, asm, lib/libkernl/cache ] + - [ 0x158c30, asm, lib/libkernl/intr ] + - [ 0x158e60, asm, lib/libkernl/tty ] + - [ 0x159380, asm, lib/libkernl/kprintf ] + - [ 0x159d20, asm, lib/libkernl/sifrpc ] + - [ 0x15ac80, asm, lib/libkernl/filestub ] + - [ 0x15e328, asm, lib/libkernl/eeloadfile ] + - [ 0x15f088, asm, lib/libkernl/iopreset ] + - [ 0x15f338, asm, lib/libkernl/diei ] + - [ 0x15f398, asm, lib/libkernl/initsys ] + - [ 0x15f600, asm, lib/libkernl/libosd ] + - [ 0x15fa20, asm, lib/libkernl/alarm ] + - [ 0x15fb60, asm, lib/libkernl/thread ] + - [ 0x15fec0, asm, lib/libkernl/deci2 ] + - [ 0x1600a0, asm, lib/libkernl/sifcmd ] + - [ 0x1607e8, asm, lib/libkernl/tlbfunc ] + - [ 0x160d00, asm, lib/libkernl/tlbtrap ] - # lib/libgcc # - - [0x1610E0, asm, lib/libgcc/_muldi3] - - [0x161158, asm, lib/libgcc/_divdi3] - - [0x1617F0, asm, lib/libgcc/_moddi3] - - [0x161E80, asm, lib/libgcc/_udivdi3] - - [0x162400, asm, lib/libgcc/_umoddi3] - - [0x162968, asm, lib/libgcc/_fixunsdfdi] - - [0x162A80, asm, lib/libgcc/_fixunssfdi] - - [0x162BA8, asm, lib/libgcc/main] - - [0x162D30, asm, lib/libgcc/_sf_to_df] - - [0x162D70, asm, lib/libgcc/_addsub_df] - - [0x163090, asm, lib/libgcc/_mul_df] - - [0x163318, asm, lib/libgcc/_div_df] - - [0x163458, asm, lib/libgcc/_compare_df] - - [0x1634A8, asm, lib/libgcc/_si_to_df] - - [0x163560, asm, lib/libgcc/_df_to_si] - - [0x163600, asm, lib/libgcc/_make_df] - - [0x163630, asm, lib/libgcc/_df_to_sf] - - [0x163688, asm, lib/libgcc/_df_to_usi] - - [0x163728, asm, lib/libgcc/frame-dwarf2] - - [0x164CB8, asm, lib/libgcc/_floatdidf] - - [0x164D60, asm, lib/libgcc/_unpack_sf] - - [0x164DC0, asm, lib/libgcc/_make_sf] - - [0x164DF0, asm, lib/libgcc/_pack_df] - - [0x164EC8, asm, lib/libgcc/_unpack_df] - - [0x164F88, asm, lib/libgcc/_fpcmp_parts_df] - - [0x1650A8, asm, lib/libgcc/_pack_sf] - - [0x165160, asm, lib/libgcc/atexit] - - [0x165200, asm, lib/libgcc/errno] - - [0x165210, asm, lib/libgcc/strncpy] + # lib/libgcc # + - [ 0x161060, asm, lib/libgcc/_muldi3 ] + - [ 0x1610d8, asm, lib/libgcc/_divdi3 ] + - [ 0x161770, asm, lib/libgcc/_moddi3 ] + - [ 0x161e00, asm, lib/libgcc/_udivdi3 ] + - [ 0x162380, asm, lib/libgcc/_umoddi3 ] + - [ 0x1628e8, asm, lib/libgcc/_fixunsdfdi ] + - [ 0x162a00, asm, lib/libgcc/_fixunssfdi ] + - [ 0x162b28, asm, lib/libgcc/main ] + - [ 0x162cb0, asm, lib/libgcc/_sf_to_df ] + - [ 0x162cf0, asm, lib/libgcc/_addsub_df ] + - [ 0x163010, asm, lib/libgcc/_mul_df ] + - [ 0x163298, asm, lib/libgcc/_div_df ] + - [ 0x1633d8, asm, lib/libgcc/_compare_df ] + - [ 0x163428, asm, lib/libgcc/_si_to_df ] + - [ 0x1634e0, asm, lib/libgcc/_df_to_si ] + - [ 0x163580, asm, lib/libgcc/_make_df ] + - [ 0x1635b0, asm, lib/libgcc/_df_to_sf ] + - [ 0x163608, asm, lib/libgcc/_df_to_usi ] + - [ 0x1636a8, asm, lib/libgcc/frame-dwarf2 ] + - [ 0x164c38, asm, lib/libgcc/_floatdidf ] + - [ 0x164ce0, asm, lib/libgcc/_unpack_sf ] + - [ 0x164d40, asm, lib/libgcc/_make_sf ] + - [ 0x164d70, asm, lib/libgcc/_pack_df ] + - [ 0x164e48, asm, lib/libgcc/_unpack_df ] + - [ 0x164f08, asm, lib/libgcc/_fpcmp_parts_df ] + - [ 0x165028, asm, lib/libgcc/_pack_sf ] + - [ 0x1650e0, asm, lib/libgcc/atexit ] + - [ 0x165180, asm, lib/libgcc/errno ] + - [ 0x165190, asm, lib/libgcc/strncpy ] - - [0x1653D0, asm, lib/libgraph] - - [0x166B30, asm, lib/libdma] - - [0x167378, asm, lib/libvu0] - - [0x1680C0, asm, lib/libdbc] - - [0x168B20, asm, lib/libpad2] - - [0x169378, asm, lib/libvib] - - [0x1694E8, asm, lib/libcdvd] + - [ 0x165350, asm, lib/libgraph ] + - [ 0x166ab0, asm, lib/libdma ] + - [ 0x1672f8, asm, lib/libvu0 ] + - [ 0x168040, asm, lib/libdbc ] + - [ 0x168aa0, asm, lib/libpad2 ] + - [ 0x1692f8, asm, lib/libvib ] + - [ 0x169468, asm, lib/libcdvd ] - # lib/libm # - - [0x16ADE0, asm, lib/libm/s_atan] - - [0x16B2A8, asm, lib/libm/s_ceil] - - [0x16B4B8, asm, lib/libm/s_cos] - - [0x16B5E0, asm, lib/libm/s_fabs] - - [0x16B618, asm, lib/libm/s_nan] - - [0x16B640, asm, lib/libm/s_sin] - - [0x16B778, asm, lib/libm/sf_cos] - - [0x16B850, asm, lib/libm/sf_sin] - - [0x16B938, asm, lib/libm/sf_tan] - - [0x16B9B0, asm, lib/libm/w_asin] - - [0x16B9C8, asm, lib/libm/w_atan2] - - [0x16B9E0, asm, lib/libm/w_sqrt] - - [0x16B9F8, asm, lib/libm/wf_acos] - - [0x16BA10, asm, lib/libm/wf_asin] - - [0x16BA28, asm, lib/libm/wf_atan2] - - [0x16BA40, asm, lib/libm/wf_fmod] - - [0x16BA58, asm, lib/libm/wf_pow] - - [0x16BA70, asm, lib/libm/wf_sqrt] - - [0x16BA88, asm, lib/libm/e_asin] - - [0x16C0E0, asm, lib/libm/e_atan2] - - [0x16C420, asm, lib/libm/e_rem_pio2] - - [0x16C9D8, asm, lib/libm/e_sqrt] - - [0x16CCF8, asm, lib/libm/ef_acos] - - [0x16D120, asm, lib/libm/ef_asin] - - [0x16D4C0, asm, lib/libm/ef_atan2] - - [0x16D6A0, asm, lib/libm/ef_fmod] - - [0x16D870, asm, lib/libm/ef_pow] - - [0x16E050, asm, lib/libm/ef_rem_pio2] - - [0x16E400, asm, lib/libm/ef_sqrt] - - [0x16E4D0, asm, lib/libm/k_cos] - - [0x16E7A8, asm, lib/libm/k_rem_pio2] - - [0x16F2F8, asm, lib/libm/k_sin] - - [0x16F530, asm, lib/libm/kf_cos] - - [0x16F680, asm, lib/libm/kf_rem_pio2] - - [0x16FEE8, asm, lib/libm/kf_sin] - - [0x16FFF0, asm, lib/libm/kf_tan] - - [0x170278, asm, lib/libm/s_floor] - - [0x170490, asm, lib/libm/s_scalbn] - - [0x170678, asm, lib/libm/sf_atan] - - [0x170908, asm, lib/libm/sf_fabs] - - [0x170930, asm, lib/libm/sf_floor] - - [0x170A08, asm, lib/libm/sf_scalbn] - - [0x170AD0, asm, lib/libm/s_copysign] - - [0x170B18, asm, lib/libm/sf_copysign] + # lib/libm # + - [ 0x16ad60, asm, lib/libm/s_atan ] + - [ 0x16b228, asm, lib/libm/s_ceil ] + - [ 0x16b438, asm, lib/libm/s_cos ] + - [ 0x16b560, asm, lib/libm/s_fabs ] + - [ 0x16b598, asm, lib/libm/s_nan ] + - [ 0x16b5c0, asm, lib/libm/s_sin ] + - [ 0x16b6f8, asm, lib/libm/sf_cos ] + - [ 0x16b7d0, asm, lib/libm/sf_sin ] + - [ 0x16b8b8, asm, lib/libm/sf_tan ] + - [ 0x16b930, asm, lib/libm/w_asin ] + - [ 0x16b948, asm, lib/libm/w_atan2 ] + - [ 0x16b960, asm, lib/libm/w_sqrt ] + - [ 0x16b978, asm, lib/libm/wf_acos ] + - [ 0x16b990, asm, lib/libm/wf_asin ] + - [ 0x16b9a8, asm, lib/libm/wf_atan2 ] + - [ 0x16b9c0, asm, lib/libm/wf_fmod ] + - [ 0x16b9d8, asm, lib/libm/wf_pow ] + - [ 0x16b9f0, asm, lib/libm/wf_sqrt ] + - [ 0x16ba08, asm, lib/libm/e_asin ] + - [ 0x16c060, asm, lib/libm/e_atan2 ] + - [ 0x16c3a0, asm, lib/libm/e_rem_pio2 ] + - [ 0x16c958, asm, lib/libm/e_sqrt ] + - [ 0x16cc78, asm, lib/libm/ef_acos ] + - [ 0x16d0a0, asm, lib/libm/ef_asin ] + - [ 0x16d440, asm, lib/libm/ef_atan2 ] + - [ 0x16d620, asm, lib/libm/ef_fmod ] + - [ 0x16d7f0, asm, lib/libm/ef_pow ] + - [ 0x16dfd0, asm, lib/libm/ef_rem_pio2 ] + - [ 0x16e380, asm, lib/libm/ef_sqrt ] + - [ 0x16e450, asm, lib/libm/k_cos ] + - [ 0x16e728, asm, lib/libm/k_rem_pio2 ] + - [ 0x16f278, asm, lib/libm/k_sin ] + - [ 0x16f4b0, asm, lib/libm/kf_cos ] + - [ 0x16f600, asm, lib/libm/kf_rem_pio2 ] + - [ 0x16fe68, asm, lib/libm/kf_sin ] + - [ 0x16ff70, asm, lib/libm/kf_tan ] + - [ 0x1701f8, asm, lib/libm/s_floor ] + - [ 0x170410, asm, lib/libm/s_scalbn ] + - [ 0x1705f8, asm, lib/libm/sf_atan ] + - [ 0x170888, asm, lib/libm/sf_fabs ] + - [ 0x1708b0, asm, lib/libm/sf_floor ] + - [ 0x170988, asm, lib/libm/sf_scalbn ] + - [ 0x170a50, asm, lib/libm/s_copysign ] + - [ 0x170a98, asm, lib/libm/sf_copysign ] - - [0x170B58, asm, lib/libpc] - - [0x170BE0, asm, lib/libmc] - - [0x172448, asm, lib/libipu/libipu] - - [0x1727B8, asm, lib/libipu/ipuinit] + - [ 0x170ad8, asm, lib/libpc ] + - [ 0x170b60, asm, lib/libmc ] + - [ 0x1723c8, asm, lib/libipu/libipu ] + - [ 0x172738, asm, lib/libipu/ipuinit ] -## .data section ## - - [0x172CF0, data] - - [0x1BCCA8, .data, worldfile] - - [0x1BCE20, data] - - [0x36AEA8, data, lib/libc/mlock] - - [0x36AEB0, data, lib/libc/locale] - # - [0x36AEB4, data, lib/libkernl/klib] - # - [0x36AEC4, data, lib/libkernl/glue] - # - [0x36AECC, data, lib/libkernl/kprintf] - # - [0x36AED4, data, lib/libkernl/sifrpc] - - [0x36AED8, data, lib/libkernl/filestub] - # - [0x36AF6C, data, libkernl/eeloadfile] - - [0x36AF78, data, lib/libkernl/initsys] - - [0x36AF98, data, lib/libkernl/libosd] - - [0x36B760, data, lib/libkernl/alarm] - - [0x36BF08, data, lib/libkernl/thread] - # - [0x36BF0C, data, lib/libkernl/sifcmd] - - [0x36BF10, data, lib/libkernl/tlbfunc] - # - [0x36C55C, data, lib/libgcc/__main] - - [0x36C570, data, lib/libgraph] - - [0x36C5C0, data, lib/libdma] - - [0x36C600, data, lib/libvu0] - - [0x36C630, data, lib/libdbc] - - [0x36C640, data, lib/libdpad2] - - [0x36C670, data, lib/libdvib] - - [0x36C680, data, lib/libcdvd] - - [0x36E0F0, data, lib/libpc] - - [0x36E100, data, lib/libmc] - - [0x36E120, data, lib/libipu] - - [0x36E1A0, data] + ## .data section ## + - [ 0x172c70, data ] + - [ 0x1bcc28, .data, worldfile ] + - [ 0x1bcda0, data ] + - [ 0x36ae28, data, lib/libc/mlock ] + - [ 0x36ae30, data, lib/libc/locale ] + # - [0x36AE34, data, lib/libkernl/klib] + # - [0x36AE44, data, lib/libkernl/glue] + # - [0x36AE4C, data, lib/libkernl/kprintf] + # - [0x36AE54, data, lib/libkernl/sifrpc] + - [ 0x36ae58, data, lib/libkernl/filestub ] + # - [0x36AEEC, data, libkernl/eeloadfile] + - [ 0x36aef8, data, lib/libkernl/initsys ] + - [ 0x36af18, data, lib/libkernl/libosd ] + - [ 0x36b6e0, data, lib/libkernl/alarm ] + - [ 0x36be88, data, lib/libkernl/thread ] + # - [0x36BE8C, data, lib/libkernl/sifcmd] + - [ 0x36be90, data, lib/libkernl/tlbfunc ] + # - [0x36C4DC, data, lib/libgcc/__main] + - [ 0x36c4f0, data, lib/libgraph ] + - [ 0x36c540, data, lib/libdma ] + - [ 0x36c580, data, lib/libvu0 ] + - [ 0x36c5b0, data, lib/libdbc ] + - [ 0x36c5c0, data, lib/libdpad2 ] + - [ 0x36c5f0, data, lib/libdvib ] + - [ 0x36c600, data, lib/libcdvd ] + - [ 0x36e070, data, lib/libpc ] + - [ 0x36e080, data, lib/libmc ] + - [ 0x36e0a0, data, lib/libipu ] + - [ 0x36e120, data ] -## .rodata section ## - - [0x38CC90, rodata] - - [0x38CFF0, .rodata, worldfile] - - [0x38D088, rodata] - - [0x391BA0, rodata, lib/libc/impure] - - [0x391BA8, rodata, lib/libc/puts] - - [0x391BB0, rodata, lib/libc/vfiprintf] - - [0x391DA0, rodata, lib/libc/vfprintf] - - [0x391FB0, rodata, lib/libc/dtoa] - - [0x392008, rodata, lib/libc/locale] - - [0x392050, rodata, lib/libc/mprec] - - [0x3921A0, rodata, lib/libkernl/tty] - - [0x3921F0, rodata, lib/libkernl/kprintf] - - [0x392350, rodata, lib/libkernl/filestub] - - [0x3923C0, rodata, lib/libkernl/eeloadfile] - - [0x3923D0, rodata, lib/libkernl/iopreset] - - [0x392400, rodata, lib/libkernl/libosd] - - [0x392408, rodata, lib/libkernl/thread] - - [0x392430, rodata, lib/libkernl/tlbfunc] - - [0x3924B0, rodata, lib/libgcc/_divdi3] - - [0x3925B0, rodata, lib/libgcc/_moddi3] - - [0x3926B0, rodata, lib/libgcc/_udivdi3] - - [0x3927B0, rodata, lib/libgcc/_umoddi3] - - [0x3928B0, rodata, lib/libgcc/_thenan_df] - - [0x3928D0, rodata, lib/libgcc/frame-dwarf2] - - [0x3929A0, rodata, lib/libgraph] - - [0x392EE0, rodata, lib/libdma] - - [0x392F50, rodata, lib/libdbc] - - [0x393138, rodata, lib/libpad2] - - [0x393160, rodata, lib/libcdvd] - - [0x393348, rodata, lib/libm/s_atan] - - [0x3933F8, rodata, lib/libm/s_ceil] - - [0x393408, rodata, lib/libm/sf_cos] - - [0x393410, rodata, lib/libm/e_asin] - - [0x393560, rodata, lib/libm/e_atan2] - - [0x393610, rodata, lib/libm/e_rem_pio2] - - [0x393860, rodata, lib/libm/e_sqrt] - - [0x393870, rodata, lib/libm/ef_acos] - - [0x3938A8, rodata, lib/libm/ef_asin] - - [0x393900, rodata, lib/libm/ef_fmod] - - [0x393910, rodata, lib/libm/ef_pow] - - [0x393998, rodata, lib/libm/ef_rem_pio2] - - [0x393D58, rodata, lib/libm/ef_sqrt] - - [0x393D60, rodata, lib/libm/k_cos] - - [0x393DC8, rodata, lib/libm/k_rem_pio2] - - [0x393E38, rodata, lib/libm/k_sin] - - [0x393EA8, rodata, lib/libm/kf_cos] - - [0x393EC8, rodata, lib/libm/kf_rem_pio2] - # - [0x393F14, rodata, lib/libm/kf_sin] - - [0x393F30, rodata, lib/libm/kf_tan] - - [0x393F78, rodata, lib/libm/s_floor] - - [0x393F88, rodata, lib/libm/s_scalbn] - - [0x393FB8, rodata, lib/libm/sf_atan] - # - [0x39400C, rodata, lib/libm/sf_floor] - - [0x394010, rodata, lib/libm/sf_scalbn] - - [0x394020, rodata, lib/libmc] - - [0x3940A8, rodata] - - [0x394100, databin] # .reginfo / segment_1.2 - - [0x394118, databin] - - [0x3A0CC8] + ## .rodata section ## + - [ 0x38cc10, rodata ] + - [ 0x38cf70, .rodata, worldfile ] + - [ 0x38d008, rodata ] + - [ 0x391b20, rodata, lib/libc/impure ] + - [ 0x391b28, rodata, lib/libc/puts ] + - [ 0x391b30, rodata, lib/libc/vfiprintf ] + - [ 0x391d20, rodata, lib/libc/vfprintf ] + - [ 0x391f30, rodata, lib/libc/dtoa ] + - [ 0x391f88, rodata, lib/libc/locale ] + - [ 0x391fd0, rodata, lib/libc/mprec ] + - [ 0x392120, rodata, lib/libkernl/tty ] + - [ 0x392170, rodata, lib/libkernl/kprintf ] + - [ 0x3922d0, rodata, lib/libkernl/filestub ] + - [ 0x392340, rodata, lib/libkernl/eeloadfile ] + - [ 0x392350, rodata, lib/libkernl/iopreset ] + - [ 0x392380, rodata, lib/libkernl/libosd ] + - [ 0x392388, rodata, lib/libkernl/thread ] + - [ 0x3923b0, rodata, lib/libkernl/tlbfunc ] + - [ 0x392430, rodata, lib/libgcc/_divdi3 ] + - [ 0x392530, rodata, lib/libgcc/_moddi3 ] + - [ 0x392630, rodata, lib/libgcc/_udivdi3 ] + - [ 0x392730, rodata, lib/libgcc/_umoddi3 ] + - [ 0x392830, rodata, lib/libgcc/_thenan_df ] + - [ 0x392850, rodata, lib/libgcc/frame-dwarf2 ] + - [ 0x392920, rodata, lib/libgraph ] + - [ 0x392e60, rodata, lib/libdma ] + - [ 0x392ed0, rodata, lib/libdbc ] + - [ 0x3930b8, rodata, lib/libpad2 ] + - [ 0x3930e0, rodata, lib/libcdvd ] + - [ 0x3932c8, rodata, lib/libm/s_atan ] + - [ 0x393378, rodata, lib/libm/s_ceil ] + - [ 0x393388, rodata, lib/libm/sf_cos ] + - [ 0x393390, rodata, lib/libm/e_asin ] + - [ 0x3934e0, rodata, lib/libm/e_atan2 ] + - [ 0x393590, rodata, lib/libm/e_rem_pio2 ] + - [ 0x3937e0, rodata, lib/libm/e_sqrt ] + - [ 0x3937f0, rodata, lib/libm/ef_acos ] + - [ 0x393828, rodata, lib/libm/ef_asin ] + - [ 0x393880, rodata, lib/libm/ef_fmod ] + - [ 0x393890, rodata, lib/libm/ef_pow ] + - [ 0x393918, rodata, lib/libm/ef_rem_pio2 ] + - [ 0x393cd8, rodata, lib/libm/ef_sqrt ] + - [ 0x393ce0, rodata, lib/libm/k_cos ] + - [ 0x393d48, rodata, lib/libm/k_rem_pio2 ] + - [ 0x393db8, rodata, lib/libm/k_sin ] + - [ 0x393e28, rodata, lib/libm/kf_cos ] + - [ 0x393e48, rodata, lib/libm/kf_rem_pio2 ] + # - [0x393E94, rodata, lib/libm/kf_sin] + - [ 0x393eb0, rodata, lib/libm/kf_tan ] + - [ 0x393ef8, rodata, lib/libm/s_floor ] + - [ 0x393f08, rodata, lib/libm/s_scalbn ] + - [ 0x393f38, rodata, lib/libm/sf_atan ] + # - [0x393F8C, rodata, lib/libm/sf_floor] + - [ 0x393f90, rodata, lib/libm/sf_scalbn ] + - [ 0x393fa0, rodata, lib/libmc ] + - [ 0x394028, rodata ] +- [ 0x394050 ] diff --git a/config/kh.jp.yaml b/config/kh.jp.yaml index 7331a52..e3f3cce 100644 --- a/config/kh.jp.yaml +++ b/config/kh.jp.yaml @@ -1,709 +1,728 @@ name: Kingdom Hearts (jp) -sha1: 9dabbf867a7ec2a030df99ba1ed969f2deef0488 +sha1: cb85dbab6c05667ed11d94e94abfa079baaf12c2 options: basename: SLPS_251.05 - target_path: SLPS_251.05 + target_path: SLPS_251.05.rom + elf_path: build/jp/SLPS_251.05.elf base_path: .. - compiler: EEGCC - find_file_boundaries: False + platform: ps2 - create_undefined_funcs_auto: True - undefined_funcs_auto_path: config/jp/undefined_funcs_auto.txt - create_undefined_syms_auto: True - undefined_syms_auto_path: config/jp/undefined_syms_auto.txt - symbol_addrs_path: [config/jp/symbol_addrs.txt, config/jp/lib_symbol_addrs.txt] + compiler: EEGCC + asm_path: asm src_path: src build_path: build/jp - extensions_path: tools/splat_ext - section_order: [".text", ".data", ".rodata", ".bss"] - auto_link_sections: [".data", ".rodata", ".bss"] - subalign: 8 + + ld_script_path: SLPS_251.05.ld + ld_dependencies: True + ld_wildcard_sections: True + ld_bss_contains_common: True + + create_asm_dependencies: True + generate_asm_macros_files: False + find_file_boundaries: False disasm_unknown: True named_regs_for_c_funcs: False hasm_in_src_path: True + subalign: 8 + gp_value: 0x48db00 + + symbol_addrs_path: + - config/jp/symbol_addrs.txt + - config/jp/lib_symbol_addrs.txt + + create_undefined_funcs_auto: True + undefined_funcs_auto_path: config/jp/undefined_funcs_auto.txt + create_undefined_syms_auto: True + undefined_syms_auto_path: config/jp/undefined_syms_auto.txt + + string_encoding: ASCII + data_string_encoding: ASCII + rodata_string_guesser_level: 2 + data_string_guesser_level: 2 + + section_order: [ ".text", ".data", ".rodata", ".bss" ] + auto_link_sections: [ ".data", ".rodata", ".bss" ] + segments: - - [0, databin, elf_header] - - name: main - type: code - start: 0x80 - vram: 0x100000 - bss_size: 0x1E1500 - subsegments: - - [0x80, hasm, lib/crt0] - - [0x148, c, xbeginning] - - [0x1260, c, xporcupine] - - [0x18F0, asm] - - [0x6258, c, xpancake] - - [0x69C8, asm] - - [0x9158, c, xarcade] - - [0xA278, c, xnoodle] - - [0xC358, c, xsauce] - - [0xF450, c, xtailor] - - [0x11120, c, xtrumpet] - - [0x11FC0, c, worldfile] - - [0x121E8, c, xblade] - - [0x14D58, asm] - - [0x1C4C0, c, xpaste] - - [0x1C658, c, xturtle] - - [0x1EB78, c, xgoblin] - - [0x1FBE8, c, xkingdom] - - [0x20AB8, c, xball] - - [0x21A88, asm] - - [0x21E60, c, xlamp] - - [0x228A8, c, xowl] - - [0x23260, c, xtoaster] - - [0x25090, c, xpeanut] - - [0x25730, c, xpillow] - - [0x27540, c, xcream] - - [0x28EA8, c, xaudacity] - - [0x2B230, asm] - - [0x3ABE8, c, xapple] - - [0x3BE08, asm] - - [0x49D68, c, xsquash] - - [0x4A098, asm] - #################### - # Particle Effects # - #################### - - [0x80FF8, c, ppp/pppMngr] - - [0x85220, c, ppp/pppDummy] - - [0x85268, c, ppp/stdProg/pppGetRotMatrixXYZ] # seemingly linked separately from rest of stdProg - # eiProg - - [0x852F8, c, ppp/eiProg/pppDrawHook] - - [0x85360, c, ppp/eiProg/pppPoint] - - [0x85418, c, ppp/eiProg/pppMove] - - [0x85510, c, ppp/eiProg/pppAccele] - - [0x85608, c, ppp/eiProg/pppAngle] - - [0x856B8, c, ppp/eiProg/pppAngMove] - - [0x857A8, c, ppp/eiProg/pppAngAccele] - - [0x85898, c, ppp/eiProg/pppScale] - - [0x85950, c, ppp/eiProg/pppSclMove] - - [0x85A48, c, ppp/eiProg/pppSclAccele] - - [0x85B40, c, ppp/eiProg/pppColor] - - [0x85C50, c, ppp/eiProg/pppColMove] - - [0x85D68, c, ppp/eiProg/pppColAccele] - - [0x85E80, c, ppp/eiProg/pppVertexAttend] - - [0x85F90, c, ppp/eiProg/pppVertexAp] - - [0x86330, c, ppp/eiProg/pppSegmentAp] - - [0x86338, c, ppp/eiProg/pppFaceAp] - - [0x86340, c, ppp/eiProg/pppVertexApLc] - - [0x866A0, c, ppp/eiProg/pppVertexApAt] - - [0x86918, c, ppp/eiProg/pppVtMime] - - [0x86C18, c, ppp/eiProg/pppMatrixXYZ] - - [0x86D18, c, ppp/eiProg/pppMatrixXZY] - - [0x86E18, c, ppp/eiProg/pppMatrixYZX] - - [0x86F18, c, ppp/eiProg/pppMatrixYXZ] - - [0x87018, c, ppp/eiProg/pppMatrixZXY] - - [0x87118, c, ppp/eiProg/pppMatrixZYX] - - [0x87218, c, ppp/eiProg/pppMatrixLoc] - - [0x87288, c, ppp/eiProg/pppMatrixScl] - - [0x87330, c, ppp/eiProg/pppParMatrix] - - [0x87360, c, ppp/eiProg/pppChrSclXYZMatrix] - - [0x873F8, c, ppp/eiProg/pppChrSclXZMatrix] - - [0x87470, c, ppp/eiProg/pppChrSclYMatrix] - - [0x874E0, c, ppp/eiProg/pppChrYSclXYZMatrix] - - [0x87560, c, ppp/eiProg/pppChrXSclXYZMatrix] - - [0x875E0, c, ppp/eiProg/pppDrawMatrix] - - [0x87610, c, ppp/eiProg/pppDrawMatrixFront] - - [0x876B0, c, ppp/eiProg/pppDrawMatrixNoRot] - - [0x877A0, c, ppp/eiProg/pppDrawMatrixWood] - - [0x87850, c, ppp/eiProg/pppSMatrix] - - [0x87870, c, ppp/eiProg/pppDrawMdl] - - [0x879C8, c, ppp/eiProg/pppDrawMdlSemi] - - [0x87B10, c, ppp/eiProg/pppDrawMdlTs] - - [0x87DA8, c, ppp/eiProg/pppDrawShape] - - [0x87FC8, c, ppp/eiProg/pppPObjPoint] - - [0x88078, c, ppp/eiProg/pppPointAp] - - [0x88190, c, ppp/eiProg/pppPointRAp] - - [0x88400, c, ppp/eiProg/pppRandFloat] - - [0x88550, c, ppp/eiProg/pppRandUpFloat] - - [0x886A8, c, ppp/eiProg/pppRandDownFloat] - - [0x88800, c, ppp/eiProg/pppRandChar] - - [0x88968, c, ppp/eiProg/pppRandUpChar] - - [0x88AD8, c, ppp/eiProg/pppRandDownChar] - - [0x88C48, c, ppp/eiProg/pppRandShort] - - [0x88DB0, c, ppp/eiProg/pppRandUpShort] - - [0x88F20, c, ppp/eiProg/pppRandDownShort] - - [0x89090, c, ppp/eiProg/pppRandInt] - - [0x89250, c, ppp/eiProg/pppRandUpInt] - - [0x893E8, c, ppp/eiProg/pppRandDownInt] - - [0x89590, c, ppp/eiProg/pppRandFV] - - [0x89738, c, ppp/eiProg/pppRandUpFV] - - [0x898E8, c, ppp/eiProg/pppRandDownFV] - - [0x89AB8, c, ppp/eiProg/pppRandIV] - - [0x89C60, c, ppp/eiProg/pppRandUpIV] - - [0x89E10, c, ppp/eiProg/pppRandDownIV] - - [0x89FD8, c, ppp/eiProg/pppRandCV] - - [0x8A1A8, c, ppp/eiProg/pppRandUpCV] - - [0x8A380, c, ppp/eiProg/pppRandDownCV] - - [0x8A560, c, ppp/eiProg/pppRandHCV] - - [0x8A730, c, ppp/eiProg/pppRandUpHCV] - - [0x8A908, c, ppp/eiProg/pppRandDownHCV] - - [0x8AB60, c, ppp/eiProg/pppSRandFV] - - [0x8AD38, c, ppp/eiProg/pppSRandUpFV] - - [0x8AF10, c, ppp/eiProg/pppSRandDownFV] - - [0x8B110, c, ppp/eiProg/pppSRandCV] - - [0x8B320, c, ppp/eiProg/pppSRandUpCV] - - [0x8B530, c, ppp/eiProg/pppSRandDownCV] - - [0x8B740, c, ppp/eiProg/pppSRandHCV] - - [0x8B950, c, ppp/eiProg/pppSRandUpHCV] - - [0x8BB60, c, ppp/eiProg/pppSRandDownHCV] - - [0x8BC98, c, ppp/eiProg/pppEiWindFun] - - [0x8BE00, c, ppp/eiProg/pppEiWfacc] - - [0x8C018, c, ppp/eiProg/pppDrawShapeField] - - [0x8C030, c, ppp/eiProg/pppDrawMdlSea] - - [0x8C048, c, ppp/eiProg/pppMoveLoop] - - [0x8C160, c, ppp/eiProg/pppAngMoveLoop] - - [0x8C278, c, ppp/eiProg/pppSclMoveLoop] - - [0x8C390, c, ppp/eiProg/pppMatrixLoop] - - [0x8C490, c, ppp/eiProg/pppPointLoop] - - [0x8C5D8, c, ppp/eiProg/pppAngleLoop] - - [0x8C720, c, ppp/eiProg/pppScaleLoop] - - [0x8C868, c, ppp/eiProg/pppDrawMatrixLoop] - - [0x8C898, c, ppp/eiProg/pppDrawMdlLoop] - - [0x8CCD8, c, ppp/eiProg/pppDrawMdlLoopZ] - - [0x8D148, c, ppp/eiProg/pppMatrixLoopXYZ] - - [0x8D248, c, ppp/eiProg/pppMatrixLoopXZY] - - [0x8D348, c, ppp/eiProg/pppMatrixLoopYXZ] - - [0x8D448, c, ppp/eiProg/pppMatrixLoopYZX] - - [0x8D548, c, ppp/eiProg/pppMatrixLoopZXY] - - [0x8D648, c, ppp/eiProg/pppMatrixLoopZYX] - # keProg - - [0x8D748, c, ppp/keProg/pppKeTh] - - [0x8DD98, c, ppp/keProg/pppKeThTp] - - [0x8DEC8, c, ppp/keProg/pppKeThRes] - - [0x8DEF8, c, ppp/keProg/pppKeThRes8] - - [0x8DF28, c, ppp/keProg/pppKeThRes8x4] - - [0x8DF58, c, ppp/keProg/pppKeThRes8x128] - - [0x8DF88, c, ppp/keProg/pppKeThRes16] - - [0x8DFB8, c, ppp/keProg/pppKeThRes16x4] - - [0x8DFE8, c, ppp/keProg/pppKeThRes16x64] - - [0x8E018, c, ppp/keProg/pppKeThRes24] - - [0x8E048, c, ppp/keProg/pppKeThRes24x4] - - [0x8E078, c, ppp/keProg/pppKeThRes32] - - [0x8E0A8, c, ppp/keProg/pppKeThRes32x4] - - [0x8E0D8, c, ppp/keProg/pppKeThRes32x32] - - [0x8E108, c, ppp/keProg/pppKeThRes40] - - [0x8E138, c, ppp/keProg/pppKeThRes40x4] - - [0x8E168, c, ppp/keProg/pppKeThRes48] - - [0x8E198, c, ppp/keProg/pppKeThRes48x4] - - [0x8E1C8, c, ppp/keProg/pppKeThRes64] - - [0x8E1F8, c, ppp/keProg/pppKeThRes64x4] - - [0x8E228, c, ppp/keProg/pppKeThRes64x16] - - [0x8E258, c, ppp/keProg/pppKeThRes128] - - [0x8E288, c, ppp/keProg/pppKeThRes128x4] - - [0x8E2B8, c, ppp/keProg/pppKeThRes128x8] - - [0x8E2E8, c, ppp/keProg/pppKeThRes255] - - [0x8E318, c, ppp/keProg/pppKeThRes255x4] - - [0x8E348, c, ppp/keProg/pppKeThHitBorn] - - [0x8E560, c, ppp/keProg/pppKeThSft] - - [0x8E8A8, c, ppp/keProg/pppKeBornRnd] - - [0x8ED58, c, ppp/keProg/pppKeBornRnd2] - - [0x8EF80, c, ppp/keProg/pppKeBornRnd3] - - [0x8F1E0, c, ppp/keProg/pppKeBornRnd4] - - [0x8F708, c, ppp/keProg/pppKeBornRnd5] - - [0x8FB38, c, ppp/keProg/pppKeBornRnd6] - - [0x8FE20, c, ppp/keProg/pppKeBornPtCmpl] - - [0x90038, c, ppp/keProg/pppKeMvYpEff] - - [0x901A8, c, ppp/keProg/pppKeMdlTfd] - - [0x903C8, c, ppp/keProg/pppKeMdlTfdUv] - - [0x90698, c, ppp/keProg/pppKeMdlTfd2] - - [0x908B8, c, ppp/keProg/pppKeMdlTfdUv2] - - [0x90B88, c, ppp/keProg/pppKeMdlDtt] - - [0x915F8, c, ppp/keProg/pppKeMdlBmp] - - [0x91610, c, ppp/keProg/pppKeAcmSolid] - - [0x91618, c, ppp/keProg/pppKeShpTail] - - [0x91F68, c, ppp/keProg/pppKeShpTail2] - - [0x92830, c, ppp/keProg/pppKeShpTail3] - - [0x934D0, c, ppp/keProg/pppKeShpTailPht] - - [0x934F0, c, ppp/keProg/pppKeShpTailLc] - - [0x93530, c, ppp/keProg/pppKeShpDtt] - - [0x93870, c, ppp/keProg/pppKeLnsLp] - - [0x93A78, c, ppp/keProg/pppKeLnsArnd] - - [0x93D00, c, ppp/keProg/pppKeLnsClm] - - [0x93F90, c, ppp/keProg/pppKeLnsCrn] - - [0x941F0, c, ppp/keProg/pppKeLnsFls] - - [0x94890, c, ppp/keProg/pppKeLnsLpT] - - [0x94A50, c, ppp/keProg/pppKeLnsArndT] - - [0x94CA8, c, ppp/keProg/pppKeLnsClmT] - - [0x94FA0, c, ppp/keProg/pppKeLnsCrnT] - - [0x95258, c, ppp/keProg/pppKeLnsFlsT] - - [0x95478, c, ppp/keProg/pppKeLnsLpSft] - - [0x95558, c, ppp/keProg/pppKeHmgEff] - - [0x95760, c, ppp/keProg/pppKeGrvTgt] - - [0x957C8, c, ppp/keProg/pppKeGrvEff] - - [0x95950, c, ppp/keProg/pppKeHitBall] - - [0x959A0, c, ppp/keProg/pppKeHitBorn] - - [0x95B18, c, ppp/keProg/pppKeHitChkPxB] - - [0x95D68, c, ppp/keProg/pppKeDrct] - - [0x95DC8, c, ppp/keProg/pppKeMatSN] - - [0x95EA0, c, ppp/keProg/pppKeParMatR] - - [0x95F40, c, ppp/keProg/pppKeTkFade] - - [0x96418, c, ppp/keProg/pppKeDMat] - - [0x96490, c, ppp/keProg/pppKeDMatFr] - - [0x96558, c, ppp/keProg/pppKeMatPht] - - [0x96688, c, ppp/keProg/pppKeDMatPht] - - [0x96748, c, ppp/keProg/pppKeDMatPhtFr] - - [0x96848, c, ppp/keProg/pppDrawMdl2] - - [0x969F0, c, ppp/keProg/pppDrawMdlSemi2] - - [0x96B88, c, ppp/keProg/pppDrawMdlTs2] - - [0x96E68, c, ppp/keProg/pppKeZCrct] - - [0x97078, c, ppp/keProg/pppKeZCrctShp] - - [0x972A0, c, ppp/keProg/pppDrawMdl3] - - [0x974F8, c, ppp/keProg/pppDrawMdlSemi3] - - [0x97740, c, ppp/keProg/pppDrawMdlTs3] - - [0x97AE0, c, ppp/keProg/pppKeMdlTfd3] - - [0x97D28, c, ppp/keProg/pppKeMdlTfdUv3] - - [0x98020, c, ppp/keProg/pppDrawShapeX] - - [0x98288, c, ppp/keProg/pppKeShpTailX] - - [0x98C08, c, ppp/keProg/pppKeShpTail2X] - - [0x99518, c, ppp/keProg/pppKeShpTail3X] - # ryjProg - - [0x9A1F8, c, ppp/ryjProg/pppRyjDrawMatrixWorld] - - [0x9A298, c, ppp/ryjProg/pppRyjDrawMatrixWorldFront] - - [0x9A3B8, c, ppp/ryjProg/pppRyjDrawMatrixWorldNoRot] - - [0x9A520, c, ppp/ryjProg/pppRyjDrawMatrixWorldWood] - - [0x9A740, c, ppp/ryjProg/pppRyjMatrixWorldXYZ] - - [0x9A910, c, ppp/ryjProg/pppRyjMatrixWorldXZY] - - [0x9AAE0, c, ppp/ryjProg/pppRyjMatrixWorldYXZ] - - [0x9ACB0, c, ppp/ryjProg/pppRyjMatrixWorldYZX] - - [0x9AE80, c, ppp/ryjProg/pppRyjMatrixWorldZXY] - - [0x9B050, c, ppp/ryjProg/pppRyjMatrixWorldZYX] - - [0x9B220, c, ppp/ryjProg/pppRyjMatrixNoRot] - - [0x9BF48, c, ppp/ryjProg/pppRyjDrawShipoly] - - [0x9D178, c, ppp/ryjProg/pppRyjDrawShipolyBone] - - [0x9EB38, c, ppp/ryjProg/pppRyjMegaBirth] - - [0x9F6D0, c, ppp/ryjProg/pppRyjMngFlag] - - [0x9F9D0, c, ppp/ryjProg/pppRyjMegaBirthPrize] - - [0xA00C0, c, ppp/ryjProg/pppRyjMegaPlace] - - [0xA0D48, c, ppp/ryjProg/pppRyjMegaPlaceShape] - - [0xA0DD0, c, ppp/ryjProg/pppRyjMegaPlaceModel] - - [0xA0E58, c, ppp/ryjProg/pppRyjMegaPlaceLamp] - - [0xA25C0, c, ppp/ryjProg/pppRyjMegaBirthModel] - - [0xA30F0, c, ppp/ryjProg/pppRyjDrawKekoto] - - [0xA3C40, c, ppp/ryjProg/pppRyjLight] - - [0xA3E28, c, ppp/ryjProg/pppRyjDrawMatrixWorldDtt] - - [0xA3EE8, c, ppp/ryjProg/pppRyjDrawMatrixWorldDttFr] - - [0xA4E38, c, ppp/ryjProg/pppRyjMegaBirthFilter] - - [0xA6870, c, ppp/ryjProg/pppRyjMegaBirthModelFilter] - # stdProg - - [0xA7078, c, ppp/stdProg/pppGetRotMatrixX] - - [0xA70F8, c, ppp/stdProg/pppGetRotMatrixY] - - [0xA7178, c, ppp/stdProg/pppGetRotMatrixZ] - - [0xA71F8, c, ppp/stdProg/pppGetRotMatrixXZY] - - [0xA7288, c, ppp/stdProg/pppGetRotMatrixYZX] - - [0xA7318, c, ppp/stdProg/pppGetRotMatrixYXZ] - - [0xA73A8, c, ppp/stdProg/pppGetRotMatrixZXY] - - [0xA7438, c, ppp/stdProg/pppGetRotMatrixZYX] - # draw - # todo: sort/divide/rename xberry and xpear, they belong to ppp/draw - - [0xA74C8, c, ppp/xberry] - - [0xA8828, c, ppp/xpear] - - [0xA9300, c, ppp/draw/draw] - - [0xACA20, c, ppp/draw/global] - - [0xACFF8, c, ppp/draw/md] - - [0xAD208, c, ppp/draw/md0] #todo: split into smaller subsegments by function +- name: main + type: code + start: 0x0 + vram: 0x100000 + bss_size: 0x1e1500 + subsegments: + - [ 0x0, hasm, lib/crt0 ] + - [ 0xc8, c, xbeginning ] + - [ 0x11e0, c, xporcupine ] + - [ 0x1870, asm ] + - [ 0x61d8, c, xpancake ] + - [ 0x6948, asm ] + - [ 0x90d8, c, xarcade ] + - [ 0xa1f8, c, xnoodle ] + - [ 0xc2d8, c, xsauce ] + - [ 0xf3d0, c, xtailor ] + - [ 0x110a0, c, xtrumpet ] + - [ 0x11f40, c, worldfile ] + - [ 0x12168, c, xblade ] + - [ 0x14cd8, asm ] + - [ 0x1c440, c, xpaste ] + - [ 0x1c5d8, c, xturtle ] + - [ 0x1eaf8, c, xgoblin ] + - [ 0x1fb68, c, xkingdom ] + - [ 0x20a38, c, xball ] + - [ 0x21a08, asm ] + - [ 0x21de0, c, xlamp ] + - [ 0x22828, c, xowl ] + - [ 0x231e0, c, xtoaster ] + - [ 0x25010, c, xpeanut ] + - [ 0x256b0, c, xpillow ] + - [ 0x274c0, c, xcream ] + - [ 0x28e28, c, xaudacity ] + - [ 0x2b1b0, asm ] + - [ 0x3ab68, c, xapple ] + - [ 0x3bd88, asm ] + - [ 0x49ce8, c, xsquash ] + - [ 0x4a018, asm ] + #################### + # Particle Effects # + #################### + - [ 0x80f78, c, ppp/pppMngr ] + - [ 0x851a0, c, ppp/pppDummy ] + - [ 0x851e8, c, ppp/stdProg/pppGetRotMatrixXYZ ] # seemingly linked separately from rest of stdProg + # eiProg + - [ 0x85278, c, ppp/eiProg/pppDrawHook ] + - [ 0x852e0, c, ppp/eiProg/pppPoint ] + - [ 0x85398, c, ppp/eiProg/pppMove ] + - [ 0x85490, c, ppp/eiProg/pppAccele ] + - [ 0x85588, c, ppp/eiProg/pppAngle ] + - [ 0x85638, c, ppp/eiProg/pppAngMove ] + - [ 0x85728, c, ppp/eiProg/pppAngAccele ] + - [ 0x85818, c, ppp/eiProg/pppScale ] + - [ 0x858d0, c, ppp/eiProg/pppSclMove ] + - [ 0x859c8, c, ppp/eiProg/pppSclAccele ] + - [ 0x85ac0, c, ppp/eiProg/pppColor ] + - [ 0x85bd0, c, ppp/eiProg/pppColMove ] + - [ 0x85ce8, c, ppp/eiProg/pppColAccele ] + - [ 0x85e00, c, ppp/eiProg/pppVertexAttend ] + - [ 0x85f10, c, ppp/eiProg/pppVertexAp ] + - [ 0x862b0, c, ppp/eiProg/pppSegmentAp ] + - [ 0x862b8, c, ppp/eiProg/pppFaceAp ] + - [ 0x862c0, c, ppp/eiProg/pppVertexApLc ] + - [ 0x86620, c, ppp/eiProg/pppVertexApAt ] + - [ 0x86898, c, ppp/eiProg/pppVtMime ] + - [ 0x86b98, c, ppp/eiProg/pppMatrixXYZ ] + - [ 0x86c98, c, ppp/eiProg/pppMatrixXZY ] + - [ 0x86d98, c, ppp/eiProg/pppMatrixYZX ] + - [ 0x86e98, c, ppp/eiProg/pppMatrixYXZ ] + - [ 0x86f98, c, ppp/eiProg/pppMatrixZXY ] + - [ 0x87098, c, ppp/eiProg/pppMatrixZYX ] + - [ 0x87198, c, ppp/eiProg/pppMatrixLoc ] + - [ 0x87208, c, ppp/eiProg/pppMatrixScl ] + - [ 0x872b0, c, ppp/eiProg/pppParMatrix ] + - [ 0x872e0, c, ppp/eiProg/pppChrSclXYZMatrix ] + - [ 0x87378, c, ppp/eiProg/pppChrSclXZMatrix ] + - [ 0x873f0, c, ppp/eiProg/pppChrSclYMatrix ] + - [ 0x87460, c, ppp/eiProg/pppChrYSclXYZMatrix ] + - [ 0x874e0, c, ppp/eiProg/pppChrXSclXYZMatrix ] + - [ 0x87560, c, ppp/eiProg/pppDrawMatrix ] + - [ 0x87590, c, ppp/eiProg/pppDrawMatrixFront ] + - [ 0x87630, c, ppp/eiProg/pppDrawMatrixNoRot ] + - [ 0x87720, c, ppp/eiProg/pppDrawMatrixWood ] + - [ 0x877d0, c, ppp/eiProg/pppSMatrix ] + - [ 0x877f0, c, ppp/eiProg/pppDrawMdl ] + - [ 0x87948, c, ppp/eiProg/pppDrawMdlSemi ] + - [ 0x87a90, c, ppp/eiProg/pppDrawMdlTs ] + - [ 0x87d28, c, ppp/eiProg/pppDrawShape ] + - [ 0x87f48, c, ppp/eiProg/pppPObjPoint ] + - [ 0x87ff8, c, ppp/eiProg/pppPointAp ] + - [ 0x88110, c, ppp/eiProg/pppPointRAp ] + - [ 0x88380, c, ppp/eiProg/pppRandFloat ] + - [ 0x884d0, c, ppp/eiProg/pppRandUpFloat ] + - [ 0x88628, c, ppp/eiProg/pppRandDownFloat ] + - [ 0x88780, c, ppp/eiProg/pppRandChar ] + - [ 0x888e8, c, ppp/eiProg/pppRandUpChar ] + - [ 0x88a58, c, ppp/eiProg/pppRandDownChar ] + - [ 0x88bc8, c, ppp/eiProg/pppRandShort ] + - [ 0x88d30, c, ppp/eiProg/pppRandUpShort ] + - [ 0x88ea0, c, ppp/eiProg/pppRandDownShort ] + - [ 0x89010, c, ppp/eiProg/pppRandInt ] + - [ 0x891d0, c, ppp/eiProg/pppRandUpInt ] + - [ 0x89368, c, ppp/eiProg/pppRandDownInt ] + - [ 0x89510, c, ppp/eiProg/pppRandFV ] + - [ 0x896b8, c, ppp/eiProg/pppRandUpFV ] + - [ 0x89868, c, ppp/eiProg/pppRandDownFV ] + - [ 0x89a38, c, ppp/eiProg/pppRandIV ] + - [ 0x89be0, c, ppp/eiProg/pppRandUpIV ] + - [ 0x89d90, c, ppp/eiProg/pppRandDownIV ] + - [ 0x89f58, c, ppp/eiProg/pppRandCV ] + - [ 0x8a128, c, ppp/eiProg/pppRandUpCV ] + - [ 0x8a300, c, ppp/eiProg/pppRandDownCV ] + - [ 0x8a4e0, c, ppp/eiProg/pppRandHCV ] + - [ 0x8a6b0, c, ppp/eiProg/pppRandUpHCV ] + - [ 0x8a888, c, ppp/eiProg/pppRandDownHCV ] + - [ 0x8aae0, c, ppp/eiProg/pppSRandFV ] + - [ 0x8acb8, c, ppp/eiProg/pppSRandUpFV ] + - [ 0x8ae90, c, ppp/eiProg/pppSRandDownFV ] + - [ 0x8b090, c, ppp/eiProg/pppSRandCV ] + - [ 0x8b2a0, c, ppp/eiProg/pppSRandUpCV ] + - [ 0x8b4b0, c, ppp/eiProg/pppSRandDownCV ] + - [ 0x8b6c0, c, ppp/eiProg/pppSRandHCV ] + - [ 0x8b8d0, c, ppp/eiProg/pppSRandUpHCV ] + - [ 0x8bae0, c, ppp/eiProg/pppSRandDownHCV ] + - [ 0x8bc18, c, ppp/eiProg/pppEiWindFun ] + - [ 0x8bd80, c, ppp/eiProg/pppEiWfacc ] + - [ 0x8bf98, c, ppp/eiProg/pppDrawShapeField ] + - [ 0x8bfb0, c, ppp/eiProg/pppDrawMdlSea ] + - [ 0x8bfc8, c, ppp/eiProg/pppMoveLoop ] + - [ 0x8c0e0, c, ppp/eiProg/pppAngMoveLoop ] + - [ 0x8c1f8, c, ppp/eiProg/pppSclMoveLoop ] + - [ 0x8c310, c, ppp/eiProg/pppMatrixLoop ] + - [ 0x8c410, c, ppp/eiProg/pppPointLoop ] + - [ 0x8c558, c, ppp/eiProg/pppAngleLoop ] + - [ 0x8c6a0, c, ppp/eiProg/pppScaleLoop ] + - [ 0x8c7e8, c, ppp/eiProg/pppDrawMatrixLoop ] + - [ 0x8c818, c, ppp/eiProg/pppDrawMdlLoop ] + - [ 0x8cc58, c, ppp/eiProg/pppDrawMdlLoopZ ] + - [ 0x8d0c8, c, ppp/eiProg/pppMatrixLoopXYZ ] + - [ 0x8d1c8, c, ppp/eiProg/pppMatrixLoopXZY ] + - [ 0x8d2c8, c, ppp/eiProg/pppMatrixLoopYXZ ] + - [ 0x8d3c8, c, ppp/eiProg/pppMatrixLoopYZX ] + - [ 0x8d4c8, c, ppp/eiProg/pppMatrixLoopZXY ] + - [ 0x8d5c8, c, ppp/eiProg/pppMatrixLoopZYX ] + # keProg + - [ 0x8d6c8, c, ppp/keProg/pppKeTh ] + - [ 0x8dd18, c, ppp/keProg/pppKeThTp ] + - [ 0x8de48, c, ppp/keProg/pppKeThRes ] + - [ 0x8de78, c, ppp/keProg/pppKeThRes8 ] + - [ 0x8dea8, c, ppp/keProg/pppKeThRes8x4 ] + - [ 0x8ded8, c, ppp/keProg/pppKeThRes8x128 ] + - [ 0x8df08, c, ppp/keProg/pppKeThRes16 ] + - [ 0x8df38, c, ppp/keProg/pppKeThRes16x4 ] + - [ 0x8df68, c, ppp/keProg/pppKeThRes16x64 ] + - [ 0x8df98, c, ppp/keProg/pppKeThRes24 ] + - [ 0x8dfc8, c, ppp/keProg/pppKeThRes24x4 ] + - [ 0x8dff8, c, ppp/keProg/pppKeThRes32 ] + - [ 0x8e028, c, ppp/keProg/pppKeThRes32x4 ] + - [ 0x8e058, c, ppp/keProg/pppKeThRes32x32 ] + - [ 0x8e088, c, ppp/keProg/pppKeThRes40 ] + - [ 0x8e0b8, c, ppp/keProg/pppKeThRes40x4 ] + - [ 0x8e0e8, c, ppp/keProg/pppKeThRes48 ] + - [ 0x8e118, c, ppp/keProg/pppKeThRes48x4 ] + - [ 0x8e148, c, ppp/keProg/pppKeThRes64 ] + - [ 0x8e178, c, ppp/keProg/pppKeThRes64x4 ] + - [ 0x8e1a8, c, ppp/keProg/pppKeThRes64x16 ] + - [ 0x8e1d8, c, ppp/keProg/pppKeThRes128 ] + - [ 0x8e208, c, ppp/keProg/pppKeThRes128x4 ] + - [ 0x8e238, c, ppp/keProg/pppKeThRes128x8 ] + - [ 0x8e268, c, ppp/keProg/pppKeThRes255 ] + - [ 0x8e298, c, ppp/keProg/pppKeThRes255x4 ] + - [ 0x8e2c8, c, ppp/keProg/pppKeThHitBorn ] + - [ 0x8e4e0, c, ppp/keProg/pppKeThSft ] + - [ 0x8e828, c, ppp/keProg/pppKeBornRnd ] + - [ 0x8ecd8, c, ppp/keProg/pppKeBornRnd2 ] + - [ 0x8ef00, c, ppp/keProg/pppKeBornRnd3 ] + - [ 0x8f160, c, ppp/keProg/pppKeBornRnd4 ] + - [ 0x8f688, c, ppp/keProg/pppKeBornRnd5 ] + - [ 0x8fab8, c, ppp/keProg/pppKeBornRnd6 ] + - [ 0x8fda0, c, ppp/keProg/pppKeBornPtCmpl ] + - [ 0x8ffb8, c, ppp/keProg/pppKeMvYpEff ] + - [ 0x90128, c, ppp/keProg/pppKeMdlTfd ] + - [ 0x90348, c, ppp/keProg/pppKeMdlTfdUv ] + - [ 0x90618, c, ppp/keProg/pppKeMdlTfd2 ] + - [ 0x90838, c, ppp/keProg/pppKeMdlTfdUv2 ] + - [ 0x90b08, c, ppp/keProg/pppKeMdlDtt ] + - [ 0x91578, c, ppp/keProg/pppKeMdlBmp ] + - [ 0x91590, c, ppp/keProg/pppKeAcmSolid ] + - [ 0x91598, c, ppp/keProg/pppKeShpTail ] + - [ 0x91ee8, c, ppp/keProg/pppKeShpTail2 ] + - [ 0x927b0, c, ppp/keProg/pppKeShpTail3 ] + - [ 0x93450, c, ppp/keProg/pppKeShpTailPht ] + - [ 0x93470, c, ppp/keProg/pppKeShpTailLc ] + - [ 0x934b0, c, ppp/keProg/pppKeShpDtt ] + - [ 0x937f0, c, ppp/keProg/pppKeLnsLp ] + - [ 0x939f8, c, ppp/keProg/pppKeLnsArnd ] + - [ 0x93c80, c, ppp/keProg/pppKeLnsClm ] + - [ 0x93f10, c, ppp/keProg/pppKeLnsCrn ] + - [ 0x94170, c, ppp/keProg/pppKeLnsFls ] + - [ 0x94810, c, ppp/keProg/pppKeLnsLpT ] + - [ 0x949d0, c, ppp/keProg/pppKeLnsArndT ] + - [ 0x94c28, c, ppp/keProg/pppKeLnsClmT ] + - [ 0x94f20, c, ppp/keProg/pppKeLnsCrnT ] + - [ 0x951d8, c, ppp/keProg/pppKeLnsFlsT ] + - [ 0x953f8, c, ppp/keProg/pppKeLnsLpSft ] + - [ 0x954d8, c, ppp/keProg/pppKeHmgEff ] + - [ 0x956e0, c, ppp/keProg/pppKeGrvTgt ] + - [ 0x95748, c, ppp/keProg/pppKeGrvEff ] + - [ 0x958d0, c, ppp/keProg/pppKeHitBall ] + - [ 0x95920, c, ppp/keProg/pppKeHitBorn ] + - [ 0x95a98, c, ppp/keProg/pppKeHitChkPxB ] + - [ 0x95ce8, c, ppp/keProg/pppKeDrct ] + - [ 0x95d48, c, ppp/keProg/pppKeMatSN ] + - [ 0x95e20, c, ppp/keProg/pppKeParMatR ] + - [ 0x95ec0, c, ppp/keProg/pppKeTkFade ] + - [ 0x96398, c, ppp/keProg/pppKeDMat ] + - [ 0x96410, c, ppp/keProg/pppKeDMatFr ] + - [ 0x964d8, c, ppp/keProg/pppKeMatPht ] + - [ 0x96608, c, ppp/keProg/pppKeDMatPht ] + - [ 0x966c8, c, ppp/keProg/pppKeDMatPhtFr ] + - [ 0x967c8, c, ppp/keProg/pppDrawMdl2 ] + - [ 0x96970, c, ppp/keProg/pppDrawMdlSemi2 ] + - [ 0x96b08, c, ppp/keProg/pppDrawMdlTs2 ] + - [ 0x96de8, c, ppp/keProg/pppKeZCrct ] + - [ 0x96ff8, c, ppp/keProg/pppKeZCrctShp ] + - [ 0x97220, c, ppp/keProg/pppDrawMdl3 ] + - [ 0x97478, c, ppp/keProg/pppDrawMdlSemi3 ] + - [ 0x976c0, c, ppp/keProg/pppDrawMdlTs3 ] + - [ 0x97a60, c, ppp/keProg/pppKeMdlTfd3 ] + - [ 0x97ca8, c, ppp/keProg/pppKeMdlTfdUv3 ] + - [ 0x97fa0, c, ppp/keProg/pppDrawShapeX ] + - [ 0x98208, c, ppp/keProg/pppKeShpTailX ] + - [ 0x98b88, c, ppp/keProg/pppKeShpTail2X ] + - [ 0x99498, c, ppp/keProg/pppKeShpTail3X ] + # ryjProg + - [ 0x9a178, c, ppp/ryjProg/pppRyjDrawMatrixWorld ] + - [ 0x9a218, c, ppp/ryjProg/pppRyjDrawMatrixWorldFront ] + - [ 0x9a338, c, ppp/ryjProg/pppRyjDrawMatrixWorldNoRot ] + - [ 0x9a4a0, c, ppp/ryjProg/pppRyjDrawMatrixWorldWood ] + - [ 0x9a6c0, c, ppp/ryjProg/pppRyjMatrixWorldXYZ ] + - [ 0x9a890, c, ppp/ryjProg/pppRyjMatrixWorldXZY ] + - [ 0x9aa60, c, ppp/ryjProg/pppRyjMatrixWorldYXZ ] + - [ 0x9ac30, c, ppp/ryjProg/pppRyjMatrixWorldYZX ] + - [ 0x9ae00, c, ppp/ryjProg/pppRyjMatrixWorldZXY ] + - [ 0x9afd0, c, ppp/ryjProg/pppRyjMatrixWorldZYX ] + - [ 0x9b1a0, c, ppp/ryjProg/pppRyjMatrixNoRot ] + - [ 0x9bec8, c, ppp/ryjProg/pppRyjDrawShipoly ] + - [ 0x9d0f8, c, ppp/ryjProg/pppRyjDrawShipolyBone ] + - [ 0x9eab8, c, ppp/ryjProg/pppRyjMegaBirth ] + - [ 0x9f650, c, ppp/ryjProg/pppRyjMngFlag ] + - [ 0x9f950, c, ppp/ryjProg/pppRyjMegaBirthPrize ] + - [ 0xa0040, c, ppp/ryjProg/pppRyjMegaPlace ] + - [ 0xa0cc8, c, ppp/ryjProg/pppRyjMegaPlaceShape ] + - [ 0xa0d50, c, ppp/ryjProg/pppRyjMegaPlaceModel ] + - [ 0xa0dd8, c, ppp/ryjProg/pppRyjMegaPlaceLamp ] + - [ 0xa2540, c, ppp/ryjProg/pppRyjMegaBirthModel ] + - [ 0xa3070, c, ppp/ryjProg/pppRyjDrawKekoto ] + - [ 0xa3bc0, c, ppp/ryjProg/pppRyjLight ] + - [ 0xa3da8, c, ppp/ryjProg/pppRyjDrawMatrixWorldDtt ] + - [ 0xa3e68, c, ppp/ryjProg/pppRyjDrawMatrixWorldDttFr ] + - [ 0xa4db8, c, ppp/ryjProg/pppRyjMegaBirthFilter ] + - [ 0xa67f0, c, ppp/ryjProg/pppRyjMegaBirthModelFilter ] + # stdProg + - [ 0xa6ff8, c, ppp/stdProg/pppGetRotMatrixX ] + - [ 0xa7078, c, ppp/stdProg/pppGetRotMatrixY ] + - [ 0xa70f8, c, ppp/stdProg/pppGetRotMatrixZ ] + - [ 0xa7178, c, ppp/stdProg/pppGetRotMatrixXZY ] + - [ 0xa7208, c, ppp/stdProg/pppGetRotMatrixYZX ] + - [ 0xa7298, c, ppp/stdProg/pppGetRotMatrixYXZ ] + - [ 0xa7328, c, ppp/stdProg/pppGetRotMatrixZXY ] + - [ 0xa73b8, c, ppp/stdProg/pppGetRotMatrixZYX ] + # draw + # todo: sort/divide/rename xberry and xpear, they belong to ppp/draw + - [ 0xa7448, c, ppp/xberry ] + - [ 0xa87a8, c, ppp/xpear ] + - [ 0xa9280, c, ppp/draw/draw ] + - [ 0xac9a0, c, ppp/draw/global ] + - [ 0xacf78, c, ppp/draw/md ] + - [ 0xad188, c, ppp/draw/md0 ] #todo: split into smaller subsegments by function + + - [ 0xbbcd8, c, gumi ] + - [ 0xbd0b8, asm ] + - [ 0xc1680, c, xbuffalo ] + - [ 0xc21b8, c, xkinetic ] # seems to be the entrypoint to what we believe is the script engine + - [ 0xc36a8, c, xflamingo ] + - [ 0xc5d88, asm ] + - [ 0xc8470, c, xhumungus ] + - [ 0xdee78, c, xstuck ] + - [ 0xdf198, asm ] + - [ 0xed878, c, xquack ] + - [ 0xeed08, asm ] + - [ 0xef210, c, xtango ] + - [ 0xf0c30, c, xbiscuit ] + - [ 0xf3990, c, xmeowp ] + - [ 0xf4890, asm ] + - [ 0x115a88, c, xpotato ] + - [ 0x1197e8, c, xrodent ] + - [ 0x11a3d0, asm ] + - [ 0x12f578, c, xcursed ] + - [ 0x12f808, asm ] + - [ 0x1304d8, c, memcard ] + - [ 0x133078, asm ] + - [ 0x144490, c, xcapy ] + - [ 0x144c38, asm ] + - [ 0x146b50, c, xmonitor ] + - [ 0x147778, c, xpackage ] + - [ 0x148548, c, xjockey ] + - [ 0x14a010, c, disk ] + ########### + # Library # + ########### + # ??? - the following 3 have 0x10 file alignment and 0x4 (no) function alignment within files + - [ 0x14aaa8, asm ] + - [ 0x14b800, asm ] + - [ 0x14b980, asm ] + # libc.a + - [ 0x14bcd0, asm, lib/libc/assert ] + - [ 0x14bd08, asm, lib/libc/bsearch ] + - [ 0x14bdd8, asm, lib/libc/exit ] + - [ 0x14be88, asm, lib/libc/fiprintf ] + - [ 0x14bee0, asm, lib/libc/malloc ] + - [ 0x14bf80, asm, lib/libc/malloc_r ] + - [ 0x14c900, asm, lib/libc/memcmp ] + # - [0x14C994, asm, lib/libc/memcpy] + # - [0x14CA44, asm, lib/libc/memset] + - [ 0x14cb08, asm, lib/libc/mloc ] + - [ 0x14cbd8, asm, lib/libc/printf ] + - [ 0x14cca8, asm, lib/libc/puts ] + - [ 0x14cd50, asm, lib/libc/qsort ] + - [ 0x14d740, asm, lib/libc/rand ] + - [ 0x14d7c0, asm, lib/libc/sbrkr ] + - [ 0x14d818, asm, lib/libc/sprintf ] + - [ 0x14d930, asm, lib/libc/strcat ] + # - [0x14DA5C, asm, lib/libc/strcmp] + - [ 0x14dba0, asm, lib/libc/strcpy ] + # - [0x14DCB4, asm, lib/libc/strlen] + - [ 0x14ddf0, asm, lib/libc/strncmp ] + - [ 0x14dfa8, asm, lib/libc/vfiprintf ] + - [ 0x14ed18, asm, lib/libc/vfprintf ] + - [ 0x150790, asm, lib/libc/vsprintf ] + - [ 0x150840, asm, lib/libc/wsetup ] + - [ 0x150950, asm, lib/libc/abort ] + - [ 0x150968, asm, lib/libc/dtoa ] + - [ 0x151e00, asm, lib/libc/fflush ] + - [ 0x151f18, asm, lib/libc/findfp ] + - [ 0x1521b8, asm, lib/libc/freer ] + - [ 0x152620, asm, lib/libc/fvwrite ] + - [ 0x152a00, asm, lib/libc/fwalk ] + - [ 0x152a98, asm, lib/libc/locale ] + - [ 0x152b80, asm, lib/libc/makebuf ] + - [ 0x152cd8, asm, lib/libc/mbtowc_r ] + # - [0x152D0C, asm, lib/libc/memchr] + # - [0x152DEC, asm, lib/libc/memmove] + - [ 0x152ef0, asm, lib/libc/mprec ] + - [ 0x153f08, asm, lib/libc/s_isinf ] + - [ 0x153f50, asm, lib/libc/s_isnan ] + - [ 0x153f90, asm, lib/libc/signal ] + - [ 0x154278, asm, lib/libc/signalr ] + - [ 0x1542f0, asm, lib/libc/stdio ] + - [ 0x154460, asm, lib/libc/writer ] + - [ 0x1544c0, asm, lib/libc/callocr ] + - [ 0x154578, asm, lib/libc/closer ] + - [ 0x1545d0, asm, lib/libc/fstatr ] + - [ 0x154630, asm, lib/libc/lseekr ] + - [ 0x154690, asm, lib/libc/readr ] + # libkernl.a + - [ 0x154700, asm, lib/libkernl/klib ] + - [ 0x154fa0, asm, lib/libkernl/glue ] + - [ 0x155370, asm, lib/libkernl/cache ] + - [ 0x1555f0, asm, lib/libkernl/intr ] + - [ 0x155820, asm, lib/libkernl/alarm ] + - [ 0x155960, asm, lib/libkernl/tty ] + - [ 0x155e80, asm, lib/libkernl/kprintf ] + - [ 0x1567f8, asm, lib/libkernl/sifrpc ] + - [ 0x157758, c, lib/libkernl/filestub ] + - [ 0x15adf0, asm, lib/libkernl/eeloadfile ] + - [ 0x15bb50, asm, lib/libkernl/iopreset ] + - [ 0x15be00, asm, lib/libkernl/diei ] + - [ 0x15be60, c, lib/libkernl/initsys ] + - [ 0x15bfa0, asm, lib/libkernl/libosd ] + - [ 0x15c230, asm, lib/libkernl/thread ] + - [ 0x15c590, asm, lib/libkernl/deci2 ] + - [ 0x15c770, asm, lib/libkernl/sifcmd ] + - [ 0x15ceb8, asm, lib/libkernl/tlbfunc ] + - [ 0x15d3c0, asm, lib/libkernl/tlbtrap ] + # libgcc.a + - [ 0x15d720, asm, lib/libgcc/_muldi3 ] + - [ 0x15d798, asm, lib/libgcc/_divdi3 ] + - [ 0x15de30, asm, lib/libgcc/_moddi3 ] + - [ 0x15e4c0, asm, lib/libgcc/_udivdi3 ] + - [ 0x15ea40, asm, lib/libgcc/_umoddi3 ] + - [ 0x15efa8, asm, lib/libgcc/_fixunsdfdi ] + - [ 0x15f0c0, asm, lib/libgcc/_fixunssfdi ] + - [ 0x15f1e8, asm, lib/libgcc/main ] + - [ 0x15f370, asm, lib/libgcc/_sf_to_df ] + - [ 0x15f3b0, asm, lib/libgcc/_addsub_df ] + - [ 0x15f6d0, asm, lib/libgcc/_mul_df ] + - [ 0x15f980, asm, lib/libgcc/_div_df ] + - [ 0x15faf8, asm, lib/libgcc/_compare_df ] + - [ 0x15fb48, asm, lib/libgcc/_si_to_df ] + - [ 0x15fc00, asm, lib/libgcc/_df_to_si ] + - [ 0x15fca0, asm, lib/libgcc/_make_df ] + - [ 0x15fcd0, asm, lib/libgcc/_df_to_sf ] + - [ 0x15fd20, asm, lib/libgcc/_df_to_usi ] + - [ 0x15fdc8, asm, lib/libgcc/frame-dwarf2 ] + - [ 0x161338, asm, lib/libgcc/_floatdidf ] + - [ 0x1613e0, asm, lib/libgcc/_unpack_sf ] + - [ 0x161440, asm, lib/libgcc/_make_sf ] + - [ 0x161470, asm, lib/libgcc/_pack_df ] + - [ 0x161588, asm, lib/libgcc/_unpack_df ] + - [ 0x161638, asm, lib/libgcc/_fpcmp_parts_df ] + - [ 0x161758, asm, lib/libgcc/_pack_sf ] + - [ 0x161828, asm, lib/libgcc/atexit ] + - [ 0x1618c8, asm, lib/libgcc/errno ] + - [ 0x1618d8, asm, lib/libgcc/strncpy ] + # libgraph.a + - [ 0x161a98, asm, lib/libgraph/graph001 ] + - [ 0x161c38, asm, lib/libgraph/graph002 ] + - [ 0x161ca0, asm, lib/libgraph/graph003 ] + - [ 0x161f10, asm, lib/libgraph/graph004 ] + - [ 0x161fd0, asm, lib/libgraph/graph008 ] + - [ 0x1620b8, asm, lib/libgraph/graph011 ] + - [ 0x162150, asm, lib/libgraph/graph012 ] + - [ 0x162468, asm, lib/libgraph/graph015 ] + - [ 0x162650, asm, lib/libgraph/graph016 ] + - [ 0x162790, asm, lib/libgraph/graph017 ] + - [ 0x162910, asm, lib/libgraph/graph018 ] + - [ 0x162fa0, asm, lib/libgraph/graph019 ] - - [0xBBD58, c, gumi] - - [0xBD138, asm] - - [0xC1700, c, xbuffalo] - - [0xC2238, c, xkinetic] # seems to be the entrypoint to what we believe is the script engine - - [0xC3728, c, xflamingo] - - [0xC5E08, asm] - - [0xC84F0, c, xhumungus] - - [0xDEEF8, c, xstuck] - - [0xDF218, asm] - - [0xED8F8, c, xquack] - - [0xEED88, asm] - - [0xEF290, c, xtango] - - [0xF0CB0, c, xbiscuit] - - [0xF3A10, c, xmeowp] - - [0xF4910, asm] - - [0x115B08, c, xpotato] - - [0x119868, c, xrodent] - - [0x11A450, asm] - - [0x12F5F8, c, xcursed] - - [0x12F888, asm] - - [0x130558, c, memcard] - - [0x1330F8, asm] - - [0x144510, c, xcapy] - - [0x144CB8, asm] - - [0x146BD0, c, xmonitor] - - [0x1477F8, c, xpackage] - - [0x1485C8, c, xjockey] - - [0x14A090, c, disk] -########### -# Library # -########### - # ??? - the following 3 have 0x10 file alignment and 0x4 (no) function alignment within files - - [0x14AB28, asm] - - [0x14B880, asm] - - [0x14BA00, asm] - # libc.a - - [0x14BD50, asm, lib/libc/assert] - - [0x14BD88, asm, lib/libc/bsearch] - - [0x14BE58, asm, lib/libc/exit] - - [0x14BF08, asm, lib/libc/fiprintf] - - [0x14BF60, asm, lib/libc/malloc] - - [0x14C000, asm, lib/libc/malloc_r] - - [0x14C980, asm, lib/libc/memcmp] - # - [0x14CA14, asm, lib/libc/memcpy] - # - [0x14CAC4, asm, lib/libc/memset] - - [0x14CB88, asm, lib/libc/mloc] - - [0x14CC58, asm, lib/libc/printf] - - [0x14CD28, asm, lib/libc/puts] - - [0x14CDD0, asm, lib/libc/qsort] - - [0x14D7C0, asm, lib/libc/rand] - - [0x14D840, asm, lib/libc/sbrkr] - - [0x14D898, asm, lib/libc/sprintf] - - [0x14D9B0, asm, lib/libc/strcat] - # - [0x14DADC, asm, lib/libc/strcmp] - - [0x14DC20, asm, lib/libc/strcpy] - # - [0x14DD34, asm, lib/libc/strlen] - - [0x14DE70, asm, lib/libc/strncmp] - - [0x14E028, asm, lib/libc/vfiprintf] - - [0x14ED98, asm, lib/libc/vfprintf] - - [0x150810, asm, lib/libc/vsprintf] - - [0x1508C0, asm, lib/libc/wsetup] - - [0x1509D0, asm, lib/libc/abort] - - [0x1509E8, asm, lib/libc/dtoa] - - [0x151E80, asm, lib/libc/fflush] - - [0x151F98, asm, lib/libc/findfp] - - [0x152238, asm, lib/libc/freer] - - [0x1526A0, asm, lib/libc/fvwrite] - - [0x152A80, asm, lib/libc/fwalk] - - [0x152B18, asm, lib/libc/locale] - - [0x152C00, asm, lib/libc/makebuf] - - [0x152D58, asm, lib/libc/mbtowc_r] - # - [0x152D8C, asm, lib/libc/memchr] - # - [0x152E6C, asm, lib/libc/memmove] - - [0x152F70, asm, lib/libc/mprec] - - [0x153F88, asm, lib/libc/s_isinf] - - [0x153FD0, asm, lib/libc/s_isnan] - - [0x154010, asm, lib/libc/signal] - - [0x1542F8, asm, lib/libc/signalr] - - [0x154370, asm, lib/libc/stdio] - - [0x1544E0, asm, lib/libc/writer] - - [0x154540, asm, lib/libc/callocr] - - [0x1545F8, asm, lib/libc/closer] - - [0x154650, asm, lib/libc/fstatr] - - [0x1546B0, asm, lib/libc/lseekr] - - [0x154710, asm, lib/libc/readr] - # libkernl.a - - [0x154780, asm, lib/libkernl/klib] - - [0x155020, asm, lib/libkernl/glue] - - [0x1553F0, asm, lib/libkernl/cache] - - [0x155670, asm, lib/libkernl/intr] - - [0x1558A0, asm, lib/libkernl/alarm] - - [0x1559E0, asm, lib/libkernl/tty] - - [0x155F00, asm, lib/libkernl/kprintf] - - [0x156878, asm, lib/libkernl/sifrpc] - - [0x1577D8, c, lib/libkernl/filestub] - - [0x15AE70, asm, lib/libkernl/eeloadfile] - - [0x15BBD0, asm, lib/libkernl/iopreset] - - [0x15BE80, asm, lib/libkernl/diei] - - [0x15BEE0, c, lib/libkernl/initsys] - - [0x15C020, asm, lib/libkernl/libosd] - - [0x15C2B0, asm, lib/libkernl/thread] - - [0x15C610, asm, lib/libkernl/deci2] - - [0x15C7F0, asm, lib/libkernl/sifcmd] - - [0x15CF38, asm, lib/libkernl/tlbfunc] - - [0x15D440, asm, lib/libkernl/tlbtrap] - # libgcc.a - - [0x15D7A0, asm, lib/libgcc/_muldi3] - - [0x15D818, asm, lib/libgcc/_divdi3] - - [0x15DEB0, asm, lib/libgcc/_moddi3] - - [0x15E540, asm, lib/libgcc/_udivdi3] - - [0x15EAC0, asm, lib/libgcc/_umoddi3] - - [0x15F028, asm, lib/libgcc/_fixunsdfdi] - - [0x15F140, asm, lib/libgcc/_fixunssfdi] - - [0x15F268, asm, lib/libgcc/main] - - [0x15F3F0, asm, lib/libgcc/_sf_to_df] - - [0x15F430, asm, lib/libgcc/_addsub_df] - - [0x15F750, asm, lib/libgcc/_mul_df] - - [0x15FA00, asm, lib/libgcc/_div_df] - - [0x15FB78, asm, lib/libgcc/_compare_df] - - [0x15FBC8, asm, lib/libgcc/_si_to_df] - - [0x15FC80, asm, lib/libgcc/_df_to_si] - - [0x15FD20, asm, lib/libgcc/_make_df] - - [0x15FD50, asm, lib/libgcc/_df_to_sf] - - [0x15FDA0, asm, lib/libgcc/_df_to_usi] - - [0x15FE48, asm, lib/libgcc/frame-dwarf2] - - [0x1613B8, asm, lib/libgcc/_floatdidf] - - [0x161460, asm, lib/libgcc/_unpack_sf] - - [0x1614C0, asm, lib/libgcc/_make_sf] - - [0x1614F0, asm, lib/libgcc/_pack_df] - - [0x161608, asm, lib/libgcc/_unpack_df] - - [0x1616B8, asm, lib/libgcc/_fpcmp_parts_df] - - [0x1617D8, asm, lib/libgcc/_pack_sf] - - [0x1618A8, asm, lib/libgcc/atexit] - - [0x161948, asm, lib/libgcc/errno] - - [0x161958, asm, lib/libgcc/strncpy] - # libgraph.a - - [0x161B18, asm, lib/libgraph/graph001] - - [0x161CB8, asm, lib/libgraph/graph002] - - [0x161D20, asm, lib/libgraph/graph003] - - [0x161F90, asm, lib/libgraph/graph004] - - [0x162050, asm, lib/libgraph/graph008] - - [0x162138, asm, lib/libgraph/graph011] - - [0x1621D0, asm, lib/libgraph/graph012] - - [0x1624E8, asm, lib/libgraph/graph015] - - [0x1626D0, asm, lib/libgraph/graph016] - - [0x162810, asm, lib/libgraph/graph017] - - [0x162990, asm, lib/libgraph/graph018] - - [0x163020, asm, lib/libgraph/graph019] + - [ 0x163040, asm, lib/libdma ] + - [ 0x163b10, c, lib/libvu0 ] + - [ 0x164858, asm, lib/libdbc ] + - [ 0x1652b8, asm, lib/libpad2 ] + - [ 0x165b10, asm, lib/libvib ] + # libcdvd.a + - [ 0x165c80, asm, lib/libcdvd/cdvd000 ] + - [ 0x166f98, asm, lib/libcdvd/cdvd005 ] + - [ 0x167178, asm, lib/libcdvd/cdvd010 ] + - [ 0x167248, asm, lib/libcdvd/cdvd015 ] + - [ 0x1672e0, asm, lib/libcdvd/cdvd017 ] + - [ 0x167398, asm, lib/libcdvd/cdvd018 ] + - [ 0x167450, asm, lib/libcdvd/cdvd035 ] + # libm.a + - [ 0x167508, asm, lib/libm/s_atan ] + - [ 0x1679d0, asm, lib/libm/s_ceil ] + - [ 0x167be0, asm, lib/libm/s_cos ] + - [ 0x167d08, asm, lib/libm/s_fabs ] + - [ 0x167d40, asm, lib/libm/s_nan ] + - [ 0x167d68, asm, lib/libm/s_sin ] + - [ 0x167ea0, asm, lib/libm/sf_cos ] + - [ 0x167f78, asm, lib/libm/sf_sin ] + - [ 0x168060, asm, lib/libm/sf_tan ] + - [ 0x1680d8, asm, lib/libm/w_asin ] + - [ 0x1680f0, asm, lib/libm/w_atan2 ] + - [ 0x168108, asm, lib/libm/w_sqrt ] + - [ 0x168120, asm, lib/libm/wf_acos ] + - [ 0x168138, asm, lib/libm/wf_asin ] + - [ 0x168150, asm, lib/libm/wf_atan2 ] + - [ 0x168168, asm, lib/libm/wf_fmod ] + - [ 0x168180, asm, lib/libm/wf_pow ] + - [ 0x168198, asm, lib/libm/wf_sqrt ] + - [ 0x1681b0, asm, lib/libm/e_asin ] + - [ 0x168808, asm, lib/libm/e_atan2 ] + - [ 0x168b48, asm, lib/libm/e_rem_pio2 ] + - [ 0x169100, asm, lib/libm/e_sqrt ] + - [ 0x169420, asm, lib/libm/ef_acos ] + - [ 0x169860, asm, lib/libm/ef_asin ] + - [ 0x169c18, asm, lib/libm/ef_atan2 ] + - [ 0x169e00, asm, lib/libm/ef_fmod ] + - [ 0x169fd0, asm, lib/libm/ef_pow ] + - [ 0x16a7f0, asm, lib/libm/ef_rem_pio2 ] + - [ 0x16abb8, asm, lib/libm/ef_sqrt ] + - [ 0x16ac90, asm, lib/libm/k_cos ] + - [ 0x16af68, asm, lib/libm/k_rem_pio2 ] + - [ 0x16bab8, asm, lib/libm/k_sin ] + - [ 0x16bcf0, asm, lib/libm/kf_cos ] + - [ 0x16be60, asm, lib/libm/kf_rem_pio2 ] + - [ 0x16c708, asm, lib/libm/kf_sin ] + - [ 0x16c830, asm, lib/libm/kf_tan ] + - [ 0x16cad8, asm, lib/libm/s_floor ] + - [ 0x16ccf0, asm, lib/libm/s_scalbn ] + - [ 0x16ced8, asm, lib/libm/sf_atan ] + - [ 0x16d178, asm, lib/libm/sf_fabs ] + - [ 0x16d1a0, asm, lib/libm/sf_floor ] + - [ 0x16d290, asm, lib/libm/sf_scalbn ] + - [ 0x16d358, asm, lib/libm/s_copysign ] + - [ 0x16d3a0, asm, lib/libm/sf_copysign ] - - [0x1630C0, asm, lib/libdma] - - [0x163B90, c, lib/libvu0] - - [0x1648D8, asm, lib/libdbc] - - [0x165338, asm, lib/libpad2] - - [0x165B90, asm, lib/libvib] - # libcdvd.a - - [0x165D00, asm, lib/libcdvd/cdvd000] - - [0x167018, asm, lib/libcdvd/cdvd005] - - [0x1671F8, asm, lib/libcdvd/cdvd010] - - [0x1672C8, asm, lib/libcdvd/cdvd015] - - [0x167360, asm, lib/libcdvd/cdvd017] - - [0x167418, asm, lib/libcdvd/cdvd018] - - [0x1674D0, asm, lib/libcdvd/cdvd035] - # libm.a - - [0x167588, asm, lib/libm/s_atan] - - [0x167A50, asm, lib/libm/s_ceil] - - [0x167C60, asm, lib/libm/s_cos] - - [0x167D88, asm, lib/libm/s_fabs] - - [0x167DC0, asm, lib/libm/s_nan] - - [0x167DE8, asm, lib/libm/s_sin] - - [0x167F20, asm, lib/libm/sf_cos] - - [0x167FF8, asm, lib/libm/sf_sin] - - [0x1680E0, asm, lib/libm/sf_tan] - - [0x168158, asm, lib/libm/w_asin] - - [0x168170, asm, lib/libm/w_atan2] - - [0x168188, asm, lib/libm/w_sqrt] - - [0x1681A0, asm, lib/libm/wf_acos] - - [0x1681B8, asm, lib/libm/wf_asin] - - [0x1681D0, asm, lib/libm/wf_atan2] - - [0x1681E8, asm, lib/libm/wf_fmod] - - [0x168200, asm, lib/libm/wf_pow] - - [0x168218, asm, lib/libm/wf_sqrt] - - [0x168230, asm, lib/libm/e_asin] - - [0x168888, asm, lib/libm/e_atan2] - - [0x168BC8, asm, lib/libm/e_rem_pio2] - - [0x169180, asm, lib/libm/e_sqrt] - - [0x1694A0, asm, lib/libm/ef_acos] - - [0x1698E0, asm, lib/libm/ef_asin] - - [0x169C98, asm, lib/libm/ef_atan2] - - [0x169E80, asm, lib/libm/ef_fmod] - - [0x16A050, asm, lib/libm/ef_pow] - - [0x16A870, asm, lib/libm/ef_rem_pio2] - - [0x16AC38, asm, lib/libm/ef_sqrt] - - [0x16AD10, asm, lib/libm/k_cos] - - [0x16AFE8, asm, lib/libm/k_rem_pio2] - - [0x16BB38, asm, lib/libm/k_sin] - - [0x16BD70, asm, lib/libm/kf_cos] - - [0x16BEE0, asm, lib/libm/kf_rem_pio2] - - [0x16C788, asm, lib/libm/kf_sin] - - [0x16C8B0, asm, lib/libm/kf_tan] - - [0x16CB58, asm, lib/libm/s_floor] - - [0x16CD70, asm, lib/libm/s_scalbn] - - [0x16CF58, asm, lib/libm/sf_atan] - - [0x16D1F8, asm, lib/libm/sf_fabs] - - [0x16D220, asm, lib/libm/sf_floor] - - [0x16D310, asm, lib/libm/sf_scalbn] - - [0x16D3D8, asm, lib/libm/s_copysign] - - [0x16D420, asm, lib/libm/sf_copysign] + - [ 0x16d3e0, asm, lib/libpc ] + - [ 0x16d468, c, lib/libmc ] + - [ 0x16ecd0, asm, lib/libipu/libipu ] + - [ 0x16f040, asm, lib/libipu/ipuinit ] - - [0x16D460, asm, lib/libpc] - - [0x16D4E8, c, lib/libmc] - - [0x16ED50, asm, lib/libipu/libipu] - - [0x16F0C0, asm, lib/libipu/ipuinit] + ## .data section ## + - [ 0x16f2e0, data ] + - [ 0x1b3a20, .data, xnoodle ] + - [ 0x1b7b10, data ] + - [ 0x1b7b70, data, xsauce ] + - [ 0x1b8000, data ] + - [ 0x1b9178, .data, worldfile ] + - [ 0x1b92f0, data ] + - [ 0x1dec10, .data, xpeanut ] + - [ 0x1ded10, data ] + - [ 0x201010, .data, xapple ] + - [ 0x201078, data ] # todo: xapple owns D_00301078 + - [ 0x25ec00, data, ppp/pppMngr ] + - [ 0x260c00, data ] + - [ 0x2de5b8, data, xquack ] + - [ 0x2de5f0, data ] + - [ 0x31f8c8, .data, memcard ] + - [ 0x31f9d0, data ] + - [ 0x3610f8, .data, xcapy ] + - [ 0x361100, data ] + - [ 0x363d48, .data, xjockey ] + - [ 0x363d58, data, xjockey ] + - [ 0x3642e8, .data, disk ] + - [ 0x364388, data ] -## .data section ## - - [0x16F360, data] - - [0x1B3AA0, .data, xnoodle] - - [0x1B7B90, data] - - [0x1B7BF0, data, xsauce] - - [0x1B8080, data] - - [0x1B91F8, .data, worldfile] - - [0x1B9370, data] - - [0x1DEC90, .data, xpeanut] - - [0x1DED90, data] - - [0x201090, .data, xapple] - - [0x2010F8, data] # todo: xapple owns D_00301078 - - [0x25EC80, data, ppp/pppMngr] - - [0x260C80, data] - - [0x2DE638, data, xquack] - - [0x2DE670, data] - - [0x31F948, .data, memcard] - - [0x31FA50, data] - - [0x361178, .data, xcapy] - - [0x361180, data] - - [0x363DC8, .data, xjockey] - - [0x363DD8, data, xjockey] - - [0x364368, .data, disk] - - [0x364408, data] + - [ 0x3643b0, data, lib/libc/impure ] + - [ 0x3646a8, data, lib/libc/malloc_r ] + - [ 0x364b00, data, lib/libc/mlock ] + - [ 0x364b08, data, lib/libc/locale ] + # - [0x364B0C, data, lib/libkernl/klib] + # - [0x364B1C, data, lib/libkernl/glue] + - [ 0x364b28, data, lib/libkernl/alarm ] + - [ 0x3652d0, data, lib/libkernl/kprintf ] + - [ 0x3652d8, data, lib/libkernl/sifrpc ] + - [ 0x3652e0, .data, lib/libkernl/filestub ] + # - [0x365374, data, libkernl/eeloadfile] + - [ 0x365380, .data, lib/libkernl/initsys ] + - [ 0x365398, data, lib/libkernl/libosd ] + - [ 0x365b58, data, lib/libkernl/thread ] + # - [0x365B5C, data, lib/libkernl/sifcmd] + - [ 0x365b60, data, lib/libkernl/tlbfunc ] + # - [0x36619C, data, lib/libgcc/__main] + - [ 0x3661b0, data, lib/libgraph/graph001 ] + - [ 0x3661d0, data, lib/libgraph/graph002 ] + - [ 0x3661f0, data, lib/libgraph/graph018 ] + - [ 0x366200, data, lib/libdma ] + - [ 0x3662b0, .data, lib/libvu0 ] + - [ 0x3662e0, data, lib/libdbc ] + - [ 0x3662f0, data, lib/libdpad2 ] + - [ 0x366320, data, lib/libdvib ] + - [ 0x366340, data, lib/libcdvd/cdvd000 ] + - [ 0x367db0, data, lib/libpc ] + - [ 0x367dc0, data, lib/libmc ] + - [ 0x367de0, data, lib/libipu ] + - [ 0x367e60, data ] - - [0x364430, data, lib/libc/impure] - - [0x364728, data, lib/libc/malloc_r] - - [0x364B80, data, lib/libc/mlock] - - [0x364B88, data, lib/libc/locale] - # - [0x364B8C, data, lib/libkernl/klib] - # - [0x364B9C, data, lib/libkernl/glue] - - [0x364BA8, data, lib/libkernl/alarm] - - [0x365350, data, lib/libkernl/kprintf] - - [0x365358, data, lib/libkernl/sifrpc] - - [0x365360, .data, lib/libkernl/filestub] - # - [0x3653F4, data, libkernl/eeloadfile] - - [0x365400, .data, lib/libkernl/initsys] - - [0x365418, data, lib/libkernl/libosd] - - [0x365BD8, data, lib/libkernl/thread] - # - [0x365BDC, data, lib/libkernl/sifcmd] - - [0x365BE0, data, lib/libkernl/tlbfunc] - # - [0x36621C, data, lib/libgcc/__main] - - [0x366230, data, lib/libgraph/graph001] - - [0x366250, data, lib/libgraph/graph002] - - [0x366270, data, lib/libgraph/graph018] - - [0x366280, data, lib/libdma] - - [0x366330, .data, lib/libvu0] - - [0x366360, data, lib/libdbc] - - [0x366370, data, lib/libdpad2] - - [0x3663A0, data, lib/libdvib] - - [0x3663C0, data, lib/libcdvd/cdvd000] - - [0x367E30, data, lib/libpc] - - [0x367E40, data, lib/libmc] - - [0x367E60, data, lib/libipu] - - [0x367EE0, data] + ## .rodata section ## + - [ 0x386950, .rodata, xbeginning ] + - [ 0x386970, .rodata, xporcupine ] + - [ 0x386980, rodata, 1870 ] + - [ 0x3869e0, .rodata, xarcade ] + - [ 0x386a60, .rodata, xnoodle ] + - [ 0x386a90, rodata, 6948 ] + - [ 0x386c40, .rodata, xtailor ] + - [ 0x386c70, .rodata, xtrumpet ] + - [ 0x386ca0, .rodata, worldfile ] + - [ 0x386d38, .rodata, xblade ] + - [ 0x386dc0, rodata, 14CD8 ] + - [ 0x386e40, .rodata, xturtle ] + - [ 0x386ef0, .rodata, xgoblin ] + - [ 0x386f70, .rodata, xkingdom ] + - [ 0x387000, .rodata, xowl ] + - [ 0x387018, .rodata, xtoaster ] + - [ 0x387080, .rodata, xpeanut ] + - [ 0x3870d0, .rodata, xpillow ] + - [ 0x387250, rodata ] + - [ 0x387968, .rodata, xapple ] + - [ 0x3879d8, rodata, blob3 ] # todo: part of xapple + - [ 0x3879e0, rodata, 3BD88 ] + - [ 0x388128, .rodata, xsquash ] + - [ 0x388140, rodata, 4A018 ] + - [ 0x3887b0, .rodata, ppp/pppMngr ] + - [ 0x3897f8, .rodata, ppp/keProg/pppKeTh ] + - [ 0x389808, .rodata, ppp/keProg/pppKeBornRnd5 ] + - [ 0x389818, .rodata, ppp/keProg/pppKeMvYpEff ] + - [ 0x389828, rodata ] # todo: needs investigated, 2 4-byte values in different TUs + - [ 0x389830, .rodata, ppp/ryjProg/pppRyjMatrixNoRot ] + - [ 0x389850, .rodata, ppp/ryjProg/pppRyjDrawShipoly ] + - [ 0x389890, .rodata, ppp/ryjProg/pppRyjDrawShipolyBone ] + - [ 0x389940, .rodata, ppp/ryjProg/pppRyjMegaBirth ] + - [ 0x389970, .rodata, ppp/ryjProg/pppRyjMegaPlaceLamp ] + - [ 0x389a00, .rodata, ppp/ryjProg/pppRyjMegaBirthModel ] + - [ 0x389a58, .rodata, ppp/xpear ] #todo: split/rename xpear and draw/md0 + - [ 0x389a60, .rodata, ppp/draw/draw ] + - [ 0x389ad8, .rodata, ppp/draw/global ] + - [ 0x389b40, .rodata, ppp/draw/md0 ] + - [ 0x389cb0, .rodata, gumi ] + - [ 0x389d70, rodata, BD0B8 ] + - [ 0x38a0b0, .rodata, xbuffalo ] + - [ 0x38a0d0, .rodata, xkinetic ] + - [ 0x38a0f0, rodata, C5D88 ] + - [ 0x38a458, .rodata, xstuck ] + - [ 0x38a480, rodata, DF198 ] + - [ 0x38a560, .rodata, xquack ] + - [ 0x38a590, .rodata, xbiscuit ] + - [ 0x38a670, .rodata, xmeowp ] + - [ 0x38a6a0, rodata, F4890 ] + - [ 0x38aa40, .rodata, xpotato ] + - [ 0x38aa98, .rodata, xrodent ] + - [ 0x38aad0, rodata, 11A3D0 ] + - [ 0x38ae80, .rodata, xcursed ] + - [ 0x38aec0, rodata, 12F808 ] + - [ 0x38af30, .rodata, memcard ] + - [ 0x38aff0, rodata, 133078 ] + - [ 0x38b348, .rodata, xcapy ] + - [ 0x38b390, rodata, 144C38 ] + - [ 0x38b3d0, .rodata, xmonitor ] + - [ 0x38b3e8, .rodata, xpackage ] + - [ 0x38b428, .rodata, xjockey ] + - [ 0x38b498, .rodata, disk ] -## .rodata section ## - - [0x3869D0, .rodata, xbeginning] - - [0x3869F0, .rodata, xporcupine] - - [0x386A00, rodata, 18F0] - - [0x386A60, .rodata, xarcade] - - [0x386AE0, .rodata, xnoodle] - - [0x386B10, rodata, 69C8] - - [0x386CC0, .rodata, xtailor] - - [0x386CF0, .rodata, xtrumpet] - - [0x386D20, .rodata, worldfile] - - [0x386DB8, .rodata, xblade] - - [0x386E40, rodata, 14D58] - - [0x386EC0, .rodata, xturtle] - - [0x386F70, .rodata, xgoblin] - - [0x386FF0, .rodata, xkingdom] - - [0x387080, .rodata, xowl] - - [0x387098, .rodata, xtoaster] - - [0x387100, .rodata, xpeanut] - - [0x387150, .rodata, xpillow] - - [0x3872D0, rodata] - - [0x3879E8, .rodata, xapple] - - [0x387A58, rodata, blob3] # todo: part of xapple - - [0x387A60, rodata, 3BE08] - - [0x3881A8, .rodata, xsquash] - - [0x3881C0, rodata, 4A098] - - [0x388830, .rodata, ppp/pppMngr] - - [0x389878, .rodata, ppp/keProg/pppKeTh] - - [0x389888, .rodata, ppp/keProg/pppKeBornRnd5] - - [0x389898, .rodata, ppp/keProg/pppKeMvYpEff] - - [0x3898A8, rodata] # todo: needs investigated, 2 4-byte values in different TUs - - [0x3898B0, .rodata, ppp/ryjProg/pppRyjMatrixNoRot] - - [0x3898D0, .rodata, ppp/ryjProg/pppRyjDrawShipoly] - - [0x389910, .rodata, ppp/ryjProg/pppRyjDrawShipolyBone] - - [0x3899C0, .rodata, ppp/ryjProg/pppRyjMegaBirth] - - [0x3899F0, .rodata, ppp/ryjProg/pppRyjMegaPlaceLamp] - - [0x389A80, .rodata, ppp/ryjProg/pppRyjMegaBirthModel] - - [0x389AD8, .rodata, ppp/xpear] #todo: split/rename xpear and draw/md0 - - [0x389AE0, .rodata, ppp/draw/draw] - - [0x389B58, .rodata, ppp/draw/global] - - [0x389BC0, .rodata, ppp/draw/md0] - - [0x389D30, .rodata, gumi] - - [0x389DF0, rodata, BD138] - - [0x38A130, .rodata, xbuffalo] - - [0x38A150, .rodata, xkinetic] - - [0x38A170, rodata, C5E08] - - [0x38A4D8, .rodata, xstuck] - - [0x38A500, rodata, DF218] - - [0x38A5E0, .rodata, xquack] - - [0x38A610, .rodata, xbiscuit] - - [0x38A6F0, .rodata, xmeowp] - - [0x38A720, rodata, F4910] - - [0x38AAC0, .rodata, xpotato] - - [0x38AB18, .rodata, xrodent] - - [0x38AB50, rodata, 11A450] - - [0x38AF00, .rodata, xcursed] - - [0x38AF40, rodata, 12F888] - - [0x38AFB0, .rodata, memcard] - - [0x38B070, rodata, 1330F8] - - [0x38B3C8, .rodata, xcapy] - - [0x38B410, rodata, 144CB8] - - [0x38B450, .rodata, xmonitor] - - [0x38B468, .rodata, xpackage] - - [0x38B4A8, .rodata, xjockey] - - [0x38B518, .rodata, disk] - - - [0x38B598, rodata, lib/libc/assert] - - [0x38B5C8, rodata, lib/libc/ctype_] - - [0x38B6D0, rodata, lib/libc/impure] - - [0x38B6D8, rodata, lib/libc/puts] - - [0x38B6E0, rodata, lib/libc/vfiprintf] - - [0x38B8D0, rodata, lib/libc/vfprintf] - - [0x38BAE0, rodata, lib/libc/dtoa] - - [0x38BB38, rodata, lib/libc/locale] - - [0x38BB80, rodata, lib/libc/mprec] + - [ 0x38b518, rodata, lib/libc/assert ] + - [ 0x38b548, rodata, lib/libc/ctype_ ] + - [ 0x38b650, rodata, lib/libc/impure ] + - [ 0x38b658, rodata, lib/libc/puts ] + - [ 0x38b660, rodata, lib/libc/vfiprintf ] + - [ 0x38b850, rodata, lib/libc/vfprintf ] + - [ 0x38ba60, rodata, lib/libc/dtoa ] + - [ 0x38bab8, rodata, lib/libc/locale ] + - [ 0x38bb00, rodata, lib/libc/mprec ] - - [0x38BCA8, rodata, lib/libkernl/tty] - - [0x38BD20, rodata, lib/libkernl/kprintf] - - [0x38BE80, .rodata, lib/libkernl/filestub] - - [0x38BEF8, rodata, lib/libkernl/eeloadfile] - - [0x38BF00, rodata, lib/libkernl/iopreset] - - [0x38BF30, rodata, lib/libkernl/thread] - - [0x38BF58, rodata, lib/libkernl/tlbfunc] + - [ 0x38bc28, rodata, lib/libkernl/tty ] + - [ 0x38bca0, rodata, lib/libkernl/kprintf ] + - [ 0x38be00, .rodata, lib/libkernl/filestub ] + - [ 0x38be78, rodata, lib/libkernl/eeloadfile ] + - [ 0x38be80, rodata, lib/libkernl/iopreset ] + - [ 0x38beb0, rodata, lib/libkernl/thread ] + - [ 0x38bed8, rodata, lib/libkernl/tlbfunc ] - - [0x38BFD8, rodata, lib/libgcc/_divdi3] - - [0x38C0D8, rodata, lib/libgcc/_moddi3] - - [0x38C1D8, rodata, lib/libgcc/_udivdi3] - - [0x38C2D8, rodata, lib/libgcc/_umoddi3] - - [0x38C3D8, rodata, lib/libgcc/_thenan_df] - - [0x38C3F0, rodata, lib/libgcc/frame-dwarf2] + - [ 0x38bf58, rodata, lib/libgcc/_divdi3 ] + - [ 0x38c058, rodata, lib/libgcc/_moddi3 ] + - [ 0x38c158, rodata, lib/libgcc/_udivdi3 ] + - [ 0x38c258, rodata, lib/libgcc/_umoddi3 ] + - [ 0x38c358, rodata, lib/libgcc/_thenan_df ] + - [ 0x38c370, rodata, lib/libgcc/frame-dwarf2 ] - - [0x38C4C0, rodata, lib/libgraph/graph003] - - [0x38C4F8, rodata, lib/libgraph/graph008] - - [0x38C528, rodata, lib/libgraph/graph012] - - [0x38C6C0, rodata, lib/libgraph/graph015] - - [0x38C7E0, rodata, lib/libgraph/graph017] - - [0x38C820, rodata, lib/libgraph/graph018] + - [ 0x38c440, rodata, lib/libgraph/graph003 ] + - [ 0x38c478, rodata, lib/libgraph/graph008 ] + - [ 0x38c4a8, rodata, lib/libgraph/graph012 ] + - [ 0x38c640, rodata, lib/libgraph/graph015 ] + - [ 0x38c760, rodata, lib/libgraph/graph017 ] + - [ 0x38c7a0, rodata, lib/libgraph/graph018 ] - - [0x38CA20, rodata, lib/libdbc] + - [ 0x38c9a0, rodata, lib/libdbc ] - - [0x38CC18, rodata, lib/libcdvd/cdvd000] - - [0x38CDC8, rodata, lib/libcdvd/cdvd005] - - [0x38CDF0, rodata, lib/libcdvd/cdvd017] + - [ 0x38cb98, rodata, lib/libcdvd/cdvd000 ] + - [ 0x38cd48, rodata, lib/libcdvd/cdvd005 ] + - [ 0x38cd70, rodata, lib/libcdvd/cdvd017 ] - - [0x38CE00, rodata, lib/libm/s_atan] - - [0x38CEB0, rodata, lib/libm/s_ceil] - - [0x38CEC0, rodata, lib/libm/sf_cos] - - [0x38CEC8, rodata, lib/libm/e_asin] - - [0x38D018, rodata, lib/libm/e_atan2] - - [0x38D0C8, rodata, lib/libm/e_rem_pio2] - - [0x38D318, rodata, lib/libm/e_sqrt] - - [0x38D328, rodata, lib/libm/ef_acos] - - [0x38D360, rodata, lib/libm/ef_asin] - # - [0x38D39C, rodata, lib/libm/ef_atan2] - - [0x38D3B8, rodata, lib/libm/ef_fmod] - - [0x38D3C8, rodata, lib/libm/ef_pow] - - [0x38D450, rodata, lib/libm/ef_rem_pio2] - - [0x38D810, rodata, lib/libm/ef_sqrt] - - [0x38D818, rodata, lib/libm/k_cos] - - [0x38D880, rodata, lib/libm/k_rem_pio2] - - [0x38D8F0, rodata, lib/libm/k_sin] - - [0x38D960, rodata, lib/libm/kf_cos] - - [0x38D980, rodata, lib/libm/kf_rem_pio2] - # - [0x38D9CC, rodata, lib/libm/kf_sin] - - [0x38D9E8, rodata, lib/libm/kf_tan] - - [0x38DA30, rodata, lib/libm/s_floor] - - [0x38DA40, rodata, lib/libm/s_scalbn] - - [0x38DA70, rodata, lib/libm/sf_atan] - # - [0x38DAC4, rodata, lib/libm/sf_floor] - - [0x38DAC8, rodata, lib/libm/sf_scalbn] - - [0x38DAD8, .rodata, lib/libmc] - - [0x38DB60, rodata] - - [0x38DB80, databin] # .reginfo / segment_1.2 - - [0x38DB98, databin] - - [0x39A680] + - [ 0x38cd80, rodata, lib/libm/s_atan ] + - [ 0x38ce30, rodata, lib/libm/s_ceil ] + - [ 0x38ce40, rodata, lib/libm/sf_cos ] + - [ 0x38ce48, rodata, lib/libm/e_asin ] + - [ 0x38cf98, rodata, lib/libm/e_atan2 ] + - [ 0x38d048, rodata, lib/libm/e_rem_pio2 ] + - [ 0x38d298, rodata, lib/libm/e_sqrt ] + - [ 0x38d2a8, rodata, lib/libm/ef_acos ] + - [ 0x38d2e0, rodata, lib/libm/ef_asin ] + # - [0x38D31C, rodata, lib/libm/ef_atan2] + - [ 0x38d338, rodata, lib/libm/ef_fmod ] + - [ 0x38d348, rodata, lib/libm/ef_pow ] + - [ 0x38d3d0, rodata, lib/libm/ef_rem_pio2 ] + - [ 0x38d790, rodata, lib/libm/ef_sqrt ] + - [ 0x38d798, rodata, lib/libm/k_cos ] + - [ 0x38d800, rodata, lib/libm/k_rem_pio2 ] + - [ 0x38d870, rodata, lib/libm/k_sin ] + - [ 0x38d8e0, rodata, lib/libm/kf_cos ] + - [ 0x38d900, rodata, lib/libm/kf_rem_pio2 ] + # - [0x38D94C, rodata, lib/libm/kf_sin] + - [ 0x38d968, rodata, lib/libm/kf_tan ] + - [ 0x38d9b0, rodata, lib/libm/s_floor ] + - [ 0x38d9c0, rodata, lib/libm/s_scalbn ] + - [ 0x38d9f0, rodata, lib/libm/sf_atan ] + # - [0x38DA44, rodata, lib/libm/sf_floor] + - [ 0x38da48, rodata, lib/libm/sf_scalbn ] + - [ 0x38da58, .rodata, lib/libmc ] + - [ 0x38dae0, rodata ] +- [ 0x38db00 ] diff --git a/configure.py b/configure.py index bbfc329..d1be6ff 100755 --- a/configure.py +++ b/configure.py @@ -3,6 +3,7 @@ import argparse import os import shutil +import subprocess import sys from pathlib import Path from typing import Dict, List, Set, Union @@ -15,14 +16,12 @@ ROOT = Path(__file__).parent.resolve() TOOLS_DIR = ROOT / "tools" -VERSION = "jp" -BASENAME = "SLPS_251.05" -YAML_FILE = f"config/kh.{VERSION}.yaml" +VERSIONS = { + "jp": ("SLPS_251.05", "Original Japanese"), + "fm": ("SLPS_251.98", "Final Mix"), +} -LD_PATH = f"{BASENAME}.ld" -ELF_PATH = f"build/{VERSION}/{BASENAME}" -MAP_PATH = f"build/{VERSION}/{BASENAME}.map" -PRE_ELF_PATH = f"build/{VERSION}/{BASENAME}.elf" +CROSS = "mips-linux-gnu-" COMMON_INCLUDES = "-Iinclude -isystem include/sdk/ee -isystem include/gcc" @@ -42,14 +41,60 @@ ] -def clean(): +class Paths: + def __init__(self, version: str): + basename, _ = VERSIONS[version] + + self.version = version + self.basename = basename + self.target_elf = basename + self.target_rom = f"{basename}.rom" + self.yaml = f"config/kh.{version}.yaml" + self.ld_script = f"{basename}.ld" + self.config_dir = f"config/{version}" + self.build_dir = f"build/{version}" + self.elf = f"{self.build_dir}/{basename}.elf" + self.map = f"{self.build_dir}/{basename}.map" + self.rom = f"{self.build_dir}/{basename}.rom" + self.checksum = f"{self.config_dir}/checksum.sha1" + + +def clean(paths: Paths): if os.path.exists(".splache"): os.remove(".splache") + for generated in (paths.ld_script, f"{paths.basename}.d"): + if os.path.exists(generated): + os.remove(generated) shutil.rmtree("asm", ignore_errors=True) shutil.rmtree("assets", ignore_errors=True) shutil.rmtree("build", ignore_errors=True) +def extract_rom(paths: Paths): + elf = ROOT / paths.target_elf + rom = ROOT / paths.target_rom + + if not elf.is_file(): + sys.exit( + f"Could not find {paths.target_elf}. Place the {VERSIONS[paths.version][1]} " + "executable, ripped from the disc, in the root of the repository." + ) + + subprocess.run( + [ + f"{CROSS}objcopy", + "-O", + "binary", + "--gap-fill=0x00", + "-R", + ".reginfo", + str(elf), + str(rom), + ], + check=True, + ) + + def write_permuter_settings(): with open("permuter_settings.toml", "w") as f: f.write( @@ -65,7 +110,17 @@ def write_permuter_settings(): ) -def build_stuff(linker_entries: List[LinkerEntry]): +def asm_dependencies(paths: Paths, src_path: Path) -> List[str]: + dep_file = Path(paths.build_dir) / src_path.with_suffix(".asmproc.d") + if not dep_file.is_file(): + return [] + + rule = dep_file.read_text().replace("\\\n", " ").split("\n")[0] + _, _, deps = rule.partition(":") + return deps.split() + + +def build_stuff(paths: Paths, linker_entries: List[LinkerEntry]): built_objects: Set[Path] = set() def build( @@ -73,6 +128,7 @@ def build( src_paths: List[Path], task: str, variables: Dict[str, str] = {}, + implicit: List[str] = [], implicit_outputs: List[str] = [], ): if not isinstance(object_paths, list): @@ -88,40 +144,48 @@ def build( rule=task, inputs=[str(s) for s in src_paths], variables=variables, + implicit=implicit, implicit_outputs=implicit_outputs, ) ninja = ninja_syntax.Writer(open(str(ROOT / "build.ninja"), "w"), width=9999) # Rules - cross = "mips-linux-gnu-" - - config = f"config/{VERSION}" - - ld_args = f"-EL -T {config}/undefined_syms.txt -T {config}/undefined_syms_auto.txt -T {config}/undefined_funcs_auto.txt -Map $mapfile -T $in -o $out" + ld_args = " ".join( + [ + "-EL", + f"-T {paths.config_dir}/undefined_syms.txt", + f"-T {paths.config_dir}/undefined_syms_auto.txt", + f"-T {paths.config_dir}/undefined_funcs_auto.txt", + "-T linker_script_extra.ld", + "-Map $mapfile", + "-T $in", + "-o $out", + ] + ) ninja.rule( "as", description="as $in", - command=f"cpp {COMMON_INCLUDES} $in -o - | {cross}as -no-pad-sections -EL -march=5900 -mabi=eabi -Iinclude -o $out", + command=f"cpp {COMMON_INCLUDES} $in -o - | {CROSS}as -no-pad-sections -EL -march=5900 -mabi=eabi -Iinclude -o $out", ) ninja.rule( "cc", description="cc $in", - command=f"{GAME_COMPILE_CMD} -o $out && {cross}strip $out -N dummy-symbol-name", + command=f"{GAME_COMPILE_CMD} -o $out && {CROSS}strip $out -N dummy-symbol-name", ) ninja.rule( "libcc", description="cc $in", - command=f"{LIB_COMPILE_CMD} $in -o $out && {cross}strip $out -N dummy-symbol-name", + command=f"{LIB_COMPILE_CMD} $in -o $out && {CROSS}strip $out -N dummy-symbol-name", ) ninja.rule( "ld", description="link $out", - command=f"{cross}ld {ld_args}", + command=f"{CROSS}ld {ld_args}", ) ninja.rule( @@ -131,9 +195,9 @@ def build( ) ninja.rule( - "elf", - description="elf $out", - command=f"{cross}objcopy $in $out -O binary", + "rom", + description="rom $out", + command=f"{CROSS}objcopy $in $out -O binary --gap-fill=0x00", ) for entry in linker_entries: @@ -150,16 +214,23 @@ def build( ): build(entry.object_path, entry.src_paths, "as") elif isinstance(seg, splat.segtypes.common.c.CommonSegC): + implicit = asm_dependencies(paths, entry.src_paths[0]) if any( str(src_path).startswith("src/lib/") for src_path in entry.src_paths ): - build(entry.object_path, entry.src_paths, "libcc") + build(entry.object_path, entry.src_paths, "libcc", implicit=implicit) else: if entry.src_paths[0].name in NO_G_FILES: g = "" else: g = "-g" - build(entry.object_path, entry.src_paths, "cc", variables={"g": g}) + build( + entry.object_path, + entry.src_paths, + "cc", + variables={"g": g}, + implicit=implicit, + ) elif isinstance(seg, splat.segtypes.common.databin.CommonSegDatabin): build(entry.object_path, entry.src_paths, "as") else: @@ -167,26 +238,28 @@ def build( sys.exit(1) ninja.build( - PRE_ELF_PATH, + paths.elf, "ld", - LD_PATH, + paths.ld_script, implicit=[str(obj) for obj in built_objects], - variables={"mapfile": MAP_PATH}, + variables={"mapfile": paths.map}, ) ninja.build( - ELF_PATH, - "elf", - PRE_ELF_PATH, + paths.rom, + "rom", + paths.elf, ) ninja.build( - ELF_PATH + ".ok", + paths.rom + ".ok", "sha1sum", - f"config/{VERSION}/checksum.sha1", - implicit=[ELF_PATH], + paths.checksum, + implicit=[paths.rom], ) + ninja.default(paths.rom + ".ok") + if __name__ == "__main__": parser = argparse.ArgumentParser(description="Configure the project") @@ -194,7 +267,8 @@ def build( "-v", "--version", help="Game version to configure for", - choices=["jp", "fm"], + choices=list(VERSIONS), + default="jp", ) parser.add_argument( "-c", @@ -204,39 +278,20 @@ def build( ) args = parser.parse_args() - if args.version: - VERSION = args.version - else: - VERSION = "jp" - - BASENAME = { - "jp": "SLPS_251.05", - "fm": "SLPS_251.98", - }[VERSION] - - LD_PATH = f"{BASENAME}.ld" - ELF_PATH = f"build/{VERSION}/{BASENAME}" - MAP_PATH = f"build/{VERSION}/{BASENAME}.map" - PRE_ELF_PATH = f"build/{VERSION}/{BASENAME}.elf" + paths = Paths(args.version) if args.clean: - clean() - - EXTENDEDNAME = { - "jp": "Original Japanese", - "fm": "Final Mix", - }[VERSION] + clean(paths) print( - f"Kingdom Hearts De:Compiled ~ Generating build configuration for {EXTENDEDNAME} edition ({BASENAME})" + f"Kingdom Hearts De:Compiled ~ Generating build configuration for " + f"{VERSIONS[args.version][1]} edition ({paths.basename})" ) - YAML_FILE = f"config/kh.{VERSION}.yaml" - - split.main([YAML_FILE], modes="all", verbose=False) + extract_rom(paths) - linker_entries = split.linker_writer.entries + split.main([Path(paths.yaml)], modes="all", verbose=False) - build_stuff(linker_entries) + build_stuff(paths, split.linker_writer.entries) write_permuter_settings() diff --git a/include/include_asm.h b/include/include_asm.h index 36a36d0..5409cb5 100644 --- a/include/include_asm.h +++ b/include/include_asm.h @@ -1,37 +1,43 @@ #ifndef INCLUDE_ASM_H #define INCLUDE_ASM_H -#if !defined(SPLAT) && !defined(M2CTX) && !defined(PERMUTER) +#if !defined(M2CTX) && !defined(PERMUTER) + #ifndef INCLUDE_ASM -#define INCLUDE_ASM(FOLDER, NAME) \ - __asm__( \ - ".section .text\n" \ - " .set noat\n" \ - " .set noreorder\n" \ - " .globl\t" #NAME ".NON_MATCHING\n" \ - " .ent\t" #NAME "\n" #NAME ".NON_MATCHING:\n" \ - " .include \"" FOLDER "/" #NAME ".s\"\n" \ - " .set reorder\n" \ - " .set at\n" \ - " .end\t" #NAME \ - ); +#define INCLUDE_ASM(FOLDER, NAME) \ + __asm__( \ + ".section .text\n" \ + " .set noat\n" \ + " .set noreorder\n" \ + " .include \"" FOLDER "/" #NAME ".s\"\n" \ + " .set reorder\n" \ + " .set at\n" \ + ) #endif #ifndef INCLUDE_RODATA -#define INCLUDE_RODATA(FOLDER, NAME) \ - __asm__( \ - ".section .rodata\n" \ - " .include \"" FOLDER "/" #NAME ".s\"\n" \ - ".section .text" \ +#define INCLUDE_RODATA(FOLDER, NAME) \ + __asm__( \ + ".section .rodata\n" \ + " .include \"" FOLDER "/" #NAME ".s\"\n" \ + ".section .text" \ ) #endif + +#if INCLUDE_ASM_USE_MACRO_INC __asm__(".include \"include/macro.inc\"\n"); #else +__asm__(".include \"include/labels.inc\"\n"); +#endif + +#else + #ifndef INCLUDE_ASM #define INCLUDE_ASM(FOLDER, NAME) #endif #ifndef INCLUDE_RODATA #define INCLUDE_RODATA(FOLDER, NAME) #endif -#endif + +#endif /* !defined(M2CTX) && !defined(PERMUTER) */ #endif /* INCLUDE_ASM_H */ diff --git a/include/labels.inc b/include/labels.inc new file mode 100644 index 0000000..e9c2bc2 --- /dev/null +++ b/include/labels.inc @@ -0,0 +1,58 @@ +# This file is used by the original compiler/assembler. +# Defines the expected assembly macros. + +# A function symbol. +.macro glabel label, visibility=global + .\visibility \label + .type \label, @function + \label: + .ent \label +.endm + +# The end of a function symbol. +.macro endlabel label + .size \label, . - \label + .end \label +.endm + +# An alternative entry to a function. +.macro alabel label, visibility=global + .\visibility \label + .type \label, @function + \label: +.endm + +# A label referenced by an error handler table. +.macro ehlabel label, visibility=global + .\visibility \label + \label: +.endm + + +# A label referenced by a jumptable. +.macro jlabel label, visibility=global + .\visibility \label + \label: +.endm + + +# A data symbol. +.macro dlabel label, visibility=global + .\visibility \label + .type \label, @object + \label: +.endm + +# End of a data symbol. +.macro enddlabel label + .size \label, . - \label +.endm + + +# Label to signal the symbol haven't been matched yet. +.macro nonmatching label, size=1 + .global \label\().NON_MATCHING + .type \label\().NON_MATCHING, @object + .size \label\().NON_MATCHING, \size + \label\().NON_MATCHING: +.endm diff --git a/include/macro.inc b/include/macro.inc index 1d894e2..47507cd 100644 --- a/include/macro.inc +++ b/include/macro.inc @@ -1,10 +1,66 @@ -.macro glabel label - .global \label - .type \label, @function - \label: +# This file is used by modern gas. +# Defines the expected assembly macros + +# Evaluate this file only once in case it's included more than once +.ifndef _MACRO_INC_GUARD +.internal _MACRO_INC_GUARD +.set _MACRO_INC_GUARD, 1 + +# A function symbol. +.macro glabel label, visibility=global + .\visibility "\label" + .type "\label", @function + "\label": + .ent "\label" +.endm + +# The end of a function symbol. +.macro endlabel label + .size "\label", . - "\label" + .end "\label" +.endm + +# An alternative entry to a function. +.macro alabel label, visibility=global + .\visibility "\label" + .type "\label", @function + "\label": + .aent "\label" +.endm + +# A label referenced by an error handler table. +.macro ehlabel label, visibility=global + .\visibility "\label" + "\label": +.endm + + +# A label referenced by a jumptable. +.macro jlabel label, visibility=global + .\visibility "\label" + "\label": +.endm + + +# A data symbol. +.macro dlabel label, visibility=global + .\visibility "\label" + .type "\label", @object + "\label": .endm -.macro dlabel label - .global \label - \label: +# End of a data symbol. +.macro enddlabel label + .size "\label", . - "\label" .endm + + +# Label to signal the symbol haven't been matched yet. +.macro nonmatching label, size=1 + .global "\label\().NON_MATCHING" + .type "\label\().NON_MATCHING", @object + .size "\label\().NON_MATCHING", \size + "\label\().NON_MATCHING": +.endm + +.endif diff --git a/linker_script_extra.ld b/linker_script_extra.ld new file mode 100644 index 0000000..dd854e7 --- /dev/null +++ b/linker_script_extra.ld @@ -0,0 +1,2 @@ +/* Pass this file to the linker with the `-T linker_script_extra.ld` flag */ +ENTRY(_start); diff --git a/requirements.txt b/requirements.txt index 1b86cab..62bf380 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ -spimdisasm>=1.28.1 -rabbitizer>=1.8.0 -splat64>=0.27.0 +spimdisasm>=1.42.3 +rabbitizer +splat64[mips]>=0.50.0 tqdm +ninja_syntax diff --git a/src/lib/crt0.s b/src/lib/crt0.s index 5779ba7..f7ef711 100644 --- a/src/lib/crt0.s +++ b/src/lib/crt0.s @@ -65,14 +65,14 @@ bssloop: j Exit daddu $a0, $v0, $zero nop -.size _start, . - _start +endlabel _start glabel _exit j Exit daddu $a0, $zero, $zero -.size _exit, . - _exit +endlabel _exit glabel _root addiu $v1, $zero, 35 syscall # ExitThread() -.size _root, . - _root +endlabel _root diff --git a/src/xrodent.c b/src/xrodent.c index 77f298c..c86ad99 100644 --- a/src/xrodent.c +++ b/src/xrodent.c @@ -1,5 +1,3 @@ #include "common.h" -INCLUDE_RODATA("asm/nonmatchings/xrodent", D_0048AA98); - INCLUDE_ASM("asm/nonmatchings/xrodent", func_002197E8); From b89e4f45759d99841fcd3b0d8ae387a945ca187c Mon Sep 17 00:00:00 2001 From: Yotona Date: Tue, 4 Aug 2026 17:26:17 -0600 Subject: [PATCH 2/7] remove unnecessary readme stuff --- README.md | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/README.md b/README.md index be0299c..5880ccb 100644 --- a/README.md +++ b/README.md @@ -9,15 +9,6 @@ A decompilation of the Playstation 2 releases of Kingdom Hearts. | Original Japanese | `SLPS_251.05` |`9dabbf867a7ec2a030df99ba1ed969f2deef0488`| | Final Mix (JP Exclusive) | `SLPS_251.98` |`e70bda789916142aafb53d85cef2e806b35ad8d8`| -splat is pointed at a flat image of the elf's code and data rather than at the -elf itself. `configure.py` extracts one with `objcopy`, and that image is what -the build is checksummed against: - -| Game Version | ROM | Sha1 | -|--------------------------|-------------------|------------------------------------------| -| Original Japanese | `SLPS_251.05.rom` |`cb85dbab6c05667ed11d94e94abfa079baaf12c2`| -| Final Mix (JP Exclusive) | `SLPS_251.98.rom` |`b62bf252fdaf0b1a726668e28c244e1d83bcb146`| - --- ### Dependencies @@ -36,7 +27,7 @@ A `mips-linux-gnu` binutils toolchain (`objcopy`, `as`, `ld`) and `ninja` are al - You can clear existing configurations with the `--clean`/`-c` flag - eg: `./configure.py -c -v fm` will clear the existing build configuration and generate a new one for the Final Mix version. -3. Run `ninja` to build the project. Final output will be stored by version in the `build` directory. A build that matches ends with `build//.rom: OK`. +3. Run `ninja` to build the project. Final output will be stored by version in the `build` directory. --- From 95f05e15fb7182e4e2a7c57d74d1ec577a3c3790 Mon Sep 17 00:00:00 2001 From: Yotona Date: Tue, 4 Aug 2026 18:13:29 -0600 Subject: [PATCH 3/7] do it do now --- configure.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/configure.py b/configure.py index d1be6ff..e592295 100755 --- a/configure.py +++ b/configure.py @@ -31,7 +31,10 @@ GAME_GCC_CMD = f"{GAME_CC_DIR}/bin/ee-gcc -c -B {GAME_CC_DIR}/bin/ee- {COMMON_INCLUDES} {COMMON_COMPILE_FLAGS} $in" -GAME_COMPILE_CMD = f"{GAME_GCC_CMD} -S -o - | {TOOLS_DIR}/masps2.py | {GAME_CC_DIR}/ee/bin/as {COMMON_COMPILE_FLAGS} -EL -mabi=eabi" +GAME_AS_CMD = f"{GAME_CC_DIR}/ee/bin/as {COMMON_COMPILE_FLAGS} -EL -mabi=eabi" +GAME_COMPILE_CMD = f"{GAME_GCC_CMD} -S -o - | {TOOLS_DIR}/masps2.py > $out.s && {GAME_AS_CMD} $out.s" + +PERMUTER_COMPILE_CMD = f"{GAME_GCC_CMD} -S -o - | {TOOLS_DIR}/masps2.py | {GAME_AS_CMD}" LIB_COMPILE_CMD = f"{LIB_CC_DIR}/ee-gcc -c -isystem include/gcc-991111 {COMMON_INCLUDES} {COMMON_COMPILE_FLAGS}" @@ -98,7 +101,7 @@ def extract_rom(paths: Paths): def write_permuter_settings(): with open("permuter_settings.toml", "w") as f: f.write( - f"""compiler_command = "{GAME_COMPILE_CMD} -D__GNUC__" + f"""compiler_command = "{PERMUTER_COMPILE_CMD} -D__GNUC__" assembler_command = "mips-linux-gnu-as -march=r5900 -mabi=eabi -Iinclude" compiler_type = "gcc" From 3cc6462bb5c9738d216d1d1838df1908c2dc0e22 Mon Sep 17 00:00:00 2001 From: Yotona Date: Tue, 4 Aug 2026 20:39:01 -0600 Subject: [PATCH 4/7] attempt diagnostic logging --- Jenkinsfile | 14 +++- tools/romdiff.py | 197 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 210 insertions(+), 1 deletion(-) create mode 100755 tools/romdiff.py diff --git a/Jenkinsfile b/Jenkinsfile index 6d6af06..99e6db8 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -9,6 +9,13 @@ pipeline { sh 'cp /usr/local/etc/roms/SLPS_251.98 .' sh 'cp /usr/local/etc/roms/SLPS_251.05 .' sh 'pip install -U -r requirements.txt --break-system-packages' + // The build is sensitive to these; log them so a mismatch that + // only reproduces here can be told apart from a local one. + sh ''' + mips-linux-gnu-as --version | head -1 + mips-linux-gnu-ld --version | head -1 + cpp --version | head -1 + ''' } } stage('Build JP') { @@ -35,7 +42,12 @@ pipeline { // } } post { - always { + failure { + sh './tools/romdiff.py' + } + // Runs after the other post conditions, so `failure` still has a + // workspace to inspect. + cleanup { cleanWs() } } diff --git a/tools/romdiff.py b/tools/romdiff.py new file mode 100755 index 0000000..2bacc2c --- /dev/null +++ b/tools/romdiff.py @@ -0,0 +1,197 @@ +#! /usr/bin/env python3 +"""Report where a built ROM differs from the target it should match. + +A failing `sha1sum -c` only says the build didn't match. This says which +objects it didn't match in, which is usually enough to name the culprit. +Intended for CI triage; never fails, so it can be dropped in a post block. +""" + +import argparse +import re +import sys +from pathlib import Path + +import yaml + +ROOT = Path(__file__).parent.parent.resolve() + +VERSIONS = { + "jp": "SLPS_251.05", + "fm": "SLPS_251.98", +} + +# Regions to print before giving up; a wholesale mismatch is not worth dumping. +MAX_REGIONS = 40 + +# Single-line map entry: " .text 0x00000000002304d8 0x2b9c build/jp/foo.o". +# Long section names wrap onto their own line, leaving the rest indented. +MAP_ENTRY_RE = re.compile(r"^\s+(\.\S+)\s+0x([0-9a-f]+)\s+0x([0-9a-f]+)\s+(\S+)$") +MAP_WRAP_RE = re.compile(r"^\s+(\.\S+)$") +MAP_WRAPPED_ENTRY_RE = re.compile(r"^\s+0x([0-9a-f]+)\s+0x([0-9a-f]+)\s+(\S+)$") + + +def load_vram_base(version: str): + """Return (rom_start, vram) of the first segment, to map offsets to vram.""" + yaml_path = ROOT / f"config/kh.{version}.yaml" + if not yaml_path.is_file(): + return None + + with open(yaml_path) as f: + config = yaml.load(f, Loader=yaml.SafeLoader) + + for segment in config.get("segments", []): + if isinstance(segment, dict) and "vram" in segment: + return segment.get("start", 0), segment["vram"] + return None + + +def load_map(map_path: Path): + """Return [(start_vram, end_vram, section, object)] sorted by address.""" + if not map_path.is_file(): + return [] + + entries = [] + pending_section = None + + for line in map_path.read_text(errors="replace").split("\n"): + match = MAP_ENTRY_RE.match(line) + if match: + pending_section = None + section, addr, size, obj = match.groups() + else: + match = MAP_WRAPPED_ENTRY_RE.match(line) + if match and pending_section: + section = pending_section + addr, size, obj = match.groups() + pending_section = None + else: + wrap = MAP_WRAP_RE.match(line) + pending_section = wrap.group(1) if wrap else None + continue + + if not obj.endswith(".o"): + continue + + start = int(addr, 16) + length = int(size, 16) + if length: + entries.append((start, start + length, section, obj)) + + entries.sort() + return entries + + +def owner(entries, vram): + for start, end, section, obj in entries: + if start <= vram < end: + return f"{obj} ({section}+{hex(vram - start)})" + return "unknown" + + +def regions(target: bytes, built: bytes): + """Group differing byte offsets into contiguous runs.""" + runs = [] + start = None + + for i in range(min(len(target), len(built))): + if target[i] != built[i]: + if start is None: + start = i + elif start is not None: + runs.append((start, i)) + start = None + + if start is not None: + runs.append((start, min(len(target), len(built)))) + + return runs + + +def report(version: str) -> bool: + """Print a diff report. Returns False if there was nothing to compare.""" + basename = VERSIONS[version] + target_path = ROOT / f"{basename}.rom" + built_path = ROOT / f"build/{version}/{basename}.rom" + + if not target_path.is_file() or not built_path.is_file(): + return False + + target = target_path.read_bytes() + built = built_path.read_bytes() + + print(f"=== {version}: {built_path.relative_to(ROOT)} vs {target_path.name} ===") + + if target == built: + print(" matches") + return True + + if len(target) != len(built): + print(f" size differs: target {len(target)}, built {len(built)}") + + runs = regions(target, built) + total = sum(end - start for start, end in runs) + print(f" {total} bytes differ in {len(runs)} region(s)") + + base = load_vram_base(version) + entries = load_map(ROOT / f"build/{version}/{basename}.map") + if not entries: + print(" (no linker map; cannot attribute to objects)") + + objects = set() + for i, (start, end) in enumerate(runs): + vram = None + if base is not None: + rom_start, vram_base = base + vram = start - rom_start + vram_base + + who = owner(entries, vram) if entries and vram is not None else "unknown" + objects.add(who.split(" ")[0]) + + if i >= MAX_REGIONS: + continue + + where = f" {hex(start)}" + if vram is not None: + where += f" vram {hex(vram)}" + print(f"{where} {end - start} bytes {who}") + + # Print the containing words, which is usually where the story is. + word = start & ~3 + while word < end: + chunk = slice(word, word + 4) + print( + f" {hex(word)} target {target[chunk].hex()}" + f" built {built[chunk].hex()}" + ) + word += 4 + + if len(runs) > MAX_REGIONS: + print(f" ... {len(runs) - MAX_REGIONS} more region(s) not shown") + + print(" affected objects:") + for obj in sorted(objects): + print(f" {obj}") + + return True + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "-v", + "--version", + help="Game version to check (default: every version that was built)", + choices=list(VERSIONS), + action="append", + ) + args = parser.parse_args() + + compared = False + for version in args.version or list(VERSIONS): + compared |= report(version) + + if not compared: + print("romdiff: nothing built to compare", file=sys.stderr) + + # Purely diagnostic; the build already reported its own verdict. + sys.exit(0) From 7af5ca4d9d1c786d824c3d6d4e9da785ae4d564b Mon Sep 17 00:00:00 2001 From: Ethan Date: Sun, 9 Aug 2026 03:31:16 +0900 Subject: [PATCH 5/7] changez --- config/kh.fm.yaml | 1 + config/kh.jp.yaml | 1 + configure.py | 24 ++++++++++++++++++++++-- include/cross-as/macro.inc | 11 +++++++++++ include/ee-as/macro.inc | 3 +++ 5 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 include/cross-as/macro.inc create mode 100644 include/ee-as/macro.inc diff --git a/config/kh.fm.yaml b/config/kh.fm.yaml index 824e184..75f8469 100644 --- a/config/kh.fm.yaml +++ b/config/kh.fm.yaml @@ -23,6 +23,7 @@ options: find_file_boundaries: False disasm_unknown: True named_regs_for_c_funcs: False + mips_abi_gpr: numeric hasm_in_src_path: True subalign: 8 gp_value: 0x494050 diff --git a/config/kh.jp.yaml b/config/kh.jp.yaml index e3f3cce..00472bd 100644 --- a/config/kh.jp.yaml +++ b/config/kh.jp.yaml @@ -23,6 +23,7 @@ options: find_file_boundaries: False disasm_unknown: True named_regs_for_c_funcs: False + mips_abi_gpr: numeric hasm_in_src_path: True subalign: 8 gp_value: 0x48db00 diff --git a/configure.py b/configure.py index e592295..362f1aa 100755 --- a/configure.py +++ b/configure.py @@ -170,7 +170,21 @@ def build( ninja.rule( "as", description="as $in", - command=f"cpp {COMMON_INCLUDES} $in -o - | {CROSS}as -no-pad-sections -EL -march=5900 -mabi=eabi -Iinclude -o $out", + command=( + "sed -e 's/\\x24ACC/ACC/g' -e 's/\\x24Q/Q/g' -e 's/\\x24R/R/g' " + "-e 's/^jlabel func_/glabel func_/' $in | " + f"{GAME_AS_CMD} -Iinclude/ee-as -Iinclude -o $out && " + f"{CROSS}strip $out -N dummy-symbol-name" + ), + ) + + ninja.rule( + "hasm", + description="as $in", + command=( + f"{CROSS}as -no-pad-sections -EL -march=5900 -mabi=eabi " + f"-Iinclude/cross-as -Iinclude -o $out $in" + ), ) ninja.rule( @@ -215,7 +229,13 @@ def build( if isinstance(seg, splat.segtypes.common.asm.CommonSegAsm) or isinstance( seg, splat.segtypes.common.data.CommonSegData ): - build(entry.object_path, entry.src_paths, "as") + if str(entry.src_paths[0]).startswith("src/"): + rule = "hasm" + implicit = ["include/cross-as/macro.inc", "include/macro.inc"] + else: + rule = "as" + implicit = ["include/ee-as/macro.inc", "include/labels.inc"] + build(entry.object_path, entry.src_paths, rule, implicit=implicit) elif isinstance(seg, splat.segtypes.common.c.CommonSegC): implicit = asm_dependencies(paths, entry.src_paths[0]) if any( diff --git a/include/cross-as/macro.inc b/include/cross-as/macro.inc new file mode 100644 index 0000000..024ab19 --- /dev/null +++ b/include/cross-as/macro.inc @@ -0,0 +1,11 @@ +# Keep source assembly in its original O32-style spelling while emitting EABI. +.set $t0, $8 +.set $t1, $9 +.set $t2, $10 +.set $t3, $11 +.set $t4, $12 +.set $t5, $13 +.set $t6, $14 +.set $t7, $15 + +.include "../macro.inc" diff --git a/include/ee-as/macro.inc b/include/ee-as/macro.inc new file mode 100644 index 0000000..67df6a7 --- /dev/null +++ b/include/ee-as/macro.inc @@ -0,0 +1,3 @@ +# Splat-generated assembly includes macro.inc. The bundled EE assembler needs +# the unquoted macro parameters emitted in labels.inc. +.include "labels.inc" From 789830a731a293739ca911b8ece90a8147d85bc7 Mon Sep 17 00:00:00 2001 From: Ethan Date: Fri, 14 Aug 2026 00:36:09 +0900 Subject: [PATCH 6/7] Attempt to fix --- diff.py | 1410 +++++++++++++++++++++++++++++++++++++--------- diff_settings.py | 6 +- src/memcard.c | 179 +++--- 3 files changed, 1244 insertions(+), 351 deletions(-) diff --git a/diff.py b/diff.py index cf89791..b54ff9b 100755 --- a/diff.py +++ b/diff.py @@ -9,6 +9,8 @@ Dict, Iterator, List, + Deque, + Sequence, Match, NoReturn, Optional, @@ -29,6 +31,16 @@ def static_assert_unreachable(x: NoReturn) -> NoReturn: raise Exception("Unreachable! " + repr(x)) +# The encoding to use for reading the map file to text. +# It is expected the map file will be ASCII-only or mostly, +# which UTF-8 is compatible with. +MAPFILE_ENCODING = "UTF-8" +# In case the map file isn't UTF-8 and some bytes can't be decoded as UTF-8, +# don't error and subtitute with U+FFFD. +# (cf the Python documentation on `codecs.replace_errors`) +MAPFILE_ENCODING_ERROR_HANDLER = "replace" + + class DiffMode(enum.Enum): SINGLE = "single" SINGLE_BASE = "single_base" @@ -39,7 +51,12 @@ class DiffMode(enum.Enum): # ==== COMMAND-LINE ==== -if __name__ == "__main__": +parser: Optional[argparse.ArgumentParser] = None + + +def main_early() -> None: + global parser + # Prefer to use diff_settings.py from the current working directory sys.path.insert(0, ".") try: @@ -51,7 +68,7 @@ class DiffMode(enum.Enum): try: import argcomplete except ModuleNotFoundError: - argcomplete = None + argcomplete = None # type: ignore parser = argparse.ArgumentParser( description="Diff MIPS, PPC, AArch64, ARM32, SH2, SH4, or m68k assembly." @@ -77,18 +94,29 @@ def complete_symbol( if not mapfile: return [] completes = [] - with open(mapfile) as f: - data = f.read() + encoding = MAPFILE_ENCODING + # We assume the encoding is self-synchronizing, + # meaning that for example finding bytes corresponding to the space + # character, is equivalent to finding a space character. + # This is true for ASCII and UTF-8 data, for example. + # This allows processing the map file as bytes instead of entirely + # processing it as decoded text, which is slow. + space = " ".encode(encoding) + line_return = "\n".encode(encoding) + with open(mapfile, "rb") as f: + import mmap + + data = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) # assume symbols are prefixed by a space character - search = f" {prefix}" + search = f" {prefix}".encode(encoding) pos = data.find(search) while pos != -1: # skip the space character in the search string - pos += 1 + pos += len(space) # assume symbols are suffixed by either a space # character or a (unix-style) line return - spacePos = data.find(" ", pos) - lineReturnPos = data.find("\n", pos) + spacePos = data.find(space, pos) + lineReturnPos = data.find(line_return, pos) if lineReturnPos == -1: endPos = spacePos elif spacePos == -1: @@ -101,7 +129,7 @@ def complete_symbol( else: match = data[pos:endPos] pos = data.find(search, endPos) - completes.append(match) + completes.append(match.decode(encoding)) return completes setattr(start_argument, "completer", complete_symbol) @@ -123,10 +151,18 @@ def complete_symbol( "--file", dest="file", type=str, - help="""File path for a file being diffed. When used the map + help="""File path for the file being diffed. When used the map file isn't searched for the function given. Useful for dynamically linked libraries.""", ) + parser.add_argument( + "-F", + "--ref-file", + dest="ref_file", + type=str, + help="""File path for the file being diffed against. Defaults to + expected/; normally you should never need to override this.""", + ) parser.add_argument( "-e", "--elf", @@ -270,7 +306,7 @@ def complete_symbol( dest="agree", action="store_true", help="""Automatically agree to any yes/no questions asked. - Useful if you really want to use the -w option without -m.""" + Useful if you really want to use the -w option without -m.""", ) parser.add_argument( "-0", @@ -362,6 +398,13 @@ def complete_symbol( help="""Compress streaks of lines with same instructions (but possibly different regalloc), leaving N lines of context around other parts.""", ) + parser.add_argument( + "-d", + "--diff-function-symbols", + dest="diff_function_symbols", + action="store_true", + help="Include and diff function symbols.", + ) # Project-specific flags, e.g. different versions/make arguments. add_custom_arguments_fn = getattr(diff_settings, "add_custom_arguments", None) @@ -371,12 +414,16 @@ def complete_symbol( if argcomplete: argcomplete.autocomplete(parser) + +if __name__ == "__main__": + main_early() + # ==== IMPORTS ==== # (We do imports late to optimize auto-complete performance.) import abc -from collections import Counter, defaultdict +from collections import Counter, defaultdict, deque from dataclasses import asdict, dataclass, field, replace import difflib import html @@ -392,7 +439,6 @@ def complete_symbol( import time import traceback - MISSING_PREREQUISITES = ( "Missing prerequisite python module {}. " "Run `python3 -m pip install --user colorama watchdog levenshtein cxxfilt` to install prerequisites (cxxfilt only needed with --source)." @@ -440,6 +486,7 @@ class Config: # Build/objdump options diff_obj: bool file: Optional[str] + ref_file: Optional[str] make: bool source_old_binutils: bool diff_section: str @@ -462,6 +509,7 @@ class Config: ignore_addr_diffs: bool algorithm: str reg_categories: Dict[str, int] + diff_function_symbols: bool # Score options score_stack_differences = True @@ -533,8 +581,10 @@ def create_config(args: argparse.Namespace, project: ProjectSettings) -> Config: # Build/objdump options diff_obj=args.diff_obj, file=args.file, + ref_file=args.ref_file, make=args.make, - source_old_binutils=args.source_old_binutils, + source_old_binutils=args.source_old_binutils + or "llvm-" in project.objdump_executable, diff_section=args.diff_section, inlines=args.inlines, max_function_size_lines=args.max_lines, @@ -556,6 +606,7 @@ def create_config(args: argparse.Namespace, project: ProjectSettings) -> Config: ignore_addr_diffs=args.ignore_addr_diffs, algorithm=args.algorithm, reg_categories=project.reg_categories, + diff_function_symbols=args.diff_function_symbols, ) @@ -657,8 +708,7 @@ def __bool__(self) -> bool: return any(s for s, f in self.segments) def __str__(self) -> str: - # Use Formatter.apply(...) instead - return NotImplemented + raise NotImplementedError("Use Formatter.apply(...) instead") def __eq__(self, other: object) -> bool: return NotImplemented @@ -887,14 +937,16 @@ def table_row(line: Tuple[Text, ...], is_data_ref: bool, cell_el: str) -> str: @dataclass -class JsonFormatter(Formatter): +class PythonFormatter(Formatter): arch_str: str def apply_format(self, chunk: str, f: Format) -> str: - # This method is unused by this formatter - return NotImplemented + raise NotImplementedError("apply_format does not apply to PythonFormatter") def table(self, data: TableData) -> str: + raise NotImplementedError("table does not apply to PythonFormatter") + + def raw(self, data: TableData) -> Dict[str, Any]: def serialize_format(s: str, f: Format) -> Dict[str, Any]: if f == BasicFormat.NONE: return {"text": s} @@ -938,6 +990,10 @@ def serialize(text: Optional[Text]) -> List[Dict[str, Any]]: column: Dict[str, Any] = {} column["text"] = serialize(text) if line: + if line.mnemonic is not None: + column["mnemonic"] = line.mnemonic + if line.symbol is not None: + column["symbol"] = line.symbol if line.line_num is not None: column["line"] = line.line_num if line.branch_target is not None: @@ -952,6 +1008,13 @@ def serialize(text: Optional[Text]) -> List[Dict[str, Any]]: output_row[column_name] = column output_rows.append(output_row) output["rows"] = output_rows + return output + + +@dataclass +class JsonFormatter(PythonFormatter): + def table(self, data: TableData) -> str: + output = super().raw(data) return json.dumps(output) @@ -1004,15 +1067,17 @@ def symbol_format(s: str) -> Format: import ast import operator as op -# supported operators operators: Dict[Type[Union[ast.operator, ast.unaryop]], Any] = { ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul, - ast.Div: op.truediv, + ast.Div: op.floordiv, + ast.USub: op.neg, ast.Pow: op.pow, ast.BitXor: op.xor, - ast.USub: op.neg, + ast.BitOr: op.or_, + ast.BitAnd: op.and_, + ast.Invert: op.inv, } @@ -1021,12 +1086,18 @@ def eval_expr(expr: str) -> Any: def eval_(node: ast.AST) -> Any: - if isinstance(node, ast.Num): # - return node.n - elif isinstance(node, ast.BinOp): # + if ( + hasattr(ast, "Constant") + and isinstance(node, ast.Constant) + and isinstance(node.value, int) + ): # Python 3.8+ + return node.value + elif isinstance(node, ast.BinOp): return operators[type(node.op)](eval_(node.left), eval_(node.right)) - elif isinstance(node, ast.UnaryOp): # e.g., -1 + elif isinstance(node, ast.UnaryOp): return operators[type(node.op)](eval_(node.operand)) + elif sys.version_info < (3, 8) and isinstance(node, ast.Num): + return node.n else: raise TypeError(node) @@ -1048,13 +1119,6 @@ def eval_int(expr: str, emsg: str) -> int: return ret -def eval_line_num(expr: str) -> Optional[int]: - expr = expr.strip().replace(":", "") - if expr == "": - return None - return int(expr, 16) - - def run_make(target: str, project: ProjectSettings) -> None: subprocess.check_call(project.build_command + [target]) @@ -1071,8 +1135,9 @@ def run_make_capture_output( def restrict_to_function(dump: str, fn_name: str) -> str: try: - ind = dump.index("\n", dump.index(f"<{fn_name}>:")) - return dump[ind + 1 :] + # Find the start of the line that contains ":" + ind = dump.rfind("\n", 0, dump.index(f"<{fn_name}>:")) + 1 + return dump[ind:] except ValueError: return "" @@ -1139,7 +1204,7 @@ def preprocess_objdump_out( This format is suitable for saving to disk with `--write-asm`. - Optionally filter the output to a single function (`restrict`) - - Otherwise, strip objdump header (7 lines) + - Otherwise, strip objdump header (6 lines) - Prepend .data references ("DATAREF" lines) when working with object files """ out = objdump_out @@ -1147,7 +1212,7 @@ def preprocess_objdump_out( if restrict is not None: out = restrict_to_function(out, restrict) else: - for i in range(7): + for i in range(6): out = out[out.find("\n") + 1 :] out = out.rstrip("\n") @@ -1157,7 +1222,8 @@ def preprocess_objdump_out( + out ) - return out + processor = config.arch.proc(config) + return processor.preprocess_objdump(out) def search_build_objects(objname: str, project: ProjectSettings) -> Optional[str]: @@ -1186,7 +1252,11 @@ def search_map_file( fail(f"No map file configured; cannot find function {fn_name}.") try: - with open(project.mapfile) as f: + with open( + project.mapfile, + encoding=MAPFILE_ENCODING, + errors=MAPFILE_ENCODING_ERROR_HANDLER, + ) as f: contents = f.read() except Exception: fail(f"Failed to open map file {project.mapfile} for reading.") @@ -1230,20 +1300,23 @@ def search_map_file( return cands[0] elif project.map_format == "mw": find = re.findall( - # ram elf rom alignment - r" \S+ \S+ (\S+) (\S+) +\S+ " + # start address, size, virtual address, file offset, alignment + r" [0-9a-f]{8} [0-9a-f]{6} ([0-9a-f]{8})(?: ([0-9a-f]{8}))?(?: +\S{1,2})? +" + re.escape(fn_name) + r"(?: \(entry of " + re.escape(config.diff_section) + r"\))? \t" # object name - + "(\S+)", + + r"(\S+)", contents, ) if len(find) > 1: fail(f"Found multiple occurrences of function {fn_name} in map file.") if len(find) == 1: - rom = int(find[0][1], 16) + if find[0][1]: + rom = int(find[0][1], 16) + else: + rom = None objname = find[0][2] objfile = search_build_objects(objname, project) @@ -1300,7 +1373,7 @@ def parse_elf_rodata_references( data: bytes, config: Config ) -> List[Tuple[int, int, str]]: e_ident = data[:16] - if e_ident[:4] != b"\x7FELF": + if e_ident[:4] != b"\x7fELF": return [] SHT_SYMTAB = 2 @@ -1444,9 +1517,12 @@ def dump_elf( else: disassemble_flag = "-d" - flags2 = [ - f"--disassemble={diff_elf_symbol}", - ] + if "llvm-" in project.objdump_executable: + flags2 = ["--disassemble", f"--disassemble-symbols={diff_elf_symbol}"] + else: + flags2 = [ + f"--disassemble={diff_elf_symbol}", + ] objdump_flags = [disassemble_flag, "-rz", "-j", config.diff_section] return ( @@ -1483,7 +1559,7 @@ def dump_objfile( if not os.path.isfile(objfile): fail(f"Not able to find .o file for function: {objfile} is not a file.") - refobjfile = os.path.join(project.expected_dir, objfile) + refobjfile = config.ref_file or os.path.join(project.expected_dir, objfile) if config.diff_mode != DiffMode.SINGLE and not os.path.isfile(refobjfile): fail(f'Please ensure an OK .o file exists at "{refobjfile}".') @@ -1517,7 +1593,7 @@ def dump_binary( fail("Not able to find function in map file.") start_addr += project.map_address_offset elif start_addr is None: - fail("Start address must be an integer expression when using binary -f") + fail("Start address must be an integer expression when using binary -f") if end is not None: end_addr = eval_int(end, "End address must be an integer expression.") else: @@ -1535,17 +1611,18 @@ def dump_binary( ) -# Example: "ldr r4, [pc, #56] ; (4c )" -ARM32_LOAD_POOL_PATTERN = r"(ldr\s+r([0-9]|1[0-3]),\s+\[pc,.*;\s*)(\([a-fA-F0-9]+.*\))" - - # The base class is a no-op. class AsmProcessor: def __init__(self, config: Config) -> None: self.config = config + # Called during run_objdump() for arch-specific normalization. Runs before + # diff-processing, i.e. process(). + def preprocess_objdump(self, objdump: str) -> str: + return objdump + def pre_process( - self, mnemonic: str, args: str, next_row: Optional[str] + self, mnemonic: str, args: str, next_row: Optional[str], comment: Optional[str] ) -> Tuple[str, str]: return mnemonic, args @@ -1606,13 +1683,19 @@ def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: elif "R_MIPS_CALL16" in row: repl = f"%call16({repl})" elif "R_MIPS_LITERAL" in row: - repl = repl[:-len(addend)] + # MWCC emits R_MIPS_LITERAL for float literals which don't have the same structure as the + # relocations emitted by GCC + # Only remove the addend if it is found in the relocation + if addend != "": + # .lit4+0x4000-0x4000 -> .lit4+0x4000 + repl = repl[: -len(addend)] else: assert False, f"unknown relocation type '{row}' for line '{prev}'" return before + repl + after, repl def is_end_of_function(self, mnemonic: str, args: str) -> bool: if self.seen_jr_ra: + self.seen_jr_ra = False return True if mnemonic == "jr" and args == "ra": self.seen_jr_ra = True @@ -1621,9 +1704,8 @@ def is_end_of_function(self, mnemonic: str, args: str) -> bool: class AsmProcessorPPC(AsmProcessor): def pre_process( - self, mnemonic: str, args: str, next_row: Optional[str] + self, mnemonic: str, args: str, next_row: Optional[str], comment: Optional[str] ) -> Tuple[str, str]: - if next_row and "R_PPC_EMB_SDA21" in next_row: # With sda21 relocs, the linker transforms `r0` into `r2`/`r13`, and # we may encounter this in either pre-transformed or post-transformed @@ -1644,10 +1726,40 @@ def pre_process( mnemonic = mnemonic.replace("li", "addi") args_parts = args.split(",") args = args_parts[0] + ",0," + args_parts[1] + if ( + next_row + and ("R_PPC_REL24" in next_row or "R_PPC_REL14" in next_row) + and ".text+0x" in next_row + and mnemonic in PPC_BRANCH_INSTRUCTIONS + ): + # GCC emits a relocation of "R_PPC_REL14" or "R_PPC_REL24" with a .text offset + # fixup the args to use the offset from the relocation + + # Split args by ',' which will result in either [cr, offset] or [offset] + # Replace the current offset with the next line's ".text+0x" offset + splitArgs = args.split(",") + splitArgs[-1] = next_row.split(".text+0x")[-1] + args = ",".join(splitArgs) + + if ( + comment is not None + and ( + next_row is None + or re.search(self.config.arch.re_reloc, next_row) is None + ) + and mnemonic == "bl" + ): + # if the mnemonic is bl and the comment doesn't match + # <.text+0x...> replace the args with the contents of the comment + if re.search(r"<.+\+0x[0-9a-fA-F]+>", comment) is None: + args = comment[1:-1] return mnemonic, args def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: + # row is the line with the relocations + # prev is the line to apply relocations to + arch = self.config.arch assert any( r in row @@ -1655,11 +1767,18 @@ def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: ), f"unknown relocation type '{row}' for line '{prev}'" before, imm, after = parse_relocated_line(prev) repl = row.split()[-1] + mnemonic, args = prev.split(maxsplit=1) + if "R_PPC_REL24" in row: # function calls - pass - if "R_PPC_REL14" in row: - pass + # or unconditional branches generated by GCC "b offset" + if mnemonic in PPC_BRANCH_INSTRUCTIONS and ".text+0x" in row: + # this has been handled in pre_process + return prev, None + elif "R_PPC_REL14" in row: + if mnemonic in PPC_BRANCH_INSTRUCTIONS and ".text+0x" in row: + # this has been handled in pre_process + return prev, None elif "R_PPC_ADDR16_HI" in row: # absolute hi of addr repl = f"{repl}@h" @@ -1686,7 +1805,128 @@ def is_end_of_function(self, mnemonic: str, args: str) -> bool: return mnemonic == "blr" +# Example: "cmp r0, #0x10" +ARM32_COMPARE_IMM_PATTERN = r"cmp\s+(r[0-9]|1[0-3]),\s+#(\w+)" + +# Example: "add pc, r1" +ARM32_JUMP_TABLE_START = r"add\s+pc,\s*r" + +# Examples: +# - "44: 00060032 .word 0x00060032" +# - "48: 0032 .short 0x0032" +# - "4a: 0032 movs r2, r6" +# - "9e: 00be lsls r6, r7, #2" +# - ".short 0x0032 ; 0x64" +ARM32_JUMP_TABLE_ENTRY_PATTERN = r"(?:(\w+):\s+([0-9a-f]+)\s+)?([\w\.]+)\s+([\w,\ ]+)" + +# Example: "ldr r4, [pc, #56] ; (4c )" +ARM32_LOAD_POOL_PATTERN = ( + r"(ldr\s+r([0-9]|1[0-3]),\s+\[pc,.*[;@]\s*)(\([a-fA-F0-9]+.*\))" +) + + class AsmProcessorARM32(AsmProcessor): + @dataclass + class JumpTableEntry: + cur_addr: int + table_start_addr: int + value: int + is_word: bool + + def preprocess_objdump(self, objdump: str) -> str: + def short_table_entry( + cur_addr: int, jump_table_start_addr: int, value: int + ) -> str: + branch_target = jump_table_start_addr + value + 4 + return f" {cur_addr:x}: {value:04x} .short 0x{value:04x} ; 0x{branch_target:x}" + + new_lines = [] + lines = objdump.splitlines() + for i, jump_table_entry in self._lines_iterator(lines): + if jump_table_entry is None: + new_lines.append(lines[i]) + continue + + entry = jump_table_entry + if entry.is_word: + # Split into two ".short" entries. + hi, lo = entry.value >> 16, entry.value & 0xFFFF + new_lines.append( + short_table_entry(entry.cur_addr, entry.table_start_addr, lo) + ) + new_lines.append( + short_table_entry(entry.cur_addr + 2, entry.table_start_addr, hi) + ) + else: + new_lines.append( + short_table_entry( + entry.cur_addr, entry.table_start_addr, entry.value + ) + ) + return "\n".join(new_lines) + + # An iterator for each line of assembly, returning the line index and optional + # metadata if the line is a jump table entry. + def _lines_iterator( + self, lines: List[str] + ) -> Iterator[Tuple[int, Optional[JumpTableEntry]]]: + jump_table_entries = 0 + table_start_addr = 0 + for i, line in enumerate(lines): + addr_match = re.match(r"^\s*([0-9a-f]+):", line) + addr = int(addr_match.group(1), 16) if addr_match else -1 + entry_match = re.search(ARM32_JUMP_TABLE_ENTRY_PATTERN, line) + if jump_table_entries > 0 and entry_match: + try: + # Try parsing argument to .short/.word + value = int(entry_match.group(4), 16) + except ValueError: + # No luck; maybe it got disassembled to an instruction, + # from which we need to read the instruction bytes instead. + try: + value = int(entry_match.group(2) or "", 16) + except ValueError: + # Something went wrong; avoid crashing. This has been + # seen to happen in practice when we misparsed the asm + # when searching for a cmp and ended up with the wrong + # number of entries, after which we ran into a line with + # a relocation rather than instruction bytes. + jump_table_entries = 0 + break + + table_entry = self.JumpTableEntry( + cur_addr=addr, + table_start_addr=table_start_addr, + value=value, + is_word=entry_match.group(3) == ".word", + ) + jump_table_entries -= 2 if table_entry.is_word else 1 + + yield i, table_entry + continue + + # Check for jump tables. + if re.search(ARM32_JUMP_TABLE_START, line): + jump_table_entries = self._jump_table_entries_count(lines, i) + table_start_addr = addr + yield i, None + + # Returns the number of entries in the jump table starting at `line_no`, or + # 0 if it's not a jump table. + def _jump_table_entries_count(self, raw_lines: List[str], line_no: int) -> int: + # The number of entries should be in the most recent `cmp` before the + # jump table. + for i in reversed(range(line_no)): + cmp_match = re.search(ARM32_COMPARE_IMM_PATTERN, raw_lines[i]) + if cmp_match: + imm_match = re.match(r"#?(0x)?([0-9a-f]+)", cmp_match.group(2)) + assert imm_match + base = 16 if imm_match.group(1) else 10 + value = int(imm_match.group(2), base) + if value > 0: + return value + 1 + return 0 + def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: arch = self.config.arch if "R_ARM_V4BX" in row: @@ -1697,6 +1937,14 @@ def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: # Don't crash on R_ARM_ABS32 relocations incorrectly applied to code. # (We may want to do something more fancy here that actually shows the # related symbol, but this serves as a stop-gap.) + if not prev.strip(): + # More recent objdump doesn't seem to be emitting .word? Or maybe + # I'm just looking at ELFs without proper STT_OBJECT markers. + # In any case, this case seems safe enough to handle. The ELF + # I was looking at also uses RELA relocations, so we don't even + # need to parse the underlying bytes from the previous row. + sym = row.split()[-1] + return ".word " + sym, sym return prev, None before, imm, after = parse_relocated_line(prev) repl = row.split()[-1] + reloc_addend_from_imm(imm, before, self.config.arch) @@ -1719,20 +1967,44 @@ def _normalize_data_pool(self, row: str) -> str: pool_match = re.search(ARM32_LOAD_POOL_PATTERN, row) return pool_match.group(1) if pool_match else row - def post_process(self, lines: List["Line"]) -> None: + def _post_process_jump_tables(self, lines: List["Line"]) -> None: + raw_lines = [ + ( + f"{line.line_num:x}: {line.original}" + if line.line_num is not None + else line.original + ) + for line in lines + ] + for i, jump_table_entry in self._lines_iterator(raw_lines): + if jump_table_entry is None: + continue + + entry = jump_table_entry + lines[i].branch_target = entry.table_start_addr + entry.value + 4 + + def _post_process_data_pools(self, lines: List["Line"]) -> None: lines_by_line_number = {} for line in lines: - lines_by_line_number[line.line_num] = line + if line.line_num is not None: + lines_by_line_number[line.line_num] = line for line in lines: if line.data_pool_addr is None: continue # Add data symbol and its address to the line. - line_original = lines_by_line_number[line.data_pool_addr].original - value = line_original.split()[1] + value = "?" + if line.data_pool_addr in lines_by_line_number: + data_parts = lines_by_line_number[line.data_pool_addr].original.split() + if len(data_parts) > 1: + value = data_parts[1] addr = "{:x}".format(line.data_pool_addr) line.original = line.normalized_original + f"={value} ({addr})" + def post_process(self, lines: List["Line"]) -> None: + self._post_process_jump_tables(lines) + self._post_process_data_pools(lines) + class AsmProcessorAArch64(AsmProcessor): def __init__(self, config: Config) -> None: @@ -1784,14 +2056,111 @@ def _normalize_adrp_differences(self, mnemonic: str, row: str) -> str: return row -class AsmProcessorI686(AsmProcessor): +class AsmProcessorX86(AsmProcessor): + def pre_process( + self, mnemonic: str, args: str, next_row: Optional[str], comment: Optional[str] + ) -> Tuple[str, str]: + if ( + comment is not None + and ( + next_row is None + or re.search(self.config.arch.re_reloc, next_row) is None + ) + and mnemonic == "call" + ): + # if the mnemonic is call and the comment doesn't match + # <.text+0x...> replace the args with the contents of the comment + if re.search(r"<.+\+0x[0-9a-fA-F]+>", comment) is None: + args = comment[1:-1] + + return mnemonic, args + def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: + # ignore WRTSEG + FP 16-bit fixup + ignore = [ + "WRTSEG", + "FIWRQQ", + "FIDRQQ", + "FIERQQ", + "FICRQQ", + "FISRQQ", + "FIARQQ", + "FIFRQQ", + "FIGRQQ", + "FJCRQQ", + "FJSRQQ", + "FJARQQ", + "FJFRQQ", + "FJGRQQ", + ] + + if any(x in row for x in ignore): + return prev, None + repl = row.split()[-1] mnemonic, args = prev.split(maxsplit=1) + offset = False + addr_imm = None + + # Calls + + # Example lcall $0x0, $0x00 + if "lcall" in mnemonic: + addr_imm = re.search(r".*", args) + + # Example call a2f + # Example call *0 + # Example jmp 64 + elif mnemonic in X86_BRANCH_INSTRUCTIONS or "call" in mnemonic: + addr_imm = re.search(r"(^|(?<=\*)|(?<=\*\%cs\:))[0-9a-f]+(?!x)", args) + + # Direct use of reloc + # Match 0x0 part to replace + + # Example %edi,0 + # Example movb $0x0,0x0 + if not addr_imm: + addr_imm = re.search(r"\b(?:0x)?(? Tuple[str, Optional[str]]: pass elif "R_386_PC8" in row: pass + elif "dir32" in row: + if "+" in repl: + repl = repl.split("+")[0] + elif "DISP32" in row: + pass + elif "OFF16" in row: + pass + elif "OFF32" in row: + pass + elif "OFFPC16" in row: + if "+" in repl: + repl = repl.split("+")[0] + elif "OFFPC32" in row: + if "+" in repl: + repl = repl.split("+")[0] elif "R_386_GOT32" in row: repl = f"%got({repl})" elif "R_386_PLT32" in row: @@ -1820,29 +2204,431 @@ def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: repl = f"%got({repl})" elif "R_386_32PLT" in row: repl = f"%plt({repl})" + elif "FAR16" in row: + if "+" in repl: + repl = repl.split("+")[0] + elif "SEG" in row: + pass else: assert False, f"unknown relocation type '{row}' for line '{prev}'" - return f"{mnemonic}\t{args[:start]+repl+args[end:]}", repl + if offset: + of = addr_imm.group() + if of[0] == "$": + of = of[1:] + if of[0] == "-": + repl = f"{repl}{of}" + else: + repl = f"{repl}+{of}" + + return f"{mnemonic}\t{args[:start] + repl + args[end:]}", repl def is_end_of_function(self, mnemonic: str, args: str) -> bool: return mnemonic == "ret" +# pc-relative mov instructions, with or without the