GBC でバンク切り替え 1
〜 ROM/RAM の拡張を C で操作する 〜
2026-01-26 作成 福島
TOP > gbc > banks-c
[ TIPS | TOYS | OTAKU | LINK | MOVIE | CGI | AvTitle | ConfuTerm | HIST | AnSt | Asob | Shell | GBC ]

1. プロジェクトディレクトリの作成

VS Code ではディレクトリを開くことにより、プロジェクトを切り替える。

1-1. ディレクトリを作成する。
ファイルエクスプローラーでディレクトリを作成する。(プロジェクトディレクトリとする)

C:\Users\who\vsc-gbc-banks\
1-2. プロジェクトディレクトリとしてディレクトリを開く。
VS Code: メニュー > ファイル > フォルダーを開く (Ctrl+K Ctrl+O)
(上記プロジェクトディレクトリ : C:\Users\who\vsc-gbc-banks\)
このフォルダー内のファイルの作成者を信頼しますか?


「信頼します」ボタンをクリックする。
→ このディレクトリの中にあとで .vscode\ が作られる。


2. C の設定

上記 1 の操作のあとに実行する。

2-1. ひな形からビルド情報を記述する。(C)
VS Code: メニュー > ターミナル > タスクの構成...
検索: テンプレートから tasks.json を生成 ← 選択
Others 任意の外部コマンドを実行する例 ← 選択
生成された .vscode\tasks.json にビルド情報を記述する。
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Compile c_bankcall",
            "type": "shell",
            "command": "cmd",
            "args": [
                "/C",
                "lcc",    // C コンパイラ本体
                "-v",     // コマンドを表示
                "-debug", // ソースコードデバッグを有効 (*.cdb を出力)
                "-Wm-yc",     // ゲームボーイカラーを指定
                "-Wl-m",      // マップファイルを生成
                "-Wl-g .STACK=0xD000",  // SP を D000 で初期化
                "-Wl-yt0x19", // MBC5(0x19) を指定
                "-Wl-yo8",    // バンク数 x 16KB
                "-o", "c_bankcall.gb", // 出力ファイル名
                "c_main.c",   // ソースファイル
                "c_task1.c",
                "c_task2.c",
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": []
        }
    ]
}
SP はデフォルトで E000 に初期化される。バンク切り替えで見失わないよう D000 で初期化する。

変更が完了したら、ファイルを閉じる。
VS Code: メニュー > ファイル > エディターを閉じる Ctrl+F4 →
2-2. ひな形からデバッグの構成を記述する。
エミュレータ起動 / 接続の設定 (VS Code の「デバッグの実行」を選択すると呼ばれる)

VS Code: メニュー > 実行 > 構成の追加...
検索: Emulicious Debugger ← 選択
生成された .vscode\launch.json にデバッグ情報を記述する。
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "emulicious-debugger",
            "request": "launch",
            "name": "Launch in Emulicious",
            "program": "${workspaceFolder}/c_bankcall.gb",
            "port": 58870,
            "stopOnEntry": true
        }
    ]
}

変更が完了したら、ファイルを閉じる。
VS Code: メニュー > ファイル > エディターを閉じる Ctrl+F4 →


3. C のプログラムを作成

3-1. メインプログラムを作成する。
VS Code: メニュー > ファイル > 新しいファイル Ctrl+Alt+Win+N
c_main.c
プロジェクトディレクトリの直下に作成する。(.vscode\ ではない)
c_main.c
#include <gb/gb.h>
#include <gb/cgb.h>

// プログラムを ROM バンク 0 に配置し、0x0000 - 0x3FFF に出現させる (省略可) 
#pragma bank 0

// func_t1, t2 は外部関数 (バンク切り替えによって見えなくなる予定)
extern uint8_t func_t1(void) __banked;
extern uint8_t func_t2(void) __banked;

// ダミー関数
void dummy(uint8_t v)
{
    uint8_t s = v;
}

// メイン関数
void main(void)
{
    SHOW_BKG;   // 背景を ON
    DISPLAY_ON; // LCD を ON

    while(1) {
        wait_vbl_done(); // V-Blank 待ち

        // 外部関数をコールする (それぞれでバンク切り替えが発生)
        uint8_t v1 = func_t1();
        uint8_t v2 = func_t2();
        dummy(v1);  // 最適化で消されないよう、ダミー関数を呼ぶ
        dummy(v2);  //      〃
    }
}

記述したら、ファイルを閉じる。
VS Code: メニュー > ファイル > エディターを閉じる Ctrl+F4 →
3-2. 外部関数を作成する。
上記 3-1 と同じ要領で外部関数 c_task1.c, c_task2.c を作成する。

c_task1.c
#include <gb/gb.h>
#include <gb/cgb.h>

// プログラムを ROM バンク 1 に配置し、0x4000 - 0x7FFF に出現させる 
#pragma bank 1

__at(0xD000) static struct {   // 静的変数を 0xD000 … としてアクセスする 
    uint8_t v0;
    uint8_t v1;
} vars;

uint8_t func_t1(void) __banked
{
    SVBK_REG = 1;   // バンク 1 の WRAM を 0xD000 に出現させる
    vars.v0 = 10;   // [0xD000] <-- 10
    vars.v1 = 11;   // [0xD001] <-- 11
    return vars.v0 + vars.v1;
}


c_task2.c (グレーアウトの行は c_task1.c と同じ)
#include <gb/gb.h>
#include <gb/cgb.h>

// プログラムを ROM バンク 2 に配置し、0x4000 - 0x7FFF に出現させる 
#pragma bank 2

__at(0xD000) static struct {   // 静的変数を 0xD000 … としてアクセスする 
    uint8_t v0;
    uint8_t v1;
} vars;

uint8_t func_t2(void) __banked
{
    SVBK_REG = 2;   // バンク 2 の WRAM を 0xD000 に出現させる
    vars.v0 = 20;   // [0xD000] <-- 20
    vars.v1 = 21;   // [0xD001] <-- 21
    return vars.v0 + vars.v1;
}


4. コンパイルとデバッグ

4-1. ソースをコンパイルする。
VS Code: メニュー > ターミナル > ビルドタスクの実行... Ctrl+Shift+B
→ 上記 2-1 で定義した task.json が実行される。
4-2. デバッグの実行
VS Code: メニュー > 実行 > デバッグの開始 F5
→ 上記 2-2 で定義した launch.json が実行される。

Emulicious が起動し、VS Code の画面には C のソース画面が表示される。
このとき、(上記 launch.json の  "stopOnEntry": true  により)  main(void)  で実行が停止する。