基板
左上のクロック発振器から時計回りに信号が流れます。ピンの外側の小さな枠がその端子の論理レベルで、橙が HIGH(1)、灰が LOW(0)。太い線は4本以上をまとめたバス、細い線は1本の制御信号です。線やピンにカーソルを合わせると同じネットだけが光ります。ICをクリックすると下に全ピンの一覧が出ます。
| PIN | NAME | NET | LEVEL | 役割 |
|---|
プログラム(ROM)と入出力
ROMは16番地×8ビットのダイオードマトリクスです。ビットをクリックするとその場でスイッチが入れ替わり、次のクロックから新しい命令が読まれます。上位4ビットが命令、下位4ビットが即値です。
| 番地 | 命令部 即値部 | 16進 | ニーモニック |
|---|
1クロックで何が起きているか
このCPUは1命令=1クロックです。フェッチもデコードも実行も、クロックの立ち上がりまでの間に組み合わせ回路が同時に済ませてしまい、立ち上がりの瞬間に4つのレジスタが一斉に書き換わります。だから命令サイクルという概念がありません。
命令表
命令は16通り。Im は命令の下位4ビットです。この命令セットは『CPUの創りかた』のTD4と互換で、同書のプログラムがそのまま動きます。
上の表の 拡張 は、TD4では未定義だった符号がこの回路のデコーダでは自然に意味を持ってしまうものです。デコーダを簡単な論理式で組んだ副作用で、隠し命令が4つ生えています。
デコーダの論理式
命令デコーダはICを4個しか使いません。命令の4ビット Op3..Op0 から、書き込み先の選択とセレクタの選択が下の式だけで出てきます。
書き込み先(IC10 74LS139)
/LD_A = /(¬Op3 · ¬Op2) /LD_B = /(¬Op3 · Op2) /LD_OUT = /( Op3 · ¬Op2) /J = /( Op3 · Op2)
2-to-4デコーダ1個そのもの。Op3とOp2の2ビットで、A・B・OUT・PCのどれに書くかが決まります。
加算器に入れる値(IC11 04 / IC12 32 / IC13 00)
J = ¬(/J) SELA = Op0 + J SELB = Op1 + J COND = Op0 + ¬C /LD_PC = /(J · COND)
セレクタは (SELB,SELA) で A / B / IN / 0 を選びます。ジャンプ命令のときだけ強制的に 0 を選ばせるために J を足しているのがミソです。
JNCがキャリーを読めるのはなぜか。 キャリーフラグ(IC14 74LS74)は毎クロック加算器の桁上げを取り込むので、JNC自身も実行時にCを0にしてしまいます。しかしDフリップフロップの出力が変わるのはクロックの立ち上がりの瞬間で、その手前でロード条件を決める組み合わせ回路が読むのは直前の命令が残したCです。だからJNCは必ずADDの直後に置きます。
部品表
ロジックICは15個。ほかに抵抗・コンデンサ・LED・ダイオード・スイッチだけで、能動素子はTTLのみです。