前回の記事で夢工場ドキドキパニックでセーブデータを探したときのメモ。
<セーブデータの調査手順>
・ディスク(夢工場どきどきパニック)を読み出したときのメッセージを確認。(A面とB面を読み込み)
・確認したアドレスと読み込み時のデータ近辺を探す。ブロック番号03で始まる16バイトにファイル名などが含まれる場所を探し、その次の04で始まる場所がデータの中身。
結果、下の部分にセーブデータあることが判明。
・該当データアドレス+16バイト(FDSヘッダ分)+1バイト(ブロック番号分)から先がファイル上のセーブデータの実際のスタートアドレス。( 0xCC80+0x0010+0x0001=0xCC91)
※今回はディスクA面にあったからこの計算でOK。ディスクB面以降ならディスクサイズ分足す必要がある。
・Block 4がCC80-CC86の7バイトなので、ブロック番号1バイトを除いた6バイトがデータ部分。結果、アドレスCC91から6バイトがデータ部分となる。
・セーブデータ部分の6バイトを直接バイナリーエディタで書き換えればFDSファイル上のセーブデータ削除も可能。
・チートコードは、ソフト側のCRCがセーブデータによって変わるかもしれないので、自分で作ったものは他のソフトでは動かないか、チートコード内のCRCの書き換えが必要と思われる。なので、今回はあえてIPSパッチ作成。
・IPSパッチの作成
0xCC91から6バイトを00で埋めたい場合のIPSパッチ。
・IPSファイルフォーマット。
先頭、データ部、最後の3ブロックに分かれている。データ部は繰り返し可。
・先頭:"PATCH"の文字(50 41 54 43 48)
・最後:"EOF"の文字(45 4F 46)
・データ部:
開始アドレス(3バイト)
長さ(2バイト)
データ(長さで指定したバイト数)
上記の例だと以下の場所。
50 41 54 43 48・・・PATCHの文字
00 CC 91・・・開始アドレス
00 06・・・長さ
00 00 00 00 00 00・・・データ
45 4F 46・・・EOFの文字
データ部は複数繰り返し可能。
・データ部の他の記述法(同一文字で繰り返し埋める場合)、未検証。
データ部(以下の8バイトで1セット)
開始アドレス(3バイト)
繰り返し指定(2バイト、”00 00”固定)
長さ(2バイト、繰り返したい長さ)
データ(1バイト、繰り返す値)
その他、レトロフリークのパッチ機能に何らかのバグがある。
(原因未特定。サイズ?アドレスかぶり?V2.5で直っているか不明。)
以上。
<セーブデータの調査手順>
・ディスク(夢工場どきどきパニック)を読み出したときのメッセージを確認。(A面とB面を読み込み)
・できあがったFDSファイルファイルをバイナリデータで開き、それっぽい文字列(SAVE)で検索。アドレス確認。Reading...Block 1, 0000-0037: Disk 1 side 1Block 2, 0038-0039: 7 filesBlock 3, 003A-0049: File 0, NT @ 2800(E0)Block 4, 004A-012A: dataBlock 3, 012B-013A: File 1, PRG @ 6000(600)Block 4, 013B-073B: dataBlock 3, 073C-074B: File 2, PRG @ 6000(8000)Block 4, 074C-874C: dataBlock 3, 874D-875C: File 3, PRG @ B800(1900)Block 4, 875D-A05D: dataBlock 3, A05E-A06D: File 4, CHR @ 0(1FF0)Block 4, A06E-C05E: dataBlock 3, C05F-C06E: File 5, CHR @ E00(C00)Block 4, C06F-CC6F: dataBlock 3, CC70-CC7F: File 6, PRG @ 6600(6)Block 4, CC80-CC86: data7 files readReading...Block 1, 0000-0037: Disk 1 side 2Block 2, 0038-0039: 19 filesBlock 3, 003A-0049: File 0, PRG @ 6000(5FF)Block 4, 004A-0649: dataBlock 3, 064A-0659: File 1, PRG @ BF00(1200)Block 4, 065A-185A: dataBlock 3, 185B-186A: File 2, PRG @ BF00(1200)Block 4, 186B-2A6B: dataBlock 3, 2A6C-2A7B: File 3, PRG @ BF00(1200)Block 4, 2A7C-3C7C: dataBlock 3, 3C7D-3C8C: File 4, PRG @ BF00(1200)Block 4, 3C8D-4E8D: dataBlock 3, 4E8E-4E9D: File 5, PRG @ BF00(1200)Block 4, 4E9E-609E: dataBlock 3, 609F-60AE: File 6, PRG @ BF00(1200)Block 4, 60AF-72AF: dataBlock 3, 72B0-72BF: File 7, PRG @ BF00(1200)Block 4, 72C0-84C0: dataBlock 3, 84C1-84D0: File 8, PRG @ C100(600)Block 4, 84D1-8AD1: dataBlock 3, 8AD2-8AE1: File 9, PRG @ D679(214)Block 4, 8AE2-8CF6: dataBlock 3, 8CF7-8D06: File 10, CHR @ 0(340)Block 4, 8D07-9047: dataBlock 3, 9048-9057: File 11, CHR @ 0(340)Block 4, 9058-9398: dataBlock 3, 9399-93A8: File 12, CHR @ 0(340)Block 4, 93A9-96E9: dataBlock 3, 96EA-96F9: File 13, CHR @ 0(340)Block 4, 96FA-9A3A: dataBlock 3, 9A3B-9A4A: File 14, CHR @ 1800(200)Block 4, 9A4B-9C4B: dataBlock 3, 9C4C-9C5B: File 15, CHR @ E00(A00)Block 4, 9C5C-A65C: dataBlock 3, A65D-A66C: File 16, CHR @ E00(A00)Block 4, A66D-B06D: dataBlock 3, B06E-B07D: File 17, CHR @ E00(A00)Block 4, B07E-BA7E: dataBlock 3, BA7F-BA8E: File 18, CHR @ E00(A00)Block 4, BA8F-C48F: dataBlock 3, C490-C49F: File 19, PRG @ 6600(6)Block 4, C4A0-C4A6: data20 files read
・確認したアドレスと読み込み時のデータ近辺を探す。ブロック番号03で始まる16バイトにファイル名などが含まれる場所を探し、その次の04で始まる場所がデータの中身。
結果、下の部分にセーブデータあることが判明。
Block 4, CC80-CC86: data
・該当データアドレス+16バイト(FDSヘッダ分)+1バイト(ブロック番号分)から先がファイル上のセーブデータの実際のスタートアドレス。( 0xCC80+0x0010+0x0001=0xCC91)
※今回はディスクA面にあったからこの計算でOK。ディスクB面以降ならディスクサイズ分足す必要がある。
・Block 4がCC80-CC86の7バイトなので、ブロック番号1バイトを除いた6バイトがデータ部分。結果、アドレスCC91から6バイトがデータ部分となる。
・セーブデータ部分の6バイトを直接バイナリーエディタで書き換えればFDSファイル上のセーブデータ削除も可能。
・チートコードは、ソフト側のCRCがセーブデータによって変わるかもしれないので、自分で作ったものは他のソフトでは動かないか、チートコード内のCRCの書き換えが必要と思われる。なので、今回はあえてIPSパッチ作成。
・IPSパッチの作成
0xCC91から6バイトを00で埋めたい場合のIPSパッチ。
・IPSファイルフォーマット。
先頭、データ部、最後の3ブロックに分かれている。データ部は繰り返し可。
・先頭:"PATCH"の文字(50 41 54 43 48)
・最後:"EOF"の文字(45 4F 46)
・データ部:
開始アドレス(3バイト)
長さ(2バイト)
データ(長さで指定したバイト数)
上記の例だと以下の場所。
50 41 54 43 48・・・PATCHの文字
00 CC 91・・・開始アドレス
00 06・・・長さ
00 00 00 00 00 00・・・データ
45 4F 46・・・EOFの文字
データ部は複数繰り返し可能。
・データ部の他の記述法(同一文字で繰り返し埋める場合)、未検証。
データ部(以下の8バイトで1セット)
開始アドレス(3バイト)
繰り返し指定(2バイト、”00 00”固定)
長さ(2バイト、繰り返したい長さ)
データ(1バイト、繰り返す値)
その他、レトロフリークのパッチ機能に何らかのバグがある。
(原因未特定。サイズ?アドレスかぶり?V2.5で直っているか不明。)
以上。