SFCGENEditor Readme

ver1.4.2 2022-12-05更新

■ 0.はじめに

このツールはSFC(SNES)のROMを読み込んで内容を参照、変更、保存することを目的としたものです。ROMの内容を一部ではなく全部そのままメモリ上に展開するのでそれなりにメモリ量を必要とします(ROMの最大容量はせいぜい8MBなので近年のPCのメモリ量ならそれほど問題にならないと思いますが)。情報を公開してくれた先人の努力に感謝します。ver0.7.0より、プラグイン方式を導入し、各ROM固有の部分(主にSFC版DQ3,6)をプラグインとして切り出し、共通部分から分離しています。これにより、汎用性、固有性の両方を確保したまま拡張することが可能になりました。このreadmeは本体部分の説明を対象にしています。

万人が使うものでもないと思うので、前提条件を満たしていない場合の動作やエラー発生時のハンドリングはあまり考えていません。現状このツールできることは以下のとおりです。

  • 固定長データ部分の参照・変更・ROM中の場所移動
  • 引数情報を加味したSR(サブルーチン、プログラム)部分のリアルタイム?逆アセンブル,SRからコールしている別のSRへの1クリックジャンプ,SRアドレスのリストの指すSRの逆アセンブル、SRの編集
  • ROM中のデータ・SRの位置の一覧

本ツールを使用して発生したいかなる損害についても一切責任を負いません。またROMの入手方法についての質問も一切お答えできませんのでご了承ください。

本ソフトウェアはフリーウェアですが、ソースコードは公開しません。

2次配布は禁止とします

■ 1.前提条件
.NET Framework ランタイム4.0以降を必要とします。Windows7,10(32bit, 64bit)で動作することを確認しています。Windows8.xでの動作は確認していません。ヘッダーなしのROMのみ対応しています。
■ 2.インストール方法
適当なフォルダに解凍してSFCGENEditor.exeを起動してください(各種ROM用の専用プラグインはPluginsフォルダに置いて下さい。PluginBase.dllはPluginsフォルダに置く必要はありません。)。レジストリを使わないのでアンインストールはフォルダごと消すだけでOKです。

2-1)モジュール構成
SFCGENEditor.exe
PluginBase.dll
Be.Windows.Forms.HexBox_Custom.dll(バイナリエディタコントロール用)
Plugins(フォルダ)
プラグイン用DLL

起動時に起動したカレントディレクトリのSettingsフォルダの下にあるRomMap.xml、ShortCut.xmlとその中のPDTablesフォルダの中のファイル(PreDefineTable)を読みます。SFCGENEditor.iniもカレントディレクトリのファイルを読みます。

例)SFCGENEditor.exeをC:Program FilesSFCGENEditorフォルダに置き、ゲームX、ゲームYのSettingsファイルをC:GameX, C:GameYに配置した場合

C:Program FilesSFCGENEditor
-SFCGENEditor.exe (Aとする)
-PluinBase.dll(同B)
-他
-Plugins
-各種プラグインDLL(同C)

C:GameX
-Settings (同P)
-SFCGENEDitor.ini (同Q)
-SFCGENEDitor.exe(A)へのショートカット(同X)

C:GameY
-Settings (同R)
-SFCGENEDitor.ini (同S)
-SFCGENEDitor.exe(A)へのショートカット(同Y)

C:GameA、C:GameBにショートカットファイル(X),(Y)を置き、これらをダブルクリックすることで
Xをダブルクリックした場合はP,Qの設定を使って、Yをダブルクリックした場合はR,Sの設定を使ってプログラムが起動します。
プラグインはBもしくはCのものが使用されます。
また、「ROMを開く」を選択した場合に開くファイルダイアログの初期ディレクトリはショートカットのあるフォルダになるので、ここにROMイメージを入れておけばゲームごとの管理がそれぞれのフォルダで完結します。

■ 3.基本コンセプト
RomMap.xmlには、対象のROM名、ROM上のアドレスのどこからどこまでが何を表すのか、その内訳はどうなっているのか、それを画面にどう表示するのかについての情報をXMLフォーマットで記述します。SFCGENEditor.exeは対象のROM名を持つプラグインをpluginsフォルダからロードします。読み込むROMファイル中に記述されているROM名はチェックしません。(パッチ製作者が変えている可能性があるため)

ShortCut.xmlには、ショートカットキーを割り当てる項目とそのキーの情報をXMLフォーマットで記述します。

