1. プロジェクトディレクトリの作成
VS Code ではディレクトリを開くことにより、プロジェクトを切り替える。
1-1. ディレクトリを作成する。
ファイルエクスプローラーでディレクトリを作成する。(プロジェクトディレクトリとする)1-2. ハードウェア定数定義を設置する。
C:\Users\who\vsc-gba-banks\
GitHub から hardware.inc をダウンロードし、作成したディレクトリに設置する。1-3. プロジェクトディレクトリとしてディレクトリを開く。
(ダウンロード方法がわかりにくい)
直接ダウンロードするのはこちらから。
VS Code: メニュー > ファイル > フォルダーを開く (Ctrl+K Ctrl+O)
(上記プロジェクトディレクトリ : C:\Users\who\vsc-gba-banks\)
→ このディレクトリの中にあとで .vscode\ が作られる。「信頼します」ボタンをクリックする。
このフォルダー内のファイルの作成者を信頼しますか?
2. アセンブラの設定
上記 1 の操作のあとに実行する。
2-1. ひな形からビルド情報を記述する。(アセンブラ)VS Code: メニュー > ターミナル > タスクの構成...2-2. ひな形からデバッグの構成を記述する。
生成された .vscode\tasks.json にビルド情報を記述する。
検索: テンプレートから tasks.json を生成 ← 選択 Others 任意の外部コマンドを実行する例 ← 選択
{ // 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 →
エミュレータ起動 / 接続の設定 (VS Code の「デバッグの実行」を選択すると呼ばれる)
VS Code: メニュー > 実行 > 構成の追加...
生成された .vscode\launch.json にデバッグ情報を記述する。
検索: Emulicious Debugger ← 選択
{ // 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+N3-2. 外部プロシージャを作成する。
a_bankcall.asm (ソースコードデバッグはメインの *.gb と *.asm の名称を合わせる必要がある)プロジェクトディレクトリの直下に作成する。(.vscode\ ではない)
a_bankcall.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-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+B4-2. デバッグの実行
→ 上記 2-1 で定義した task.json が実行される。
VS Code: メニュー > 実行 > デバッグの開始 F5
→ 上記 2-2 で定義した launch.json が実行される。
Emulicious が起動し、VS Code の画面にはアセンブラのソース画面が表示される。
このとき、(上記 launch.json の "stopOnEntry": true により) $0100 の nop で実行が停止する。