SMB Laboratoryのトップページへ

IPSパッチについて

概要

 ファイルの一部分を変更することやそのためのデータのことをパッチ(差分)と呼びます。IPSは、パッチの形式のうちの一つであり、ゲーム機エミュレータで実行するROMイメージのパッチとして古くから世界的に広く利用されています。

IPSファイルの仕様

 これから説明にでてくる用語は、筆者が使用しているもので、正式なものではありません。

ファイルの拡張子

 IPSファイルの拡張子はipsとなります。

ファイル内の数値

 IPSファイル内のオフセットや長さなどの数値はすべて、最上位バイトから最下位バイトへと順に保持されています。

ファイル構造

 下図のように、ファイルを識別するためのPATCHヘッダー、任意の数のチャンク、チャンク(または、ファイル)の終端を示すEOFフッター、ファイルの切り捨てを行うためのTruncate情報という順番でデータが保持されるファイル構造となっています。なお、Truncate情報は存在しない場合もあります。

PATCHヘッダー(5バイト)
チャンク
チャンク
EOFフッター(3バイト)
Truncate情報(3バイト)

それぞれについて詳しくみていきましょう。

PATCHヘッダー

 ファイルの先頭のASCII文字でPATCHにあたる 50 41 54 43 48(16進数)の5バイトのヘッダーです。ファイルがIPSファイルであることを示しています。

チャンク

 実際に書き込むデータを保持したものをチャンクと呼びます。チャンクには、2種類あります。

[1] AM(Absolute Mode)チャンク

 書き込むデータをそのままの状態で保持するためのチャンクです。以下のような構造になっています。

オフセット データの長さ データ
OO OO OO LL LL VV VV
3バイト 2バイト LL LLで指定されたバイト長

 パッチが適用されるファイルにオフセットOO OO OOから長さLL LLのデータVV … VVを書き込むチャンクになります。

[2] EM(Encoded Mode)チャンク

 同じ値を複数回続けて書き込むチャンクです。このチャンクをうまく利用することにより、IPSファイルのファイルサイズを小さくすることができます。以下のような構造になっています。

オフセット 2バイトの0 回数
OO OO OO 00 00 TT TT VV
3バイト 2バイト 2バイト 1バイト

 パッチが適用されるファイルにオフセットOO OO OOから値VVをTT TT回書き込むチャンクになります。

 ※ AMチャンクの長さが0の場合に、EMチャンクとなるという見方もできます。

EOFフッター

 ASCII文字でEOFにあたる45 4F 46(16進数)の3バイトでファイルの終端(Truncate情報が存在する場合は、チャンクの終端)を示しています。

Truncate情報

 3バイトのデータで、パッチが適用されるファイルは、この値で指定されたオフセット以降のデータが削除されます。Truncate情報は、存在しない場合もあります。

不明な点

 仕様における不明な点を挙げたいと思います。

チャンクの保持される順について

 一般に、チャンクはオフセットが昇順になるように保持されていますが、そうでなくてもよいのかが不明です。

問題点

 広く普及しているIPSファイルですが、問題点もいくつか存在します。

EOFフッターとチャンクのオフセットを区別できなくなる問題

 下図のようなIPSファイルがあったとします。

PATCHヘッダー
チャンク
オフセットが4542278(16進数で454F46)のチャンク[α]
チャンク
EOFフッター(16進数で454F46)

 このようなIPSファイルでは、シーケンシャルに処理していった場合、チャンク[α]の部分でチャンクのオフセットなのかEOFフッターなのかを区別することができないという問題があります。

チャンクのオフセットのデータ長の問題

 チャンクのオフセットのデータ長は3バイトなので、3バイトで保持できる数値の最大値である16777215(16進数でFFFFFF)バイトより大きなオフセットはIPSファイルでは保持できません。つまり、約16MBより大きなファイルのオフセットが指定できないということであり、ゲーム機のROMイメージのパッチとしての用途を考えると、古いゲーム機であればほとんど問題にはなりませんが、比較的新しいゲーム機になるとROMイメージのファイルサイズが16MBを超えることも多く、正常なパッチを作成できないという問題が発生してきます。

inserted by FC2 system