本節では文字列処理について述べる。 まず、いくつかの基本的な概念を簡単に説明する。 次に、プログラムがどのように文字列データにアクセスするかを簡単に述べる。 最後に、全文字列データを独自コードから UTF-8 に変換したテキストデータを作成する。
なお、本節で言う文字列とは SFC 版ドラクエ 5 でのそれと同じ定義とする。 3.7 文字列 の冒頭部を参照して欲しい。
文字列の扱いにおける要所を以下に列挙していく。
前作同様、文字列を構成する文字コードは、単に 1 バイトの数値として表現されている。 この文字コードの配列を文字列と呼んでいるのだった。
文字列は前作では Pascal 風の構造を有していたが、今作では C 言語風に改められている。
すなわち、表現する文字列に対応する文字コード列に続き、
終端を意味させるために空文字 #$AC
が末尾にあるものとする。
半濁点・濁点処理についてはサブルーチン $C03221
のコードが参考になる。
文字コードが #$C9
以上の文字については、次に述べる事情を考慮するようだ。
「パ」とか「バ」のような文字はデータとしては 1 コードで表現されているものの、 表示の都合上、これらを 2 コードに分けたデータとして管理することもある。 そのために参照する「半濁点・濁点付き仮名文字から半濁点・濁点を抜いた文字に変換する表」や、 半濁点・濁点だけを表す文字コードが定義されている。
「半濁点・濁点付き仮名文字から半濁点・濁点を抜いた文字に変換する表」は
アドレス $C029A4
と $C0297B
にそれぞれ定義されている。
これを参照して、例えば「ガ」を「カ」「゛」と分解できる。
半濁点・濁点分解処理では、前作とは対照的に、半濁点・濁点コードのほうを上位バイトに配置する規則がある。
半濁点・濁点だけを表す文字コードはそれぞれ #$84
, #$83
となっている。
文字列データはアドレス $FB8703
から延々と配列されている。
前作では文字列の意味によって論理的にグループ分けされていて、ID の意味が弱かったのだが、
本作では ID を与えるだけで文字列データの特定ができる。
先に述べたように、文字列の末端に #$AC
があるという性質を用いれば、
この先頭アドレスから ID 個の #$AC
を検索していって、
到達したアドレスが与える ID で示される文字列データの格納位置となる。
ただし、このようなアルゴリズムでは定数時間アクセスどころか、
明らかに ID の大きい文字列データほどアクセスに時間を要するようになってしまう。
そこで、実際のプログラムでは 16 の倍数ごとの ID の文字列データの格納アドレスを
あらかじめ配列 $C165E7
にキャッシュしておくことで頑張っている。
これについて詳細を知りたければ、サブルーチン $C0315E
を確認して欲しい。
文字列 ID としての有効な値の範囲は、定数データの参照という意味では
#$09A7
未満である必要がある。
それ以上の値は、仲間キャラクターの名前等を参照するために用いられている。
その場合には、ID は #$09CA
未満である必要がある。
このことについても、サブルーチン $C0315E
以下から確認できる。
ここまで出てきた重要(および関連する)機能のアドレスを表にまとめておく。 後でウィンドウ解析を議論する際に参照して欲しい:
表 4.15 文字列機能
アドレス | 分類 | 意味 |
---|---|---|
$C0297B
|
データ | 濁点文字コードから濁点を抜いた文字コードへの対応を与える配列 |
$C029A4
|
データ | 半濁点文字コードから半濁点を抜いた文字コードへの対応を与える配列 |
$C029AE
|
データ | ある文字コードから「~」や「+」へ変換するための配列 |
$C0315E
|
サブルーチン | 文字列 ID を入力して、データ格納アドレスを $00:$03,X に出力する |
$C03221
|
サブルーチン | 必要に応じて文字コードを変換する |
$C165E7
|
データ | 文字列データ格納アドレス計算配列 |
$FB8703
|
データ | 文字列データ配列 |
付録 B データ にアドレス $FB8703
以降に表現されている全文字列データを UTF-8 に変換したテキストデータを置く。
前述のとおり、意味のあるダンプは ID が #$09A7
未満のものに限る。