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バンクの機能もあるみたいですが、そこまでは調べていません。

0 件のコメント:

コメントを投稿