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
・公開





戻る