tcy | 2μs min 〜 3μs max |
tφ1 | 0.70μs min |
tφ2 | 0.55μs min |
tD3 | 0.20μs min |
tD2 | 0.40μs min |
tD1 | 0.90μs min 〜 1.1μs max |
これ計算するとわかりますが
そういえば、8080でRST 0命令って何のためにあるんだろうと思ったことはありませんか。
そう、8008ではresetするために不可欠なものだったんですねえ。
それと互換をとるために8080に残したんでしょうきっと。
だから RST 0なんて盲腸みたいな命令が8080にあるんでしょう、
S0 | S1 | S2 | state | 説明 |
0 | 1 | 0 | T1 | アドレスの下位8bitを出力する。 In/out命令の入出力サイクルの場合アキュムレータを出力する。 |
0 | 1 | 1 | T1I | 割り込みを受け付けた際のT1サイクル |
0 | 0 | 1 | T2 | アドレスの上位6ビットとバスサイクル種別信号2bitを出力 |
0 | 0 | 0 | WAIT | メモリからのReady信号を待っている状態 |
1 | 0 | 0 | T3 | データの読み込みあるいは出力 |
1 | 1 | 0 | STOPPED | HALT命令にて停止している。 |
1 | 1 | 1 | T4 | 命令の実行 In命令ではフラグの値を出力 |
1 | 0 | 1 | T5 | 命令の実行 |
D6 | D7 | サイクル | 説明 |
0 | 0 | PCI | 命令の1バイト目の読み出し |
0 | 1 | PCR | 命令の2,3バイト目の読み出し,またはデータの読み出し |
1 | 0 | PCC | IN,OUT命令 |
1 | 1 | PCW | データの書き込み |
そうです、メモリをアクセスするたびに T1→T2→(WAIT→)T3(→T4→T5)を繰り返すのです.
基本的にT4,T5は内部動作になり、これが存在しない命令もたくさんあります.
そして1つのstateは2クロック(500 KHzなら4μS)かかるのです.
1つのstateの中は前半がSYNC=1,後半がSYNC=0で区別されます。
基本的にSYNC=1でCPUはデータを読み込み,SYNC=0でデータを出力します。
外部のラッチでアドレスなどをラッチしておきメモリとつなぐのです.
ただしIN,OUT命令の場合T1でアキュムレータの値が出力されます.
OUT命令の場合はこれが出力データになります.
IN,OUT命令の場合T2で命令コードがそのまま出力されます.
IN | 01 00 MMM 1 |
OUT | 01 01 MMM 1 (OUTの場合この3つのパターンがある) 01 10 MMM 1 01 11 MMM 1 |
これでINポートが8個OUTポートが24個の意味も明らかでしょう.
命令 | Clock | 1st cycle | 2nd cycle | 3rd cycle | ||||||||||||
LAA,LAB,LAC,LAD,LAE,LAH,LAL LBA,LBB,LBC,LBD,LBE,LBH,LBL LCA,LCB,LCC,LCD,LCE,LCH,LCL LDA,LDB,LDC,LDD,LDE,LDH,LDL LEA,LEB,LEC,LED,LEE,LEH,LEL LHA,LHB,LHC,LHD,LHE,LHH,LHL LLA,LLB,LLC,LLD,LLE,LLH,LLL |
10+ 2*W1 |
|
なし | なし | ||||||||||||
INB,INC,IND,INE,INH,INL DCB,DCC,DCD,DCE,DCH,DCL |
↑ | ↑ | なし | なし | ||||||||||||
ADA,ADB,ADC,ADD,ADE,ADH,ADL
ACA,ACB,ACC,ACD,ACE,ACH,ACL SUA,SUB,SUC,SUD,SUE,SUH,SUL SBA,SBB,SBC,SBD,SBE,SBH,SBL CPA,CPB,CPC,CPD,CPE,CPH,CPL |
↑ | ↑ | なし | なし | ||||||||||||
NDA,NDB,NDC,NDD,NDE,NDH,NDL
XRA,XRB,XRC,XRD,XRE,XRH,XRL ORA,ORB,ORC,ORD,ORE,ORH,ORL |
↑ | ↑ | なし | なし | ||||||||||||
RLC,RRC,RAL,RAR | ↑ | ↑ | なし | なし |
命令 | Clock | 1st cycle | 2nd cycle | 3rd cycle | ||||||||||||||||||
LAM,LBM,LCM,LDM, LEM,LHM,LLM LAI,LBI,LCI,LDI, LEI,LHI,LLI |
16+ 2*W1+ 2*W2 |
|
|
なし | ||||||||||||||||||
ADM,ACM,SUM,SBM,CPM ADI,ACI,SUI,SBI,CPI |
↑ | ↑ | ↑ | なし | ||||||||||||||||||
NDM,XRM,ORM NDI,XRI,ORI |
↑ | ↑ | ↑ | なし | ||||||||||||||||||
LMA,LMB,LMCLMD, LME,LMH,LML |
14+ 2*W1+ 2*W2 |
|
|
なし | ||||||||||||||||||
LMI | 18+ 2*W1+ 2*W2+ 2*W3 |
|
|
|
命令 | Clock | 1st cycle | 2nd cycle | 3rd cycle | ||||||||||||||||
INP | 16+ 2*W1+ 2*W2 |
|
|
なし | ||||||||||||||||
OUT | 12+ 2*W1+ 2*W2 |
|
|
なし | ||||||||||||||||
HLT | 8+ 2*W1 |
|
なし | なし |
命令 | Clock | 1st cycle | 2nd cycle | 3rd cycle | ||||||||||||||||||||||
JMP,CAL | 22+ 2*W1+ 2*W2+ 2*W3 |
|
|
|
||||||||||||||||||||||
Branch Taken JFC,JFZ,JFS,JFP JTC,JTZ,JTS,JTP CFC,CFZ,CFS,CFP CTC,CTZ,CTS,CTP |
22+ 2*W1+ 2*W2+ 2*W3 |
↑ | ↑ | ↑ | ||||||||||||||||||||||
Branch Not Taken JFC,JFZ,JFS,JFP JTC,JTZ,JTS,JTP CFC,CFZ,CFS,CFP CTC,CTZ,CTS,CTP |
18+ 2*W1+ 2*W2+ 2*W3 |
|
|
|
命令 | Clock | 1st cycle | 2nd cycle | 3rd cycle | ||||||||||
RET,RST | 10+ 2*W1 |
|
なし | なし | ||||||||||
Return Taken RFC,RFZ,RFS,RFP RTC,RTZ,RTS,RTP |
10+ 2*W1 |
|
なし | なし | ||||||||||
Return Not Taken RFC,RFZ,RFS,RFP RTC,RTZ,RTS,RTP |
6+ 2*W1 |
|
なし | なし |
メモリアドレス指定方法
H,Lレジスタはメモリ参照のために常に利用される。
またHLをメモリに保存しようにもスタックがないため、事実上演算には利用できない。
つまり8080に比べ内蔵レジスタが2本少ないと考えてよい。
メモリ転送のような簡単なプログラムであっても、内蔵レジスタが不足しメモリをワークエリアに使う事態になる。
8080系のようなポインタベースのアーキテクチャでメモリをワークエリアに使わざるをえない悲哀を感じるのである。
以上のようなアドレッシングモードの貧弱さとスタックポインタが存在しないことなどから
割り込みが不完全であることは容易に予想できるであろう。
割り込みを受け付けた場合、割り込みサイクルで読み取った命令を実行する。
割り込み動作をさせるには1バイトのリスタート命令か3バイトのコール命令を読み込ませる。
割り込み対して不完全といわざるをえない点を以下に記述する。
以上の条件から、内部状態の待避復帰には、このような手順が必要になる。
次に、リターンスタックがCPUに内蔵されている点がネックになる。
リターンスタックの中身を取り出す命令はリターン命令だけである。
従ってその中身をデータとして取り出すことはできない。
またリターンスタックに値を書く命令はリスタート命令とコール命令のみ
である。好きな値を書き込むことができない。
よってソフトウェアでリターンスタックを拡張することができない。
つまりサブルーチンのネスティングレベルが7レベルに制限される。
割り込みでも使用するから、それに使用するレベルだけ制限はきつくなる。
これはソフトウェアを書く上で結構きつい制限になるはずである。
もちろんサブルーチンコール命令を読んだアドレスを外部ハードウェアで
ラッチしておき、それを読み込んで自分でソフトウェアスタックを作ることは
可能である。必要なら外部ハードを設ければよい。
しかし、ハードウェアに強く依存したソフトになることになる。