ゲームボーイにはBG面の他にウィンドウ面というものがあります。
簡単に説明すると、BGの上に表示できる、もう1枚のBGみたいなものですが
制限が色々あるので使い勝手は微妙なところです。
まず、表示できるタイルデータはBGと共通です。
表示はSHOW_WIN、非表示はHYDE_WINで行います。
表示内容はset_win_tiles()で設定します。
BGみたいにgotoxy()命令やsetchar()命令とか無さそうなので
表示にひと手間かかります。
そして重要なことですが、下のBGを透過させることが出来ません。
透過させるにはウィンドウ面をスクロールさせて
ウィンドウ面の外側にBGを表示させるしかありません。
スクロールにはmove_win(横スクロール位置, 縦スクロール位置)命令を使いますが
ここにも制限があり、横スクロール位置は0~166、縦スクロール位置は0~143でないと
ウィンドウ面は表示されません。
ちなみに横スクロール位置は7ドット左にずれてしまうようですので
画面の左上にピッタリ表示させるにはmove_win(7,0)とする必要があります。
(かといってmove_win(0,0)にしても左上に設定したタイルの右端は
何故か表示されません…仕様なのかエミュレータのバグなのかは不明です)
これらの制限から考えるに、ウィンドウ面は基本的に
画面の下部や右部にスコアやステータスなどを表示する際に適しています。
ファミコンではラスタースクロールで画面を分割したりしますが
それよりは簡単に実装できます。
2019/02/10
2019/01/27
MBC1を使ってROM容量を増やす
ゲームボーイのプログラムROM容量は32Kバイトですが
ちょっと規模の大きいものを作ろうとすると32Kバイトでは足りなくなります。
そこで、MBC1によるバンク切り替えで
32Kバイトより大きな容量を使えるようにします。
バンク切り替えの仕組みですが、プログラム32Kバイトのうち
前半16Kバイトと後半16Kバイトに分けて、
前半は固定し、後半のみを16Kバイト単位で切り替えます。
切り替えるには SWITCH_ROM_MBC1(バンク番号) という
命令を使います。この命令は前半16Kバイトの
プログラム内で実行しなければなりません。
※ここではGBDKのサンプルプログラムを簡素化して紹介しています。
プログラム前半16Kバイト用のプログラムbanktest.cを作成します。
banktest.c
続いてプログラム後半16Kバイト用のバンク1のプログラムです。
bank_1.c
bank_2.c
make.bat
ちょっと規模の大きいものを作ろうとすると32Kバイトでは足りなくなります。
そこで、MBC1によるバンク切り替えで
32Kバイトより大きな容量を使えるようにします。
バンク切り替えの仕組みですが、プログラム32Kバイトのうち
前半16Kバイトと後半16Kバイトに分けて、
前半は固定し、後半のみを16Kバイト単位で切り替えます。
切り替えるには SWITCH_ROM_MBC1(バンク番号) という
命令を使います。この命令は前半16Kバイトの
プログラム内で実行しなければなりません。
※ここではGBDKのサンプルプログラムを簡素化して紹介しています。
banktest.c
#include <gb.h>
#include <stdio.h>
void bank_1();
void bank_2();
void bank_3();
void bank_fixed()
{
puts("I'm in fixed ROM");
}
void main()
{
puts("Program Start...");
bank_fixed();
SWITCH_ROM_MBC1(1);
bank_1();
SWITCH_ROM_MBC1(2);
bank_2();
SWITCH_ROM_MBC1(3);
bank_3();
puts("The End...");
}
bank_1()が呼ばれると、「I'm in ROM bank 1」と表示されます。
bank_1.c
#include <gb.h>
#include <stdio.h>
void bank_1() /* In ROM bank 1 */
{
puts("I'm in ROM bank 1");
}
バンク2、3も同様に作ります。
bank_2.c
#include <gb.h>
#include <stdio.h>
void bank_2() /* In ROM bank 2 */
{
puts("I'm in ROM bank 2");
}
bank_3.c
#include <gb.h>
#include <stdio.h>
void bank_3() /* In ROM bank 3 */
{
puts("I'm in ROM bank 3");
}
まとめてコンパイルするバッチファイルを用意します。
make.bat
lcc -Wa-l -c -o banktest.o banktest.c
lcc -Wa-l -Wf-bo1 -c -o bank_1.o bank_1.c
lcc -Wa-l -Wf-bo2 -c -o bank_2.o bank_2.c
lcc -Wa-l -Wf-bo3 -c -o bank_3.o bank_3.c
lcc -Wl-m -Wl-yt1 -Wl-yo4 -o banktest.gb banktest.o bank_1.o bank_2.o bank_3.o
コマンドプロンプトからmake.batを実行すると
banktest.gbが出来上がります。
実行結果から、バンク1~3のプログラムが順に実行されたことが確認できます。
MBC1にはプログラムROMのバンク切り替えの他にバッテリーバックアップや
RAMバンクの機能もあるみたいですが、そこまでは調べていません。
BMPファイルを変換するアプリケーション
皆さん、楽しいゲームボーイ開発ライフをお過ごしでしょうか?
ゲームボーイ開発に欠かせないのはタイルデータを作るGBTDです。
GBTDでGBDKのC言語用のタイルデータを出力しないと
プログラムの中にデータを持たせる事が出来ません。
自分で描く分には構いませんが、デザイナーさんに描いてもらう際に
GBTDを使わせるのは正直なところ酷だと思います。
かといって、デザイナーさんから受け取った画像を
GBTDに入力し直すのもかなりの手間です。
そんな事がありましたので、BMPファイルをGBDKの
C言語用タイルデータに変換するアプリケーションを作りました。
BMP2GBDK.C (bmp2gbdk(v1.0).zip)
・使い方
1)
bmp2gbdk.exe を起動します。
2)
アプリケーションのウインドウが開きますので
BMPファイルをドラッグアンドドロップして下さい。
3)
ファイル名に準じたC言語用のソースファイルが生成されます。
例えば、Player.bmpならPlayer.cになります。
内部の変数名もPlayerになります。
・注意
1)
BMPファイルで使用する色数は必ず4色にして下さい。
使用されている色数をチェックし、RGBの各値の合計順に
明るさを判定します。
2)
BMPファイルの縦横ドットサイズは8の倍数にして下さい。
3)
通常は8x8モードで変換しますが、ファイル名に
“_spr”が含まれている場合は8x16モードで変換します。
・免責事項
このアプリケーションを使用する事によって生じた
いかなる損害に対しても作者は一切の責任を負いません。
ゲームボーイ開発に欠かせないのはタイルデータを作るGBTDです。
GBTDでGBDKのC言語用のタイルデータを出力しないと
プログラムの中にデータを持たせる事が出来ません。
自分で描く分には構いませんが、デザイナーさんに描いてもらう際に
GBTDを使わせるのは正直なところ酷だと思います。
かといって、デザイナーさんから受け取った画像を
GBTDに入力し直すのもかなりの手間です。
そんな事がありましたので、BMPファイルをGBDKの
C言語用タイルデータに変換するアプリケーションを作りました。
BMP2GBDK.C (bmp2gbdk(v1.0).zip)
・使い方
1)
bmp2gbdk.exe を起動します。
2)
アプリケーションのウインドウが開きますので
BMPファイルをドラッグアンドドロップして下さい。
3)
ファイル名に準じたC言語用のソースファイルが生成されます。
例えば、Player.bmpならPlayer.cになります。
内部の変数名もPlayerになります。
・注意
1)
BMPファイルで使用する色数は必ず4色にして下さい。
使用されている色数をチェックし、RGBの各値の合計順に
明るさを判定します。
2)
BMPファイルの縦横ドットサイズは8の倍数にして下さい。
3)
通常は8x8モードで変換しますが、ファイル名に
“_spr”が含まれている場合は8x16モードで変換します。
・免責事項
このアプリケーションを使用する事によって生じた
いかなる損害に対しても作者は一切の責任を負いません。