PDP-8ときたらPDP-11でしょう。
PDP-11をDIPパッケージにしたDCJ-11というのがあります。これがかっこいい。
基板の上に2つチップが載ってるのでワンチップではないですが。
マニュアル
https://bitsavers.trailing-edge.com/pdf/dec/pdp11/1173/EK-DCJ11-UG-PRE_J11ug_Oct83.pdf
アドレシングや命令は68000の先祖のような感じです。
68000はエンコードの隙間に別のアドレシングや命令を詰め込んだようになっていますが、
そうなる前のすっきりしたエンコードです。それでいてかなり強力で使いやすい体系だと感じました。
当時アセンブラで書いていたエンジニア達は「このマシン書きやすいね」なんて会話をしていたかもしれません。
コンパイラを探していると、以下のページを見つけました。
https://github.com/hoglet67/PiTubeDirect/wiki/PDP-11-Co-Pro-Notes
Macで直接走るのはPCC,GCC,ACKですが、ライブラリが揃っていて出力するバイナリも良さそうなACKを選びました。
ACKは86系などもサポートし、Pascalなどのフロントエンドもあるので大規模ですが、基本そのまま使うので気にしないことにします。
次にPDP-11のエミュレータを探すと、SIMHというのがありました。
しかし、CPU部分を自作のものに置き換えることを考えると、ちょっと大規模すぎます。
CPUだけ楽しめればいいので、もっと小規模のものを探すとapoutというユーザーモード限定のエミュレータがありました。
https://github.com/DoctorWkt/Apout
16ビットプロセッサはswitch文だと命令にたどり着くまで複数回の判定が必要になるので、68kやTMS9995と同じようにテンプレートを展開しまくって一発ジャンプ方式で行きます。
マニュアルを読んで、apoutのCPUと比較しながら実装していきました。
コンパイラ
エミュレータを作る過程で浮動小数点数のprintfが正しく動かなかったバグを修正し、本家のIssuesに書いておきました。
また、リンカがマップファイルを出力するように改造しました。
まず、LuaとNinjaをインストールします。
brew install lua ninja
Ninjaはオプションのはずですが、無いとビルドが途中で止まってしまいます。
https://github.com/kwhr0/ack
からCodeのZIPファイルをダウンロードします。
あらかじめ/opt/localを書き込み可にしておきます。
unzip ack-default.zip
cd ack-default
make
make install
とします。
エミュレータ
https://github.com/kwhr0/Apout
からCodeのZIPファイルをダウンロードします。
unzip Apout-master.zip
cd Apout-master
make
出来上がったapoutをパスが通ったところにコピーします。
逆アセンブラ
リンカが出力したマップファイルを読んで逆アセンブルリストに反映するように改造しました。
https://github.com/kwhr0/pdp11dasm
からCodeのZIPファイルをダウンロードします。
unzip pdp11dasm-master.zip
cd pdp11dasm-master
make
出来上がったpdp11dasmをパスが通ったところにコピーします。
サンプル
https://github.com/kwhr0/sample-pdp11
からCodeのZIPファイルをダウンロードします。
unzip sample-pdp11-master.zip
cd sample-pdp11-master
Makefileの一行目で実行するサンプルを指定します。
PDP-8から引き続きライフゲーム(life)とNクィーン(queen)、COSMACで使ったマンデルブロ(mandelbrot)の他、コンパイラを探していたときのページにあった円周率(pi)があります。
また、ある程度の規模のプログラムがちゃんと動くか見てみたいので、
PDP-8用のB言語コンパイラ、8bcをACKでコンパイルし、それをapoutで走らせてB言語のソースをコンパイル、emu6100で走るところまで確認できました。
https://github.com/kwhr0/8bc/tree/cross11
からCodeのZIPファイルをダウンロードします。
unzip 8bc-pdp11.zip
cd 8bc-pdp11
make
PDP-11でPDP-8をターゲットとするクロスコンパイルをしている状態です。
両方の実機を揃えて同じことをやると楽しそうです。