TTLでドライブする場合プルアップ抵抗をつければよい。
従ってLS TLLより入力電流が少ないタイプが必要である。
また8008にはGNDが無いのでVolminはマイナス電位になるはずであり、
入力クランプのあるものがよいと思われる。
またなにぶん古いデバイスであるので最新のデバイスで受けた場合、
信号のスルーレートが遅すぎて発信する可能性があると思われるため
シュミットトリガで受けた方がよい。
最近のデバイスではシュミットトリガ入力のALSTTLが適当であろう。
出力時は出力ピンと同じ扱いでよい。
入力のVihminを満たすためにVoh=3.65Vを保証された8212を使うことにする。
これによりプルアップ抵抗をつける必要がなくなる。
入出力切り替えタイミングはAC特性の部分で検討する。
8008当時の環境では3 stateのゲートは使えなかったかったようである. 従って双方向Pinのドライブはオープンコレクタが常識だったようだ. オープンコレクタには、プルアップ抵抗は必須だが、8008の出力能力は0.44mA@0.4Vしかない。. 結局、どうしていたかというと、3KΩ位の抵抗を使用し、 参考回路図によると、T3A*SYNC*(PCI+PCR+(PCC*INP)で抵抗をイネーブルにしている。
|
データによると、8008の各ピンの入出力容量は最大10pF(1MHz,25℃)であるので、
普通のTTLと考えて設計すればよく、特別な配慮はしない。
仕様上は、T2とWAIT状態でしか参照しない信号であると思われるが、
必要以外のタイミングでは、すべてReady状態の入力としておく方がよいと思われる。
またφ22の立ち上がりの時点では確定させておいた方が問題を起こす可能性を低減できると思われる。
(何れも経験的なものであるが、計測器を自由に利用できたり、
メーカから十二分な技術サポートを受けられる環境に無い場合、トラブルを避けるのに役立つ。)
参考回路図によるとSYNCの立ち上がりでアサートし、T1Iで始まる割り込み応答サイクルのPCIのT2のφ22でネゲートすればよいようだ。
8008のデータ入力セットアップ: T3のφ11の立ち下がりに対して0μsmin
8008のデータ入力ホールド: T3でφ21の立ち下がり後SYNC=highである間じゅうホールド
よってT3のφ11の立ち下がりの0.10μs前からイネーブルし、 T3でφ21の立ち下がり後SYNC=highである間じゅうイネーブルし続ければよい。
![]() |
上のタイミングのように、すべて100nsの倍数に定められる。
昔のようにワンショット4個で作成する案もあるが、ここでは無調整で済む回路とする。
FPGAなども考えられるが、ここでは標準のTTLで考えてみた。
シリアル通信用のクロックと共用化するため原振は19.6608MHzである。
下図において右端から8008用クロックが得られる。これをインバータを通して8008に供給する。
B側のF163はクロックイネーブル付きのエッジトリガ型D-FFとして使っている。
2相ノンオーバラップクロックは4つの状態があるので、それを2ビットジョンソンカウンタの4つの状態に対応づけている。
B側F163のQ1-Q0とF139のの上半分で2ビットジョンソンカウンタを構成している。
F139の下半分で4つの状態をデコードしている。
クロックのタイミング定義にあわせて状態遷移のタイミングをかえているのがA側F163である。
ロードする初期値を動的にかえ、キャリー出力でB側F163の状態を変化させるようにしてある。
ジョンソンカウンタの出力をデコードしたものであるので、F139の出力をそのまま使ってもよい気がするが、
習慣上、B側F163のQ2-Q3を使ってもう一度ラッチしてから出力としている。
![]() |
T1サイクル | アドレスの下位8ビット(INP,OUTサイクルを除く)またはAregの値そのもの(INP,OUTサイクル)が出力される。 これは、メモリアドレスや出力データ,入力拡張アドレスに用いられるので8008外部のラッチに保存しておかねばならない。 ここでは下位アドレスラッチと呼ぶ。 |
T2サイクル | アドレスの上位6ビット+バスサイクル種別信号2ビット(INP,OUTサイクルを除く)またはOPCode値そのもの(INP,OUTサイクル)が出力される。
これは、メモリアドレスやI/Oアドレスに用いられるので8008外部のラッチに保存しておかねばならない。 ここでは上位アドレスラッチと呼ぶ。 |
T1Iサイクル | 割り込みを受け付けた最初のPCI(割り込み命令フェッチ)サイクルで出力されるアドレスは、現在のPCの値であり、フェッチする割り込み命令とは関係がなく、ラッチする必要はないはずである。
しかしこの割り込み命令フェッチサイクルでメモリを参照/書込みする命令を読ませた場合、その命令が終了するまではすべてのT1がT1Iとして出力されるらしい。(明確に書いたものはないが、解説記事や8008の状態遷移図によると) 従ってT1Iとして出力されたアドレスをラッチしておかないと割り込み時のメモリの読み書きが正常にできなくなると思われる。 |
またメモリのアクセスタイム等を有効に使うために、アドレスラッチは(少なくとも上位アドレスラッチは)スルーラッチとしたほうがよい。(ALS-TTLならば 74ALS573など)
以上により、下位アドレスラッチのラッチ信号はこうなる。
従ってT2終了時にはすべてのデータが揃っている。
必要ならReadyを制御してWaitをかけてタイミングを延ばす。
最短の場合 I/Oライトパルス = T3*φ22 である。
データ入力マルチプレクサをI/Oリードデータに選択する。
外付けデータ入力バッファを必要なタイミングでイネーブルする。
必要ならReadyを制御してWaitをかけてタイミングを延ばす。
Waitをかけてもライトデータの出力期間を延ばすことはできない。T3のステートだけである。
必要ならReadyを制御してWaitをかけてタイミングを延ばす。
最短の場合 メモリライトパルス = T3*φ22 である。
データ入力マルチプレクサをメモリリードデータに選択する。
外付けデータ入力バッファを必要なタイミングでイネーブルする。
必要ならReadyを制御してWaitをかけてタイミングを延ばす。
リターンアドレスのスタックが7レベルしかないので一般的には多重割り込みはできないものと考えた方がよい。
(割り込みを受けた際のアドレスを外部ラッチに保存し、割り込みでフェッチさせる命令をJMPなどにすればあるいは多重割り込みが可能かもしれないが、ここではそこまで深入りしない。)
(1) Interruptピンに接続する回路
割り込みマスク回路はI/Oポートなどに割り付け、外付けで実現する。
Interrupt信号をアサートしてから8008が割り込みに応答する前にInterrupt信号がネゲートされることが無いように割り込みマスク回路を設計する。
通常動作をしているCPUを停止させるにはHLT命令を割り込ませればよい。
STOPPED状態にあるCPUを起動するには、任意の命令を割り込ませればよい。
任意の番地からスタートさせるにはJMP命令を割り込ませればよい。
電源ON直後や直前のCPU内部状態を破壊してもよい場合、RST命令を用いれば1バイトで0番地に実行を移すことができる。
ここでは、CPU停止のためにはHLT命令,CPUの起動のためにはNOP(LAA)命令,ResetのためにはRST 0命令を割り込ませることにする。
次にCPUが通常動作にない場合どうするかを考える。
電源ON直後の通常動作に入るまでの際に起こる。
文献によれば、8008は電源が加わり、φ1,φ2が正常に与えられると
Vddの立ち上がりを検出してHLT命令(0x00)をインストラクションレジスタに入れSTOPPEDステートになる。
それに続く16ステートで内部メモリをクリアするようである。
コンソールパネル等を設け人手でスタートさせるなら問題はなさそうだが、自動スタートは問題が出そうである。
まず8008がVddの立ち上がり検出に失敗したらどうなるかという点と、いつ割り込みを加えたらよいかという点である。
ResetICで電源電圧を監視し、規定の電圧に達してから、いくらか時間を待ってRST 0命令を割り込ませるという方針を取ることにする。(+5と-9を監視するの面倒だなあ。)
割り込みを連続して与えるようにハードを作れば更にいろいろなことが可能である。
(ただしこれは紙の上での検討であり、まだ実物で確認したわけではない。)
(リターンスタックもいじれそうである。RET、CALL、JMPをうまく使えば可能とおもわれる。)
いずれにしても、ステップ実行の回路が任意にWaitをかけても動作に支障がないように
メモリやI/Oインタフェースを設計する必要がある。
また電源投入直後、CPUがSTOPPED状態になるまではWaitをかけないようにする方がよいと思われる。
目標は、エバリュエーションキットのようにプログラム開発に利用できることである。
[当分続く]