目次 | 前の話題 | 次の話題

SCDIS と SCKILL の改良

1997年2月14日

昨日、私と同じく PJCC の技術顧問をつとめる 野村さんからメールが あった。野村さんのBBSで、BGL ファイルの Section 16 に含まれる SetElevation を SCKILL で削除できないか、という相談が出ているという。

SCKILL は MSFS のシーナリファイルである BGL ファイル中の特定部分を削除する ことができるツールである。AREAKILL という同様のツールがあるのだが、PC-98 では動かないという問題があったので、私が SCKILL を作ったのである。

で、相談された Section 16 の SetElevation であるが、これには SCKILL は対応して いない。SCKILL はシーナリディスアセンブラ SCDIS の解析エンジンをそのまま使って おり、SCDIS 自体が Section 16 の SetElevation を解析できないのだ。なぜできない かというとフォーマットが未知だからである。(FS5STRUCT.TXTには記述がない)

これに対処するには、BGL ファイルの該当部分を自力で解析するしかない。幸い SCASM 自体は Section 16 のコマンドに対応しているので、自力解析は 割と簡単にできそうである。それでちょっとやってみることにした。

まず最初に SetElevation コマンドを含む SCASM のソースファイルを書いて SCASM でコンパイルする。できた BGL ファイルをバイナリダンプして、内容 を推測していく。

具体的には、ソースファイルのほうをちょっとずつ変更してコンパイル してやる。するとBGL ファイルの内容がちょっと変化はずである。 この変化した部分がソースファイルで変更した部分に相当するわけである。 また、同じコマンドを10個くらい連続して書いてやると、 BGL ファイル内では同じバイナリの列が10個連続するはずだから、 これを使えばレコードの長さもわかるというわけだ。

一つレコードがわかってしまえば、あとはいもづる式である。今、A という コマンドのレコードがわかっているときに B というコマンドのレコードを 調べたいとしよう。これを解析するには、A B A というコマンドをソースフ ァイルに書いてコンパイルする。すると出来た BGL ファイル中には A に対応する既知のレコードが2つあって、その間に B に対応する レコードがサンドイッチになっているはずだ。これで、B というレコードが ほぼどういう形をしているかわかるというわけ。

こうやって Section 16 のコマンドを全部(10個弱)調べあげた。 内容自身は Section 9 のコマンドとほぼ同じ形だったので、全部調べるのに 1時間もかかからなかったと思う。

これを元にして SCDIS と SCKILL を改良したので、今後は SetElevation もちゃんと解析できるようになった。今テスト中なので、一般公開はして いないが、今日明日中には公開できそうである。

しかし、、、バレンタインデーに一日中こんなことをしている私って いったい何なのだろう。
別にいいけど、、、さ。


今回の内容についてアンケートにお答えください。
とても面白い まあまあ面白い 普通 あまり面白くない 全然駄目


目次 | 前の話題 | 次の話題