4.2. 文字列

4.2.1. 概要
4.2.2. データ

本節では文字列処理について述べる。 まず、いくつかの基本的な概念を簡単に説明する。 次に、プログラムがどのように文字列データにアクセスするかを簡単に述べる。 最後に、全文字列データを独自コードから UTF-8 に変換したテキストデータを作成する。

なお、本節で言う文字列とは SFC 版ドラクエ 5 でのそれと同じ定義とする。 3.7 文字列 の冒頭部を参照して欲しい。

4.2.1. 概要

文字列の扱いにおける要所を以下に列挙していく。

文字コード

前作同様、文字列を構成する文字コードは、単に 1 バイトの数値として表現されている。 この文字コードの配列を文字列と呼んでいるのだった。

既に先人 [URL1], [URL2] の手によってデータ格納位置および文字コードが判明している。

文字列のデータ構造

文字列は前作では Pascal 風の構造を有していたが、今作では C 言語風に改められている。 すなわち、表現する文字列に対応する文字コード列に続き、 終端を意味させるために空文字 #$AC が末尾にあるものとする。

半濁点・濁点処理

半濁点・濁点処理についてはサブルーチン $C03221 のコードが参考になる。 文字コードが #$C9 以上の文字については、次に述べる事情を考慮するようだ。

「パ」とか「バ」のような文字はデータとしては 1 コードで表現されているものの、 表示の都合上、これらを 2 コードに分けたデータとして管理することもある。 そのために参照する「半濁点・濁点付き仮名文字から半濁点・濁点を抜いた文字に変換する表」や、 半濁点・濁点だけを表す文字コードが定義されている。

「半濁点・濁点付き仮名文字から半濁点・濁点を抜いた文字に変換する表」は アドレス $C029A4$C0297B にそれぞれ定義されている。 これを参照して、例えば「ガ」を「カ」「゛」と分解できる。 半濁点・濁点分解処理では、前作とは対照的に、半濁点・濁点コードのほうを上位バイトに配置する規則がある。

半濁点・濁点だけを表す文字コードはそれぞれ #$84, #$83 となっている。

文字列データの格納アドレス配列

文字列データはアドレス $FB8703 から延々と配列されている。 前作では文字列の意味によって論理的にグループ分けされていて、ID の意味が弱かったのだが、 本作では ID を与えるだけで文字列データの特定ができる。

先に述べたように、文字列の末端に #$AC があるという性質を用いれば、 この先頭アドレスから ID 個の #$AC を検索していって、 到達したアドレスが与える ID で示される文字列データの格納位置となる。 ただし、このようなアルゴリズムでは定数時間アクセスどころか、 明らかに ID の大きい文字列データほどアクセスに時間を要するようになってしまう。 そこで、実際のプログラムでは 16 の倍数ごとの ID の文字列データの格納アドレスを あらかじめ配列 $C165E7 にキャッシュしておくことで頑張っている。 これについて詳細を知りたければ、サブルーチン $C0315E を確認して欲しい。

文字列 ID

文字列 ID としての有効な値の範囲は、定数データの参照という意味では #$09A7 未満である必要がある。 それ以上の値は、仲間キャラクターの名前等を参照するために用いられている。 その場合には、ID は #$09CA 未満である必要がある。 このことについても、サブルーチン $C0315E 以下から確認できる。

ここまで出てきた重要(および関連する)機能のアドレスを表にまとめておく。 後でウィンドウ解析を議論する際に参照して欲しい:

表 4.15 文字列機能

アドレス 分類 意味
$C0297B データ 濁点文字コードから濁点を抜いた文字コードへの対応を与える配列
$C029A4 データ 半濁点文字コードから半濁点を抜いた文字コードへの対応を与える配列
$C029AE データ ある文字コードから「~」や「+」へ変換するための配列
$C0315E サブルーチン 文字列 ID を入力して、データ格納アドレスを $00:$03,X に出力する
$C03221 サブルーチン 必要に応じて文字コードを変換する
$C165E7 データ 文字列データ格納アドレス計算配列
$FB8703 データ 文字列データ配列

4.2.2. データ

付録 B データ にアドレス $FB8703 以降に表現されている全文字列データを UTF-8 に変換したテキストデータを置く。 前述のとおり、意味のあるダンプは ID が #$09A7 未満のものに限る。