3部構成で、ここは第3部です。
・第1部:バックアップ領域を増やす-天の声2を改造
・第2部:パソコンと共有-セーブデータをPCとやり取りする
・第3部:BRAMの考察-セーブデータの構造を知る
.
天の声2のSRAM増量化、パソコンとのデータやり取りが無事終わり、バックアップしたデータがそのままエミュレータで使えることも確認できました。
一通り不都合無く使えるのですが、折角なので、PCエンジンのセーブデータについて少し知識を入れておく為と、一つのファイルに複数タイトルのデータが入っていた場合の分割の仕方を書きます。
.
第3部:BRAMの考察
PCエンジンのエミュレータ「Ootake」は1つのbramファイルに複数タイトルのデータがあってもちゃんと読み込んでくれますが、他はどうかわからないのと、管理方法としてタイトル一つ一つ分けておいたほうがわかりやすい事もあるかな、ということで、少しだけbramについてお勉強。
(実は書く前に一つずつ分けないとエミュで使えないと思って調べていた)
BRAMのデータ構造は上画像のようになってます。
セーブデータの最初のセグメントが0x8000、最後が0x8800となっていて、&h00~16ByteはBankHeaderといってファイルの先頭に必ずあります。
続くEntryHeaderから各タイトルのセーブデータとなります。
複数タイトルのデータがある場合はどうやって格納されているのかですが、EntryHeaderの先頭2Byte(上の絵で言うと青色の箇所)がEntryHeaderの先頭から見たセーブデータのサイズになります。
上のサイズ情報をそのまま読むと$2F03になってしまいますが、実際には表記が前後反転しているので、正しくは$032Fとなります。
次のデータがある場合は次の位置(ポインタ)から更にEntryHeaderから・・・といった格納になっています。
下はネクロスの要塞のセーブデータが2つ入ってますが、最初のセーブデータのサイズを読むと0x59Byte、EntryHeader先頭から選択するとちゃんと合っていることがわかります。
上の画像はネクロスの要塞のデータですが、一つのタイトルで複数セーブできるようになっている場合、セーブデータとしては複数タイトル分作られる形になります。
ので、例えばデータの並び的に、ネクロス3→桃鉄2→ネクロス1→ネクロス2といったような並びもありえます。
で、複数のデータが入っていて一つずつに分けたい場合、BankHeaderの&h06からの2Byteも書き換えなければいけない。
これは、一番上のヘッダー情報画像にも書いてありますが、$8000+$10(BankHeaderサイズ)+全セーブデータ合計が書かれています(前後反転表記)
例えば一番上のヘッダー情報画像では桃鉄2のデータが一つなので、$8000+$10+$32F=$833F、表記としては$3F83となります。
ネクロスのデータ画像では2つのデータがあるので、$8000+$10+$59+$59=$80C2、前後入れ替えて$C280となります。
要するに、データを一つに分けて管理したい時は、
・BankHeaderを配置して、&h06からの2Byteを後で変更する
・EntryHeaderに書かれたサイズを&h10から配置する
・余ったスペースは全て$00埋めでファイルサイズを2KByteにする
といった作業が必要ということになります。
こうしておけば、実機に一つずつデータを持っていけるので、他のデータを壊す心配がないです。
データ構造的には難しくないので、必要ならツールを作ったほうが早いかもしれません。
.
ということで、bramの構造も少しは理解できました。
全てが上手く分割して問題なく使えるか?というのは実際に使ってみないとわからないところではありますが・・・
一つに分けるのではなく、逆に結合することも可能ですので、同タイトルのデータを一つに纏めて並べ替える、といったことも有効な手段かな、と。
とりあえず、3部構成でPCエンジンのセーブデータについて纏める事ができた(?)と思うことにして終わりにします。