PreDefineTableはデータを画面に表示する場合に人間に見やすい情報に変換するための情報を1テーブル1ファイルに記述します(変更の仕方については後述します)。ROMファイルを読み込んだときに、これらの情報に従ってROMを解析し、人間に見やすい情報に変換します。

読み込んだROMはバイナリ配列として内部で保持し、ツール上での変更をすぐさまこの配列に反映します。ROM保存時にはこのバイナリ配列をファイルにそのまま書き出すだけです。

※デフォルトのSettingsフォルダの中身ははSFC版DQ3用のものです。SettingsDQ3_ExtendedはSFC版DQ3職人用拡張パッチ(通称DQ3 extended ver1.44以降 http://dqnbinary.jp.land.to/cgi-bin/img/457.zip)用のファイルです。パッチ対応のROMを編集したい場合は、SettingsDQ3_ExtendedをSettingsにリネームして使用してください。

※SettingsDQ6はSFC版DQ6用のものです。DQ6のROMを読み込むときはSettingsにリネームしてからSFCGENEditorを起動してください。

■ 4.使い方
起動するとペイン(枠?)を3つ持ったウィンドウが表示されるはずです。


左ペイン(①)がツリービューペイン、右上ペイン(②)をデータペイン、右下(③)を追加情報ペインと呼ぶことにします。

4-1) ツリービューペイン

ROMの内容をツリー構造で表示します。ツリー構造自体はRomMap.xmlに記述されているので変更可能です。見たいデータをクリックするとデータペインに解析された状態でデータが表示されます。一番下に「ROM索引」というノードがあります。ここをクリックするとROM内の情報の所在がデータペインに表示されます。

4-2) データペイン

RomMap.xmlの設定によって3種類の表示ができます。

4-2-1) データ編集モード

基本はBNE2などと同様に解析結果を行列の状態で展開します。その場で値を変更できます。(セルのダブルクリックもしくはF2で編集開始です F2のほうが使いやすいはず。)
16進表記のデータは編集時に先頭に「$」(RomMap.xmlのHexPrefixで指定した文字列)が付いて、16進数で編集できるようになりました。
入力可能な範囲外の入力の場合は編集を受け付けないようになりました。(例:0-63の範囲なのに100を入力した場合など)固定長データに対し、レコード途中に複数行まとめて削除/挿入できるようにしました。処理したいレコードにフォーカスを移動し、右クリックでメニューを表示してください。

4-2-2)画像表示モード

画像の格納方法はROMごとに異なるため、対応は各プラグインで行うことになります。

4-2-3)SR編集モード

SR(SubRoutine,プログラムのこと)を逆アセンブルした結果を表示します。別のSRをコールしている行をダブルクリックするとそのSRにジャンプします。$FCの場合はジャンプしたいSRのインデックスを入力するウィンドウが出るので範囲内の数値を入れるとそのSRにジャンプします。Valsの列で編集します。半角スペースで区切って2文字ずつ16進で入力してください。変更を確定するとその場で再度逆アセンブリを行い、結果を表示します。SRの長さが増える場合は後ろに十分な空き領域が必要です。別のSRをコールしている行のValsの列をダブルクリックしてもコール先のSRに飛ばず、編集モードに移行するだけにしました。別のSRにジャンプしたい場合はValsの列以外をダブルクリックしてください。2文字ずつ区切らなくても入力できるようにしました。2文字以上で入力した場合はリトルエンディアン方式で変換されます。分岐命令、ジャンプ命令に対して、ジャンプ先のチェックをするようにしました。ジャンプ先がSR定義外の場合は背景色を薄青、ジャンプ先がSR内だが不正なアドレス(例:22 xx xx xxの2バイト目にジャンプなど)の場合は赤、それ以外の未検証の場合は薄灰で表示するようにし、ケアレスミスによるバグを見つけやすいようにしました。複数行(1行だけでも可・離れた複数行も可)を選択した状態で右クリックすると「選択行を削除」メニューが表示され、一度に複数行を削除できるようにしました。

4-3)追加情報ペイン

データ表示モードの場合に現在選択している行のバイナリイメージを表示します。表示だけです。SR編集モードの場合はSR内で呼んでいる別のSRのリストを引数付きで表示します。

■ 5.メニューについて
5-1)「ファイル」メニュー下

※画像中のメニューをクリックすると個別の説明にジャンプします。

ROMを開く

ROMファイルを開いてメモリ中に展開します。本プログラムで行う変更はすべてメモリ中のROMイメージに対して行います。ヘッダの有無のチェックはしないので、事前にヘッダは削ってください。ファイルを選択する際に「読み取り専用で開く」にチェックを入れるとROMに対する変更が一切できない状態になります。うっかり触って変えてしまいたくない場合に使用します。

