前回の続きです。
C言語でスーファミ用のソフト開発(1)PVSnesLibの導入 - takuya matsubara blog
今回は「PVSnesLib」のサンプルプログラム「hello_world」について紹介します。普通、Hello Worldというと、一番簡単なプログラムですが、PVSnesLibの場合はそんなことはありません。
hello_worldの実行画面です。画面に「Hello World !」の文字が表示されます。
妙な色使いになっていますが、「色がいっぱい使えますよ」とアピールするためだと思います。
スーファミは画面モードが0~7まであります。hello_worldが使っているのは「モード1」です。BG1だけを表示していて、BG2と3は非表示にしています。
モード1は3枚のBG画面を重ねて表示できます。使える色が決まっていて、BG1~2が16色、BG3が4色です。BG番号は0から数えるので、BG1は「0番」です。
スーファミはBGのサイズを「32×32」「64×32」「32×64」「64×64」の中から選択可能です。hello_worldは32×32を使っています。
タイル番号やパレットや反転情報を記憶する領域のことを「タイルマップ」と呼びます。ファミコンとは違って、スーファミは1セル単位でパレットを変更可能です。
// Initialize text console with our font
consoleSetTextMapPtr(0x6800);
consoleSetTextGfxPtr(0x3000);
consoleSetTextOffset(0x0100);
consoleInitText(0, 16 * 2, &tilfont, &palfont);// Init background
bgSetGfxPtr(0, 0x2000);
bgSetMapPtr(0, 0x6800, SC_32x32);
hello_worldで画面を初期化している部分がこちらです。意味不明な数値が並んでいます。console~で始まっているのは、テキスト関連の関数です。それとは別にbgSet~というBG関連の関数も呼んでいます。これらはVRAMを割り当てるための処理です。
PVSnesLibの場合、「タイル」の画像のことを「グラフィック」と呼んだりしています。自分の場合は「パターン」と呼んでいます。
hello_worldはこのようにVRAMを割り当てています。番地は0x0000~7FFFの範囲で自由に設定可能ですが、0x1000や0x0800のようにキリが良い必要があります。
オレンジ色の領域がフォントデータ(パターン)です。アルファベットや記号で96文字×32バイト=3072バイト使います。
ピンク色の領域がタイルマップです。32×32文字=1024ワード=2048バイト使います。
青色の領域がフォント以外のパターンです。256枚×32バイト=8KBも確保していますが、全く使っていません。
「Snes9X v1.51.ep10r2 - Geiger's Snes9x Debugger.」というエミュレータを使って、実行中のVRAMを表示してみました。VRAMは1アドレス=1ワードで記憶します。しかし、このエミュレータでは1アドレス=1バイトで扱っていて、アドレスが2倍で表示されます。0x6800番地が0xD000番地です。ややこしいです。
たとえば、座標(10,10)の文字は0x6800+(32×10)+10=0x694A番地に格納されます。エミュレータだと2倍になるので、0xD294~95番地です。ここに「Hello World」の「H」の文字が入っています。メモリ内で上位と下位がひっくり返っているので、1ワードに直すと「0x2128」になります。
本来、「H」のキャラクターコードは「0x48」ですが、フォントデータはスペース(0x20)から始まるので、0x20を引くと0x28になります。さらにオフセット値の0x100を足すとタイル番号は0x128になります。さらにBGの表示の優先度をオンにする設定として0x2000を足すと、「0x2128」です。これでエミュレータの値と一致します。
ここで言う「オフセット値」というのはフォントに加算するタイル番号のことです。先ほど256枚=8KBのパターンが未使用と書きましたが、それがオフセット値となります。
この8KBは使っていないので、削除することにします。次のように書き換えます。
consoleSetTextGfxPtr(0x2000); // 0x3000→0x2000
consoleSetTextOffset(0x0000); // 0x100→0
これでオフセット値が0になります。フォントデータを0x2000~2BFF番地に割り当てるので、0x3000~3BFF番地が空きます。
オリジナルのフォントを表示するには、リソースの画像を差し替えるだけです。hello_worldの場合、「pvsneslibfont.png」という画像です。
フォントの画像は1文字あたり8×8ピクセルです。キャラクターコード順に96文字、並べます。途中で折り返しても構いません。使える色は16色までです。
続き