非常にシンプルでありながら、原理的にはどんな演算でも可能なことで知られるプログラミング言語、Brainfuck。そのインタプリタをN60-BASICで書いてみた。サンプルとして、Hello World!プログラムを同梱してある。
Hello World!を実行させたところ。10000行目以降がプログラム
Brainfuckで使用する命令は以下の8種類、使う文字も8種類だ。それ以外の文字は単に読み飛ばす実装とした。コメントの埋め込みなどに利用することもできる。
命令 | 説明 |
---|---|
> | ポインタを1進める。 |
< | ポインタを1戻す。 |
+ | ポインタが指す値を1増やす。255+1=0のループ方式とした。 |
- | ポインタが指す値を1減らす。0-1=255のループ方式とした。 |
. | ポインタが指す値を出力する。 |
, | 入力を1文字読み、ポインタが指す所に代入する。 |
[ | ポインタが指す値が0なら、対応する]の次までジャンプする。 |
] | 対応する[までジャンプする。 |
プログラムはDATA文として記述し、最後にENDというデータを付加する。行分割は自由。,を含むプログラムの場合は、データを""で囲むこと。[]の対応やポインタの範囲についてのチェックは行っていないので注意されたい。
一般的なBrainfuckの実装条件として、バイト配列が30000個以上という項目がある。しかし、PC-6001初代機では32Kバイト拡張してもフリーエリアが30140バイト。インタプリタとBrainfuckプログラムの格納領域を引いたら、どう考えても足りない。mk2以降専用とすることも考えたが、初代機ユーザーのため、涙を飲んでTiny版とさせていただいた。でも、Brainfuckでそんな大量の配列を使うプログラムなんて見たことがない。本当にそんなに必要なのだろうか?と言うわけで、とりあえず256個+拡張256個(後述)の配列を確保することにした。それ以上必要な場合は配列宣言を書き換えるなどして対応していただきたい。また、利用できるBrainfuckプログラムは最大で255文字までとなっている。
他のマイコンへの移植が容易になるよう、速度は無視してBASICで制作した。標準BASICに近いので、多少の手直しのみで簡単に移植可能だ!CLEAR文とINKEY$ぐらい直せば何とかなるんじゃないかな?また、思い立ったら自分のアイデアですぐに改造できるぞ!
メモリへの直接アクセスが可能なように独自拡張した。ポインタの初期値(便宜上0番地と呼ぶことにする)に対してアドレスがマイナス方向の配列についても読み書き可能にし、-1〜-5番地をシステムエリアに割り当てた。モード切り替え値をセットすることで、通常はバイト配列である0〜255番地を、オフセット値から始まる実メモリとして扱うことができる。インタプリタやBrainfuckプログラム自体を破壊してしまうようなプログラムも書けるぞ!ただしROM領域については+-,の命令は効かないので注意。
アドレス | 内容 |
---|---|
-256〜-6 | フリーエリア |
-5 | 読み込みスイッチ (インクリメントで動作) |
-4 | 読み込み値格納 |
-3 | メモリオフセット上位バイト |
-2 | メモリオフセット下位バイト |
-1 | モード切り替え (0:配列/それ以外:メモリ) |
0〜255 | 配列/メモリ |
また、読み込みスイッチを設け、オフセット値で示すアドレスから直接値をコピーする機能を用意した。通常Brainfuckで値をコピーするには、破壊的方法([>+<-]など)を使うしかないのだが、このままではROM領域の値をコピーして利用することができないからだ。スイッチをインクリメント(ポインタを-5にセットして+)することで、格納用アドレス(-4番地)に直接値を読み込むことができる。
-1番地をいじらなければ0〜255番地は単なる配列として扱えるので、通常のBrainfuckプログラムはそのまま動作する。ただし、中にはマイナス方向も普通の配列として使えることを仮定するプログラムもあるようなので、そういった特殊なものは手直しが必要になるだろう。
拡張機能を使い、ROMの&H111から34バイト出力したところ
このインタプリタでは、Brainfuckプログラムを一つの文字変数に格納しているため、最大255文字までのプログラムしか利用できない。手抜き実装ですんません。もっと長いのを書きたい!という方は是非改造してみていただきたい。
例えば、モード切り替えの種類を増やして、I/Oへのアクセスを実装してみるのはどうだろうか。スイッチを拡張して、書き込みも直接できるようにするのも便利かもしれない。マシン語コールや独自サブルーチンの呼び出し、割り込みの制御などを追加してみるのも面白いのではないだろうか。BrainfuckでPC-6001を完全に制御するのも夢じゃない!
このインタプリタでは、(英語版Wikipediaで紹介されているバージョンの)Hello World!を実行するのに約1分もかかってしまう。しかしP6の能力はこんなものではないはず。アルゴリズムを工夫してBASICの範囲内で頑張るのも良し、もちろんマシン語で書いてみるのも良いだろう。Brainfuckは非常に簡単に処理系が書ける言語として知られている。さあ、レッツチャレンジ!
トップ > 雑多なもの > Tiny Brainfuck for PC-6001