読み取り専用モードは次回「ROMを開く」で再度ROMファイルを読みなおす際にリセットされます。読取り専用モードでもデータ、SRの定義、変更、削除(定義のみ)は行えます。

ROMを保存

現在メモリ中にあるROMイメージをファイルに保存します。

ROMを閉じる

現在メモリ中にあるROMイメージを捨てます。

ROM基本情報を編集

ROM名、チェックサムを編集できます。

チェックサムの計算が(一応)正しくできるようになったので、現在のチェックサムを計算して表示する「チェックサム計算」、計算したチェックサムを適用する「チェックサム変更」ボタンを追加しました。チェックサムの計算ルールは4MB未満は1バイトずつ加算、4MB以降は2倍して加算した下位2バイトです。この計算ルールで一応SNES9Xのチェックサム計算と一致しているようですが、これ以外のルールが存在する場合は対応していません。

「ROM保存時にチェックサムを自動調整」にチェックを入れるとROM保存時に自動でチェックサムを調整するようにします。

外部バイナリファイルをインポート

指定したファイルをバイナリ形式で読み込み、指定のアドレスから上書き(置き換え)します。開始アドレス、終了アドレスがROMの範囲外だった場合にはインポートしません。

インポートするファイルの中の一部を範囲指定してインポートできるようにしました(上書きを開始するアドレスを指定した後に全部をインポートするか範囲指定するかを選択するダイアログを表示するようにしました)。従来通りファイル全部をインポートすることもできます。

PDTablesフォルダの下のファイルの再読み込み

PDTablesフォルダの下のcsvファイルを再読み込みします。今まではPDTablesフォルダの内容は起動時にしか読み込まないため、PDTables以下のファイルを変更した場合はプログラムを再起動する必要がありましたが変更後このメニューを選ぶことで不要になりました。

RomMap.xml情報を編集

RomMap.xmlの基本情報(対象ROM名、ROMサイズ、コメント等)を編集できます。ROMをロードしている間は対象ROM名、ROMサイズは変更できません(変更するとプラグインも変わる可能性があるため)。また、プログラム起動時にRomMap.xmlがSettingsフォルダの下に存在しない場合、このダイアログがまず表示され、基本情報を入力することを要求されます。これにより、0からRomMap.xmlをこのプログラム上で定義できるようになりました。

RomMap.xml再読み込み

RomMap.xmlファイルを再度読み込み、その情報に従ってメモリ中のROMイメージを再解析します。

RomMap.xmlを保存

その時点でのRomMap情報をファイルに保存します。読み込んだ元のRomMap.xml中のコメントは先頭にあるもののみ復元されます。また、その時点でSettingsフォルダにあるRomMap.xmlをバックアップすることも可能です(保存時に聞いてくる)。バックアップすると、元のファイルは「RomMapYYYYMMDDHHNN.xml」にリネームされます。同じファイル名が既に存在する場合は消してリネームします。

終了

プログラムを終了します。終了時にメモリ中のROMイメージ、RomMapが未保存状態の場合は保存するか確認します。

5-2)「編集」メニュー下

※画像中のメニューをクリックすると個別の説明にジャンプします。

バイナリパターン検索

16進文字列をスペース区切りで指定するとROM中をそのパターンで検索し該当する箇所をリストアップします。基本的にはStirlingの検索機能と同じですが、検索範囲や「データ定義のみ」「プログラムのみ」「空(未定義部分)も検索する」の指定ができます。パターンとして指定できるのは32バイト分で表示される検索結果は最大100件までです。また、この機能を利用してプログラム逆アセンブル内容を表示中に右クリックで「このSRをコールしている場所を検索」メニューを追加してあります。プログラムの定義状態(JSRかJSLか)に応じて検索範囲を決定し、このダイアログを表示し検索を行います。

行ジャンプ

指定した行にスクロールします。16進入力も可能です。

アドレスジャンプ

指定したアドレス近辺のノードにジャンプします。ツリービューペインにフォーカスがある場合は指定アドレスに一番近いノードにフォーカスを移動、ROM索引表示中にROM索引のデータビューペインにフォーカスがある場合は指定アドレスに一番近いレコードにフォーカスを移動します。

アドレス早引き

アドレスを入力するとそのアドレスから始まるのが何を意味するのか(RomMapに定義されていれば)を返します。

データノード管理

