Gameboy Library


img
ゲームボーイでテキストリーダーを作ってみました。

複数文書を格納でき、しおりセーブやページジャンプ機能もあります。

漢字表示や DMA による全画面の一括転送などの実装テストとして作った物です。




■ GB文庫とテキストコンバーター

・GBLibMaker と GBLibrary gblibmaker.zip (2026.02.08版)
 .NET Framework 4.8 以上が必要です。Windows Update で入手できます。
 Gameboy Color 専用(モノクロ GB は不可)です。GDMA 等の拡張機能を使用するためです。

img

GBLibMaker はテキスト文書を GBテキストリーダーに組み込んで ROM 形式で出力します。
GBLibMaker.exe と gblib_mplus.bin, gblib_naga10.bin は同じ場所に置いてください。
使い方は以下の通り。

テキストファイル(複数可)をドラッグ&ドロップで放り込むと、リストに登録されます。
登録したテキストを選択して、タイトルとコメント(半角 30 文字、全角は 15 文字まで)を編集します。
何も書かないとそれぞれ『Title + 番号』、『Comment + 番号』となります。
登録を取り消したい場合は Delete キーを押してください。
テキストの順番はカーソルキーの上下で入れ替わります。

GB で表示する際の「ナガ10」「Mplus」の 2 種類のフォントを選ぶことができます。
設定が終わったら Output ボタンを押すと GBLIB.GBC という ROM ファイルが出力されます。
ROM の最大サイズは 2MB なので、あまり多くのテキストは入れられません。

img img img

スクリーンショットのテキストは青空文庫を利用させて頂いたものです。

文字フォントとして永尾制一氏作のナガ 10 を使用させていただいています。
knj10-1.1 より 5x10rk と knj10 を GB 用に加工・収録しました。
→ナガ10 (https://github.com/chocolatemelt/naga10) 元々のサイトが消失したようなのでミラーのリンクを貼っておきます。

別の文字フォントとして M+ FONTS PROJECT による M+ BITMAP FONTS を使用させていただいています。
mplus_bitmap_fonts-2.2.4 より mplus_j10r と mplus_j10b-jisx0201 を元に GB 用に加工・収録しました。
→ M+ BITMAP FONTS (https://ftp.kaist.ac.kr/macports/distfiles/mplus-fonts/) こちらも消失したようなのでミラーリンク。

一番左端はタイトル画面で、下二行にテキストのタイトルとコメントが表示されます。
パッドの上下でテキストの選択、START でテキストリーダー画面に切り替わります。
START のみの押下で前回読んだページから、SELECT+START で強制的に最初のページから開始します。

パッドの左右または A/B ボタンでページの送り/戻しが出来ます。

img
SELECT ボタンを押している間はページメニューが開きます。
その状態で上下左右キーでページ数を増減するとページジャンプができます。


START ボタンを押すことで、タイトルに戻るとともにセーブします。
次回同じテキストを開いたときに、そこから再開できます。





■ プログラムについて

・DMA による全画面転送

GB は元々 8x8 ドットのタイルを 20x18 個敷き詰めて 1 画面を構成するタイルマップなのですが
GBLibrary では、これを 1 ドット単位のビットマップのように扱います。

白黒 GB では、全画面をタイルで埋めようにも 256 個のタイルしか使えないので 20x18=320 個を
カバーすることが出来なかったのですが(ただし特殊なやり方で可能)、
GBC になって追加で 256 個増えたので、20x18 の全てに個別のタイルを敷き詰め、
各タイル 8x8 ドットを 1 ドット単位でアクセスし全画面 160x144 ドットをビットマップとして扱えるようになりました。

さて、そうなると全画面を書き換えた場合にどのくらいの転送量が発生するかですが、
パレット固定 4 色に制限すると 1ドット=2ビットなので、160x144x2=46080ビット=5760バイト
の転送をしなければなりません。

GBC において DMA 転送機能によりメモリから VRAM に大量にデータを転送する仕組みが追加されました。
本件では 1 画面分のバッファを用意しておき、画面が完成したら VRAM に転送するようにしています。
HDMA 転送方式だと、VRAM へのアクセス禁止期間を自動的に避けて転送してくれるので余計なことを考えずに済みます。

・文字フォントの表示

img

フォントが 8x8 ドットであれば、タイルのサイズに丁度合うので描画も楽なのですが
今回は 10x10 や 10x11 ドットなので隣や下のタイルへのはみ出しを考慮しながらの複雑な描画になりました。
しかし大きなフォントの方が読みやすく見栄えが良いので苦労する価値はあります。

フォントデータは隙間なく ROM データとして格納してあり、これとは別に文字コードからフォントの入った ROM アドレスへの
変換テーブルを用意しています。それぞれフォント 1 文字に付き「格納バンク」「格納アドレス下位」「格納アドレス上位」で 3byte 必要であり
テーブルそのものに 16KB * 3 = 48KB を使用しますが、フォントデータ本体を効率よく格納できるのがメリットになります。

・テキスト格納

テキストはシフト JIS コードをそのまま ROM に埋め込んでいます。
コンバーターはタイトルとコメントを文書毎につけるのと、ページ毎の開始バンクとアドレスをインデックステーブルとして付加します。

このあたりは GB 単体で起動時にインデックスを作成してメモリ上に置けるようにするのがスマートなのですが
起動が遅くなりそうなのでコンバーターに丸投げする方式になりました。


・セーブ

セーブ用メモリエリア $A000-$BFFF の領域を使用します。ここはカートリッジ上にありメモリ領域で
GB のヘッダの ROM 種別に BATTERY と付くとバッテリーバックアップ SRAM の意味になります。

書き込む際には事前に $0000 番地に $0A を出力し、保護する際は $00 を出力します。
誤ってデータが破壊されるのを防ぐおまじないです。


■ 反省

ノベルゲーム移植の元になったプログラムです。
文字コードからフォントデータへのアドレス変換や、ビットマップデータをタイルデータに割り付ける処理など
テキスト表示の基本が実装できたと思います。

コンバーターはテキストを毎ページ仮想描画してみてページの区切りの所をインデックステーブル化する処理をしています。
本来は GB 側で起動時に同じ処理をすれば良いのですが、遅くなりそうなのと面倒さが先だって手抜きしてしまいました。


▲ TOP