3.7. 文字列

3.7.1. 概要
3.7.2. 文字列へのアクセス方法
3.7.3. データ

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

なお、本節で言う文字列とはメニューウィンドウや戦闘時のウィンドウで用いられる文字列を指す。 移動時のメッセージウィンドウに描画されるテキストに用いられる文字列は該当しない。 そちらについては 3.6 テキスト解析 で述べる。

3.7.1. 概要

ポイントとなる概念を以下に列挙していく。

文字コード

文字列を構成する文字コードは、単に 1 バイトの数値として表現されている。 次に挙げる偉大な先人の業績を参照することで、文字コードと実際に画面上に描画される文字との対応がわかる:

  • ソニタウン [URL2] (dqviewer が出力する SFC_DQ5gra.bmp を参照)

  • スーパーファミコン版ドラゴンクエスト データ解析プログラム (dq_analizer [URL1] 内の dq5decode.c を参照)

文字列のデータ構造

文字列はいわゆる Pascal 文字列の形式を採用しているようだ。 すなわち、最初の 1 バイトに文字列の長さ L を格納し、 次のバイトから L 個のバイトが文字列を構成する文字コードの配列だ。

半濁点・濁点処理

データとしては「エ゛ヒル゜フラント」のように 半濁点、濁点はそれぞれひとつの文字として存在する。 ウィンドウに文字画像を描画するときには、 位置をずらすことで「ビ」「プ」のように見せる。 本書では、可読性を上げるために「エビルプラント」のように整形してある。

ベースアドレス

アドレス $21955B に各種文字列表のアドレス表がある。 ウィンドウ描画時に、どれかのアドレスからデータを取得するのである。

表 3.20 アドレス表

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 ルーラ行き先

3.7.2. 文字列へのアクセス方法

文字列の取得処理は 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

3.7.3. データ

付録 B データ に全文字列データをから UTF-8 に変換したテキストデータを置く。