改造コード

バイナリ改造


基礎知識

2種類のメモリ

 セガサターンのメモリには「02メモリ」と「60メモリ」の二種類があり、それぞれ異なったデータが書き込まれている。
 現在掲載中のコードは全て60メモリ用なので、CEPを用いる際は(60)と記載されたベースアドレスに合わせること。
 またゲーム上にあるはずのデータが60メモリ上で見つからない場合、02メモリ内を探索してみると良いかもしれない。

データ構造

 以下はゲーム実行中の60メモリ上のデータ配列を示したものである。
 これらの中で適切なアドレスを探し、値を書き換えることによって改造が成立する。
アドレス(16進) 区分 備考
鋼鉄 作戦 セーブデータ
8000~EDFF(共通) 兵器登録コード
36F90~3A7CF 350D0~3890F 14~3853 部隊コード
3A7D4~3ABD3 38914~38D13 3858~3C57 索敵コード 索敵で見えているマスを記録
3AC1F~3B09E 38D5F~391DE 3CA3~4122 施設コード
3BC58~3BCAF 39D98~39DEF 4CDC~4D33 オプションコード
3BCB0~3BD27 39DF0~39E67 4D34~4DAB 陣営コード
3BD28~3BD87 39E68~39EC7 4DAC~4E0B オプションコード
 セーブデータには部隊コード~オプションコードまでのデータ配列がそのまま記録される。
 このセクションは鋼鉄・作戦でアドレスが異なるものの、一定量ずれているだけであって、データの並び自体は全く同じである。

 よって改造にあたっては、CEPやPAR(下記)の他にも、セーブデータをバイナリエディタ上で直接編集するという手段もある。
 (特に部隊インデックスの入れ替えはバイナリエディタを使わなければ厳しい)

コードの入力方法

 エミュレータの場合はCEP、実機の場合はPARを用いる。
 筆者がPARについて詳しくないため、これ以降の説明はCEP(PAR互換モード)を前提とする。
 なおPARの入力方法についてはこちらのページを参考にした。
CEP
(PAR互換モード)
PAR 効果(例は鋼鉄の旋風でのアドレスとする)
1バイト(8bit)書き換え 30XXXXXX 00YY 36XXXXXX 00YY アドレスXXXXXXをYYに変える
30037418 00FA 36037418 00FA 第1陣営空第1部隊の経験値を250にする
2バイト(16bit)書き換え 80XXXXXX ZZYY 16XXXXXX YYZZ アドレスXXXXXXをYYに、
アドレスXXXXXX+1をZZにする
※CEPの場合、YYZZではないことに注意。
80036F9D 1E14 16036F9D 141E 第1陣営司令部を座標X:20 Y:30に移動させる
繰り返し 5000XXYY 0000 直下一行のコードを、
アドレスYY間隔でXX回繰り返す
50005024 0000
30039C9A 00FA
第5陣営の訓練値をすべて250にする
(アドレス390CA、39CBE、39CE2、
・・・3A7B6までの計80個を250にする)

メモリの閲覧

CEPの「検索」タブにてフラグ消去ボタンを押すと、「編集」タブにてメモリ上のデータ配列を閲覧できる。
このデータ配列上でクリックすると、クリックした箇所から8バイト分を直接書き換えることができる。
また、「保存」ボタンで現在のメモリの状態をバイナリファイルで書き出すこともできる(ただしデータ欠損などの失敗も割と起こるので注意)。

値の検索

CEPの「検索」タブにて目的の値を入力して検索すると、その値が格納されているアドレスの一覧が表示される。
なお2バイト(16bit)の値を検索する場合、1バイト目と2バイト目を入れ換えて検索することに注意。

セーブデータの冒頭20(14h)バイトについて

基本的には弄らなくて良いが、作戦ファイルの場合セーブデータのゲーム上での順番が
記録日時(≠ファイル自体の更新日時)順となるため、順番を綺麗に揃えたいなら弄ってみるのもありだ。
(鋼鉄の場合はWORLD_AD_[番号].binの番号順に並ぶためシンプルに済む。・・・と思いきや違うことが判明したので後述)

またこれはワールドアドバンスド大戦略に限らず、サターン全般のセーブデータである程度共通する仕様のようだ。

(例)鋼鉄スタンダードのコロネット作戦のセーブデータ
35 33 34 36 30 33 30 31 30 35 00 00 70 9B 50 15 00 00 00 00
  • 35 33 34 36 30 33 30 31 30 35:ASCIIデータで「5346030105」を表す。この5346030105のうち、
  53:鋼鉄ではマップ番号(10進)、作戦ファイルではシナリオ番号(16進)となる(例:D3→瀬戸内海ウォーズ)。
    この番号を変更するとマップが変わる。ただしマップ番号以外のデータは以前のままのため、
    非常にチグハグなデータになる(1回試してみると面白い)。
  460301:46/3/1、つまりゲームシナリオ上の日時(ファイルの記録日時ではない)
  05:不明。鋼鉄では5の倍数(10進)?作戦ファイルでは常に00(バイナリで3030)になるみたい。

  • 11~12バイト目「0000」および17~20バイト目「00000000」:意味のないクッションデータと思われる

  • 70 9B 50 15:セーブデータの記録日時(2022/10/2 13:46を表す)
 Windows上の更新日時とは別。サターン本体orSSFの時計を現実時間に合わせていない場合は食い違う。
 鋼鉄の場合、セーブデータを作成した時のみ記録され、以降はいくらデータを上書きしても更新されない(違うマップを上書きした場合でもである)。
 なので普通に取り扱った場合、ゲーム上ではWORLD_AD_[番号].binの番号順に並ぶことになるが、あくまで実際はここの値の順である。
 作戦ファイルの場合はセーブ上書きの都度更新されるので、ゲーム上での順番が入れ替わる。

00000000の時:1980/0/0 0:00 ここからスタート。
1バイト目(70):下一桁が0か8しか記録されない(X0 or X8)。+8hで+1分、+10hで+2分。F8→31分。
        秒は記録されないが、もしされるとしたら+1hで+7.5秒か。
2バイト目(9B):+1hで+32分。+2hで1時間00分?(未検証) +10hで+8時間。
3バイト目(50):+1hで+4日。+8hで+1ヶ月(日の端数切捨)。+10hで+2ヶ月。
4バイト目(15):+1hで+2年(月の端数切捨)。2022現在は15h=21(1980年+2×21=2022年)。
        余談だがFFなら2492年なので、他のバイトと合わせると2493年末まで記録可能ということになる。
最終更新:2023年02月19日 19:55