ハードウェアシミュレータその12
コードがややこしくなってきたので整理した。
修正点
まず、いくつかのクラスをシミュレータ本体に移動。
それから、バスのビットを見ながらごちゃごちゃ条件をチェックしている部分を分離して、出力ピンを変数に格納。
## 命令デコーダ # mov命令時にH insn_mov = (~bus.o[0] & ~bus.o[1]) | (bus.o[0] & ~bus.o[1] & ~bus.o[3]) # add命令時にH insn_add = (~bus.o[0] & bus.o[1]) | (bus.o[0] & ~bus.o[1] & bus.o[3]) # ジャンプ命令時にH insn_jnc = bus.o[0] & bus.o[1] # レジスタ書き込み条件 write_reg = ~insn_jnc # ソースがイミディエート時にH source_imm = ~bus.o[0] # ソースがレジスタ時にH source_reg = bus.o[0] & ~bus.o[1]
出力ピンはひとつのオブジェクトなので変数に格納することができる。それっぽい名前をつけておけばコードが見やすくなる。HDLでもこういうことはできて、CPUを作る際には大量のデコード結果線が作られる、ようだ。
今は1クロック1命令実行の組み合わせ回路的なCPUだが、いずれRAMを扱うようになってRAM上の命令を実行できるようになるとステートマシン化するので、ステートの扱いも同様に状態を変数に格納していくことになる。
また、HDLの場合はツールがうまいこと最適化してくれるかもしれないが、このハードウェアシミュレータにはそのような機能は無いので、作れば作るだけ規模が大きくなって遅くなる。別に速度を重視してるわけでもないので問題は無く、理論どおりに動いてくれればそれでよい。
後は細々とした修正。
おしまい
ハードウェアシミュレータ最新はこちら。
https://gist.github.com/mirichi/c5e8bb02e790c5d3088b
CPUの回路はこちら。
https://gist.github.com/mirichi/41f73dab95db1541cb9e