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