ブロック図
4004はシステムの要ですので中身が複雑です.しかし,少しずつ説明していきますので,気負いせずお読みください.下にブロック図を示します.
タイミング
まずは簡単なところから説明していきます.右上のタイミングブロックをご覧ください.MCS-4の共通端子のところでも説明しましたが,SYNC信号の発信元は4004ですのでSYNCは出力端子になっています.この信号を作り出すためにΦ1とΦ2が入力されています.
チップ管理ロジック&バッファとチップ管理レジスタ
次に左上をご覧ください.チップ管理ロジック&バッファブロックがありますね.ここではROM(4001)とRAM(4002)を制御するための信号であるCM-ROMとCM-RAM0~3が出力端子になっています.これら5本の出力端子からアサート(High)にすることで,その接続されているROMもしくはRAMが動作する仕組みになっています.
データバスI/Oバッファ
次に左下をご覧ください.データバスI/Oバッファブロックがありますね.これはおなじみのデータバスであり,MCS-4では4[bit]バスですので入出力端子D0~3までの4本があります.この端子から,ROMへはアドレスを出力,ROMからはインストラクションを入力,RAMとはデータもしくはアドレスが入出力されていくのです.
プログラムカウンタ
さて,ここからがCPUたる4004の本質的なブロックの説明になります.なるべく処理の順番に従って話を進めていきます.まずは電源投入直後もしくはリセットがかかったところからお話をします.はじめに右中段にあるプログラムカウンタブロックは12[bit]であり,現在実行しているインストラクションのROMアドレスです.このため,電源投入直後にはこのプログラムカウンタの値が0となります.プログラムカウンタに入っているアドレスのうち,まずは下位4ビットをデータバスI/Oバッファに格納します.その後,同様に,中位4ビットと上位4ビットのアドレスがROMに送られます.
OPRとOPA
アドレスをROMに送りますと,そのアドレスに格納されているインストラクションがROMからCPUに送られてきます.インストラクションは基本的に8[bit]ですので,2回に分けてデータバスI/Oバッファを介して送られてきます.はじめに送られてきた4[bit]がOPRに,あとに送られてきた4[bit]がOPAに格納されます.
インストラクションデコーダ
OPRおよびOPAに入ったインストラクションをインストラクションデコーダで復号化し,そのインストラクションが何なのか4004は理解します.
インデックスレジスタ・アキュムレータ・4ビット加算器とシフタ
インストラクションによって処理が変わりますが,まずは計算をする場合を説明します.4004には加算をするインストラクションであるADDというものがあり,その場合,アキュムレータに入っている4[bit]の値とインデックスレジスタに入っている値とを足します.インデックスレジスタは16個あり,0000(2)~1111(2)までのアドレスを持っています.インストラクションレジスタの指定はOPA(オペランド)に記された4[bit]のアドレスにより行うこととなっています.そして,加算した結果は再びアキュムレータに代入されます.もし桁上りが発生した場合,キャリに1が入る仕組みになっているのです.このように16個のインデックスレジスタという,一時記憶領域を使いながら計算をしていくのです.
インデックスレジスタは16個あり,場合によっては2個まとめて8[bit]として利用することもあります.その場合にはアドレスの上位3[bit]を指定することになっています.このような使い方を「インデックス対」と以下では言います.例えば,SRCというインストラクションの場合,OPAはRRR1(2)となっており,この3[bit]のRRRがインデックスレジスタの上位3[bit]となるのです.
インストラクションレジスタ
インストラクションによっては,16[bit]となっているものもあります.その場合,1サイクルではすべてのインストラクションを持ってこられませんので2サイクルでフェッチします.その場合,インストラクションレジスタが使われ,最初のサイクルでフェッチしたインストラクションの半分をインストラクションレジスタに入れておき,次のサイクルでOPRとOPAに入れておきます.その後,デコーダでインストラクションを解析するのです.
インクリメンター
プログラムカウンタに入った値は,分岐命令でなければ次に進みます.その時に使われるのがインクリメンターであり,プログラムカウンタに入った値を1増やします.
スタック
プログラムカウンタの下にあるスタックに注目してください.3個のスタックがありますが,これらはサブルーチンを呼び出すときに使います.これまでのアドレス,つまりプログラムカウンタに入っている値をスタックに入れておき,サブルーチンのアドレスをプログラムカウンタに入れてあげます.その後,サブルーチンの処理が終わりましたら,スタックから前のアドレスをとり出し,プログラムカウンタに入れます.このようにすることで,サブルーチン処理が行えます.スタックは3段になっているので,サブルーチンのネストは最大で3段階といえます.
以上ですべてのブロックについて説明しました.上記のブロックはこのあとも常に説明で出てきますのでよく理解しておいてください.