見出し画像

マシン語を覚える - はじめてのエミュ

Apple][を手に入れてBASICは、すぐに覚えることが出来たので、マシン語を覚えようとしていたところへ、慶応の大学生だったパソコンの師匠に、教科書を渡されて「ここに書いてある実在しないCPUを作ってみては」と言われました。曰く「パソコンなんてものにとらわれずに、ちゃんと計算機の勉強をしなさい」と。確かSAMOSとかいう名前だった気がするのですが、調べても見つからないので、本当はどんな名前だったかはもうわかりません。

プログラムカウンタはPC、アキュムレータはACなどの変数にして、メモリはMMという配列にしました。ちょうど6K BASICの変数は16ビットの整数だったので、16ビットマシンの出来上がりです。メモリ中のPCが指す配列の値を読み込んで、これを命令と解釈して実行するコードをBASICで書きました(符号なし整数はなかったので、ちょっとズルはしました)。

この時点では完全にテキストのみでしたが、ちゃんとシングルステップやメモリダンプと書き込みなどの最低限のモニタ機能は作りました。あんまり便利なものではなかったですけど。

最初は教科書通りの仕様で作り、動作確認をしていましたが、自分の書いたコードですから、欲しい機能があれば自由に追加して試してみることが出来ます。これでいろいろなアドレッシングモードを実装してみて、パソコンに使われているCPUの動作の理解が深まりました。6K BASICには16進数を扱う命令が無かったのですが、自分で作るのはさほど苦労しませんでした。

作ってみてわかったのですが、当時のCPUは制約のあるシリコンに載せるために、少々無理をしたアーキテクチャで、ミニコンのようにすっきりしたものではありませんでした。アーキテクチャがキレイだとアセンブラがなくても、いきなりバイナリでさほど苦労せずにコードが書けるものだと実感しました。

命令を解釈、実行するコードを書きながら、なるほどマイクロコードというのは、こういう部分に使われているのだな、と見えてきました。定型的な処理が繰り返し出てくるので、これをサブルーチンにして、パターンに従って呼び出すようにコードを修正していきます。

こういう下地が出来てから、具体的に6502の勉強をしたので、マシン語を覚えるのは比較的スムーズだった気がします。その後Z-80やら6809はもちろん、新しく登場した16ビットCPUたちを理解するのも容易だった気がします。細かい違いはどうでも良くて、アドレッシングモードとフラグ動作の違いが大事です。どちらかというとアセンブラ記法が、結構違っているのが嫌いでした。間接アドレスの書き方とかね。もうハンドアセンブルは勘弁ですし、郷に入れば郷に従うしかないのですが。

今のCPUをコードで書いて作ってみろと言われたら、難しすぎて大変ですね。普通に使っている部分だけならいざしらず、普段は出て来ない特殊なレジスタ操作や特権命令とかはどういう動作をするのか確認することすら困難です。でも昔のCPUだったら、割りと簡単に作ることが出来るので、PDP11あたりに挑戦するのはいかがですか?

ヘッダ写真は、1979年10月号の仮想マシン"THE COMPUTER"の画像。

いいなと思ったら応援しよう!