Added MWCC, Added WIBO:

- Implemented WIBO command for MWCC
- Implemented WIBO command for MWLD

- Need to get matching build
- Wip work on generate_lcf and inc.lcf
This commit is contained in:
2026-07-25 14:13:31 -05:00
committed by Timothy O'Barr
parent 7620a6c671
commit a12dc1c6b2
14 changed files with 508 additions and 282 deletions
+3
View File
@@ -0,0 +1,3 @@
INCLUDE "undefined_syms.txt"
INCLUDE "undefined_syms_auto.txt"
INCLUDE "undefined_funcs_auto.txt"
+208 -208
View File
@@ -239,217 +239,217 @@ segments:
- [0x02E480, asm, sdk/sce/ee/gcc/lib/gcc-lib/ee/version/libgcc/vsprintf] - [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] - [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] - [0x02E590, asm, sdk/sce/ee/gcc/lib/gcc-lib/ee/version/libgcc/wsetup]
- [0x02E6A0, c, cs4/Seimei/src/AniFile] - [0x02E6A0, asm, cs4/Seimei/src/AniFile]
- [0x02EA20, c, cs4/Seimei/src/Anim] - [0x02EA20, asm, cs4/Seimei/src/Anim]
- [0x032110, c, cs4/Seimei/src/Camera] - [0x032110, asm, cs4/Seimei/src/Camera]
- [0x034930, c, cs4/Seimei/src/Debug] - [0x034930, asm, cs4/Seimei/src/Debug]
- [0x034D10, c, cs4/Seimei/src/Draw] - [0x034D10, asm, cs4/Seimei/src/Draw]
- [0x038710, c, cs4/Seimei/src/File] - [0x038710, asm, cs4/Seimei/src/File]
- [0x038D00, c, cs4/Seimei/src/Game] - [0x038D00, asm, cs4/Seimei/src/Game]
- [0x039A00, c, cs4/Seimei/src/Load] - [0x039A00, asm, cs4/Seimei/src/Load]
- [0x03A380, c, cs4/Seimei/src/Main] - [0x03A380, asm, cs4/Seimei/src/Main]
- [0x03AFE0, c, cs4/Seimei/src/MathUtil] - [0x03AFE0, asm, cs4/Seimei/src/MathUtil]
- [0x03BCE0, c, cs4/Seimei/src/MdlLink] - [0x03BCE0, asm, cs4/Seimei/src/MdlLink]
- [0x03BDC0, c, cs4/Seimei/src/Mic] - [0x03BDC0, asm, cs4/Seimei/src/Mic]
- [0x03BEE0, c, cs4/Seimei/src/Model] - [0x03BEE0, asm, cs4/Seimei/src/Model]
- [0x03D1A0, c, cs4/Seimei/src/Pad] - [0x03D1A0, asm, cs4/Seimei/src/Pad]
- [0x03DF80, c, cs4/Seimei/src/Sprite] - [0x03DF80, asm, cs4/Seimei/src/Sprite]
- [0x03E9A0, c, cs4/Seimei/src/Tex] - [0x03E9A0, asm, cs4/Seimei/src/Tex]
- [0x03FC40, c, cs4/Seimei/src/Vmd] - [0x03FC40, asm, cs4/Seimei/src/Vmd]
- [0x0414C0, c, cs4/Seimei/src/Vram] - [0x0414C0, asm, cs4/Seimei/src/Vram]
- [0x041B90, c, cs4/Seimei/src/Vu1] - [0x041B90, asm, cs4/Seimei/src/Vu1]
- [0x041E70, c, cs4/Seimei/fslib/lib/fslibmc] - [0x041E70, asm, cs4/Seimei/fslib/lib/fslibmc]
- [0x046A00, c, cs4/Seimei/fslib/lib/fslibpa2] - [0x046A00, asm, cs4/Seimei/fslib/lib/fslibpa2]
- [0x047A20, c, cs4/Seimei/fslib/lib/fslibsd] - [0x047A20, asm, cs4/Seimei/fslib/lib/fslibsd]
- [0x0484C0, c, cs4/Seimei/fslib/lib/fslibsdsynth] - [0x0484C0, asm, cs4/Seimei/fslib/lib/fslibsdsynth]
- [0x04AA50, c, cs4/Seimei/fslib/lib/fslibvu0] - [0x04AA50, asm, cs4/Seimei/fslib/lib/fslibvu0]
- [0x04ABC0, c, cs4/Seimei/src/Memory] - [0x04ABC0, asm, cs4/Seimei/src/Memory]
- [0x04B150, c, cs4/Seimei/src/Map] - [0x04B150, asm, cs4/Seimei/src/Map]
- [0x04FBC0, c, cs4/Seimei/src/String] - [0x04FBC0, asm, cs4/Seimei/src/String]
- [0x04FD50, c, cs4/Seimei/src/My] - [0x04FD50, asm, cs4/Seimei/src/My]
- [0x053740, c, cs4/Seimei/src/MyAct] - [0x053740, asm, cs4/Seimei/src/MyAct]
- [0x056F20, c, cs4/Seimei/src/MyThk] - [0x056F20, asm, cs4/Seimei/src/MyThk]
- [0x059480, c, cs4/Seimei/fslib/lib/fslibhit] - [0x059480, asm, cs4/Seimei/fslib/lib/fslibhit]
- [0x0594F0, c, cs4/Seimei/fslib/lib/hit_basic] - [0x0594F0, asm, cs4/Seimei/fslib/lib/hit_basic]
- [0x059650, c, cs4/Seimei/fslib/lib/hit_calc] - [0x059650, asm, cs4/Seimei/fslib/lib/hit_calc]
- [0x059720, c, cs4/Seimei/fslib/lib/hit_info] - [0x059720, asm, cs4/Seimei/fslib/lib/hit_info]
- [0x059790, c, cs4/Seimei/src/Mi2] - [0x059790, asm, cs4/Seimei/src/Mi2]
- [0x059860, c, cs4/Seimei/src/CharHit] - [0x059860, asm, cs4/Seimei/src/CharHit]
- [0x059C60, c, cs4/Seimei/src/Dss] - [0x059C60, asm, cs4/Seimei/src/Dss]
- [0x05ACB0, c, cs4/Seimei/src/Damage] - [0x05ACB0, asm, cs4/Seimei/src/Damage]
- [0x05B3B0, c, cs4/Seimei/src/Hmd] - [0x05B3B0, asm, cs4/Seimei/src/Hmd]
- [0x05E360, c, cs4/Seimei/src/Binder] - [0x05E360, asm, cs4/Seimei/src/Binder]
- [0x05E980, c, cs4/Seimei/src/Ene] - [0x05E980, asm, cs4/Seimei/src/Ene]
- [0x060DF0, c, cs4/Seimei/src/EneAct] - [0x060DF0, asm, cs4/Seimei/src/EneAct]
- [0x062F40, c, cs4/Seimei/src/EneThk] - [0x062F40, asm, cs4/Seimei/src/EneThk]
- [0x0649E0, c, cs4/Seimei/src/PointLight] - [0x0649E0, asm, cs4/Seimei/src/PointLight]
- [0x065370, c, cs4/Seimei/lib/libaio] - [0x065370, asm, cs4/Seimei/lib/libaio]
- [0x0683E0, c, cs4/Seimei/src/Scene] - [0x0683E0, asm, cs4/Seimei/src/Scene]
- [0x068BF0, c, cs4/Seimei/src/ShadowVolume] - [0x068BF0, asm, cs4/Seimei/src/ShadowVolume]
- [0x068E00, c, cs4/Seimei/src/DepthAlpha] - [0x068E00, asm, cs4/Seimei/src/DepthAlpha]
- [0x069460, c, cs4/Seimei/src/ClothSimulator] - [0x069460, asm, cs4/Seimei/src/ClothSimulator]
- [0x069930, c, cs4/Seimei/src/Rta] - [0x069930, asm, cs4/Seimei/src/Rta]
- [0x06B9B0, c, cs4/Seimei/src/rta_util] - [0x06B9B0, asm, cs4/Seimei/src/rta_util]
- [0x06BB00, c, cs4/Seimei/src/Script] - [0x06BB00, asm, cs4/Seimei/src/Script]
- [0x06F370, c, cs4/Seimei/fslib/lib/fslibscr] - [0x06F370, asm, cs4/Seimei/fslib/lib/fslibscr]
- [0x0709B0, c, cs4/Seimei/src/MyDamage] - [0x0709B0, asm, cs4/Seimei/src/MyDamage]
- [0x0710E0, c, cs4/Seimei/src/EneDamage] - [0x0710E0, asm, cs4/Seimei/src/EneDamage]
- [0x072120, asm, unklib_001720A0] # GCC TU - [0x072120, asm, unklib_001720A0] # GCC TU
- [0x072360, c, cs4/Seimei/fslib/lib/FsFont] - [0x072360, asm, cs4/Seimei/fslib/lib/FsFont]
- [0x0747D0, c, cs4/Seimei/fslib/lib/FsFontDraw] - [0x0747D0, asm, cs4/Seimei/fslib/lib/FsFontDraw]
- [0x076C20, c, cs4/Seimei/fslib/lib/FsFontRect] - [0x076C20, asm, cs4/Seimei/fslib/lib/FsFontRect]
- [0x076C40, c, cs4/Seimei/fslib/lib/FsFontReplace] - [0x076C40, asm, cs4/Seimei/fslib/lib/FsFontReplace]
- [0x076F20, c, cs4/Seimei/src/Font] - [0x076F20, asm, cs4/Seimei/src/Font]
- [0x077A10, c, cs4/Seimei/src/Dizzy] - [0x077A10, asm, cs4/Seimei/src/Dizzy]
- [0x0796C0, c, cs4/Seimei/src/SandEffect] - [0x0796C0, asm, cs4/Seimei/src/SandEffect]
- [0x0796E0, c, cs4/Seimei/src/Drama] - [0x0796E0, asm, cs4/Seimei/src/Drama]
- [0x07B6A0, c, cs4/Seimei/src/Msg] - [0x07B6A0, asm, cs4/Seimei/src/Msg]
- [0x07CA90, c, cs4/Seimei/src/KuonMsg] - [0x07CA90, asm, cs4/Seimei/src/KuonMsg]
- [0x07D140, c, cs4/Seimei/src/List] - [0x07D140, asm, cs4/Seimei/src/List]
- [0x07D920, c, cs4/Seimei/src/util] - [0x07D920, asm, cs4/Seimei/src/util]
- [0x07DAE0, c, cs4/Seimei/src/FsMsg] - [0x07DAE0, asm, cs4/Seimei/src/FsMsg]
- [0x07DBC0, c, cs4/Seimei/src/TmpMenu] - [0x07DBC0, asm, cs4/Seimei/src/TmpMenu]
- [0x07DFB0, c, cs4/Seimei/src/Object] - [0x07DFB0, asm, cs4/Seimei/src/Object]
- [0x0807A0, c, cs4/Seimei/src/Fade] - [0x0807A0, asm, cs4/Seimei/src/Fade]
- [0x081180, c, cs4/Seimei/src/Blast] - [0x081180, asm, cs4/Seimei/src/Blast]
- [0x081760, c, cs4/Seimei/src/Light] - [0x081760, asm, cs4/Seimei/src/Light]
- [0x081910, c, cs4/Seimei/src/Cdvd] - [0x081910, asm, cs4/Seimei/src/Cdvd]
- [0x0820E0, c, cs4/Seimei/src/Filter] - [0x0820E0, asm, cs4/Seimei/src/Filter]
- [0x085190, c, cs4/Seimei/src/msg_util] - [0x085190, asm, cs4/Seimei/src/msg_util]
- [0x085610, c, cs4/Seimei/src/DrawOT] - [0x085610, asm, cs4/Seimei/src/DrawOT]
- [0x085FA0, c, cs4/Seimei/src/ItemMng] - [0x085FA0, asm, cs4/Seimei/src/ItemMng]
- [0x087040, c, cs4/Seimei/src/Title] - [0x087040, asm, cs4/Seimei/src/Title]
- [0x08DDB0, c, cs4/Seimei/src/Spirit] - [0x08DDB0, asm, cs4/Seimei/src/Spirit]
- [0x08DE80, c, cs4/Seimei/src/E016Act] - [0x08DE80, asm, cs4/Seimei/src/E016Act]
- [0x08E2E0, c, cs4/Seimei/src/E016Thk] - [0x08E2E0, asm, cs4/Seimei/src/E016Thk]
- [0x08E800, c, cs4/Seimei/src/E011Act] - [0x08E800, asm, cs4/Seimei/src/E011Act]
- [0x08EEB0, c, cs4/Seimei/src/E011Thk] - [0x08EEB0, asm, cs4/Seimei/src/E011Thk]
- [0x08F770, c, cs4/Seimei/src/Peep] - [0x08F770, asm, cs4/Seimei/src/Peep]
- [0x090F60, c, cs4/Seimei/src/P007Act] - [0x090F60, asm, cs4/Seimei/src/P007Act]
- [0x0910A0, c, cs4/Seimei/src/P007Thk] - [0x0910A0, asm, cs4/Seimei/src/P007Thk]
- [0x091170, c, cs4/Seimei/src/EtcEvent] - [0x091170, asm, cs4/Seimei/src/EtcEvent]
- [0x091700, c, cs4/Seimei/src/FrontEnd/FrontEnd_Card] - [0x091700, asm, cs4/Seimei/src/FrontEnd/FrontEnd_Card]
- [0x093A10, c, cs4/Seimei/src/P008Act] - [0x093A10, asm, cs4/Seimei/src/P008Act]
- [0x093C60, c, cs4/Seimei/src/Param] - [0x093C60, asm, cs4/Seimei/src/Param]
- [0x093CE0, c, cs4/Seimei/src/P004Act] - [0x093CE0, asm, cs4/Seimei/src/P004Act]
- [0x094120, c, cs4/Seimei/src/P004Thk] - [0x094120, asm, cs4/Seimei/src/P004Thk]
- [0x094400, c, cs4/Seimei/src/E022Act] - [0x094400, asm, cs4/Seimei/src/E022Act]
- [0x094EF0, c, cs4/Seimei/src/E022Thk] - [0x094EF0, asm, cs4/Seimei/src/E022Thk]
- [0x095750, c, cs4/Seimei/src/Movie] - [0x095750, asm, cs4/Seimei/src/Movie]
- [0x095D20, asm, unklib_00195CA0] - [0x095D20, asm, unklib_00195CA0]
- [0x09BBE0, c, cs4/Seimei/src/MsgFile] - [0x09BBE0, asm, cs4/Seimei/src/MsgFile]
- [0x09C0F0, c, cs4/Seimei/src/MemoryCard] - [0x09C0F0, asm, cs4/Seimei/src/MemoryCard]
- [0x09DF70, c, cs4/Seimei/src/MCIconData] - [0x09DF70, asm, cs4/Seimei/src/MCIconData]
- [0x09DF90, c, cs4/Seimei/src/MultiStm] - [0x09DF90, asm, cs4/Seimei/src/MultiStm]
- [0x09E1E0, asm, unklib_0019E160] - [0x09E1E0, asm, unklib_0019E160]
- [0x0A1510, c, cs4/Seimei/src/Mirror] - [0x0A1510, asm, cs4/Seimei/src/Mirror]
- [0x0A23B0, c, cs4/Seimei/src/Riddle] - [0x0A23B0, asm, cs4/Seimei/src/Riddle]
- [0x0A4F80, c, cs4/Seimei/src/E031Act] - [0x0A4F80, asm, cs4/Seimei/src/E031Act]
- [0x0A4F90, c, cs4/Seimei/src/MovePath] - [0x0A4F90, asm, cs4/Seimei/src/MovePath]
- [0x0A53F0, c, cs4/Seimei/src/P006Thk] - [0x0A53F0, asm, cs4/Seimei/src/P006Thk]
- [0x0A54D0, c, cs4/Seimei/src/P027Act] - [0x0A54D0, asm, cs4/Seimei/src/P027Act]
- [0x0A5610, c, cs4/Seimei/src/P027Thk] - [0x0A5610, asm, cs4/Seimei/src/P027Thk]
- [0x0A5AE0, c, cs4/Seimei/src/P018Act] - [0x0A5AE0, asm, cs4/Seimei/src/P018Act]
- [0x0A5EA0, c, cs4/Seimei/src/P018Thk] - [0x0A5EA0, asm, cs4/Seimei/src/P018Thk]
- [0x0A5F50, c, cs4/Seimei/src/Miz] - [0x0A5F50, asm, cs4/Seimei/src/Miz]
- [0x0A6060, c, cs4/Seimei/src/E032Act] - [0x0A6060, asm, cs4/Seimei/src/E032Act]
- [0x0A6440, c, cs4/Seimei/src/E032Thk] - [0x0A6440, asm, cs4/Seimei/src/E032Thk]
- [0x0A6630, c, cs4/Seimei/src/P019Act] - [0x0A6630, asm, cs4/Seimei/src/P019Act]
- [0x0A69F0, c, cs4/Seimei/src/P019Thk] - [0x0A69F0, asm, cs4/Seimei/src/P019Thk]
- [0x0A6B20, c, cs4/Seimei/src/P030Act] - [0x0A6B20, asm, cs4/Seimei/src/P030Act]
- [0x0A6E20, c, cs4/Seimei/src/P030Thk] - [0x0A6E20, asm, cs4/Seimei/src/P030Thk]
- [0x0A6E40, c, cs4/Seimei/src/TexEffect] - [0x0A6E40, asm, cs4/Seimei/src/TexEffect]
- [0x0A8580, c, cs4/Seimei/src/P020Act] - [0x0A8580, asm, cs4/Seimei/src/P020Act]
- [0x0A89A0, c, cs4/Seimei/src/E042Act] - [0x0A89A0, asm, cs4/Seimei/src/E042Act]
- [0x0A8DD0, c, cs4/Seimei/src/Sound/Sec] - [0x0A8DD0, asm, cs4/Seimei/src/Sound/Sec]
- [0x0A9290, c, cs4/Seimei/src/Sound/Snd] - [0x0A9290, asm, cs4/Seimei/src/Sound/Snd]
- [0x0AA110, c, cs4/Seimei/src/Sound/SndReverb] - [0x0AA110, asm, cs4/Seimei/src/Sound/SndReverb]
- [0x0AA640, c, cs4/Seimei/src/Sound/SndSq] - [0x0AA640, asm, cs4/Seimei/src/Sound/SndSq]
- [0x0AB190, c, cs4/Seimei/src/Sound/SndVoice] - [0x0AB190, asm, cs4/Seimei/src/Sound/SndVoice]
- [0x0AC990, c, cs4/Seimei/src/Sound/VagStm] - [0x0AC990, asm, cs4/Seimei/src/Sound/VagStm]
- [0x0AE600, c, cs4/Seimei/src/sfx/PtclMng] - [0x0AE600, asm, cs4/Seimei/src/sfx/PtclMng]
- [0x0BB900, c, cs4/Seimei/src/sfx/Sfx] - [0x0BB900, asm, cs4/Seimei/src/sfx/Sfx]
- [0x0BC750, c, cs4/Seimei/src/sfx/SfxCommon] - [0x0BC750, asm, cs4/Seimei/src/sfx/SfxCommon]
- [0x0BF400, c, cs4/Seimei/src/sfx/SfxDebug_TmrGraph] - [0x0BF400, asm, cs4/Seimei/src/sfx/SfxDebug_TmrGraph]
- [0x0BF500, c, cs4/Seimei/src/sfx/SfxDomanString] - [0x0BF500, asm, cs4/Seimei/src/sfx/SfxDomanString]
- [0x0C00B0, c, cs4/Seimei/src/sfx/SfxDraw] - [0x0C00B0, asm, cs4/Seimei/src/sfx/SfxDraw]
- [0x0C3BD0, c, cs4/Seimei/src/sfx/SfxFileIO] - [0x0C3BD0, asm, cs4/Seimei/src/sfx/SfxFileIO]
- [0x0C42A0, c, cs4/Seimei/src/sfx/SfxFlicker] - [0x0C42A0, asm, cs4/Seimei/src/sfx/SfxFlicker]
- [0x0C5C50, c, cs4/Seimei/src/sfx/SfxFormat] - [0x0C5C50, asm, cs4/Seimei/src/sfx/SfxFormat]
- [0x0C6B60, c, cs4/Seimei/src/sfx/SfxMng] - [0x0C6B60, asm, cs4/Seimei/src/sfx/SfxMng]
- [0x0CE240, c, cs4/Seimei/src/sfx/SfxModel] - [0x0CE240, asm, cs4/Seimei/src/sfx/SfxModel]
- [0x0CEBE0, c, cs4/Seimei/src/sfx/SfxPLight] - [0x0CEBE0, asm, cs4/Seimei/src/sfx/SfxPLight]
- [0x0CF7F0, c, cs4/Seimei/src/sfx/SfxPostEffect] - [0x0CF7F0, asm, cs4/Seimei/src/sfx/SfxPostEffect]
- [0x0CFDA0, c, cs4/Seimei/src/sfx/SfxTracer] - [0x0CFDA0, asm, cs4/Seimei/src/sfx/SfxTracer]
- [0x0D0F90, c, cs4/Seimei/src/sfx/StaticList] - [0x0D0F90, asm, cs4/Seimei/src/sfx/StaticList]
- [0x0D14E0, c, cs4/Seimei/src/menu/KnMenuModel] - [0x0D14E0, asm, cs4/Seimei/src/menu/KnMenuModel]
- [0x0D61F0, c, cs4/Seimei/src/menu/KnMenuWind] - [0x0D61F0, asm, cs4/Seimei/src/menu/KnMenuWind]
- [0x0D66D0, c, cs4/Seimei/src/menu/KuonMenu] - [0x0D66D0, asm, cs4/Seimei/src/menu/KuonMenu]
- [0x0D8500, c, cs4/Seimei/src/menu/Menu] - [0x0D8500, asm, cs4/Seimei/src/menu/Menu]
- [0x0D9620, c, cs4/Seimei/src/menu/menu_util] - [0x0D9620, asm, cs4/Seimei/src/menu/menu_util]
- [0x0EBBE0, c, cs4/Seimei/src/menu/MenuCtrl] - [0x0EBBE0, asm, cs4/Seimei/src/menu/MenuCtrl]
- [0x0EE080, c, cs4/Seimei/src/menu/MenuItem] - [0x0EE080, asm, cs4/Seimei/src/menu/MenuItem]
- [0x0F1B60, c, cs4/Seimei/src/MiniGame/GameFunc] - [0x0F1B60, asm, cs4/Seimei/src/MiniGame/GameFunc]
- [0x0F55C0, c, cs4/Seimei/src/MiniGame/MGAnime] - [0x0F55C0, asm, cs4/Seimei/src/MiniGame/MGAnime]
- [0x0F7C70, c, cs4/Seimei/src/MiniGame/MGFont] - [0x0F7C70, asm, cs4/Seimei/src/MiniGame/MGFont]
- [0x0F7DC0, c, cs4/Seimei/src/MiniGame/MGInit] - [0x0F7DC0, asm, cs4/Seimei/src/MiniGame/MGInit]
- [0x0F9AB0, c, cs4/Seimei/src/MiniGame/MGLoad] - [0x0F9AB0, asm, cs4/Seimei/src/MiniGame/MGLoad]
- [0x0F9CD0, c, cs4/Seimei/src/MiniGame/MGPad] - [0x0F9CD0, asm, cs4/Seimei/src/MiniGame/MGPad]
- [0x0FE8D0, c, cs4/Seimei/src/MiniGame/MGSprite] - [0x0FE8D0, asm, cs4/Seimei/src/MiniGame/MGSprite]
- [0x0FF080, c, cs4/Seimei/src/MiniGame/MiniGame] - [0x0FF080, asm, cs4/Seimei/src/MiniGame/MiniGame]
- [0x0FF8D0, c, cs4/Seimei/src/E035Act] - [0x0FF8D0, asm, cs4/Seimei/src/E035Act]
- [0x0FFBB0, c, cs4/Seimei/src/E035Thk] - [0x0FFBB0, asm, cs4/Seimei/src/E035Thk]
- [0x0FFD70, c, cs4/Seimei/src/E034Act] - [0x0FFD70, asm, cs4/Seimei/src/E034Act]
- [0x0FFF70, c, cs4/Seimei/src/E034Thk] - [0x0FFF70, asm, cs4/Seimei/src/E034Thk]
- [0x100130, c, cs4/Seimei/src/P025Act] - [0x100130, asm, cs4/Seimei/src/P025Act]
- [0x100710, c, cs4/Seimei/src/P025Thk] - [0x100710, asm, cs4/Seimei/src/P025Thk]
- [0x100920, c, cs4/Seimei/src/E003Act] - [0x100920, asm, cs4/Seimei/src/E003Act]
- [0x100FD0, c, cs4/Seimei/src/E003Thk] - [0x100FD0, asm, cs4/Seimei/src/E003Thk]
- [0x101890, c, cs4/Seimei/src/E028Act] - [0x101890, asm, cs4/Seimei/src/E028Act]
- [0x1018A0, c, cs4/Seimei/src/E033Act] - [0x1018A0, asm, cs4/Seimei/src/E033Act]
- [0x101960, c, cs4/Seimei/src/E036Act] - [0x101960, asm, cs4/Seimei/src/E036Act]
- [0x101970, c, cs4/Seimei/src/E037Act] - [0x101970, asm, cs4/Seimei/src/E037Act]
- [0x101980, c, cs4/Seimei/src/MiniGame/TMKSpriteInit] - [0x101980, asm, cs4/Seimei/src/MiniGame/TMKSpriteInit]
- [0x104470, c, cs4/Seimei/src/sfx/SfxBugs] - [0x104470, asm, cs4/Seimei/src/sfx/SfxBugs]
- [0x105150, c, cs4/Seimei/src/E044Act] - [0x105150, asm, cs4/Seimei/src/E044Act]
- [0x105560, c, cs4/Seimei/src/sfx/SfxFog] - [0x105560, asm, cs4/Seimei/src/sfx/SfxFog]
- [0x105A00, c, cs4/Seimei/fslib/lib/fsspummng] - [0x105A00, asm, cs4/Seimei/fslib/lib/fsspummng]
- [0x106520, c, cs4/Seimei/src/Event] - [0x106520, asm, cs4/Seimei/src/Event]
- [0x106A90, c, cs4/Seimei/src/Event0031] - [0x106A90, asm, cs4/Seimei/src/Event0031]
- [0x107380, c, cs4/Seimei/src/Event0051] - [0x107380, asm, cs4/Seimei/src/Event0051]
- [0x107E90, c, cs4/Seimei/src/MiniGame/sgh/sgh] - [0x107E90, asm, cs4/Seimei/src/MiniGame/sgh/sgh]
- [0x107EA0, c, cs4/Seimei/src/MiniGame/sgh/sghDice] - [0x107EA0, asm, cs4/Seimei/src/MiniGame/sgh/sghDice]
- [0x108860, c, cs4/Seimei/src/MiniGame/sgh/sghDraw] - [0x108860, asm, cs4/Seimei/src/MiniGame/sgh/sghDraw]
- [0x108AD0, c, cs4/Seimei/src/MiniGame/sgh/sghEne] - [0x108AD0, asm, cs4/Seimei/src/MiniGame/sgh/sghEne]
- [0x108BD0, c, cs4/Seimei/src/MiniGame/sgh/sghEneThk] - [0x108BD0, asm, cs4/Seimei/src/MiniGame/sgh/sghEneThk]
- [0x10A890, c, cs4/Seimei/src/MiniGame/sgh/sghKoma] - [0x10A890, asm, cs4/Seimei/src/MiniGame/sgh/sghKoma]
- [0x10BEA0, c, cs4/Seimei/src/MiniGame/sgh/sghMain] - [0x10BEA0, asm, cs4/Seimei/src/MiniGame/sgh/sghMain]
- [0x10BFE0, c, cs4/Seimei/src/MiniGame/sgh/sghMap] - [0x10BFE0, asm, cs4/Seimei/src/MiniGame/sgh/sghMap]
- [0x10C9D0, c, cs4/Seimei/src/MiniGame/sgh/sghMarker] - [0x10C9D0, asm, cs4/Seimei/src/MiniGame/sgh/sghMarker]
- [0x10CBF0, c, cs4/Seimei/src/MiniGame/sgh/sghMode] - [0x10CBF0, asm, cs4/Seimei/src/MiniGame/sgh/sghMode]
- [0x10DCB0, c, cs4/Seimei/src/MiniGame/sgh/sghMsg] - [0x10DCB0, asm, cs4/Seimei/src/MiniGame/sgh/sghMsg]
- [0x10EA40, c, cs4/Seimei/src/MiniGame/sgh/sghPad] - [0x10EA40, asm, cs4/Seimei/src/MiniGame/sgh/sghPad]
- [0x10F7D0, c, cs4/Seimei/src/MiniGame/sgh/sghSprite] - [0x10F7D0, asm, cs4/Seimei/src/MiniGame/sgh/sghSprite]
- [0x10FC50, c, cs4/Seimei/src/MiniGame/sgh/sghTime] - [0x10FC50, asm, cs4/Seimei/src/MiniGame/sgh/sghTime]
- [0x10FC70, c, cs4/Seimei/src/Event0035] - [0x10FC70, asm, cs4/Seimei/src/Event0035]
- [0x110390, c, cs4/Seimei/src/Event0034] - [0x110390, asm, cs4/Seimei/src/Event0034]
- [0x1107C0, c, cs4/Seimei/src/Event0033] - [0x1107C0, asm, cs4/Seimei/src/Event0033]
- [0x110F20, c, cs4/Seimei/src/Event0040] - [0x110F20, asm, cs4/Seimei/src/Event0040]
- [0x111470, c, cs4/Seimei/src/Event0010] - [0x111470, asm, cs4/Seimei/src/Event0010]
- [0x112490, c, cs4/Seimei/src/Event0041] - [0x112490, asm, cs4/Seimei/src/Event0041]
- [0x1126A0, c, cs4/Seimei/src/Event0008] - [0x1126A0, asm, cs4/Seimei/src/Event0008]
- [0x112A80, c, cs4/Seimei/src/Event0009] - [0x112A80, asm, cs4/Seimei/src/Event0009]
- [0x112B40, c, cs4/Seimei/src/menu/MenuTD] - [0x112B40, asm, cs4/Seimei/src/menu/MenuTD]
- [0x113920, c, cs4/Seimei/src/Event0083] - [0x113920, asm, cs4/Seimei/src/Event0083]
- [0x113B10, c, cs4/Seimei/src/E041Act] - [0x113B10, asm, cs4/Seimei/src/E041Act]
- [0x113BD0, c, cs4/Seimei/src/Event0002] - [0x113BD0, asm, cs4/Seimei/src/Event0002]
- [0x114110, c, cs4/Seimei/src/Event0006] - [0x114110, asm, cs4/Seimei/src/Event0006]
- [0x115080, c, cs4/Seimei/src/sfx/SfxScriptIF] - [0x115080, asm, cs4/Seimei/src/sfx/SfxScriptIF]
- [0x115300, c, cs4/Seimei/src/Event0032] - [0x115300, asm, cs4/Seimei/src/Event0032]
- [0x115610, c, cs4/Seimei/src/E023Act] - [0x115610, asm, cs4/Seimei/src/E023Act]
- [0x115620, c, cs4/Seimei/src/Event0001] - [0x115620, asm, cs4/Seimei/src/Event0001]
- [0x1157F0, c, cs4/Seimei/src/P036Act] - [0x1157F0, asm, cs4/Seimei/src/P036Act]
- [0x115910, c, cs4/Seimei/src/Event0085] - [0x115910, asm, cs4/Seimei/src/Event0085]
- [0x115B70, asm, unklib_00215AF0] - [0x115B70, asm, unklib_00215AF0]
# vutext # vutext
+295 -72
View File
@@ -17,6 +17,13 @@ import tempfile
import subprocess import subprocess
import ninja_syntax 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 typing import Any, Union, Protocol, Literal, cast
from pathlib import Path from pathlib import Path
from contextlib import contextmanager 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_assets import fix_assets
from tools.python.fix_linkerscript import fix_linkerscript 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 @contextmanager
def suppress_stdout_stderr(): def suppress_stdout_stderr():
@@ -50,30 +61,20 @@ TOOLS_DIR = ROOT / "tools"
CROSS = "mips-ps2-decompals-" CROSS = "mips-ps2-decompals-"
COMPILER = "ee-gcc2.9-991111-01" COMPILER = "mwcps2-3.0b52-030722"
COMPILER_FLAGS = "-DMATCHING_DECOMP -O2 -g2 -gstabs" # -malign-functions=3 COMPILER_FLAGS = "-O3,p -sym on -str readonly"
WIBO = f"{TOOLS_DIR}/wibo-x86_64"
LANGUAGES: dict[str, str] = { LANGUAGES: dict[str, str] = {
"SLUS_210.07": "", "SLUS_210.07": "",
} }
# list of object file names (e.g., "tim2_new.c.o"), that have asm that needs FUNCTION_SYMBOL_LABEL = "glabel"
# to be patched. the respective c files (e.g. "tim2_new.c") will be compiled END_FUNCTION_SYMBOL_LABEL = "endlabel"
# in two steps: c -> asm, then asm -> obj. in between, the intermediate UNIQUE_TEXT_SECTION_DIRECTIVE = '.section .text,"ax",@progbits,unique,'
# asm will be passed to `tools/python/fix_asm_matching.py` for patching. INCLUDE_MACRO_INC_DIRECTIVE = '.include "macro.inc"'
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",
]
def get_compiler_command(command: str): 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] ee_compiler_dirname = next(os.walk(ee_dir))[1][0]
commands = { commands = {
"ee-gcc": compiler_dir / "bin" / "ee-gcc", #"ee-gcc": compiler_dir / "bin" / "ee-gcc",
"cc1": compiler_dir / "lib" / "gcc-lib" / "ee" / ee_compiler_dirname / "cc1", #"cc1": compiler_dir / "lib" / "gcc-lib" / "ee" / ee_compiler_dirname / "cc1",
"cc1plus": compiler_dir / "lib" / "gcc-lib" / "ee" / ee_compiler_dirname / "cc1plus", #"cc1plus": compiler_dir / "lib" / "gcc-lib" / "ee" / ee_compiler_dirname / "cc1plus",
"cpp": compiler_dir / "lib" / "gcc-lib" / "ee" / ee_compiler_dirname / "cpp", #"cpp": compiler_dir / "lib" / "gcc-lib" / "ee" / ee_compiler_dirname / "cpp",
"as": compiler_dir / "ee" / "bin" / "as", #"as": compiler_dir / "ee" / "bin" / "as",
} }
return commands[command] #return commands[command]
def make_compiler_cmd(config_dir: Path, src_path: Path, language: str): def make_compiler_cmd(config_dir: Path, src_path: Path, language: str):
rel_root = Path(os.path.relpath(ROOT, config_dir)) rel_root = Path(os.path.relpath(ROOT, config_dir))
tools_dir = rel_root / "tools" tools_dir = rel_root / "tools"
game_cc_dir = f"{tools_dir}/cc/{COMPILER}/bin" game_cc_dir = f"{tools_dir}/cc/{COMPILER}"
lib_cc_dir = f"{tools_dir}/cc/{COMPILER}/bin"
compiler_includes = f"-I{src_path.parent / 'src'} -I{src_path.parent / 'include'} -Iinclude -isystem include/sdk/ee -isystem include/gcc" compiler_includes = f"-I{src_path.parent / 'src'} -I{src_path.parent / 'include'} -Iinclude/sdk/ee"
assembler_includes = f"-Wa,-I{src_path.parent / 'include'} -Wa,-I{src_path.parent}" assembler_includes = f"-I{src_path.parent / 'include'} -I{src_path.parent}"
common_includes = f"{compiler_includes} {assembler_includes}" common_includes = f"{compiler_includes} {assembler_includes}"
game_compile_cmd = f"{game_cc_dir}/ee-gcc -c {common_includes} {COMPILER_FLAGS}" game_compile_cmd = f"{WIBO} {game_cc_dir}/mwccps2.exe -c {common_includes} {COMPILER_FLAGS}"
lib_compile_cmd = f"{lib_cc_dir}/ee-gcc -c -isystem include/{COMPILER} {common_includes} {COMPILER_FLAGS}"
return game_compile_cmd, lib_compile_cmd, common_includes return game_compile_cmd, common_includes
WIBO_VER = "0.6.4"
def exec_shell(command: list[str]) -> str: 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): 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: with open(config_dir / "permuter_settings.toml", "w") as f:
f.write( f.write(
f"""compiler_command = "{game_compile_cmd} -D__GNUC__" f"""compiler_command = "{game_compile_cmd} -D__GNUC__"
assembler_command = "{CROSS}as -march=r5900 -mabi=eabi -Iinclude" assembler_command = "{CROSS}as -march=r5900 -mabi=eabi -Iinclude"
compiler_type = "gcc" compiler_type = "mwcc"
[preserve_macros] [preserve_macros]
[decompme.compilers] [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" pre_elf_path = f"build/{basename}.elf"
src_path = Path(config["options"]["src_path"]) 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() 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) ninja = ninja_syntax.Writer(open(str(ROOT / config_dir / "build.ninja"), "w"), width=9999)
# Rules # 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( ninja.rule(
"as", "as",
@@ -223,7 +220,7 @@ def build_stuff(
# NOTE: Japanese strings are EUC-JP encoded!! # NOTE: Japanese strings are EUC-JP encoded!!
# We need to convert them from (-f) UTF-8 to (-t) EUC-JP while compiling, # We need to convert them from (-f) UTF-8 to (-t) EUC-JP while compiling,
# otherwise Japanese strings will be compiled wrong! # 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( 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"{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"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"{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( ninja.rule(
"cc", "cc",
description="cc $in", 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( ninja.rule(
@@ -251,22 +248,22 @@ def build_stuff(
command=( 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"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'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'{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 f"{CROSS}strip $out -N dummy-symbol-name" # ............................. 5) strip 'dummy-symbol-name' from object
), ),
) )
ninja.rule( #ninja.rule(
"libcc", # "libcc",
description="cc $in", # 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 && {ld}strip $out -N dummy-symbol-name",
) # )
ninja.rule( ninja.rule(
"ld", "ld",
description="link $out", description="link $out",
command=f"{CROSS}ld {ld_args}", command=f"{WIBO} {ld} {ld_args}",
) )
ninja.rule( ninja.rule(
@@ -278,7 +275,7 @@ def build_stuff(
ninja.rule( ninja.rule(
"elf", "elf",
description="elf $out", 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: 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): 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")
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: else:
build(entry.object_path, entry.src_paths, "cc") 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]): def make_asm(config_path: Path, config: dict[str, Any]):
""" """
Extracts assembly for each function into 'expected/asm/' subfolder. 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_obj_path = tmp_path / "obj"
tmp_asm_dir = tmp_path / "asm" 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"): for asm_file in tmp_asm_dir.rglob("*.c.s"):
asm_file_rel = asm_file.relative_to(tmp_path) 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 = tmp_obj_path / obj_file_rel.relative_to("obj")
obj_file.parent.mkdir(parents=True, exist_ok=True) obj_file.parent.mkdir(parents=True, exist_ok=True)
subprocess.run( 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"{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"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}", f"mips-linux-gnu-as -no-pad-sections -EL -march=5900 -mabi=eabi -I../include -o {obj_file_rel} {asm_file_rel}",
shell=True, shell=True,
cwd=tmp_path, 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}") 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(): def main():
class ArgsProtocol(Protocol): class ArgsProtocol(Protocol):
YAML_FILE: Path YAML_FILE: Path
@@ -622,22 +848,13 @@ def main():
) )
args = cast(ArgsProtocol, parser.parse_args()) 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() cwd = Path(os.getcwd()).resolve()
if not ROOT.samefile(cwd): if not ROOT.samefile(cwd):
print("ERROR: this script must be run from it's directory!") print("ERROR: this script must be run from it's directory!")
exit(1) exit(1)
compilerOptions["MWCCPS2"].value.bigAddendWorkaroundForMigratedFunctions = False
config = splat_load_yaml( config = splat_load_yaml(
[args.YAML_FILE], [args.YAML_FILE],
modes=["all"], modes=["all"],
@@ -648,6 +865,9 @@ def main():
basename = config["options"]["basename"] basename = config["options"]["basename"]
config_dir = Path(args.YAML_FILE).parent config_dir = Path(args.YAML_FILE).parent
compiler_dir = Path("tools") / "cc" / COMPILER
if basename not in LANGUAGES: if basename not in LANGUAGES:
supported_elfs = f"{set(f'{elf} ({lang})' for elf, lang in LANGUAGES.items())}".replace("'", "") supported_elfs = f"{set(f'{elf} ({lang})' for elf, lang in LANGUAGES.items())}".replace("'", "")
print(f"unsupported game ELF. Supported versions are: {supported_elfs}") 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 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" 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: # fix asset .incbin path from relative to root to relative to config dir:
# e.g., change: # e.g., change:
# .incbin "config/assets/name.section.bin" # .incbin "config/assets/name.section.bin"
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.