LLMのためのFamily BASICリファレンス(1)|AI が Family BASIC を書けない理由

LLMのためのFamily BASICリファレンス(1)|AI が Family BASIC を書けない理由 — LLM, Family BASIC, AI AIテキスト

こんにちは、パレイド技術部の橘です。

辺境部の連載「ファミリーベーシックでバイブコーディング」では、1984 年の Family BASIC に 2026 年の AI を接続して遊んでいます。

技術部からはその傍流として、「AI に 1980 年代の BASIC を書かせるためのリファレンスを、公式マニュアルから引用ベースで起こす」記録を 連載します。今回はその第 1 回。そもそも、なぜリファレンスが必要なのかから始めます。

本記事は LLM による自動執筆パイプラインで生成されました。現在は人間が補助していますが、pareido.jp では最終的に AI が自律的にコンテンツを制作できる仕組みの構築を目指しています。

「ボールを跳ね返すコードを書いて」と言うだけでは

Claude にこう頼んでみます。

ファミリーベーシック (Family BASIC) で、ボールが画面を上下左右で跳ね返るプログラムを書いて。

返ってきたコードは、こうでした (一部抜粋・連載者で改変)。

10 LET X = 128
20 LET Y = 120
30 LET DX = 1
40 LET DY = 1
50 FOR I = 1 TO 1000
60   IF X < 0 OR X > 255 THEN DX = -DX
70   IF Y < 0 OR Y > 239 THEN DY = -DY
80   X = X + DX : Y = Y + DY
90   CLS
100  PUT SPRITE 1, (X, Y), 0, 1
110 NEXT I

実機に流すと、ほぼ全行でエラーになります。原因は次のとおり。

  • LET キーワードが使えない?SN ERROR。Family BASIC は LET A=10 のような書き方を 受け付けません。
  • NEXT II が SN エラー → ファミベの NEXT は変数を取りません。NEXT 単独で書く必要があります。
  • PUT SPRITE という命令が存在しない → ファミベでは DEF SPRITE でキャラを定義し、 SPRITE n, x, y で表示します。
  • 小文字を含む変数や予約語は使えない → 英文字は大文字のみ。キーボードに小文字キーが ありません。
  • FOR I = 1 TO 1000 の数値リテラルは整数 16bit 範囲内なので OK ですが、もし 32768 を 超えると保証外。

つまり LLM は「LET を付ける」「NEXT に変数を付ける」「現代風の SPRITE 命令を出す」「小文字を 混ぜる」といった、他言語の BASIC 方言から転移した習慣を、ファミベに対しても無自覚に 適用してしまっている。これは LLM の “怠惰” ではなく、訓練データのほとんどが Microsoft BASIC系・現代 BASIC 系で占められているからだと思われます。

ファミリーベーシック が LLM にとって難しい点

連載者が把握している範囲で、ファミベ固有の “他言語からは転移できない” 仕様を並べてみます。 これらすべてを LLM に伝えないと、まともなコードは出てきません。

言語仕様

  • 変数名は最大 2 文字 (英字 + 英字/数字)。COUNTtemp は使えない
  • 整数のみ、16bit 符号付き (-32768〜+32767)。実数 (浮動小数) は無い
  • 文字列は最大 31 文字。超過すると ST ERROR
  • 行番号は 0〜65535、昇順必須
  • 配列の添字は 0 始まり (DIM A(10) で要素は 0..10 の 11 個)
  • 2 次元配列まで (3 次元以上不可)
  • LET キーワードは使えない (連載者検証: ?SN ERROR)
  • NEXT に変数を付けるとエラー (NEXT I?SN ERROR)
  • 未初期化変数は数値=0、文字変数=空文字列 として扱われる (マニュアル明記)

構文・記号

  • 英文字は大文字のみ。小文字キーがそもそも無い
  • 真偽値は -1 (真) と 0 (偽)。C 系の 1/0 ではない
  • 関係演算子は <> >= <= ( は使えない)
  • ?PRINT の代用'REM の代用
  • &H 接頭辞で 16 進数リテラル (&H7600 等)
  • コード 92 は \ ではなく ¥ (日本語 JIS 系)
  • 変数と論理演算子 (NOT, AND, OR, XOR) を続けて書くときはスペース必須 (マニュアル明記)
  • 例: NOT X は OK、NOTX は変数として誤認される

命令系

  • PUT SPRITE 等は無し。スプライトは DEF SPRITE n, (...)+CHR$(...) で定義、 SPRITE n, x, y で表示
  • MOVE 系は別系統。自動移動は DEF MOVEPOSITIONMOVE n のライフサイクル
  • 音は BEEP (単発) と PLAY (MML)PLAY の MML は独自方言で、Tn/On/Vn/Mn の組合せ
  • ファイル IO はカセットテープのみ (SAVE, LOAD, LOAD?)
  • メモリ操作は PEEK / POKE / CALL。POKE 可能領域は &H7040&H77FF のみ

これだけの暗黙ルールがあって、LLM がいきなり書けるはずがない。ファミベでは「他言語と 同じノリ」が一切通用しない、と言っていい。

結論: LLM 向けにリファレンスを編み直す必要がある

辺境部の連載 (familybasic-vibecoding) では、Phase 2 で完全リファレンスをシステム プロンプトに埋め込みました。約 13,000 文字のドキュメントを渡すと、Claude の出力は 劇的に改善します。「LET を付けない」「NEXT に変数を付けない」「?PRINT を 代用してもよい」といった注意書きを LLM が守るようになる。

この連載では、そのリファレンスをどう設計し、何を引用根拠にして、どこまでマニュアル外の 事実を含められるかを技術部側で記録します。次回は、著作権法 32 条 (引用) の 4 要件と、 「LLM 向けに再構造化した解説」(主) + 「マニュアル原文の引用」(従) で 1 エントリを 構成するスキーマ設計の話から。

ROM 所有者向けの補助資料として、どこまで開いてよいか — そこから始まります。

タイトルとURLをコピーしました