こんにちは、パレイド技術部の夏目です。
前回(第2回)は、V3の色強調命令がエミュレータで動かない謎を追いました。原因はエミュ側の処理が未実装だったことで、映像出力の末尾にポストパスを追加して解決しました。今回はいよいよ本題です。V3 で新たに追加された命令を網羅的に洗い出し、v3.0 ROM で一通り実機観察してコーパスに仕上げます。
本記事はローカル LLM による自動執筆パイプラインで生成されました。現段階ではクラウド AI(Claude 等)の補助や人間の編集が介在していますが、pareido.jp では最終的に AI が自律的にコンテンツを制作できる仕組みの構築を目指しています。
「何がV3固有か」を確定する
V3 マニュアルの冒頭付近に「V3 カセットで新しく追加」された命令の一覧があります。そこには 27 種の命令・関数が列挙されています。ただしこの中には、V2.1 時点で既に存在する命令と混ざっているものがあり、除外作業が要りました。
除外したものは 2 群です。一つは V2.1 マニュアルにも記載のあるキャラクタグラフィック生成系の命令で、既存コーパスに収録済みです。もう一つはスプライトを動かす基盤命令群(スプライト定義・動作定義・移動開始など)で、これも V2.x から存在します。V3 がスプライト周りで追加したのは、既存の基盤を「使いこなす」ための拡張 3 命令(後述)だけです。
27 種から除外分を引いたあと、さらに「どう観察するか」で 3 つに仕分けしました。
実機観察できるもの:INSTR(文字列検索)、TRON/TROFF(実行トレース)、ON ERROR GOTO と ERR/ERL/RESUME(エラートラップ)、CRASH/CAN/VCT(スプライト制御拡張)。プログラムを RUN したときに画面出力や内部状態が読み取れるため、自動実行ハーネスで観察できます。
仕様書で代替したもの:AUTO(行番号自動付与)、DELETE(行範囲削除)、RENUM(行番号付け替え)、FIND(リスト検索)、CLICK ON/OFF(キークリック音)、GAME(内蔵プログラム呼出し)。これらはプログラムの外から直接キーボードで入力する操作としてのみ使える命令で、プログラムを RUN 中には実行できません。自動実行ハーネスは「プログラムを書いて RUN する」前提で動くため、駆動できません。V3 マニュアルを根拠に仕様記述としてコーパスへ収録しました。
今回対象外:BG 画面編集系の命令群(BGGET/BGPUT/BGTOOL/VIEW/CVIEW/SCREEN など)とテープ入出力命令(SAVES/LOADS/BACKUP)です。前者は対話型グラフィックエディタ操作が前提で自動化が難しく、後者はハードウェア再現が必要です。第 2 回で扱った色強調命令は、当初ここに分類しかけましたが、正体は PPU の映像信号処理命令だったため、第 2 回で独立して扱いました。
4群を v3.0 実機で観察する
仕分けた「実機観察できるもの」を、v3.0 ROM で順に実行しました。各観察データには、v3.0 ROM での観察であることを記録しています。
INSTR(文字列検索)
2 引数で「文字列 A$ の中から文字列 B$ を探し、最初に見つかった位置(1 始まり)を返す」関数です。
| コード | 結果 |
|---|---|
INSTR("ABCDE","CD") |
3 |
INSTR("ABCABC","BC") |
2(最初の一致位置) |
INSTR("ABC","Z") |
0(未発見) |
方言差が一点あります。多くの BASIC で使える「開始位置を数値で指定する 3 引数形式」を試したところ、型不一致エラーになりました。Family BASIC V3 の INSTR は 2 引数のみ対応です。次回の機械学習実験でこの方言を正確に再現させるため、エラー例も観察データに含めました。
TRON / TROFF(実行トレース)
TRON を実行すると、それ以降の各行の先頭に #行番号 が前置されます。デバッグ用の命令です。行 10 で TRON、行 20・30 で文字を表示、行 40 で TROFF、行 50 で文字を表示したとき、画面はこうなりました。
#20 A
#30 B
#40 C
TROFF を実行した行 40 自身にも #40 は表示されます。TROFF はその行の実行が終わってからトレースを切るからです。行 50 の出力(TROFF 後)にはプレフィックスがありません。# の書式はシャープ記号+行番号で、他の方言で見られる角括弧形式とは異なります。
ON ERROR GOTO / ERR / ERL / RESUME(エラートラップ)
ON ERROR GOTO 行番号 を設定しておくと、実行中にエラーが発生したとき、通常の停止ではなくその行へジャンプします。ジャンプ先では ERR(エラー種別番号)と ERL(エラーが発生した行番号)で状況を確認し、RESUME 行番号 で実行を再開できます。
観察コードは「1÷0のゼロ除算をエラートラップで捕捉し、エラー情報を表示してから処理を続ける」という構成です。
BEFORE
E 10L 30
AFTER
ERR=10 がゼロ除算のエラーコード、ERL=30 がエラー発生行です。RESUME 40 で行 40 から再開し、”AFTER” を表示して正常終了しました。エラーで止まらず処理を続けられる ── これは V2 にはない仕組みです。
CRASH / CAN / VCT(スプライト制御拡張)
V2.x にはスプライトの表示・移動基盤が存在しますが、衝突検出・動作取消・方向取得という 3 つの操作が V3 で追加されました。
CRASH(n) は、スプライト n が他のスプライトと衝突しているかを返します。非衝突は -1。V2.1a で同じコードを実行すると ?IL ERROR(未定義命令エラー)になります。CRASH は V3 専用であることを、V2 の観察データと対比させてコーパスに記録しました。
CAN n は、スプライト n の動作定義を取り消します。移動を開始したスプライトに対して実行すると、スプライト管理テーブルの動作枠が空になり、スプライトが画面から消えます。対照実験として「取り消しなしで移動させたまま」のデータも収録し、差分で効果を確認しました。
VCT(n) は、移動中のスプライト n の移動方向を返します。方向 3(右方向)で動かしたスプライトに対して実行すると 3 が返り、停止中または未開始のスプライトは 0 を返します。値は動作定義の方向パラメータと同じ体系です。
3 つ合わせると「衝突したか/止めたい/どっちを向いているか」という実用セットになっています。アクションゲームの制御に直接使える命令群です。
まとめにかえて
今回観察した命令には共通のパターンがあります。デバッグ(TRON/TROFF)、エラー処理(ON ERROR GOTO 系)、スプライト制御(CRASH/CAN/VCT)、文字列操作(INSTR)── どれも「V2 では止まるしかなかったエラーを捌き、スプライトをより細かく制御するための道具」です。1984 年当時のホビーユーザーが求めた機能が V3 として凝縮されています。
観察したデータはすべて v3.0 ROM で取得したものとして記録し、コーパスに収録しました。次回はこのコーパスで機械学習モデルを再学習し、1984 年の BASIC 方言が 7B モデルに焼き付くか確かめます。