スレッドの方に使い方を質問する方がいたので、
このプログラムの動作を調べてみた。
以降、ROMのヘッダが"無い"という前提で話を進める。
このプログラムの動作を調べてみた。
以降、ROMのヘッダが"無い"という前提で話を進める。
理解しておくべきROMのアドレス
002BA9-002BAA:メッセージアドレス(下位2Byte) 002BB0-002BB1:メッセージアドレス(上位2Byte) 015BB5-0165E6:メッセージオフセット群(3B*870、8メッセージ区切り) 0:3b:開始ビット 5b:アドレス 1:アドレス 2:アドレス 37175B-3B8702:メッセージデータ 3B8703-3BC76C:文字列データ(AC が区切り)
理解しておくべきDQ6のメッセージの仕組み
- "メッセージデータ"のアドレスは、"メッセージアドレス"+"メッセージオフセット"。ROM内でのそれぞれのアドレスは上記を参照。
- メッセージは8つで1グループになっており、全部で870グループある。
- 0x015BB5から始まる870個のオフセット群から、1グループ毎に1つのオフセットが与えられる。
- 同一グループ内では、[AC]か[AE]が区切りとなり、1つのメッセージの終わりを表す。
例
ああ[AC]い[AC]うう[AE]えええ[AC]お[AC]かか[AE]き[AC]く[AE]
↑で1グループということ。
「セリフ変更ツール」の動作
ROM読込
指定された"データアドレス"と"オフセットアドレス"に基づき、メッセージデータを復号、表示する。
※reedmeにExHiROM(0x600000以上のサイズ)は駄目と書いてあるが、実際0800番~0AFF番のメッセージが消失してしまう。
※"メッセージデータ"の末尾=ROMの末尾、という状況では読み込みに失敗する。そのときはROMの末尾に00を付け足してやれば、読込可能になる。
※reedmeにExHiROM(0x600000以上のサイズ)は駄目と書いてあるが、実際0800番~0AFF番のメッセージが消失してしまう。
※"メッセージデータ"の末尾=ROMの末尾、という状況では読み込みに失敗する。そのときはROMの末尾に00を付け足してやれば、読込可能になる。
ROM保存
既存のRomに上書き保存することが前提である。
「セリフ変更ツール」がファイルに書き込むデータは
"メッセージオフセット群"と"メッセージデータ"
だけなので、新規のファイルとして保存した場合、その他の領域は00のままとなり、Romの役目を果たさない。
「セリフ変更ツール」がファイルに書き込むデータは
"メッセージオフセット群"と"メッセージデータ"
だけなので、新規のファイルとして保存した場合、その他の領域は00のままとなり、Romの役目を果たさない。
保存時の特徴的な動作
メッセージが870個のグループに分かれていることは説明したが、
未改造のDQ6ではRomの容量を節約するため、グループ間に隙間は無い。
つまり、メッセージを元のものより短くすることは可能でも、長くすることはできないということ。
未改造のDQ6ではRomの容量を節約するため、グループ間に隙間は無い。
つまり、メッセージを元のものより短くすることは可能でも、長くすることはできないということ。
しかし「セリフ変更ツール」は、保存時にグループとグループの間に幾らかの隙間を持たせて保存をする。
(隙間部分は00で埋められている。)
これは、メッセージを元のものより長くするための配慮だと思われる。
(隙間部分は00で埋められている。)
これは、メッセージを元のものより長くするための配慮だと思われる。
だが、グループ間に隙間ができた=グループ一つひとつのサイズが大きくなったのと同じこと。
したがって"メッセージデータ"そのもののサイズも大きくなってしまう。
したがって"メッセージデータ"そのもののサイズも大きくなってしまう。
これをそのまま上書き保存してしまっては、
[37175B-3B8702:メッセージデータ]の範囲から溢れ出し[3B8703-3BC76C:文字列データ]以降を破壊してしまうことになる。
[37175B-3B8702:メッセージデータ]の範囲から溢れ出し[3B8703-3BC76C:文字列データ]以降を破壊してしまうことになる。
では、どのように保存すれば良いのか?
正しい保存の仕方
読込と編集が済んだ後、
保存するタイミングで「セリフ変更ツール」の"データアドレス"を0x37175B→0x4"1"0000に変更すればよい。※0x4"0"0000ではない。
こうすることで、"メッセージデータ"をROMの末尾に持っていくことが出来、内部のデータを破壊せずに済む。
ちなみに、テストをしたいなら、
保存するタイミングで「セリフ変更ツール」の"データアドレス"を0x37175B→0x4"1"0000に変更すればよい。※0x4"0"0000ではない。
こうすることで、"メッセージデータ"をROMの末尾に持っていくことが出来、内部のデータを破壊せずに済む。
ちなみに、テストをしたいなら、
0064、[D9]あら? もう 目がさめた?[AD]あまり ねむれなかったのかしら?[AC]
を別の文章に変えれば、ゲームを始めてすぐ確認できる。
※以降は、読込のタイミングで"データアドレス"を0x37175B→0x410000に変更すれば、ROM末尾の"メッセージデータ"を編集することができる。
※"メッセージデータ"をROM末尾に移動する際、1B2C番のメッセージの
[AF]子ホのれなのれま(中略)[AC]
の部分を
[AF][AC]
に変更しておくと良い。
※何故かは分からないが、0x410000を指定して保存すると、メッセージデータは0x4100"00"ではなく0x4100"10"に書き込まれる。
しかし、"メッセージオフセット群"にはそれに合わせてか"0x10"のぶん大きな値が書き込まれるので問題は無い。
0x4100"10"に書き込まれたデータを手動で0x4100"00"にずらすと、メッセージがおかしくなるので注意。
しかし、"メッセージオフセット群"にはそれに合わせてか"0x10"のぶん大きな値が書き込まれるので問題は無い。
0x4100"10"に書き込まれたデータを手動で0x4100"00"にずらすと、メッセージがおかしくなるので注意。
次に、ROM容量0x400000以降のアドレスを使用するため、ROMをHiROMからExHiROMへと拡張する必要がある。
ROM拡張
「セリフ変更ツール」を"使用する前"に
「Lunar Expand」というツールを使って"48 Mbit ExHiROM (6 MB)"に拡張し、「セリフ変更ツール」で扱える様、0x410000以降を削除する。という手順でも良いが、
ここでは、「セリフ変更ツール」を"使用した後"に手動で拡張する方法を教える。
「Lunar Expand」というツールを使って"48 Mbit ExHiROM (6 MB)"に拡張し、「セリフ変更ツール」で扱える様、0x410000以降を削除する。という手順でも良いが、
ここでは、「セリフ変更ツール」を"使用した後"に手動で拡張する方法を教える。
stirling等のバイナリエディタで、メッセージを変更したROMを読み込む。
- 0x00FFD5を31→35に変更。
- 0x00FFD7を0C→0Dに変更。
- 0x008000-0x00FFFFを選択し、"コピー"
- 0x408000-0x40FFFFを選択し、貼り付け
この処理により、ROMがExHiROMに変更される。
この時点で、
この時点で、
0x3FFFF0列がFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0x400000列が00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x407FF0列が00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x408000列が0x008000列と同じ。
0x40FFD5と0x00FFD5が35 0x40FFD7と0x00FFD7が0D
0x40FFF0列が0x00FFF0列と同じ。 0x410000列が00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x410010列が"メッセージデータ"の先頭
以上の状態でなければ、何かが間違っている。
メッセージアドレス変更
次に、0x002BA9-0x002BAAと0x002BB0を書き換え、"メッセージアドレス"を0x4100"00"に変更する必要がある。
ExHiROMの場合、ROMのアドレスとSNESのアドレスの対応は、
ExHiROMの場合、ROMのアドレスとSNESのアドレスの対応は、
00:0000-3F:FFFF→C0:0000-FF:FFFF 40:0000-7D:FFFF→40:0000-7D:FFFF
なので、
- 0x002BA9を5B→"00"に変更。※"10"では無いことに注意。
- 0x002BAAを17→00に変更。
- 0x002BB0をF7→41に変更。
最後に
最後の仕上げとして、0x5FFFFFまでの足りない分を埋めないと、誤作動が起こる場合があるようだ。
"メッセージデータ"の終端から0x5FFFFFまでを00で埋めておこう。
※こうすると、当然サイズオーバーにより「セリフ変更ツール」で正しく読込めなくなる。再びメッセージを編集したいなら、バイナリエディタで一時的に0x5FFFFFのみを削除すると良い。
"メッセージデータ"の終端から0x5FFFFFまでを00で埋めておこう。
※こうすると、当然サイズオーバーにより「セリフ変更ツール」で正しく読込めなくなる。再びメッセージを編集したいなら、バイナリエディタで一時的に0x5FFFFFのみを削除すると良い。