diff --git a/Makefile b/Makefile index bef588d..00b8a80 100644 --- a/Makefile +++ b/Makefile @@ -106,11 +106,11 @@ build: ## Build project @$(MAKE) .build-only; status=$$?; [ $$status -eq 0 ] || { $(MAKE) .check-files-on-error; }; exit $$status extract-data: ## Extract variables from .data in config directory - @python3 tools/python/parse_data.py + @python3 tools/python/parse_data.py make-asm: ## Create expected asm folder in config directory @python3 configure.py config/kuon.yaml --make-asm - + map-mismatch: ## Check for mismatches in mapfile @python3 tools/python/map_mismatch.py --language diff --git a/config/SLUS_210.07.inc.lcf b/config/SLUS_210.07.inc.lcf new file mode 100644 index 0000000..5e5103b --- /dev/null +++ b/config/SLUS_210.07.inc.lcf @@ -0,0 +1,3 @@ +INCLUDE "undefined_syms.txt" +INCLUDE "undefined_syms_auto.txt" +INCLUDE "undefined_funcs_auto.txt" \ No newline at end of file diff --git a/config/kuon.yaml b/config/kuon.yaml index 7372898..07c3d45 100644 --- a/config/kuon.yaml +++ b/config/kuon.yaml @@ -239,217 +239,217 @@ segments: - [0x02E480, asm, sdk/sce/ee/gcc/lib/gcc-lib/ee/version/libgcc/vsprintf] - [0x02E530, asm, sdk/sce/ee/gcc/lib/gcc-lib/ee/version/libgcc/writer] - [0x02E590, asm, sdk/sce/ee/gcc/lib/gcc-lib/ee/version/libgcc/wsetup] - - [0x02E6A0, c, cs4/Seimei/src/AniFile] - - [0x02EA20, c, cs4/Seimei/src/Anim] - - [0x032110, c, cs4/Seimei/src/Camera] - - [0x034930, c, cs4/Seimei/src/Debug] - - [0x034D10, c, cs4/Seimei/src/Draw] - - [0x038710, c, cs4/Seimei/src/File] - - [0x038D00, c, cs4/Seimei/src/Game] - - [0x039A00, c, cs4/Seimei/src/Load] - - [0x03A380, c, cs4/Seimei/src/Main] - - [0x03AFE0, c, cs4/Seimei/src/MathUtil] - - [0x03BCE0, c, cs4/Seimei/src/MdlLink] - - [0x03BDC0, c, cs4/Seimei/src/Mic] - - [0x03BEE0, c, cs4/Seimei/src/Model] - - [0x03D1A0, c, cs4/Seimei/src/Pad] - - [0x03DF80, c, cs4/Seimei/src/Sprite] - - [0x03E9A0, c, cs4/Seimei/src/Tex] - - [0x03FC40, c, cs4/Seimei/src/Vmd] - - [0x0414C0, c, cs4/Seimei/src/Vram] - - [0x041B90, c, cs4/Seimei/src/Vu1] - - [0x041E70, c, cs4/Seimei/fslib/lib/fslibmc] - - [0x046A00, c, cs4/Seimei/fslib/lib/fslibpa2] - - [0x047A20, c, cs4/Seimei/fslib/lib/fslibsd] - - [0x0484C0, c, cs4/Seimei/fslib/lib/fslibsdsynth] - - [0x04AA50, c, cs4/Seimei/fslib/lib/fslibvu0] - - [0x04ABC0, c, cs4/Seimei/src/Memory] - - [0x04B150, c, cs4/Seimei/src/Map] - - [0x04FBC0, c, cs4/Seimei/src/String] - - [0x04FD50, c, cs4/Seimei/src/My] - - [0x053740, c, cs4/Seimei/src/MyAct] - - [0x056F20, c, cs4/Seimei/src/MyThk] - - [0x059480, c, cs4/Seimei/fslib/lib/fslibhit] - - [0x0594F0, c, cs4/Seimei/fslib/lib/hit_basic] - - [0x059650, c, cs4/Seimei/fslib/lib/hit_calc] - - [0x059720, c, cs4/Seimei/fslib/lib/hit_info] - - [0x059790, c, cs4/Seimei/src/Mi2] - - [0x059860, c, cs4/Seimei/src/CharHit] - - [0x059C60, c, cs4/Seimei/src/Dss] - - [0x05ACB0, c, cs4/Seimei/src/Damage] - - [0x05B3B0, c, cs4/Seimei/src/Hmd] - - [0x05E360, c, cs4/Seimei/src/Binder] - - [0x05E980, c, cs4/Seimei/src/Ene] - - [0x060DF0, c, cs4/Seimei/src/EneAct] - - [0x062F40, c, cs4/Seimei/src/EneThk] - - [0x0649E0, c, cs4/Seimei/src/PointLight] - - [0x065370, c, cs4/Seimei/lib/libaio] - - [0x0683E0, c, cs4/Seimei/src/Scene] - - [0x068BF0, c, cs4/Seimei/src/ShadowVolume] - - [0x068E00, c, cs4/Seimei/src/DepthAlpha] - - [0x069460, c, cs4/Seimei/src/ClothSimulator] - - [0x069930, c, cs4/Seimei/src/Rta] - - [0x06B9B0, c, cs4/Seimei/src/rta_util] - - [0x06BB00, c, cs4/Seimei/src/Script] - - [0x06F370, c, cs4/Seimei/fslib/lib/fslibscr] - - [0x0709B0, c, cs4/Seimei/src/MyDamage] - - [0x0710E0, c, cs4/Seimei/src/EneDamage] + - [0x02E6A0, asm, cs4/Seimei/src/AniFile] + - [0x02EA20, asm, cs4/Seimei/src/Anim] + - [0x032110, asm, cs4/Seimei/src/Camera] + - [0x034930, asm, cs4/Seimei/src/Debug] + - [0x034D10, asm, cs4/Seimei/src/Draw] + - [0x038710, asm, cs4/Seimei/src/File] + - [0x038D00, asm, cs4/Seimei/src/Game] + - [0x039A00, asm, cs4/Seimei/src/Load] + - [0x03A380, asm, cs4/Seimei/src/Main] + - [0x03AFE0, asm, cs4/Seimei/src/MathUtil] + - [0x03BCE0, asm, cs4/Seimei/src/MdlLink] + - [0x03BDC0, asm, cs4/Seimei/src/Mic] + - [0x03BEE0, asm, cs4/Seimei/src/Model] + - [0x03D1A0, asm, cs4/Seimei/src/Pad] + - [0x03DF80, asm, cs4/Seimei/src/Sprite] + - [0x03E9A0, asm, cs4/Seimei/src/Tex] + - [0x03FC40, asm, cs4/Seimei/src/Vmd] + - [0x0414C0, asm, cs4/Seimei/src/Vram] + - [0x041B90, asm, cs4/Seimei/src/Vu1] + - [0x041E70, asm, cs4/Seimei/fslib/lib/fslibmc] + - [0x046A00, asm, cs4/Seimei/fslib/lib/fslibpa2] + - [0x047A20, asm, cs4/Seimei/fslib/lib/fslibsd] + - [0x0484C0, asm, cs4/Seimei/fslib/lib/fslibsdsynth] + - [0x04AA50, asm, cs4/Seimei/fslib/lib/fslibvu0] + - [0x04ABC0, asm, cs4/Seimei/src/Memory] + - [0x04B150, asm, cs4/Seimei/src/Map] + - [0x04FBC0, asm, cs4/Seimei/src/String] + - [0x04FD50, asm, cs4/Seimei/src/My] + - [0x053740, asm, cs4/Seimei/src/MyAct] + - [0x056F20, asm, cs4/Seimei/src/MyThk] + - [0x059480, asm, cs4/Seimei/fslib/lib/fslibhit] + - [0x0594F0, asm, cs4/Seimei/fslib/lib/hit_basic] + - [0x059650, asm, cs4/Seimei/fslib/lib/hit_calc] + - [0x059720, asm, cs4/Seimei/fslib/lib/hit_info] + - [0x059790, asm, cs4/Seimei/src/Mi2] + - [0x059860, asm, cs4/Seimei/src/CharHit] + - [0x059C60, asm, cs4/Seimei/src/Dss] + - [0x05ACB0, asm, cs4/Seimei/src/Damage] + - [0x05B3B0, asm, cs4/Seimei/src/Hmd] + - [0x05E360, asm, cs4/Seimei/src/Binder] + - [0x05E980, asm, cs4/Seimei/src/Ene] + - [0x060DF0, asm, cs4/Seimei/src/EneAct] + - [0x062F40, asm, cs4/Seimei/src/EneThk] + - [0x0649E0, asm, cs4/Seimei/src/PointLight] + - [0x065370, asm, cs4/Seimei/lib/libaio] + - [0x0683E0, asm, cs4/Seimei/src/Scene] + - [0x068BF0, asm, cs4/Seimei/src/ShadowVolume] + - [0x068E00, asm, cs4/Seimei/src/DepthAlpha] + - [0x069460, asm, cs4/Seimei/src/ClothSimulator] + - [0x069930, asm, cs4/Seimei/src/Rta] + - [0x06B9B0, asm, cs4/Seimei/src/rta_util] + - [0x06BB00, asm, cs4/Seimei/src/Script] + - [0x06F370, asm, cs4/Seimei/fslib/lib/fslibscr] + - [0x0709B0, asm, cs4/Seimei/src/MyDamage] + - [0x0710E0, asm, cs4/Seimei/src/EneDamage] - [0x072120, asm, unklib_001720A0] # GCC TU - - [0x072360, c, cs4/Seimei/fslib/lib/FsFont] - - [0x0747D0, c, cs4/Seimei/fslib/lib/FsFontDraw] - - [0x076C20, c, cs4/Seimei/fslib/lib/FsFontRect] - - [0x076C40, c, cs4/Seimei/fslib/lib/FsFontReplace] - - [0x076F20, c, cs4/Seimei/src/Font] - - [0x077A10, c, cs4/Seimei/src/Dizzy] - - [0x0796C0, c, cs4/Seimei/src/SandEffect] - - [0x0796E0, c, cs4/Seimei/src/Drama] - - [0x07B6A0, c, cs4/Seimei/src/Msg] - - [0x07CA90, c, cs4/Seimei/src/KuonMsg] - - [0x07D140, c, cs4/Seimei/src/List] - - [0x07D920, c, cs4/Seimei/src/util] - - [0x07DAE0, c, cs4/Seimei/src/FsMsg] - - [0x07DBC0, c, cs4/Seimei/src/TmpMenu] - - [0x07DFB0, c, cs4/Seimei/src/Object] - - [0x0807A0, c, cs4/Seimei/src/Fade] - - [0x081180, c, cs4/Seimei/src/Blast] - - [0x081760, c, cs4/Seimei/src/Light] - - [0x081910, c, cs4/Seimei/src/Cdvd] - - [0x0820E0, c, cs4/Seimei/src/Filter] - - [0x085190, c, cs4/Seimei/src/msg_util] - - [0x085610, c, cs4/Seimei/src/DrawOT] - - [0x085FA0, c, cs4/Seimei/src/ItemMng] - - [0x087040, c, cs4/Seimei/src/Title] - - [0x08DDB0, c, cs4/Seimei/src/Spirit] - - [0x08DE80, c, cs4/Seimei/src/E016Act] - - [0x08E2E0, c, cs4/Seimei/src/E016Thk] - - [0x08E800, c, cs4/Seimei/src/E011Act] - - [0x08EEB0, c, cs4/Seimei/src/E011Thk] - - [0x08F770, c, cs4/Seimei/src/Peep] - - [0x090F60, c, cs4/Seimei/src/P007Act] - - [0x0910A0, c, cs4/Seimei/src/P007Thk] - - [0x091170, c, cs4/Seimei/src/EtcEvent] - - [0x091700, c, cs4/Seimei/src/FrontEnd/FrontEnd_Card] - - [0x093A10, c, cs4/Seimei/src/P008Act] - - [0x093C60, c, cs4/Seimei/src/Param] - - [0x093CE0, c, cs4/Seimei/src/P004Act] - - [0x094120, c, cs4/Seimei/src/P004Thk] - - [0x094400, c, cs4/Seimei/src/E022Act] - - [0x094EF0, c, cs4/Seimei/src/E022Thk] - - [0x095750, c, cs4/Seimei/src/Movie] + - [0x072360, asm, cs4/Seimei/fslib/lib/FsFont] + - [0x0747D0, asm, cs4/Seimei/fslib/lib/FsFontDraw] + - [0x076C20, asm, cs4/Seimei/fslib/lib/FsFontRect] + - [0x076C40, asm, cs4/Seimei/fslib/lib/FsFontReplace] + - [0x076F20, asm, cs4/Seimei/src/Font] + - [0x077A10, asm, cs4/Seimei/src/Dizzy] + - [0x0796C0, asm, cs4/Seimei/src/SandEffect] + - [0x0796E0, asm, cs4/Seimei/src/Drama] + - [0x07B6A0, asm, cs4/Seimei/src/Msg] + - [0x07CA90, asm, cs4/Seimei/src/KuonMsg] + - [0x07D140, asm, cs4/Seimei/src/List] + - [0x07D920, asm, cs4/Seimei/src/util] + - [0x07DAE0, asm, cs4/Seimei/src/FsMsg] + - [0x07DBC0, asm, cs4/Seimei/src/TmpMenu] + - [0x07DFB0, asm, cs4/Seimei/src/Object] + - [0x0807A0, asm, cs4/Seimei/src/Fade] + - [0x081180, asm, cs4/Seimei/src/Blast] + - [0x081760, asm, cs4/Seimei/src/Light] + - [0x081910, asm, cs4/Seimei/src/Cdvd] + - [0x0820E0, asm, cs4/Seimei/src/Filter] + - [0x085190, asm, cs4/Seimei/src/msg_util] + - [0x085610, asm, cs4/Seimei/src/DrawOT] + - [0x085FA0, asm, cs4/Seimei/src/ItemMng] + - [0x087040, asm, cs4/Seimei/src/Title] + - [0x08DDB0, asm, cs4/Seimei/src/Spirit] + - [0x08DE80, asm, cs4/Seimei/src/E016Act] + - [0x08E2E0, asm, cs4/Seimei/src/E016Thk] + - [0x08E800, asm, cs4/Seimei/src/E011Act] + - [0x08EEB0, asm, cs4/Seimei/src/E011Thk] + - [0x08F770, asm, cs4/Seimei/src/Peep] + - [0x090F60, asm, cs4/Seimei/src/P007Act] + - [0x0910A0, asm, cs4/Seimei/src/P007Thk] + - [0x091170, asm, cs4/Seimei/src/EtcEvent] + - [0x091700, asm, cs4/Seimei/src/FrontEnd/FrontEnd_Card] + - [0x093A10, asm, cs4/Seimei/src/P008Act] + - [0x093C60, asm, cs4/Seimei/src/Param] + - [0x093CE0, asm, cs4/Seimei/src/P004Act] + - [0x094120, asm, cs4/Seimei/src/P004Thk] + - [0x094400, asm, cs4/Seimei/src/E022Act] + - [0x094EF0, asm, cs4/Seimei/src/E022Thk] + - [0x095750, asm, cs4/Seimei/src/Movie] - [0x095D20, asm, unklib_00195CA0] - - [0x09BBE0, c, cs4/Seimei/src/MsgFile] - - [0x09C0F0, c, cs4/Seimei/src/MemoryCard] - - [0x09DF70, c, cs4/Seimei/src/MCIconData] - - [0x09DF90, c, cs4/Seimei/src/MultiStm] + - [0x09BBE0, asm, cs4/Seimei/src/MsgFile] + - [0x09C0F0, asm, cs4/Seimei/src/MemoryCard] + - [0x09DF70, asm, cs4/Seimei/src/MCIconData] + - [0x09DF90, asm, cs4/Seimei/src/MultiStm] - [0x09E1E0, asm, unklib_0019E160] - - [0x0A1510, c, cs4/Seimei/src/Mirror] - - [0x0A23B0, c, cs4/Seimei/src/Riddle] - - [0x0A4F80, c, cs4/Seimei/src/E031Act] - - [0x0A4F90, c, cs4/Seimei/src/MovePath] - - [0x0A53F0, c, cs4/Seimei/src/P006Thk] - - [0x0A54D0, c, cs4/Seimei/src/P027Act] - - [0x0A5610, c, cs4/Seimei/src/P027Thk] - - [0x0A5AE0, c, cs4/Seimei/src/P018Act] - - [0x0A5EA0, c, cs4/Seimei/src/P018Thk] - - [0x0A5F50, c, cs4/Seimei/src/Miz] - - [0x0A6060, c, cs4/Seimei/src/E032Act] - - [0x0A6440, c, cs4/Seimei/src/E032Thk] - - [0x0A6630, c, cs4/Seimei/src/P019Act] - - [0x0A69F0, c, cs4/Seimei/src/P019Thk] - - [0x0A6B20, c, cs4/Seimei/src/P030Act] - - [0x0A6E20, c, cs4/Seimei/src/P030Thk] - - [0x0A6E40, c, cs4/Seimei/src/TexEffect] - - [0x0A8580, c, cs4/Seimei/src/P020Act] - - [0x0A89A0, c, cs4/Seimei/src/E042Act] - - [0x0A8DD0, c, cs4/Seimei/src/Sound/Sec] - - [0x0A9290, c, cs4/Seimei/src/Sound/Snd] - - [0x0AA110, c, cs4/Seimei/src/Sound/SndReverb] - - [0x0AA640, c, cs4/Seimei/src/Sound/SndSq] - - [0x0AB190, c, cs4/Seimei/src/Sound/SndVoice] - - [0x0AC990, c, cs4/Seimei/src/Sound/VagStm] - - [0x0AE600, c, cs4/Seimei/src/sfx/PtclMng] - - [0x0BB900, c, cs4/Seimei/src/sfx/Sfx] - - [0x0BC750, c, cs4/Seimei/src/sfx/SfxCommon] - - [0x0BF400, c, cs4/Seimei/src/sfx/SfxDebug_TmrGraph] - - [0x0BF500, c, cs4/Seimei/src/sfx/SfxDomanString] - - [0x0C00B0, c, cs4/Seimei/src/sfx/SfxDraw] - - [0x0C3BD0, c, cs4/Seimei/src/sfx/SfxFileIO] - - [0x0C42A0, c, cs4/Seimei/src/sfx/SfxFlicker] - - [0x0C5C50, c, cs4/Seimei/src/sfx/SfxFormat] - - [0x0C6B60, c, cs4/Seimei/src/sfx/SfxMng] - - [0x0CE240, c, cs4/Seimei/src/sfx/SfxModel] - - [0x0CEBE0, c, cs4/Seimei/src/sfx/SfxPLight] - - [0x0CF7F0, c, cs4/Seimei/src/sfx/SfxPostEffect] - - [0x0CFDA0, c, cs4/Seimei/src/sfx/SfxTracer] - - [0x0D0F90, c, cs4/Seimei/src/sfx/StaticList] - - [0x0D14E0, c, cs4/Seimei/src/menu/KnMenuModel] - - [0x0D61F0, c, cs4/Seimei/src/menu/KnMenuWind] - - [0x0D66D0, c, cs4/Seimei/src/menu/KuonMenu] - - [0x0D8500, c, cs4/Seimei/src/menu/Menu] - - [0x0D9620, c, cs4/Seimei/src/menu/menu_util] - - [0x0EBBE0, c, cs4/Seimei/src/menu/MenuCtrl] - - [0x0EE080, c, cs4/Seimei/src/menu/MenuItem] - - [0x0F1B60, c, cs4/Seimei/src/MiniGame/GameFunc] - - [0x0F55C0, c, cs4/Seimei/src/MiniGame/MGAnime] - - [0x0F7C70, c, cs4/Seimei/src/MiniGame/MGFont] - - [0x0F7DC0, c, cs4/Seimei/src/MiniGame/MGInit] - - [0x0F9AB0, c, cs4/Seimei/src/MiniGame/MGLoad] - - [0x0F9CD0, c, cs4/Seimei/src/MiniGame/MGPad] - - [0x0FE8D0, c, cs4/Seimei/src/MiniGame/MGSprite] - - [0x0FF080, c, cs4/Seimei/src/MiniGame/MiniGame] - - [0x0FF8D0, c, cs4/Seimei/src/E035Act] - - [0x0FFBB0, c, cs4/Seimei/src/E035Thk] - - [0x0FFD70, c, cs4/Seimei/src/E034Act] - - [0x0FFF70, c, cs4/Seimei/src/E034Thk] - - [0x100130, c, cs4/Seimei/src/P025Act] - - [0x100710, c, cs4/Seimei/src/P025Thk] - - [0x100920, c, cs4/Seimei/src/E003Act] - - [0x100FD0, c, cs4/Seimei/src/E003Thk] - - [0x101890, c, cs4/Seimei/src/E028Act] - - [0x1018A0, c, cs4/Seimei/src/E033Act] - - [0x101960, c, cs4/Seimei/src/E036Act] - - [0x101970, c, cs4/Seimei/src/E037Act] - - [0x101980, c, cs4/Seimei/src/MiniGame/TMKSpriteInit] - - [0x104470, c, cs4/Seimei/src/sfx/SfxBugs] - - [0x105150, c, cs4/Seimei/src/E044Act] - - [0x105560, c, cs4/Seimei/src/sfx/SfxFog] - - [0x105A00, c, cs4/Seimei/fslib/lib/fsspummng] - - [0x106520, c, cs4/Seimei/src/Event] - - [0x106A90, c, cs4/Seimei/src/Event0031] - - [0x107380, c, cs4/Seimei/src/Event0051] - - [0x107E90, c, cs4/Seimei/src/MiniGame/sgh/sgh] - - [0x107EA0, c, cs4/Seimei/src/MiniGame/sgh/sghDice] - - [0x108860, c, cs4/Seimei/src/MiniGame/sgh/sghDraw] - - [0x108AD0, c, cs4/Seimei/src/MiniGame/sgh/sghEne] - - [0x108BD0, c, cs4/Seimei/src/MiniGame/sgh/sghEneThk] - - [0x10A890, c, cs4/Seimei/src/MiniGame/sgh/sghKoma] - - [0x10BEA0, c, cs4/Seimei/src/MiniGame/sgh/sghMain] - - [0x10BFE0, c, cs4/Seimei/src/MiniGame/sgh/sghMap] - - [0x10C9D0, c, cs4/Seimei/src/MiniGame/sgh/sghMarker] - - [0x10CBF0, c, cs4/Seimei/src/MiniGame/sgh/sghMode] - - [0x10DCB0, c, cs4/Seimei/src/MiniGame/sgh/sghMsg] - - [0x10EA40, c, cs4/Seimei/src/MiniGame/sgh/sghPad] - - [0x10F7D0, c, cs4/Seimei/src/MiniGame/sgh/sghSprite] - - [0x10FC50, c, cs4/Seimei/src/MiniGame/sgh/sghTime] - - [0x10FC70, c, cs4/Seimei/src/Event0035] - - [0x110390, c, cs4/Seimei/src/Event0034] - - [0x1107C0, c, cs4/Seimei/src/Event0033] - - [0x110F20, c, cs4/Seimei/src/Event0040] - - [0x111470, c, cs4/Seimei/src/Event0010] - - [0x112490, c, cs4/Seimei/src/Event0041] - - [0x1126A0, c, cs4/Seimei/src/Event0008] - - [0x112A80, c, cs4/Seimei/src/Event0009] - - [0x112B40, c, cs4/Seimei/src/menu/MenuTD] - - [0x113920, c, cs4/Seimei/src/Event0083] - - [0x113B10, c, cs4/Seimei/src/E041Act] - - [0x113BD0, c, cs4/Seimei/src/Event0002] - - [0x114110, c, cs4/Seimei/src/Event0006] - - [0x115080, c, cs4/Seimei/src/sfx/SfxScriptIF] - - [0x115300, c, cs4/Seimei/src/Event0032] - - [0x115610, c, cs4/Seimei/src/E023Act] - - [0x115620, c, cs4/Seimei/src/Event0001] - - [0x1157F0, c, cs4/Seimei/src/P036Act] - - [0x115910, c, cs4/Seimei/src/Event0085] + - [0x0A1510, asm, cs4/Seimei/src/Mirror] + - [0x0A23B0, asm, cs4/Seimei/src/Riddle] + - [0x0A4F80, asm, cs4/Seimei/src/E031Act] + - [0x0A4F90, asm, cs4/Seimei/src/MovePath] + - [0x0A53F0, asm, cs4/Seimei/src/P006Thk] + - [0x0A54D0, asm, cs4/Seimei/src/P027Act] + - [0x0A5610, asm, cs4/Seimei/src/P027Thk] + - [0x0A5AE0, asm, cs4/Seimei/src/P018Act] + - [0x0A5EA0, asm, cs4/Seimei/src/P018Thk] + - [0x0A5F50, asm, cs4/Seimei/src/Miz] + - [0x0A6060, asm, cs4/Seimei/src/E032Act] + - [0x0A6440, asm, cs4/Seimei/src/E032Thk] + - [0x0A6630, asm, cs4/Seimei/src/P019Act] + - [0x0A69F0, asm, cs4/Seimei/src/P019Thk] + - [0x0A6B20, asm, cs4/Seimei/src/P030Act] + - [0x0A6E20, asm, cs4/Seimei/src/P030Thk] + - [0x0A6E40, asm, cs4/Seimei/src/TexEffect] + - [0x0A8580, asm, cs4/Seimei/src/P020Act] + - [0x0A89A0, asm, cs4/Seimei/src/E042Act] + - [0x0A8DD0, asm, cs4/Seimei/src/Sound/Sec] + - [0x0A9290, asm, cs4/Seimei/src/Sound/Snd] + - [0x0AA110, asm, cs4/Seimei/src/Sound/SndReverb] + - [0x0AA640, asm, cs4/Seimei/src/Sound/SndSq] + - [0x0AB190, asm, cs4/Seimei/src/Sound/SndVoice] + - [0x0AC990, asm, cs4/Seimei/src/Sound/VagStm] + - [0x0AE600, asm, cs4/Seimei/src/sfx/PtclMng] + - [0x0BB900, asm, cs4/Seimei/src/sfx/Sfx] + - [0x0BC750, asm, cs4/Seimei/src/sfx/SfxCommon] + - [0x0BF400, asm, cs4/Seimei/src/sfx/SfxDebug_TmrGraph] + - [0x0BF500, asm, cs4/Seimei/src/sfx/SfxDomanString] + - [0x0C00B0, asm, cs4/Seimei/src/sfx/SfxDraw] + - [0x0C3BD0, asm, cs4/Seimei/src/sfx/SfxFileIO] + - [0x0C42A0, asm, cs4/Seimei/src/sfx/SfxFlicker] + - [0x0C5C50, asm, cs4/Seimei/src/sfx/SfxFormat] + - [0x0C6B60, asm, cs4/Seimei/src/sfx/SfxMng] + - [0x0CE240, asm, cs4/Seimei/src/sfx/SfxModel] + - [0x0CEBE0, asm, cs4/Seimei/src/sfx/SfxPLight] + - [0x0CF7F0, asm, cs4/Seimei/src/sfx/SfxPostEffect] + - [0x0CFDA0, asm, cs4/Seimei/src/sfx/SfxTracer] + - [0x0D0F90, asm, cs4/Seimei/src/sfx/StaticList] + - [0x0D14E0, asm, cs4/Seimei/src/menu/KnMenuModel] + - [0x0D61F0, asm, cs4/Seimei/src/menu/KnMenuWind] + - [0x0D66D0, asm, cs4/Seimei/src/menu/KuonMenu] + - [0x0D8500, asm, cs4/Seimei/src/menu/Menu] + - [0x0D9620, asm, cs4/Seimei/src/menu/menu_util] + - [0x0EBBE0, asm, cs4/Seimei/src/menu/MenuCtrl] + - [0x0EE080, asm, cs4/Seimei/src/menu/MenuItem] + - [0x0F1B60, asm, cs4/Seimei/src/MiniGame/GameFunc] + - [0x0F55C0, asm, cs4/Seimei/src/MiniGame/MGAnime] + - [0x0F7C70, asm, cs4/Seimei/src/MiniGame/MGFont] + - [0x0F7DC0, asm, cs4/Seimei/src/MiniGame/MGInit] + - [0x0F9AB0, asm, cs4/Seimei/src/MiniGame/MGLoad] + - [0x0F9CD0, asm, cs4/Seimei/src/MiniGame/MGPad] + - [0x0FE8D0, asm, cs4/Seimei/src/MiniGame/MGSprite] + - [0x0FF080, asm, cs4/Seimei/src/MiniGame/MiniGame] + - [0x0FF8D0, asm, cs4/Seimei/src/E035Act] + - [0x0FFBB0, asm, cs4/Seimei/src/E035Thk] + - [0x0FFD70, asm, cs4/Seimei/src/E034Act] + - [0x0FFF70, asm, cs4/Seimei/src/E034Thk] + - [0x100130, asm, cs4/Seimei/src/P025Act] + - [0x100710, asm, cs4/Seimei/src/P025Thk] + - [0x100920, asm, cs4/Seimei/src/E003Act] + - [0x100FD0, asm, cs4/Seimei/src/E003Thk] + - [0x101890, asm, cs4/Seimei/src/E028Act] + - [0x1018A0, asm, cs4/Seimei/src/E033Act] + - [0x101960, asm, cs4/Seimei/src/E036Act] + - [0x101970, asm, cs4/Seimei/src/E037Act] + - [0x101980, asm, cs4/Seimei/src/MiniGame/TMKSpriteInit] + - [0x104470, asm, cs4/Seimei/src/sfx/SfxBugs] + - [0x105150, asm, cs4/Seimei/src/E044Act] + - [0x105560, asm, cs4/Seimei/src/sfx/SfxFog] + - [0x105A00, asm, cs4/Seimei/fslib/lib/fsspummng] + - [0x106520, asm, cs4/Seimei/src/Event] + - [0x106A90, asm, cs4/Seimei/src/Event0031] + - [0x107380, asm, cs4/Seimei/src/Event0051] + - [0x107E90, asm, cs4/Seimei/src/MiniGame/sgh/sgh] + - [0x107EA0, asm, cs4/Seimei/src/MiniGame/sgh/sghDice] + - [0x108860, asm, cs4/Seimei/src/MiniGame/sgh/sghDraw] + - [0x108AD0, asm, cs4/Seimei/src/MiniGame/sgh/sghEne] + - [0x108BD0, asm, cs4/Seimei/src/MiniGame/sgh/sghEneThk] + - [0x10A890, asm, cs4/Seimei/src/MiniGame/sgh/sghKoma] + - [0x10BEA0, asm, cs4/Seimei/src/MiniGame/sgh/sghMain] + - [0x10BFE0, asm, cs4/Seimei/src/MiniGame/sgh/sghMap] + - [0x10C9D0, asm, cs4/Seimei/src/MiniGame/sgh/sghMarker] + - [0x10CBF0, asm, cs4/Seimei/src/MiniGame/sgh/sghMode] + - [0x10DCB0, asm, cs4/Seimei/src/MiniGame/sgh/sghMsg] + - [0x10EA40, asm, cs4/Seimei/src/MiniGame/sgh/sghPad] + - [0x10F7D0, asm, cs4/Seimei/src/MiniGame/sgh/sghSprite] + - [0x10FC50, asm, cs4/Seimei/src/MiniGame/sgh/sghTime] + - [0x10FC70, asm, cs4/Seimei/src/Event0035] + - [0x110390, asm, cs4/Seimei/src/Event0034] + - [0x1107C0, asm, cs4/Seimei/src/Event0033] + - [0x110F20, asm, cs4/Seimei/src/Event0040] + - [0x111470, asm, cs4/Seimei/src/Event0010] + - [0x112490, asm, cs4/Seimei/src/Event0041] + - [0x1126A0, asm, cs4/Seimei/src/Event0008] + - [0x112A80, asm, cs4/Seimei/src/Event0009] + - [0x112B40, asm, cs4/Seimei/src/menu/MenuTD] + - [0x113920, asm, cs4/Seimei/src/Event0083] + - [0x113B10, asm, cs4/Seimei/src/E041Act] + - [0x113BD0, asm, cs4/Seimei/src/Event0002] + - [0x114110, asm, cs4/Seimei/src/Event0006] + - [0x115080, asm, cs4/Seimei/src/sfx/SfxScriptIF] + - [0x115300, asm, cs4/Seimei/src/Event0032] + - [0x115610, asm, cs4/Seimei/src/E023Act] + - [0x115620, asm, cs4/Seimei/src/Event0001] + - [0x1157F0, asm, cs4/Seimei/src/P036Act] + - [0x115910, asm, cs4/Seimei/src/Event0085] - [0x115B70, asm, unklib_00215AF0] # vutext diff --git a/configure.py b/configure.py index 52aab06..59e2525 100755 --- a/configure.py +++ b/configure.py @@ -17,6 +17,13 @@ import tempfile import subprocess import ninja_syntax +from dataclasses import dataclass, asdict +#from utils import ensure_path_and_write, normalize_object_path, to_expected_path + +import splat.util.options as splat_options +from splat.segtypes.linker_entry import LinkerEntry, clean_up_path +from spimdisasm.common.CompilerConfig import compilerOptions + from typing import Any, Union, Protocol, Literal, cast from pathlib import Path from contextlib import contextmanager @@ -29,6 +36,10 @@ from splat.segtypes.linker_entry import LinkerEntry from tools.python.fix_assets import fix_assets from tools.python.fix_linkerscript import fix_linkerscript +from sys import stdout +from subprocess import run +from dataclasses import dataclass +from struct import unpack @contextmanager def suppress_stdout_stderr(): @@ -50,30 +61,20 @@ TOOLS_DIR = ROOT / "tools" CROSS = "mips-ps2-decompals-" -COMPILER = "ee-gcc2.9-991111-01" -COMPILER_FLAGS = "-DMATCHING_DECOMP -O2 -g2 -gstabs" # -malign-functions=3 +COMPILER = "mwcps2-3.0b52-030722" +COMPILER_FLAGS = "-O3,p -sym on -str readonly" + +WIBO = f"{TOOLS_DIR}/wibo-x86_64" + LANGUAGES: dict[str, str] = { "SLUS_210.07": "", } -# list of object file names (e.g., "tim2_new.c.o"), that have asm that needs -# to be patched. the respective c files (e.g. "tim2_new.c") will be compiled -# in two steps: c -> asm, then asm -> obj. in between, the intermediate -# asm will be passed to `tools/python/fix_asm_matching.py` for patching. -ASM_PATCH_LIST: list[str] = [ - "effect_oth.c.o", - "photo.c.o", - "ig_camra.c.o", -] - -BIN_PATH_LIST: list[str] = [ - "photo.c.o", -] - -EUC_JP_LIST = [ - "title.c.o", -] +FUNCTION_SYMBOL_LABEL = "glabel" +END_FUNCTION_SYMBOL_LABEL = "endlabel" +UNIQUE_TEXT_SECTION_DIRECTIVE = '.section .text,"ax",@progbits,unique,' +INCLUDE_MACRO_INC_DIRECTIVE = '.include "macro.inc"' def get_compiler_command(command: str): @@ -82,33 +83,28 @@ def get_compiler_command(command: str): ee_compiler_dirname = next(os.walk(ee_dir))[1][0] commands = { - "ee-gcc": compiler_dir / "bin" / "ee-gcc", - "cc1": compiler_dir / "lib" / "gcc-lib" / "ee" / ee_compiler_dirname / "cc1", - "cc1plus": compiler_dir / "lib" / "gcc-lib" / "ee" / ee_compiler_dirname / "cc1plus", - "cpp": compiler_dir / "lib" / "gcc-lib" / "ee" / ee_compiler_dirname / "cpp", - "as": compiler_dir / "ee" / "bin" / "as", + #"ee-gcc": compiler_dir / "bin" / "ee-gcc", + #"cc1": compiler_dir / "lib" / "gcc-lib" / "ee" / ee_compiler_dirname / "cc1", + #"cc1plus": compiler_dir / "lib" / "gcc-lib" / "ee" / ee_compiler_dirname / "cc1plus", + #"cpp": compiler_dir / "lib" / "gcc-lib" / "ee" / ee_compiler_dirname / "cpp", + #"as": compiler_dir / "ee" / "bin" / "as", } - return commands[command] + #return commands[command] def make_compiler_cmd(config_dir: Path, src_path: Path, language: str): rel_root = Path(os.path.relpath(ROOT, config_dir)) tools_dir = rel_root / "tools" - game_cc_dir = f"{tools_dir}/cc/{COMPILER}/bin" - lib_cc_dir = f"{tools_dir}/cc/{COMPILER}/bin" + game_cc_dir = f"{tools_dir}/cc/{COMPILER}" - compiler_includes = f"-I{src_path.parent / 'src'} -I{src_path.parent / 'include'} -Iinclude -isystem include/sdk/ee -isystem include/gcc" - assembler_includes = f"-Wa,-I{src_path.parent / 'include'} -Wa,-I{src_path.parent}" + compiler_includes = f"-I{src_path.parent / 'src'} -I{src_path.parent / 'include'} -Iinclude/sdk/ee" + assembler_includes = f"-I{src_path.parent / 'include'} -I{src_path.parent}" common_includes = f"{compiler_includes} {assembler_includes}" - game_compile_cmd = f"{game_cc_dir}/ee-gcc -c {common_includes} {COMPILER_FLAGS}" - lib_compile_cmd = f"{lib_cc_dir}/ee-gcc -c -isystem include/{COMPILER} {common_includes} {COMPILER_FLAGS}" + game_compile_cmd = f"{WIBO} {game_cc_dir}/mwccps2.exe -c {common_includes} {COMPILER_FLAGS}" - return game_compile_cmd, lib_compile_cmd, common_includes - - -WIBO_VER = "0.6.4" + return game_compile_cmd, common_includes def exec_shell(command: list[str]) -> str: @@ -149,17 +145,17 @@ def clean(config_dir: Path, config: dict[str, Any]): def write_permuter_settings(config_dir: Path, src_path: Path, language: str): - game_compile_cmd, _, _ = make_compiler_cmd(config_dir, src_path, language) + game_compile_cmd, _ = make_compiler_cmd(config_dir, src_path, language) with open(config_dir / "permuter_settings.toml", "w") as f: f.write( f"""compiler_command = "{game_compile_cmd} -D__GNUC__" assembler_command = "{CROSS}as -march=r5900 -mabi=eabi -Iinclude" -compiler_type = "gcc" +compiler_type = "mwcc" [preserve_macros] [decompme.compilers] -"tools/build/cc/gcc/gcc" = "{COMPILER}" +"tools/build/cc/mwcc/mwcc" = "{COMPILER}" """ ) @@ -177,7 +173,7 @@ def build_stuff( pre_elf_path = f"build/{basename}.elf" src_path = Path(config["options"]["src_path"]) - game_compile_cmd, lib_compile_cmd, common_includes = make_compiler_cmd(config_dir, src_path, language) + game_compile_cmd, common_includes = make_compiler_cmd(config_dir, src_path, language) built_objects: set[Path] = set() @@ -213,9 +209,10 @@ def build_stuff( ninja = ninja_syntax.Writer(open(str(ROOT / config_dir / "build.ninja"), "w"), width=9999) # Rules - ld_args = "--no-warn-rwx-segments -EL -T undefined_syms.txt -T undefined_syms_auto.txt -T undefined_funcs_auto.txt -Map $mapfile -T $in -o $out" + ld_args = "-map -lcf $in -o $out" - cpp = Path("..", "..", get_compiler_command("cpp")) + ld = Path("..", (Path("tools") / "cc" / COMPILER / "mwldps2.exe")) + cpp = Path("..", (Path("tools") / "cc" / COMPILER / "mwccps2.exe")) ninja.rule( "as", @@ -223,7 +220,7 @@ def build_stuff( # NOTE: Japanese strings are EUC-JP encoded!! # We need to convert them from (-f) UTF-8 to (-t) EUC-JP while compiling, # otherwise Japanese strings will be compiled wrong! - command=f"{cpp} {common_includes} $in -o - | iconv -f=UTF-8 -t=EUC-JP | {CROSS}as -no-pad-sections -EL -march=5900 -mabi=eabi -I{src_path.parent / 'include'} -o $out", + command=f"{WIBO} {cpp} {common_includes} $in -o - | iconv -f=UTF-8 -t=EUC-JP | {CROSS}as -no-pad-sections -EL -march=5900 -mabi=eabi -I{src_path.parent / 'include'} -o $out", ) ninja.rule( @@ -235,14 +232,14 @@ def build_stuff( f"{game_compile_cmd.replace(' -c ', ' -S ')} $in -o $$s_in && " # .......... 3) replace -c with -S in gcc command to generate intermediate assembly file instead of object f"python3 {ROOT}/tools/python/fix_asm_matching.py {language} $$s_in && " # . 4) fix assembly file using known patterns with tools/python/fix_asm_matching.py f"{game_compile_cmd} $$s_in -o $out && " # ................................. 5) compile assembly file into object - f"{CROSS}strip $out -N dummy-symbol-name" # ................................ 6) strip 'dummy-symbol-name' from object + f"{ld}strip $out -N dummy-symbol-name" # ................................ 6) strip 'dummy-symbol-name' from object ), ) ninja.rule( "cc", description="cc $in", - command=f"{game_compile_cmd} $in -o $out && {CROSS}strip $out -N dummy-symbol-name", + command=f"{game_compile_cmd} $in -o $out && {ld}strip $out -N dummy-symbol-name", ) ninja.rule( @@ -251,22 +248,22 @@ def build_stuff( command=( f"eucjp_in=$$(echo $in.eucjp.c | sed 's,^[^/]*/[^/]*/,cc-src/,') && " # . 1) remove ../../ from path + prefix with cc-src/ + suffix with .eucjp.c and store it into eucjp_in var: ../src/file.c -> eucjp_in=cc-src/src/file.c.eucjp.c f'mkdir -p $$(dirname "$$eucjp_in") && ' # .............................. 2) create directory from eucjp_in var: s_in=cc-src/src/path/to/file.c.eucjp.c -> mkdir -p cc-src/src/path/to/ - f"iconv -o $$eucjp_in -f=UTF-8 -t=EUC-JP $in && " # ..................... 3) convert source file to EUC-JP (save converted source to cc-src/src/file.c.eucjp.c) + #f"iconv -o $$eucjp_in -f=UTF-8 -t=EUC-JP $in && " # ..................... 3) convert source file to EUC-JP (save converted source to cc-src/src/file.c.eucjp.c) f'{game_compile_cmd} -I$$(dirname "$in") $$eucjp_in -o $out && ' # ...... 4) compile converted source file into object (also add original source directory as include path to allow relative imports) f"{CROSS}strip $out -N dummy-symbol-name" # ............................. 5) strip 'dummy-symbol-name' from object ), ) - ninja.rule( - "libcc", - description="cc $in", - command=f"{lib_compile_cmd} $in -o $out && {CROSS}strip $out -N dummy-symbol-name", - ) + #ninja.rule( + # "libcc", + # description="cc $in", + # command=f"{lib_compile_cmd} $in -o $out && {ld}strip $out -N dummy-symbol-name", + # ) ninja.rule( "ld", description="link $out", - command=f"{CROSS}ld {ld_args}", + command=f"{WIBO} {ld} {ld_args}", ) ninja.rule( @@ -278,7 +275,7 @@ def build_stuff( ninja.rule( "elf", description="elf $out", - command=f"{CROSS}objcopy $in $out -O binary && python3 {ROOT}/tools/python/fix_bin_matching.py {language} $out", + command=f"{ld}objcopy $in $out -O binary && python3 {ROOT}/tools/python/fix_bin_matching.py {language} $out", ) for entry in linker_entries: @@ -304,12 +301,6 @@ def build_stuff( if any(str(src_path).startswith("src/lib/") for src_path in entry.src_paths): build(entry.object_path, entry.src_paths, "libcc") - elif entry.object_path.name in ASM_PATCH_LIST: - build(entry.object_path, entry.src_paths, "cc-s") - - elif entry.object_path.name in EUC_JP_LIST: - build(entry.object_path, entry.src_paths, "cc-eucjp") - else: build(entry.object_path, entry.src_paths, "cc") @@ -351,6 +342,162 @@ def build_stuff( ) +def get_line_file_path(args: AnnotationArgs): + if args.line_file_path is not None: + return args.line_file_path + + # if args.elf_path.name == SH2_SERIAL and "Event/stage" in args.asm_path.as_posix(): +# return Path(f"{TOOLS}/alessatool/dwarf") / Path(args.asm_path.name).with_suffix(".line") + + return None + + +def line_has_vram_addr(line: str, addr_str: str) -> bool: + if addr_str not in line or "*/" not in line: + return False + + return line.index("*/") > line.index(addr_str) + + +def annotate_asm(args: AnnotationArgs): + with open(args.asm_path, "r") as asm_file: + asm_contents = asm_file.read() + + asm_lines = asm_contents.splitlines() + asm_line_index = 0 + + vram_start = args.vram_start + vram_end = args.vram_end + + if vram_start is None or vram_end is None: + vram_start, vram_end = find_vram_bounds(asm_lines) + + line_file_path = get_line_file_path(args) + + if line_file_path is None or not line_file_path.exists(): + addresses = (f"0x{v:X}" for v in range(vram_start, vram_end, 0x4)) + proc = run([args.addr2line_path, "-e", args.elf_path, *addresses], capture_output=True, encoding=args.encoding) + addr2line_output_lines = proc.stdout.splitlines() + else: + # parse the binary line number file. + + # the format is a list of u_shorts, one per line number. + # there should be one line number per vram address, and each vram + # address should be exactly 4 bytes apart, mirroring how the addr2line + # output is formatted + + with open(line_file_path, "rb") as line_file: + line_data = line_file.read() + line_numbers = unpack(f"<{len(line_data) // 2}H", line_data) + compile_unit = args.asm_path.with_suffix(".c").name + addr2line_output_lines = list(map(lambda n : to_addr2line_format(compile_unit, n), line_numbers)) + + main_tu_name = None + prev_tu_name = None + prev_line_number = -1 + function_count = 0 + is_in_function_label = False + current_vram_addr = vram_start + annotated_asm_lines = [] + + for addr_index in range(0, len(addr2line_output_lines) - 1): + line = addr2line_output_lines[addr_index] + + if line.startswith("?"): + current_vram_addr += 0x4 + continue + + separator_index = line.rfind(":") + current_line_number = int(line[separator_index+1:]) + + if current_line_number == prev_line_number: + current_vram_addr += 0x4 + continue + + vram_addr_str = f"{current_vram_addr:X}" + + current_tu_name = line[0:separator_index] + if current_tu_name != main_tu_name and current_tu_name != prev_tu_name: + if main_tu_name: + print(f"[warn] alessatool/annotate: address at {vram_addr_str} belongs to {current_tu_name}") + else: + main_tu_name = current_tu_name + prev_tu_name = current_tu_name + + while True: + if asm_line_index >= len(asm_lines): + raise AssertionError( + f"address 0x{current_vram_addr:X} not found in asm" + ) + + asm_line = asm_lines[asm_line_index] + + if line_has_vram_addr(asm_line, vram_addr_str): + break + + should_append_asm_line = True + if args.tu: + asm_line_trimmed = asm_line.strip() + + # track when we go in & out of function symbols + if asm_line_trimmed.startswith(FUNCTION_SYMBOL_LABEL): + function_count += 1 + is_in_function_label = True + annotated_asm_lines.append(f"{UNIQUE_TEXT_SECTION_DIRECTIVE}{function_count}") + annotated_asm_lines.append("") + elif asm_line_trimmed.startswith(END_FUNCTION_SYMBOL_LABEL): + is_in_function_label = False + + # remove `nop`s + if not is_in_function_label and asm_line_trimmed.endswith("nop"): + should_append_asm_line = False + + # remove `macro.inc` include directive + elif asm_line_trimmed == INCLUDE_MACRO_INC_DIRECTIVE: + should_append_asm_line = False + + if should_append_asm_line: + annotated_asm_lines.append(asm_line) + + asm_line_index += 1 + + annotated_asm_lines.append(f"\t.loc 1 {current_line_number}") + annotated_asm_lines.append(asm_line) + asm_line_index += 1 + + prev_line_number = current_line_number + current_vram_addr += 0x4 + + while asm_line_index < len(asm_lines) - 1: + annotated_asm_lines.append(asm_lines[asm_line_index]) + asm_line_index += 1 + + assert main_tu_name, "no valid compilation unit found" + annotated_asm_lines = [ + ".section .debug", + ".previous", + ".text", + f".file 1 \"{main_tu_name}\"", + *annotated_asm_lines + ] + + append_final_new_line(annotated_asm_lines) + annotated_asm_contents = "\n".join(annotated_asm_lines) + + if not args.stdout and args.out_path: + with open(args.out_path, "w") as out_file: + out_file.write(annotated_asm_contents) + if args.verbose: + print(f"alessatool/annotate: wrote asm to {args.out_path}") + else: + stdout.write(annotated_asm_contents) + + +def append_final_new_line(lines: list[str]): + if lines[-1] != "": + lines.append("") + + def make_asm(config_path: Path, config: dict[str, Any]): """ Extracts assembly for each function into 'expected/asm/' subfolder. @@ -456,7 +603,7 @@ def make_asm(config_path: Path, config: dict[str, Any]): tmp_obj_path = tmp_path / "obj" tmp_asm_dir = tmp_path / "asm" - cpp = Path("..", "..", "..", get_compiler_command("cpp")) + cpp = Path("..", "..", "..", (Path("tools") / "cc" / COMPILER)) for asm_file in tmp_asm_dir.rglob("*.c.s"): asm_file_rel = asm_file.relative_to(tmp_path) @@ -464,8 +611,8 @@ def make_asm(config_path: Path, config: dict[str, Any]): obj_file = tmp_obj_path / obj_file_rel.relative_to("obj") obj_file.parent.mkdir(parents=True, exist_ok=True) subprocess.run( - f"{cpp} -I../src -I../include -Iinclude -isystem include/sdk/ee -isystem include/gcc -Wa,-I../include -Wa,-I../.. '{asm_file_rel}' -o - | " - f"iconv -f=UTF-8 -t=EUC-JP '{asm_file_rel}' | " + f"{cpp} -I../src -I../include -Iinclude -Iinclude/sdk/ee -I../.. '{asm_file_rel}' -o - | " + #f"iconv -f=UTF-8 -t=EUC-JP '{asm_file_rel}' | " f"mips-linux-gnu-as -no-pad-sections -EL -march=5900 -mabi=eabi -I../include -o {obj_file_rel} {asm_file_rel}", shell=True, cwd=tmp_path, @@ -590,6 +737,85 @@ def generate_objdiff_configuration(config_path: Path, config: dict[str, Any], la print(f"Wrote objdiff configuration ({len(units)} units) to {objdiff_path}") +SECTION_ALIGNMENT_PAIRS: list[tuple[str, int]] = [ + (".text", 0x10), + (".data", 0x8), + (".rodata", 0x8), + (".lit4", 0x4), + (".sdata", 0x4), + (".sbss", 0x4), + (".bss", 0x10), +] + +TRACKED_SEGMENT_TYPES = ["asm", "c", "data", "rodata"] + +def generate_lcf(): + ''' + Generate a linker command file. It uses an oversimplified method of looping + over the linker entries emitted by Splat and looking for splits that are + parented to a `code` segment. Then it writes out the list of object files + for each section. + + Expects a template file with the extension `.inc.lcf`. + ''' + + entries_by_section_type: dict[str, list[LinkerEntry]] = dict() + for section_type, _ in SECTION_ALIGNMENT_PAIRS: + entries_by_section_type[section_type] = [] + + for entry in split.linker_writer.entries: + segment = entry.segment + parent = segment.parent + + if not parent or parent.type != "code": + continue + + section_type = entry.section_link_type + if section_type not in entries_by_section_type: + continue + + entries_by_section_type[section_type].append(entry) + + lcf_blocks: list[str] = [] + + for section_type, alignment in SECTION_ALIGNMENT_PAIRS: + objects = entries_by_section_type[section_type] + if not objects: + continue + if section_type == ".bss": + alignment = args.bss_alignment + + block = [ + f"\t\t# {section_type}", + f"\t\t__{section_type[1:]}_start = .;", + f"\t\tALIGNALL(0x{alignment:X});", + ] + for entry in objects: + alignment = entry.segment.ld_align_segment_start + if alignment is not None: + block.append(f"\t\tALIGNALL(0x{alignment:X});") + + object_name = entry.object_path.name + block.append(f"\t\t{object_name} ({section_type})") + + lcf_blocks.append("\n".join(block)) + + generated_lcf = "\n\n".join(lcf_blocks) + + template_path = args.template_path + output_path = args.lcf_output_path + + template = template_path.read_text() + output = template.replace( + "### 🔴 code 🔴 ###", + generated_lcf.strip(), + ) + output_path.write_text(output) + + if args.verbose: + print(f"✅ Mullberry/generate: wrote LCF to {output_path}") + + def main(): class ArgsProtocol(Protocol): YAML_FILE: Path @@ -622,22 +848,13 @@ def main(): ) args = cast(ArgsProtocol, parser.parse_args()) - # try: - # exec_shell(["wibo"]) - # except FileNotFoundError: - # print("ERROR: wibo does not appear to be accessible") - # print("To install it, please download it and put it in your PATH:") - # print( - # f" wget https://github.com/decompals/wibo/releases/download/{WIBO_VER}/wibo && " - # f"chmod +x wibo && sudo mv wibo /usr/bin/" - # ) - # sys.exit(1) - cwd = Path(os.getcwd()).resolve() if not ROOT.samefile(cwd): print("ERROR: this script must be run from it's directory!") exit(1) + compilerOptions["MWCCPS2"].value.bigAddendWorkaroundForMigratedFunctions = False + config = splat_load_yaml( [args.YAML_FILE], modes=["all"], @@ -648,6 +865,9 @@ def main(): basename = config["options"]["basename"] config_dir = Path(args.YAML_FILE).parent + compiler_dir = Path("tools") / "cc" / COMPILER + + if basename not in LANGUAGES: supported_elfs = f"{set(f'{elf} ({lang})' for elf, lang in LANGUAGES.items())}".replace("'", "") print(f"unsupported game ELF. Supported versions are: {supported_elfs}") @@ -677,6 +897,9 @@ def main(): assert asm_data_path.is_dir(), f"{asm_data_path} not found or not a directory" assert asset_rel_path.is_dir(), f"{asset_rel_path} not found or not a directory" + generate_lcf() + + # fix asset .incbin path from relative to root to relative to config dir: # e.g., change: # .incbin "config/assets/name.section.bin" diff --git a/tools/cc/ee-gcc2.9-991111-01/bin/ee-gcc b/tools/cc/ee-gcc2.9-991111-01/bin/ee-gcc deleted file mode 100755 index b7871b0..0000000 Binary files a/tools/cc/ee-gcc2.9-991111-01/bin/ee-gcc and /dev/null differ diff --git a/tools/cc/ee-gcc2.9-991111-01/ee/bin/as b/tools/cc/ee-gcc2.9-991111-01/ee/bin/as deleted file mode 100755 index d1295a4..0000000 Binary files a/tools/cc/ee-gcc2.9-991111-01/ee/bin/as and /dev/null differ diff --git a/tools/cc/ee-gcc2.9-991111-01/lib/gcc-lib/ee/2.9-ee-991111-01/cc1 b/tools/cc/ee-gcc2.9-991111-01/lib/gcc-lib/ee/2.9-ee-991111-01/cc1 deleted file mode 100755 index 87354da..0000000 Binary files a/tools/cc/ee-gcc2.9-991111-01/lib/gcc-lib/ee/2.9-ee-991111-01/cc1 and /dev/null differ diff --git a/tools/cc/ee-gcc2.9-991111-01/lib/gcc-lib/ee/2.9-ee-991111-01/cc1plus b/tools/cc/ee-gcc2.9-991111-01/lib/gcc-lib/ee/2.9-ee-991111-01/cc1plus deleted file mode 100755 index c09f757..0000000 Binary files a/tools/cc/ee-gcc2.9-991111-01/lib/gcc-lib/ee/2.9-ee-991111-01/cc1plus and /dev/null differ diff --git a/tools/cc/ee-gcc2.9-991111-01/lib/gcc-lib/ee/2.9-ee-991111-01/cpp b/tools/cc/ee-gcc2.9-991111-01/lib/gcc-lib/ee/2.9-ee-991111-01/cpp deleted file mode 100755 index c38e954..0000000 Binary files a/tools/cc/ee-gcc2.9-991111-01/lib/gcc-lib/ee/2.9-ee-991111-01/cpp and /dev/null differ diff --git a/tools/cc/mwcps2-3.0b52-030722/LMGR326B.DLL b/tools/cc/mwcps2-3.0b52-030722/LMGR326B.DLL new file mode 100644 index 0000000..3cb5964 Binary files /dev/null and b/tools/cc/mwcps2-3.0b52-030722/LMGR326B.DLL differ diff --git a/tools/cc/mwcps2-3.0b52-030722/asm_r5900_elf.exe b/tools/cc/mwcps2-3.0b52-030722/asm_r5900_elf.exe new file mode 100755 index 0000000..7b6bca0 Binary files /dev/null and b/tools/cc/mwcps2-3.0b52-030722/asm_r5900_elf.exe differ diff --git a/tools/cc/mwcps2-3.0b52-030722/mwccps2.exe b/tools/cc/mwcps2-3.0b52-030722/mwccps2.exe new file mode 100755 index 0000000..d1d5301 Binary files /dev/null and b/tools/cc/mwcps2-3.0b52-030722/mwccps2.exe differ diff --git a/tools/cc/mwcps2-3.0b52-030722/mwldps2.exe b/tools/cc/mwcps2-3.0b52-030722/mwldps2.exe new file mode 100755 index 0000000..ba983c3 Binary files /dev/null and b/tools/cc/mwcps2-3.0b52-030722/mwldps2.exe differ diff --git a/tools/wibo-x86_64 b/tools/wibo-x86_64 new file mode 100755 index 0000000..02b9825 Binary files /dev/null and b/tools/wibo-x86_64 differ