ノード「データ」の下の情報を管理します。見出しだけのノードの新規定義、削除、移動、名称変更、ROM上のデータの新規定義、削除、移動、変更を行うことができます。

ROM内移動

ROM索引の内容がデータペインに表示されているときのみ使用可能です。移動したい行を選択してこのメニューを選択すると移動先のアドレスを入力するように求められます。移動先に十分な空きがあれば移動できますが、移動先が単に未解析のために「空き」と表示されていても移動できてしまうので、本当に空いていると確認できる場所にのみ移動してください。また、移動したデータを参照している部分の変更は自動では行いません。移動前の領域は0xFFで初期化されます。

このテーブルの定義を変更

現在参照しているテーブルの定義を変更します。

クリップボードのデータをセルにコピー

固定長データを参照中に、現在クリップボードにあるタブ区切り文字列、カンマ区切り文字列(CSV)を現在のセルを起点に一括コピーします。Excelなどで値を操作した後書き戻したい、というような場合に便利です。ドロップダウンコンボボックスになっているセルに対しては選択肢のキャプションが一致していれば正しくコピーできます。Undo機能が無いので、コピー後「やっぱやめたい」という場合に元に戻す手段がありませんので、作業前にバックアップをとっておく、など気を払ってください(作者的には、それほど頻繁には使用しないがあると作業が楽になる局面がある、という感じの実装意図です)。

このテーブルのデータを再読み込み

現在ツリービューペインで選択している固定長データをバイナリ情報から再度読み込みます。
フィールドにSRの開始アドレスが含まれる場合、それらの逆アセンブルも行います。

レコード数を変更

現在フォーカスのある項目がデータ型、アドレスである場合には配列の数を変更できます。レコード数を増やす場合は後ろにその分の空き領域が必要です。

レコードサイズを変更

現在フォーカスのある項目がデータ型、アドレスである場合には1レコードのサイズを変更できます。サイズ変更に伴うデータのズレは自動で調整されます。レコードサイズを増やす場合は後ろにその分の空き領域が必要です。

指定レコードのデータをコピー

固定長データに対し、同一テーブル内の別のレコードを範囲指定でコピーします。

SRを新規に定義、変更

SRの定義を追加します。定義を追加する場所はすでに開始位置として他で定義されているアドレス以外はどこでも可能です。レジスタ(A,X,Y)の場合はスタートバイトの列にA,X,Yと記述してください。それ以外の場合(SRコールの後の数バイトを引数とする場合)はスタートバイトを16進(0xXX,$XXなど)で記述してください。

SR定義情報を削除

SRの定義を変更します。ツリービューで対象のSRのノードを選択しておくか、ROM索引上で対象のSRのレコードを選択しておくことでそのSRの定義情報を削除できます。

このSRをコールしている箇所を検索

このSRをコールしている箇所をバイナリパターン検索を使用して検索します。SRの定義によって同バンク内かROM中全部を検索するかが変わります。

バイナリエディタ上で編集


その時点でのROMイメージをバイナリエディタ上で編集できます。バイナリエディタコントロールはBe.HexEditor(http://hexbox.sourceforge.net/)をカスタムしStirlingライクなカーソル移動ができるようにした自前ビルド版を使用します。あくまで補助という位置づけなので豪華機能にする予定はありません。検索、Undoくらいは実装したいですが「あくまで補助」なのであまり期待はしないでください。

画像をBMP形式で保存

現在表示している画像をファイル名を指定してビットマップ形式(24ビット)で保存します。

5-3)「表示」メニュー下

※画像中のメニューをクリックすると個別の説明にジャンプします。

m,xフラグ状態を表示

プログラムを逆アセンブルして表示している場合のみ、各行のm,xフラグの状態の表示をon/offで切り替えることができます。読み取り専用なので変更はできません。

5-4)「移動」メニュー下

※画像中のメニューをクリックすると個別の説明にジャンプします。

前へ,次へ

1つ前(後)に見ていた情報に移動します。Webブラウザの前へ,次への感覚で使ってください。履歴は最新の30個まで保存しています。履歴の数は変更できません。

ROM索引

ROM索引の画面に移動します。

ROM索引中の現在アドレス

現在表示している内容のROM索引中のアドレス位置にジャンプします。

ツリービュー

ツリービューペインにフォーカスを移動します。

データビュー

データペインにフォーカスを移動します(画像表示モードの場合を除く)。

追加情報

追加情報ペインにフォーカスを移動します。

5-5)「バージョン情報」

