本節では文字列処理について述べる。 まず、いくつかの基本的な概念を簡単に説明する。 次に、プログラムがどのように文字列データにアクセスするかを、具体的なコードと併せて示す。 最後に、全文字列データを独自コードから UTF-8 に変換したテキストデータを作成する。
なお、本節で言う文字列とはメニューウィンドウや戦闘時のウィンドウで用いられる文字列を指す。 移動時のメッセージウィンドウに描画されるテキストに用いられる文字列は該当しない。 そちらについては 3.6 テキスト解析 で述べる。
ポイントとなる概念を以下に列挙していく。
文字列を構成する文字コードは、単に 1 バイトの数値として表現されている。 次に挙げる偉大な先人の業績を参照することで、文字コードと実際に画面上に描画される文字との対応がわかる:
文字列はいわゆる Pascal 文字列の形式を採用しているようだ。 すなわち、最初の 1 バイトに文字列の長さ L を格納し、 次のバイトから L 個のバイトが文字列を構成する文字コードの配列だ。
データとしては「エ゛ヒル゜フラント」のように 半濁点、濁点はそれぞれひとつの文字として存在する。 ウィンドウに文字画像を描画するときには、 位置をずらすことで「ビ」「プ」のように見せる。 本書では、可読性を上げるために「エビルプラント」のように整形してある。
アドレス $21955B
に各種文字列表のアドレス表がある。
ウィンドウ描画時に、どれかのアドレスからデータを取得するのである。
表 3.22 アドレス表
ID | アドレス | 内容 |
---|---|---|
00 |
$23C5CE
|
仲間の名前 |
01 |
$23C5F9
|
肩書 |
02 |
$23C690
|
性別 |
03 |
$228000
|
じゅもん・とくぎの名前 |
04 |
$23C69C
|
モンスター名 |
05 |
$23CE0E
|
アイテム名 |
06 |
$23D5B5
|
さくせん名 |
07 |
$308000
|
不明 1 |
08 |
$23D6A1
|
不明 2 |
09 | ||
0A |
$23C242
|
仲間モンスターの名前 |
0B |
$23D5F3
|
ルーラ行き先 |
文字列の取得処理は BRK 命令を経由した汎用データアクセスサブルーチン呼び出しとして実現している。
BRK のオペランドとしては #$80
... #$93
が適用され、
汎用データアクセス ID としては例えば #$2B
が利用される。
これらの一般的な振る舞いについては 3.2.3.4 オペランド #$80
, ..., #$93
: オブジェクトのフィールドにアクセス と
3.3 汎用データアクセスサブルーチン(仮) で述べる。
例えば現在のさくせんの名前を取得するコードは次のようなものになる。
最初の BRK 呼び出しでは現在のさくせんを $46
に取得する。
二番目の BRK 呼び出しで対応する文字列を(ここでは説明しないが $00, ...
に)取得する。
異なる種類の ID をあらかじめ既定のアドレスに格納してから BRK するのが作法だ。
04/B912: 0088 BRK #$88 ; #$88, #$4F: さくせんを参照する 04/B914: 4F 04/B915: A546 LDA $46 ; さくせん ID 04/B917: 8542 STA $42 ; オブジェクト ID を指示(=さくせん ID の値) 04/B919: A906 LDA #$06 04/B91B: 8543 STA $43 ; 上述のアドレステーブル $21955B の ID として 6 を指示(=さくせん名テーブルアドレス) 04/B91D: 0088 BRK #$88 ; #$88, #$2B: 指定オブジェクトの名前を得る 04/B91F: 2B
付録 B データ に全文字列データをから UTF-8 に変換したテキストデータを置く。