こんにちは、パレイド技術部の夏目です。1980年代、マイコンBASICマガジン(ベーマガ)の編集部では、ある種の「検閲」が行われていたという。初代編集長の大橋太郎氏によれば、機械語で書かれた投稿プログラムは、どこが間違っているのかを人間の編集者が判断できないという理由から、誌面への掲載を意図的に避けていた(出典: igcc.jp)。BASICのリストなら読者が打ち込んでRUNすれば動作が確認できるが、機械語は数値の並びそのものが命令であり、目で追っても意味を汲み取れない。動くか壊れるかは実行してみるまで分からない、添削不能なコードだった。
かつて人間が匙を投げたブラックボックスとしての機械語に対し、2026年のLLM(大規模言語モデル)は、自らコードを書き、実行し、エラーに気づいて修正する能力を持っているだろうか。本連載では、この問いを軸に、LLMによる6502機械語の生成とデバッグの限界に挑む。famibasic-v3連載で作った観察ハーネスを土台に、レジスタとメモリまで見える形へ拡張しながら進める。
本記事はローカル LLM による自動執筆パイプラインで生成されました。現段階ではクラウド AI(Claude 等)の補助や人間の編集が介在していますが、pareido.jp では最終的に AI が自律的にコンテンツを制作できる仕組みの構築を目指しています。
BASICでは間に合わない場面がある
Family BASICは、命令を一行ずつ解析しながら実行するインタプリタ方式の言語である。この仕組みは初心者には扱いやすいが、一方で処理速度の限界という壁に突き当たる。ファミコンの映像は1秒間に約60回描き直され、1フレームに使える時間は約16.6ミリ秒しかない。この短い時間内に、画面上のスプライトを大量に同時に動かしたり、音楽と映像のタイミングを厳密に同期させたり、毎フレームで複数キャラの衝突判定を行ったりしようとすると、BASICが1行ずつ構文を解析しながら実行する分のオーバーヘッドが響いて処理が追いつかなくなる。
Family BASICには、この限界を突破するための「逃げ道」が用意されている。それがCALL文である。CLEAR &Hxxxxで BASIC のワークスペースより低いメモリ領域を確保し、そこへPOKEで6502の機械語(マシンコード)を1バイトずつ書き込み、CALL &Hxxxxで実行する。この型自体は命令辞典にも既に記載されている標準的な手続きなので、ここでは構文の詳細な解説には踏み込まない。BASICの手軽さでゲームの骨組みを組み、速度が要る一部分だけを機械語のサブルーチンに任せる——その両取りができるのが CALL 文の価値である。
LLMに機械語を書かせるとどうなるか
これまでの連載で、LLMにBASICコードを書かせてきた際、V2やV3といった方言の差異や、実機でのみ確認できる挙動の罠に直面することが多々あった。機械語の世界は、その難易度がさらに一段階上がると予想される。オペコード(1つの命令を表す数値)を一つ書き間違えるだけでプログラムの動作は全く別のものになり、レジスタ(CPU内部の一時的な記憶場所)の大きさの取り違えやメモリの指定方法の混同、さらには16bitアドレスのエンディアン(下位バイトと上位バイトの順序)といった、BASICには存在しない低レイヤーの罠が至る所に潜んでいるからだ。
ChatGPTの黎明期(2022-23年)において、6502のアセンブリ言語をLLMに書かせた実験がコミュニティ内でいくつか報告されている。フォーラムの報告を追うと、存在しない命令を発明する幻覚(例えば実在しないMUL命令をあると思い込んで書く)、レジスタの大きさの取り違え、周辺機器の制御アドレスの誤りといった失敗パターンが繰り返し観察されている。ただし、これらはいずれも単発のセッションで確かめた個別の事例報告であり、統計的な成功率を測ったベンチマークではない。また、2025年から2026年現在の最新モデルにおいて、6502の生成精度を定量的に検証した記録はまだ見当たらない。
学術寄りの研究に目を向けても状況は近い。x86-64やARMといった現代のCPU向けにLLMがアセンブリを生成する研究はあるが、汎用モデルをそのまま使うと成功率は低く、目的特化でファインチューンして初めて高い数字が出る、という傾向が報告されている。6502のような1980年代のCPUに絞ったベンチマークはさらに手薄で、Family BASICのCALL文経由という具体的なターゲットに絞った検証は見当たらなかった。ここに、本連載が自前でベンチを取る意義がある。
前回の連載(famibasic-v3)では、V3固有命令の実例だけでモデルに追加学習(LoRA)させた結果、「学習データが狭いと方言に過学習して創作が固着し、資料をそのまま読ませる(RAG)方式では資料が大きすぎてモデルの処理上限を溢れる」という板挟みに突き当たった。機械語でも同じ構図が再現するのか、それとも命令セットの小ささ(6502は基本命令が56種類しかない)がむしろ有利に働くのか。ここも確かめたい。
観察ハーネスはまだ機械語を見られない
本連載の実験環境として構築した「観察ハーネス」は、現在、BASICの画面表示や、画面用メモリ・スプライト管理領域(VRAM/OAM)の中身を読み取ることには成功している。しかし、CPUレジスタの中身や、メモリの任意のアドレスに書き込まれた値の変化を読み取ることは、まだ実現できていない。BASICなら間違ったコードは?SN ERRORのような形で画面に現れるが、機械語は違う。狙ったアドレスに正しい値を書けたのか、それとも何も起きなかったのか、あるいは無関係なメモリを静かに壊したのか——画面を見ているだけでは判別できない。
次回は、このハーネスにレジスタ観測を足すところから始める。その次にメモリダンプ、そしてLLMが書くニーモニックをバイト列に変換するアセンブラと、地味な土台作りが3回続く。派手なベンチはその先だ。