はじめに
CPU に Z80 (16MHz) を採用した自作ゲーム機「VGS-Zero」に特化した Z80 アセンブラ「vgsasm」を開発中です。
vgsasm の開発経緯についてはこちらで記事にしてます。
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 をインストールしてプロジェクトを作ってみましたが、情報過多で正直作り難いな...と感じていたところ、恐らく同じ意見を持ったであろうと思われる方の記事を発見。
上記の記事をチュートリアル的に進めるのが、恐らく最も簡単です。
一点、signature provider の書き方がよく分からなかったので、上記記事の コメント で補足を入れておきました。
対応した機能
ハイライト表示
予約語やリテラル等々をカラフルに表示します。
これは json ファイルに正規表現で色分け表示のルール(正規表現)を記述するだけなので簡単です。
正規表現の書き方は、ググったり生成 AI に聞けばサクッと教えてくれます。
構造体メンバ変数のサジェスト表示
vgsasm は「構造体サポート」がセールスポイントの Z80 アセンブラなので これが最重要機能 です。これが有るか無いかによって、vgsasm でのプログラミング生産性に顕著な差が出てくる筈です。(その他の機能はオマケみたいなものと言っても過言ではありません)
サジェスト表示自体は 非公式チュートリアル の通りにやればすぐできました。
チュートリアルでは固定値を表示してますが、その部分を document
から拾ったソースコードをパースして動的に取得したものを設定するだけです。
ただし、#include
で読み込んでいるソースファイルの探索も必要で少し大変でした。
以下のツイート参照
マクロの引数 usage 表示
定義したマクロ関数を呼び出す時に引数の個数や何を入力すべきかを案内します。
このサジェスチョンがあることで、「マクロが定義済みか?」という簡易チェックができますし、引数の個数や並び順のヒント表示されることも結構重要です。
定義ジャンプ
構造体、列挙体、マクロ、#include
したソースファイルを ⌘ボタン を押しながらクリックすることで、その定義箇所にジャンプすることができます。
構造体の全体像やマクロ内処理の内容のチェックがカジュアルにできるようになります。
VSCode マーケットプレイスで公開
導入を簡単にするため、マーケットプレイスで公開しておきました。
このエクステンションは OSS (GPLv3) としても公開しているので、マーケットプレイスを経由せずに直接リポジトリをダウンロードして使うこともできます。
まだベータ版ですが、vgsasm 本体と一緒になるはやで完成させてゲーム開発に戻りたいところです。
vgsasm のユニットテストで正常系と異常系の全網羅を目指しているので無限に終わらないw
その息抜きで久々に js コードを書いてみた節があります。
ただ、コレのお陰で結合テストとして同時並行実施している VGS-Zero の examples の全 vgsasm 化 が大分楽になりそうな予感がします。
VGS-Zero に限らず、今後 Z80 系の開発ではプライベートでも仕事でも vgsasm を使いたくなってきました。
vgsasm なら MSX のアプリとかも書けることは確認済みです。
まぁ、VGS-Zero の SDK は Linux専用(macでも使えるかも?) というスタンスなので、そんなに使う人は居ないと思いますが。