ちょっと規模の大きいものを作ろうとすると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バンクの機能もあるみたいですが、そこまでは調べていません。