2025/07/08 05:58 The REM-arkable Misadventures of List (Commodore BASIC)

やあ、ロボ子!今日の話題はCommodore BASICのLISTルーチンについてなのじゃ。

Commodore BASICですか、博士。それはまた懐かしい響きですね。LISTルーチンに何か問題があるんですか?

そうなんじゃ。LISTルーチンはREM文の中にある特殊文字をうまく扱えないらしいのじゃ。具体的には、シフトされたPETSCII文字がBASICキーワードに展開されちゃうらしいぞ。

REM文はコメントとして使われるものですよね。それがキーワードに展開されると、どんな問題が起こるんですか?

例えば、特定の文字(SHIFT-L, 0xCC)を含むREM文だと、LISTが構文エラーで中断しちゃうのじゃ。BASIC 1.0だと、GOトークンがないからSHIFT-K (0xCB)でエラー、SHIFT-L (0xCC)でFORにラップアラウンドするらしいぞ。

なるほど。コメントが原因でプログラムが正常に表示されなくなるんですね。LISTルーチンは具体的にどこにあるんですか?

LISTルーチンは$C5B5に存在するのじゃ。行番号を出力した後、メモリ内のBASICコードを解析して出力するらしい。トークン化されたキーワードを人間が読める形に展開する時に問題が起きるみたいじゃな。

トークンをキーワードに戻す処理に問題があるんですね。REM文のトークンを適切に処理できない、と。

その通り!UN-CRUNCHルーチン(トークンをキーワードに戻す処理)で、REM文のトークンを適切に処理する機能がないのじゃ。キーワードリストの終端を示すゼロバイトも適切に処理しないから、構文エラーが発生するらしい。

BASIC 4.0ではどうなんですか?

BASIC 4.0では、キーワードリストが拡張されて、ディスクコマンドなどが追加されているのじゃ。キーワードリストが256バイトを超えるから、より複雑な方法でリストにアクセスするらしいぞ。リストを超えて読み込むと、エラーメッセージリストにアクセスして、異なる表示になるみたいじゃ。

BASIC V.2 (VIC-20, C64)ではどうですか?

BASIC V.2のLISTルーチンはPET 2001の「New ROM」とほぼ同じだけど、UN-CRUNCHルーチンへの間接ジャンプが追加されているのじゃ。これで、BASIC拡張機能が独自のトークン展開ルーチンを組み込めるようになるらしいぞ。

なるほど、拡張機能で修正できる余地があるんですね。修正方法はあるんですか?

REMトークン($8F)を検出した場合に、独自の処理ルーチンに分岐するパッチが提案されているのじゃ。このパッチでは、キーワード「REM」を出力して、残りの行をそのまま出力するらしいぞ。

それなら、特殊文字の問題も解決できそうですね。

LISTコマンドは、プログラムの行リンクを操作することで欺瞞できるらしいぞ。行リンクを変更することで、特定の行をLISTコマンドから隠せるのじゃ。でも、プログラムがロードされる際に、行リンクが再構築されるから、効果は一時的なものみたいじゃ。

面白いですね。でも、ロード時に修正されるなら、あまり意味がないかもしれませんね。

そういうことじゃ。Commodore BASICのLISTルーチンには、REM文の処理に問題があって、特殊文字が正しく表示されない。BASIC V.2では、拡張機能による修正が可能だけど、カーネルのリビジョンによってアドレスが異なるから、注意が必要なのじゃ。LISTコマンドは、行リンクを操作することで欺瞞できるけど、プログラムのロード時に修正される。…ふう、疲れたのじゃ。

よくわかりました、博士。しかし、昔のコンピュータは色々と制約があって大変だったんですね。

そうじゃな。でも、その制約の中で工夫するのがまた楽しかったりするのじゃ。…ところでロボ子、もし私がBASICのプログラムで永遠にループしてしまったら、迷わず電源を切ってくれぞ!

わかりました、博士。その時は、容赦なくリセットボタンを押しますね!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
