Z80 の研究部屋
Z80 について個人的に調査したデータを追加していこうと思います。Z80 のマニュアルとあわせて読めば理解が深まること間違いなし!?
- 信号線の調査データ [Nov.19 2012]
Z80 を H8/3052 マイコンに接続してクロックを L にセットして信号線を読む、クロックを H にセットして信号線を読む、・・・ということを繰り替えして得たデータです。
1行がクロックの半周期になっています。どの信号線がどのクロックで変化するかがわかります。
例として、DI 命令実行時の信号線の変化を次に掲載します。
[DI] 4 cycles
CLK ADDR DATA /M1 /MREQ /IOREQ /WR /RD /REFSH /BUSACK /HALT
1 0001 FF 0 1 1 1 1 1 1 1
0 0001 F3 0 0 1 1 0 1 1 1
1 0001 F3 0 0 1 1 0 1 1 1
0 0001 F3 0 0 1 1 0 1 1 1
1 0001 FF 1 1 1 1 1 0 1 1
0 0001 FF 1 0 1 1 1 0 1 1
1 0001 FF 1 0 1 1 1 0 1 1
0 0001 FF 1 1 1 1 1 0 1 1
DI 命令は 4 クロックサイクルで完了する命令です。なので 8 行(8 x 1/2周期)で表現しています。
最初の2クロック(4行)が OP コードフェッチで、後の2クロックがリフレッシュサイクルです。
この 4 クロックの信号パターンはどの命令でも必ず発生します。
DI の場合はこの次のクロックサイクルから次の OP コードフェッチを開始しますが、
命令自体は次の OP コードフェッチと並行して実行されています(注。命令の実行が次の OP
コードフェッチとオーバーラップするのは DI だけに限らず、ALU
の演算結果をレジスタに格納する命令は、たいていその結果の格納(レジスタ書き込み)サイクルと次の OP コードフェッチがオーバーラップしています。
注: よって EI 状態で /INT が L の場合、DI の割り込みフェッチサイクル(最後のクロック立ち上がり、↑だと最後から2行目)で割り込みは検知される。実際に割り込み禁止となるのは DI の次の命令から。
注意点としては、データはマイコンのデジタル I/O ポートから取得しているため、CLK がレベル変化してから各信号線のレベルを読み出すまでに十分長い時間が経過しています。
よって、CLK 変化から信号が変化するまでの遅延時間がゼロのデータとして見てください。実際に CPU を数MHzのクロック周波数で動作させた場合、各信号は CLK 変化から多少遅れて出て来るはずです。
前置きはこのくらいにして、調査したデータをここに掲載します(ABC 順)。ところどころ CPU 内で何をしているか妄想しているコメント等ありますが真実とは限りませんのでご参考までに。
ADC_HL_BC_15cycles.txt
ADD_HL_BC_11cycles.txt
ADD_HL_DE_11cycles.txt
ADD_IX_BC_15cycles.txt
ADD_IY_BC_15cycles.txt
BIT_6_(IX+127)_20cycles.txt
BIT_7_(HL)_12cycles.txt
CALL_0000h_17cycles.txt
CALL_Z_0003h_17cycles.txt
CPIR.txt
DI_4cycles.txt
EI_4cycles.txt
EI_HALT_INT.txt
EX_(SP)_HL_19cycles.txt
EX_(SP)_IX_23cycles.txt
EX_(SP)_IY_23cycles.txt
FD_BIT_7_E.txt
HALT_4cycles.txt
IM_2_8cycles.txt
INC_(HL)_11cycles.txt
INC_(IX+127)_23cycles.txt
INC_(IX+127)_prefixed_by_2x_CBh_27cycles.txt
INC_(IX+127)_prefixed_by_CBh_19cycles.txt
INC_(IX+127)_prefixed_by_EDh_19cycles.txt
INC_(IY+127)_prefixed_by_EDh_19cycles.txt
INC_IX_10cycles.txt
INT_MODE_1_13cycles.txt (割り込み MODE 1 検知時の動作)
IN_A_(55h)_11cycles.txt
IN_A_(0AAh)_11cycles.txt
IN_A_(C)_12cycles.txt
JP_HL_4cycles.txt
JR_rr_12cycles.txt
LDIR.txt
LD_(HL)_00h_10cycles.txt
LD_(HL)_A_7cycles.txt
LD_(IX+127)_A_19cycles.txt
LD_A_(HL)_7cycles.txt
LD_A_(IX+127)_19cycles.txt
LD_A_I_9cycles.txt
LD_A_nn.txt
LD_BC_(1122h)_20cycles.txt
LD_B_nn.txt
LD_HL_(1234h)_with_ED_20cycles.txt
LD_I_A_9cycles.txt
LD_SP_HL_6cycles.txt
LD_SP_IX_10cycles.txt
LD_SP_nnnn_10cycles.txt
LD_(2233h)_HL_16cycles.txt
LD_(3344h)_BC_20cycles.txt
LD_(4455h)_IX_20cycles.txt
OUT_(055h)_A_11cycles.txt
OUT_(C)_A_12cycles.txt
POP_AF_10cycles.txt
POP_IX_14cycles.txt
PUSH_AF_11cycles.txt
PUSH_IX_15cycles.txt
RESET_and_NOP.txt (リセット後最初の命令を実行開始するまでの動きを調査)
RETI_14cycles.txt
RETN_14cycles.txt
RET_10cycles.txt
RET_NZ_5_or_11cycles.txt
RLC_(HL)_15cycles.txt
RLC_(IX+127)_23cycles.txt
RLC_A_8cycles.txt
RLD_18cycles.txt
RRD_18cycles.txt
RST00h_11cycles.txt
SET_4_(IX+127)_23cycles.txt
SET_5_(HL)_15cycles.txt
今後さらに命令を調査することがあれば追加します。ただしここに掲載したデータと Z80 マニュアルの命令サイクル数の表から他の命令がどのように実行されるかはある程度類推できると思います。
(C) Ki 2012