Skip to content

Small programming language for small microprocessors, first created in 1978.

Notifications You must be signed in to change notification settings

Titanium-Mutex/Micro-Plan

Repository files navigation

Micro-Plan

1978年の8bitマイコン用プログラム言語のコンパイラの再現

マイクロプランは、1978年のbit誌(共立出版)のマイクロコンピュータ用プログラム増刊号に、「マイクロプランのプロセッサ」として、戸村哲氏が公表された小さな言語であり、増刊号には、その文法BNF、コンパイラ、ローダ、インタプリタ、コンパイラ初期化用のID表が掲載された。ソースコードは、マイクロプランで記述され、約400行、11kBのサイズであった。これを実際にコンパイルすると、分岐命令、コール命令の参照が未定義で残されたR-Codeが生成される。この未定義参照をR-Codeローダが解決して、Q-Codeに変換する。Q-Codeは、仮想機械Qマシンの機械命令であり、Q-Codeインタプリタが実行する。マイクロプランコンパイラは、最終的に2kBほどのQ-Codeとして実行される。当時、最も小さなTiny BASICが2kBほどであったので、コンパイラとしては非常にコンパクトであった。R-CodeローダとQ-Codeインタプリタは、8080マイコンのアセンブリコードで記述されており、両方合わせた実行コードは1kBほどであったので、4kBのメモリがあれば、自分自身をコンパイルすることができた。ただし、ジャンプ命令、コール命令のオフセットが12bitしかないので、メモリ空間はわずか4kBであった。

Microplanで書かれたMicroplanコンパイラをCで書き直した。負数のdiv, mod の仕様が、Cと旧microplanでは異なるようだ。

コンパイラには、2点、改良が加えてある。1つは、ID表を内蔵させたことである。もともとは、ID表を外部から入力していたので、コンパイルしたいソースコードの前に、すべからくこのID表を書き込んでおく必要がある。これは面倒である。こんな風にID表を分離させてあるのは、ID表の初期化コードが数百バイトになるので、省メモリしたかったのだと思う。確かにメモリ空間を圧迫するが、4kBに収まってコンパイルできるのだから、コンパイラの初期化コードに含めるべきだろう。もう1点は、エントリポイント、Cで言うmain()のアドレスをR-Codeローダが記憶するが、これを不要にして、プログラムの先頭にジャンプ命令を入れて、エントリアドレスに飛ぶようにした。R-CodeローダとQ-Codeインタプリタを別プログラムとして実行するので、その間でエントリアドレスを引き渡すのが面倒だったからだ。Q-Codeインタプリタは、常にゼロ番地から実行を開始すれば良い。

そのほかにQcodeインタプリタには、実行トレースを出力したり、逆アセンブルするユーティリティを付けた。

C版microplan コンパイラとローダ、実行系

マイクロプランコンパイラは、microplan 自身で記述されているが、そのままでは実行できないので、Cに書き換える。コンパイラの本体は、mpc.c として再現した。8080のアセンブリで書かれたR-codeローダ、Q-codeインタプリタもCで記述する。 マイクロプランのソースプログラムは、mpcでR-codeにコンパイルされ、拡張子=.rc のR-codeファイルにストアされる。R-codeローダである mpld は、このR-code ファイルを読み込んで、拡張子=.qc のQ-codeファイルを作成する。同時に、拡張子=.sym のシンボル表を書き出す。シンボル表には、関数と手続きの名前とその16進アドレスが列挙される。最後に、メインプログラムのエントリアドレスが追記される。その名前は、mainと小文字であることに注意。できあがった.qc, .sym ファイルを参照して、mpx がQ-codeを解釈実行する。実行に.symファイルは不要であるが、-d オプションを与えると、実行トレースが表示され、CALL命令のオペランドとして手続き・関数名が表示できる。さらに、mpq は、.qc と.symから、Q-code を逆アセンブルする。

mpc [-d] filename

filename.mp をマイクロプランのソースコードとしてコンパイルし、結果のR-codeをfilename.rc に書き出す。-dを付けると、コンパイル中に読み込んだソースコードをstderrに順次表示するので、error が出た場合、その場所がわかる。

mpld [-d] filename

filename.rc をRコードのファイルとして入力し、ロードした結果のメモリイメージをfilename.qc に書き出す。また、シンボル表をfilename.sym に書き出す。

mpx [-d] [-c] [-r] [-i infile] [-o outfile] filename

filename.qc をQコードファイルとして読み込み、またfilename.sym をシンボル表として読み込んで、Qコードの先頭(ゼロ番地)から実行を開始する。ゼロ番地には、メインプログラムへのジャンプ命令が入っている。最後に、実行された命令数とclock数(マイクロ秒単位)が表示される。 -i, -o は、実行されるマイクロプランプログラムの入出力ファイルを指定する。指定が無い場合、stdin と stdout が適用される。 -d (debug) を指定すると、実行される命令が逆アセンブル表示される (トレースモード)。 -c は、call traceモードで、call命令が実行されると何が呼び出されるか表示

mpq [-t symfile] filename

Q-code である filename.qc とそのシンボル表であるfilename.sym を読み込んで、逆アセンブルしたリストをstdoutに出力する。

About

Small programming language for small microprocessors, first created in 1978.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published