4bit CPUのエミュレータを作ってみた

「CPUの創りかた」という、いまや伝説、といっていいかわかりませんが、書籍があって、そこに4bit CPUを作る方法について解説がされています。「「CPUの創りかた」のTD4製作に必要な部品リスト – 30 to 30」とかに部品リストはあるのですが、ICがなくなってきているそうで、部品集めから大変そうです。互換機を作っている人もいるみたいですね(TD4 互換機の製作 – Kiの研究部屋)。

いずれにせよ、そのまま電子工作をするのは大変そうですが、書いてある内容は面白いので、たまに読んでみています。そこには、4bit CPUのエミュレータも紹介されていて、Windowsを持っていると動かすことができます。4bitぐらいなら命令数も少ないので結構簡単に作れるのだろうなぁ、と思っていたら、世の中では結構作っている人がいました。JavaScript版もあって、とてもよくできています。ちょっとうまく動かないときもあるようですが…TD4のエミュレータを書いてみた。 – linuxとかテストとかTD4 CPU EMULATERあたりですね。

このCPUは、メモリも手作り前提なので4bitのアドレス空間しか用意しておらず、16バイトと非常に小さいので、エミュレータも結構手軽に作れます。大人の科学の4ビットマイコン GMC-4 の方はメモリ空間がデータ/プログラム合わせても約40バイトであることを考えても、驚きの少なさです。その分、CPUの原理が非常に理解しやすくなっています。

ということで手軽に実装できそうなのでJavaで実装してみました。GUIは少し面倒なのでコンソールアプリで用意してプログラムはJavaのソースコードへ直接埋め込む形にしました。ICなどを表現するクラスを用意したりはせずに、普通にコマンドに対応する処理を用意して、レジスターやアウトプットの状態を変更するという単純な実装にしてあります。具体的には、次のようにCPUの状態を1ステップ実行するたびにコンソールへ出力するようにしました。program_memoryの配列に4bit CPU用のプログラムが記述されていて、そこは値が変わりません。register_aとか、register_bの値が変わります。

--------
register_a     : 1 1 1 1:15
register_b     : 1 1 1 1:15
carry_flag     : 0 0 0 0
program_counter: 1 1 1 1:15
output_port    : 0 1 0 1:5
input_port     : 1 1 1 1:15
clock_generator: 1
program_memory:
program_memory[00]: 00000001
program_memory[01]: 00000010
program_memory[02]: 00000011
program_memory[03]: 00000100
program_memory[04]: 01010001
program_memory[05]: 01010010
program_memory[06]: 01010011
program_memory[07]: 01010100
program_memory[08]: 00110100
program_memory[09]: 00010000
program_memory[10]: 01110001
program_memory[11]: 01000000
program_memory[12]: 00100000
program_memory[13]: 01100000
program_memory[14]: 10010000
program_memory[15]: 10110101

ビットの値を表示するプログラムは次のようにして作りました。4ビット用、8ビット用のものを用意してあります。良く探せばクラスライブラリにありそうですが、これは趣味のプログラミングなので、まぁ自作でもいいかなと。

public String dump4bitString(int v) {
  return dumpBitString(v, 4);
}
public String dump8bitString(int v) {
  return dumpBitString(v, 8);
}
public String dumpBitString(int v, int d) {
  String s = "";
  for (int i = 0; i < d; i++) {
    int x = v & 0x01;
    s = x + s;
    v = v >> 1;
  }
  return s;
}

プログラムコードの全部は公開はしませんが、それほど難しい処理ではないので、自作はすぐにできるはずです。難しいと思う場合は、さきほどあげたURLを参考にしてみてください。C++で実装して公開している人もいるようでした。たまには、こういうプログラミングも楽しいですね!

こういうのが好きな人向けの書籍には下記があります。

同じカテゴリの記事: General