N64 エキサイトバイク64 メッセージコンバーター
何年振りかわかりませんが解析のために作っていたコンバーターをせっかくなので公開することにしました。
エキサイトバイク64のデータはROM上は圧縮されているようでそのままでは変換できないためエミュレーター上で実行した際のメモリ上に展開された 生データを変換対象とします。Project64のSavestateファイルの構造はPROJECT64のソースコード等を参照すると、
オフセット | サイズ | 内容 |
---|---|---|
00000000 | 4バイト | Magc Word = 0xC8A6D823 |
00000004 | 4バイト | RDRAMSize |
00000010 | 64バイト | カートリッジロムのみの場合 64byte ROM Header info from B0000000-B000003F ディスクありの場合 32byte ROM Header info from B0000000-B000001F 32byte DiskAddressID |
00000048 | ?? | 以下、データ NextVITimer, sizeof(NextVITimer) m_Reg.m_PROGRAM_COUNTER m_Reg.m_GPR, sizeof(int64_t) * 32); m_Reg.m_FPR, sizeof(int64_t) * 32); m_Reg.m_CP0, sizeof(uint32_t) * 32); m_Reg.m_FPCR, sizeof(uint32_t) * 32); m_Reg.m_HI, sizeof(int64_t)); m_Reg.m_LO, sizeof(int64_t)); m_Reg.m_RDRAM_Registers, sizeof(uint32_t) * 10); m_Reg.m_SigProcessor_Interface, sizeof(uint32_t) * 10); m_Reg.m_Display_ControlReg, sizeof(uint32_t) * 10); m_Reg.m_Mips_Interface, sizeof(uint32_t) * 4); m_Reg.m_Video_Interface, sizeof(uint32_t) * 14); m_Reg.m_Audio_Interface, sizeof(uint32_t) * 6); m_Reg.m_Peripheral_Interface, sizeof(uint32_t) * 13); m_Reg.m_RDRAM_Interface, sizeof(uint32_t) * 8); m_Reg.m_SerialInterface, sizeof(uint32_t) * 4); m_TLB.TlbEntry(0), sizeof(CTLB::TLB_ENTRY) * 32); m_MMU_VM.PifRam(), 0x40); m_MMU_VM.Rdram(), SaveRDRAMSize); m_MMU_VM.Dmem(), 0x1000); m_MMU_VM.Imem(), 0x1000); |
要は、最初の方にどのROMのStatesaveなのか識別と、後半にメモリ内容が入っていること、さらに比べてみるとわかりますが4バイトごとにデータが入れ替わっているという点に気を付けてプログラミングします。
2021/8/22
・公開