標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第91回]

●XCHG命令の説明です

ここのところクロック毎の動作を写真で説明することばかりが続いていました。
久しぶりに新しい命令の説明です。
以前、スパゲッティのような追加配線だらけになってしまった写真([第70回])をお見せして、そのときは、この状態ではそれぞれの命令を正しく動作させるのはなかなかにきびしい…と思わずため息をついてしまいましたが、でも思ったよりもまともに動いてくれています。

引き続き残った命令について、タイミングチャートと回路図と、それからクロック毎の動作の写真もお見せしながら説明をしていきます。
今回はXCHG命令です。

OPコードは”EB”です。
レジスタペアのHLとDEの内容を交換します。
前にも何回か言及したことですが、8080はなんともちぐはぐなCPUで、不統一なところが目に付きます。

HLレジスタは、メモリアドレスを指定するインデックスレジスタとしての役割が与えられていますから、他のレジスタペアDE、BCとは別格としての扱いになっていてもそれはそれで納得できます。

しかしDEレジスタとBCレジスタは機能的には全く同等です。
(Z80では、BCとDEにそれぞれ別の役割を与えています)
それなのに、XCHGはHLとDEの値を交換しますが、HLとBCの値を交換する命令はありません。

レジスタの値の交換というのは、簡単なようですが、結構面倒な作業をしなければなりません。
全部のレジスタを使ってしまっているときに、たとえばHLレジスタとBCレジスタの値を交換しようとすると、スタックを利用するしかありません。

PUSH H
PUSH B
POP H
POP B

という具合です。
たかがレジスタの値の交換のためにスタックを使うというのは、感覚的には抵抗を感じてしまいますが、仕方がありません。
マシン語のプログラムでは処理時間が問題になることが多いので、実行時間が長いPUSH、POP命令はできれば使いたくありません。
もしAレジスタが空いていて利用できれば、

MOV A,H
MOV H,B
MOV B,A
MOV A,L
MOV L,C
MOV C,A

とすれば、少しですが時間の短縮になります。ですけれどなんともいやなプログラムですね。

さてXCHG命令ですが、8080もZ80も実行クロック数は4クロックで、これはNOPなどと同じで、最低のクロック数で実行します。
レジスタのセレクト回路に何か工夫があって、セレクトするチャンネルを簡単に交換するような仕組みになっているのかもしれません。
「つくるCPU」の回路ではごくオーソドックスにWKレジスタを使います。
ですからクロック数が多くなって、なかなか大変な処理になります。

●XCHG命令のタイミングチャートです



処理は3つのパートに分かれます。
期間W1ではLレジスタの値をWKLレジスタに、Hレジスタの値をWKHレジスタに入れます。
期間W2ではEレジスタの値をLレジスタに、Dレジスタの値をHレジスタに入れます。
最後の期間W3ではWKLレジスタの値をレジスタEに、WKHレジスタの値をレジスタDに入れます。

s3−s0とregRD、d3−d0とregWRによってレジスタが選択され、値の読み出し、書き込みが行われます。
s3−s0、d3−d0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。

●XCHG命令の回路図です



タイミングチャートのW1の部分は、STAX命令、LDAX命令([第66回])と同じです。
この部分は、STAX命令、LDAX命令の回路図([第66回])の「MVreg16」を利用します。

2008.10.8upload

前へ
次へ
ホームページトップへ戻る