2019/01/27

MBC1を使ってROM容量を増やす

ゲームボーイのプログラムROM容量は32Kバイトですが
ちょっと規模の大きいものを作ろうとすると32Kバイトでは足りなくなります。

そこで、MBC1によるバンク切り替えで
32Kバイトより大きな容量を使えるようにします。

バンク切り替えの仕組みですが、プログラム32Kバイトのうち
前半16Kバイトと後半16Kバイトに分けて、
前半は固定し、後半のみを16Kバイト単位で切り替えます。
切り替えるには SWITCH_ROM_MBC1(バンク番号) という
命令を使います。この命令は前半16Kバイトの
プログラム内で実行しなければなりません。

※ここではGBDKのサンプルプログラムを簡素化して紹介しています。

プログラム前半16Kバイト用のプログラムbanktest.cを作成します。

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...");
}

続いてプログラム後半16Kバイト用のバンク1のプログラムです。

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モードで変換します。

・免責事項
このアプリケーションを使用する事によって生じた
いかなる損害に対しても作者は一切の責任を負いません。