自作Z80アセンブラ（vgsasm）対応の Visual Studio Code Extension を作成

# はじめに

CPU に Z80 (16MHz) を採用した自作ゲーム機「VGS-Zero」に特化した Z80 アセンブラ「vgsasm」を開発中です。

vgsasm の開発経緯についてはこちらで記事にしてます。

https://qiita.com/suzukiplan/items/dc44601e5faa23412866

vgsasm の開発も終盤に差し掛かり（2024.11.01時点）、CI で動かす自動テストや VGS-Zero の examples の vgsasm 移植などをしてバグや機能不足をモリモリと潰しているところです。

vgsasm の言語仕様はとても良い感じになりました。

主に `struct` がものすごく便利です。

ただ、記述した `struct` を使う時、メンバ変数名を忘れてしまい、定義を確認して、「あぁ、そうだったのか」と思い出し、コードを記述する...というものすごく生産性が悪い行動をしていたので、vgsasm 対応の Visual Studio Code Extension を作り、構造体メンバ変数のサジェストなどに対応することにしました。

## Visual Studio Code Extension の作り方

ググったら AI が「yo code」でプロジェクトを作れと案内してきたので、言われた通りに yo をインストールしてプロジェクトを作ってみましたが、情報過多で正直作り難いな...と感じていたところ、恐らく同じ意見を持ったであろうと思われる方の記事を発見。

https://qiita.com/takl/items/ba2f63db515f66585d1f

上記の記事をチュートリアル的に進めるのが、恐らく最も簡単です。

> 一点、signature provider の書き方がよく分からなかったので、上記記事の [コメント](https://qiita.com/takl/items/ba2f63db515f66585d1f#comment-a495cefbb8c5f7eaba09) で補足を入れておきました。

## 対応した機能

### ハイライト表示

![Screenshot from 2024-11-01 10-01-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2161417/eae1afe9-b66c-e13b-f602-e98892f8fd97.png)

予約語やリテラル等々をカラフルに表示します。

これは json ファイルに正規表現で色分け表示のルール（正規表現）を記述するだけなので簡単です。

https://github.com/suzukiplan/vgsasm-extension/blob/master/vgsasm.tmLanguage.json

正規表現の書き方は、ググったり生成 AI に聞けばサクッと教えてくれます。

### 構造体メンバ変数のサジェスト表示

![Screenshot from 2024-10-31 13-51-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2161417/5e0ca9ad-9e84-c1a7-2fca-4be8d8ed782d.png)

vgsasm は「構造体サポート」がセールスポイントの Z80 アセンブラなので **これが最重要機能** です。これが有るか無いかによって、vgsasm でのプログラミング生産性に顕著な差が出てくる筈です。_（その他の機能はオマケみたいなものと言っても過言ではありません）_

サジェスト表示自体は [非公式チュートリアル](https://qiita.com/takl/items/ba2f63db515f66585d1f#completion-item-provider-%E3%82%92%E4%BD%9C%E3%82%8B) の通りにやればすぐできました。

チュートリアルでは固定値を表示してますが、その部分を `document` から拾ったソースコードをパースして動的に取得したものを設定するだけです。

ただし、`#include` で読み込んでいるソースファイルの探索も必要で少し大変でした。

以下のツイート参照

https://x.com/suzukiplan/status/1851924332441932252

### マクロの引数 usage 表示

![Screenshot from 2024-11-01 09-35-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2161417/63c61f54-9233-0c4e-f55a-86be0aab6b96.png)

定義したマクロ関数を呼び出す時に引数の個数や何を入力すべきかを案内します。

このサジェスチョンがあることで、「マクロが定義済みか？」という簡易チェックができますし、引数の個数や並び順のヒント表示されることも結構重要です。

### 定義ジャンプ

構造体、列挙体、マクロ、`#include` したソースファイルを ⌘ボタン を押しながらクリックすることで、その定義箇所にジャンプすることができます。

構造体の全体像やマクロ内処理の内容のチェックがカジュアルにできるようになります。

## VSCode マーケットプレイスで公開

導入を簡単にするため、マーケットプレイスで公開しておきました。

![Screenshot from 2024-10-31 22-27-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2161417/3bf8cb4a-3799-cf42-c8f6-c47a7eee4b29.png)

このエクステンションは OSS (GPLv3) としても公開しているので、マーケットプレイスを経由せずに直接リポジトリをダウンロードして使うこともできます。

https://github.com/suzukiplan/vgsasm-extension/

まだベータ版ですが、vgsasm 本体と一緒になるはやで完成させてゲーム開発に戻りたいところです。

_vgsasm の[ユニットテスト](https://github.com/suzukiplan/vgsasm/blob/master/tests/result.txt)で正常系と異常系の全網羅を目指しているので無限に終わらないｗ_

_その息抜きで久々に js コードを書いてみた節があります。_

ただ、コレのお陰で結合テストとして同時並行実施している [VGS-Zero の examples の全 vgsasm 化](https://github.com/suzukiplan/vgszero/pull/64) が大分楽になりそうな予感がします。

VGS-Zero に限らず、今後 Z80 系の開発ではプライベートでも仕事でも vgsasm を使いたくなってきました。

vgsasm なら MSX のアプリとかも書けることは確認済みです。

https://x.com/suzukiplan/status/1848206072630140979

まぁ、VGS-Zero の SDK は **Linux専用（macでも使えるかも？）** というスタンスなので、そんなに使う人は居ないと思いますが。