1. プロジェクトディレクトリの作成
VS Code ではディレクトリを開くことにより、プロジェクトを切り替える。
1-1. ディレクトリを作成する。
ファイルエクスプローラーでディレクトリを作成する。(プロジェクトディレクトリとする)1-2. プロジェクトディレクトリとしてディレクトリを開く。
C:\Users\who\vsc-gbc-banks\
VS Code: メニュー > ファイル > フォルダーを開く (Ctrl+K Ctrl+O)
(上記プロジェクトディレクトリ : C:\Users\who\vsc-gbc-banks\)
→ このディレクトリの中にあとで .vscode\ が作られる。「信頼します」ボタンをクリックする。
このフォルダー内のファイルの作成者を信頼しますか?
2. C の設定
上記 1 の操作のあとに実行する。
2-1. ひな形からビルド情報を記述する。(C)VS Code: メニュー > ターミナル > タスクの構成...2-2. ひな形からデバッグの構成を記述する。
生成された .vscode\tasks.json にビルド情報を記述する。
検索: テンプレートから tasks.json を生成 ← 選択 Others 任意の外部コマンドを実行する例 ← 選択
SP はデフォルトで E000 に初期化される。バンク切り替えで見失わないよう D000 で初期化する。
{ // 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": [] } ] }
変更が完了したら、ファイルを閉じる。
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}/c_bankcall.gb", "port": 58870, "stopOnEntry": true } ] }
変更が完了したら、ファイルを閉じる。
VS Code: メニュー > ファイル > エディターを閉じる Ctrl+F4 →
3. C のプログラムを作成
3-1. メインプログラムを作成する。
VS Code: メニュー > ファイル > 新しいファイル Ctrl+Alt+Win+N3-2. 外部関数を作成する。
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-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+B4-2. デバッグの実行
→ 上記 2-1 で定義した task.json が実行される。
VS Code: メニュー > 実行 > デバッグの開始 F5
→ 上記 2-2 で定義した launch.json が実行される。
Emulicious が起動し、VS Code の画面には C のソース画面が表示される。
このとき、(上記 launch.json の "stopOnEntry": true により) main(void) で実行が停止する。