SFCGENEditorのプログラムバージョン、プラグインの情報・バージョンを表示します。

■ 6.RomMap.xmlの記述方法
基本すべての定義はSFCGENEditor上で行えるようになったため、直接XMLを編集する必要はなくなったので省略
■ 7.ShortCut.xmlの記述方法
XML形式です。編集はメモ帳などで行ってください。(XML的に)正しく変更できているかどうかを確認するにはEdgeで開いてファイルの最後まで正しくパース(解釈)できていればOKです。XMLでそのまま使用できない文字(< ,>,&,’,”)に気をつけてください。
※記述例:

名称分類説明
menuoptionタグトップのタグです。必須なので消さないで下さい。
shortcutタグ「移動」メニューに追加するショートカットメニュー1つを記述します。
keyアトリビュートショートカットキーを指定します(大文字小文字は問わない)。Ctrl+?、Alt+?、Ctrl+Alt+?のいずれかが指定可能です(CTRL+ALT+?の場合のCTRL、ALTの順番は順不同)。?に指定できるのは数字もしくはアルファベット1文字です。F?(ファンクションキー)には現時点では対応していません。また、すでに存在しているショートカットキーと重複して設定は可能ですがその場合の動作は保証されません。ぶつからないように設定してください。
nodenameアトリビュートショートカットキーによってジャンプしたいツリービュー上のノードの名称を指定します。
■ 8.PreDefineTableの記述方法
1ファイルに1テーブルをCSV形式で記述します。ファイル名の拡張子を除いた文字列がテーブル名になります。テーブル名はRomMap.xmlで定義している固定長データのテーブル名と同じものは使えません。フィールドは2つまでで、1つ目のフィールドは表示用のデータ(disp),2つめのフィールドは値(value) を意味するものとします。3つ目以降はあっても無視します。valueは省略可能ですが、省略するときは全行省略してください。省略時には先頭から 0,1,2….を自動で付番します。

設定例:省略しない場合

設定例:省略する場合

1テーブルの中でvalueを指定したりしなかったりした場合の動作の確認はしていません。全レコード指定する/しないで統一してください。

■ 9.SFCGENEditor.iniの記述方法
通常のiniファイル形式です。設定可能なキーは以下のとおり

9-1)[ROM]セクション
DefaultROMExtキー

「ROMを開く」「ROMを保存」で表示されるファイルオープンダイアログでフィルターされる拡張子を指定する。記述方法はプログラム中で指定するオープンファイルダイアログのフィルターとして設定する文字列と全く同じ。

|フィルター文字列|拡張子(複数指定可能)

が1セットとなる。フィルターを複数設定したい場合は並べて複数記述するだけ。
設定例:

DefaultROMPathキー

「ROMを開く」で表示されるファイルオープンダイアログで表示される初期ディレクトリを指定する。指定がない場合はカレントディレクトリを使う。

CheckSumAutoAdjustキー

ROM保存時にチェックサムを自動で調整する。

0:調整しない(デフォルト)
1:調整する
設定例:

[APP]セクション
WindowPosキー

プログラム起動時に保存された座標情報を元にウィンドウ座標をリストアする。記録するのはプログラム終了時のみ。Left(ウィンドウの左端のX座標),Top(ウィンドウの上端のY座標),Width(水平方向の幅),Height(垂直方向の高さ)を,(カンマ)区切りで記述する。例外として、最大化の場合は”Maximized”、最小化の場合は”Minimized”と記述する。
設定例:

UseDefaultIconキー

プラグイン中のアイコンを使用しない。

0:使用しない
1:使用する(デフォルト)
設定例:

ShowPostMXInSRキー

新規SR定義、既存SR変更ダイアログでSR後のm,xフラグを指定できるコンボボックスを表示する。SRコールした後m,xフラグが変化する一部ゲーム(グラディウスⅢ?)で使用する。

0:表示しない(デフォルト)
1:表示する
設定例:

ShowSSFolderキー

起動時に使用するSettingsフォルダを選択するダイアログを表示するか

0:表示しない
1:表示する(デフォルト)
設定例:

■ 10.その他
コマンドライン
SFCGENEditor.exe filename [/L]
  • filename:ROMファイル名を引数で指定することでそのROMファイルを開いて解釈した状態で起動します。フルパスで指定しなかった場合はSFCGENEditorと同じパスにあるものとして扱います。相対パスでの指定も可能です。
    例:
  • /L: Lightモード プログラムの逆アセンブルを行いません。
■ 11.参考サイト
タイトルとURLをコピーしました