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

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

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

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

C:\Users\who\vsc-gba-banks\
1-2. ハードウェア定数定義を設置する。
GitHub から hardware.inc をダウンロードし、作成したディレクトリに設置する。
(ダウンロード方法がわかりにくい)

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


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


2. アセンブラの設定

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

2-1. ひな形からビルド情報を記述する。(アセンブラ)
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": "Assemble a_bankcall",
            "type": "shell",
            "command": "cmd",
            "args": [
                "/C",
                // アセンブルを指示
                "rgbasm -g -o a_bankcall.obj a_bankcall.asm",
                "&& rgbasm -g -o a_task1.obj a_task1.asm",
                "&& rgbasm -g -o a_task2.obj a_task2.asm",
                // 実行ファイルを生成 (*.gb, *.sym を出力)
                "&& rgblink -n a_bankcall.sym -o a_bankcall.gb a_bankcall.obj a_task1.obj a_task2.obj",
                // シグネチャとパディングの書き込み (ROM+MBC5+RAM: -m 0x1A)
                "&& rgbfix -v -p 0xFF -C -m 0x1A a_bankcall.gb",
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": []
        }
    ]
}

変更が完了したら、ファイルを閉じる。
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}/a_bankcall.gb",
            "port": 58870,
            "stopOnEntry": true
        }
    ]
}

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


3. アセンブラのプログラムを作成

3-1. メインプログラムを作成する。
VS Code: メニュー > ファイル > 新しいファイル Ctrl+Alt+Win+N
a_bankcall.asm
プロジェクトディレクトリの直下に作成する。(.vscode\ ではない)
a_bankcall.asm (ソースコードデバッグはメインの *.gb と *.asm の名称を合わせる必要がある)
; --- カートリッジのエントリ (本体タイトル表示の後に有効化) ---
SECTION "Entry", ROM0[$0100]  ; 自作プログラムは $0100 から記述する
    nop
    jp Start

; --- カートリッジヘッダ (0104h-014Fh) rgbfix がここを埋めてくれる ---
ds $150 - @

; --- メインプログラム ---
Start:

    ; 画面表示の終了待ち (本来は V-Blank 中の処理)
.waitVBlank:
    ld a, [$FF44]   ; LYレジスタ(現在のスキャンライン)を取得
    cp 144
    jr c, .waitVBlank

    xor a           ; LCD OFF
    ld [$FF40], a   ; $00 を書き込み

    ld a, %1110_0100 ; BGP パレットデータ (c0:3=black c1:2 c2:1 c3:0=white) 
    ld [$FF47], a   ; $E4 を書き込み

    ld a, %1000_0001 ; LCD ON 背景有効
    ld [$FF40], a   ; $81 を書き込み

    ld sp, $D000    ; SP を初期化 (HRAM にあらず)

MainLoop:
    ld a, BANK(func_t1)   ; func_t1 が存在するバンク番号を取得
    ld [$2000], a         ; ROM $4000 をバンク切り替え
    call func_t1

    ld a, BANK(func_t2)   ; func_t2 が存在するバンク番号を取得
    ld [$2000], a         ; ROM $4000 をバンク切り替え
    call func_t2

    jr MainLoop

記述したら、ファイルを閉じる。
VS Code: メニュー > ファイル > エディターを閉じる Ctrl+F4 →
3-2. 外部プロシージャを作成する。
上記 3-1 と同じ要領で外部プロシージャ a_task1.asm, a_task2.asm を作成する。

a_task1.asm
INCLUDE "hardware.inc"

SECTION "wram1", WRAMX, BANK[1] ; WRAM バンク 1 として $D000 に配置         
vars: ds 1

SECTION "rom1", ROMX, BANK[1]   ; ROM バンク 1 として $4000 に配置
func_t1::                       ; :: は公開ラベル
    ; $D000 に WRAM[1] を出現させ wram1 として操作する
    ld a, BANK("wram1")
    ldh [rSVBK], a  ; rSVBK は hardware.inc で $FF70 と定義
    ldh a, [rSVBK]  ; バンク切り替えが成功なら %1111_1001 になる

    ld a, [vars]
    ld a, $10
    ld [vars], a

    ret


a_task2.asm (グレーアウトの行は a_task1.asm と同じ)
INCLUDE "hardware.inc"

SECTION "wram2", WRAMX, BANK[2] ; WRAM バンク 2 として $D000 に配置         
vars: ds 1

SECTION "rom2", ROMX, BANK[2]   ; ROM バンク 2 として $4000 に配置
func_t2::                       ; :: は公開ラベル
    ; $D000 に WRAM[2] を出現させ wram2 として操作する
    ld a, BANK("wram2")
    ldh [rSVBK], a  ; rSVBK は hardware.inc で $FF70 と定義
    ldh a, [rSVBK]  ; バンク切り替えが成功なら %1111_1010 になる

    ld a, [vars]
    ld a, $20
    ld [vars], a

    ret


4. アセンブルとデバッグ

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

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