標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第109回]
●OUT命令とIN命令のクロック毎の動作の写真です
動作の確認をするためのプログラムは[第107回]で紹介済みですが、もう一度再掲いたします。
0000 3E80 MVI A,80
0002 D383 OUT 83
0004 D380 OUT 80
0006 3D DCR A
0007 D381 OUT 81
0009 3D DCR A
000A D382 OUT 82
000C DB81 IN 81
OUT命令が何回か出てきます。
クロック毎の動作は同じなので、最初に出てくる0002番地のOUT 83についてはT4から紹介しますが、あとのOUT命令については、実行後のI/Oポート(82C55)の出力結果を確認するために、最終クロックの写真のみ紹介することにします。
OUT命令のT4の写真です。
OPコードレジスタには”D3”(OUT命令のOPコード)がラッチされています。
PC(プログラムカウンタ)は”0003”になっていて、PCADoutが点灯しているので、PC(プログラムカウンタ)の値が、外部アドレスバスA15−A0に出力されています。
MEMRDが点灯していて、外部データバスD7−D0には、メモリアドレス0003の値”83”が出力されています。
”83”はOUT命令で指定するI/Oアドレスです。
DataDIRとDataEnableが点灯していて、内部データバス(innerBUS)も”83”になっています。
regWRが点灯していて、d3−d0が”0111”なのでデータの受け手としてWKLレジスタが選択されます。
WKLregWRが点灯していて、WKLレジスタに内部データバスの値”83”が読み込まれています。
d3−d0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
Aレジスタは、OUT命令の前に実行された、MVI A,80によって、”80”になっています。
T5の写真です。
regWR、WKLregWRが消灯し、WKLレジスタに、内部データバスの値”83”がラッチされました。
PCclkが点灯しました。
T6の写真です。
PC(プログラムカウンタ)は+1されて”0004”になりましたが、PCADoutが消灯しているので、外部アドレスバスA15−A0には出力されません。
代わりにWKselが点灯していて、WKレジスタの値が外部アドレスバスA15−A0に出力されています。
IOWRが点灯していて、外部アドレスバスの下位8ビットA7−A0がI/Oアドレスであることを示しています。
regRDが点灯していて、s3−s0が”1111”なのでデータの送り手としてAレジスタが選択されます。
AregRDが点灯していて、Aレジスタの値、”80”が内部データバスinnerBUSに出力されています。
DataEnableが点灯していますが、DataDIRは消灯しているので、内部データバス(innerBUS)の値が外部データバスD7−D0に出力され、外部データバスも”80”になっています。
I/Oアドレス”83”である外部I/O(82C55のコントロールワードアドレス)に、データバスの値”83”が書き込まれているはずですが、写真ではそのことは確認できません。
T7の写真です。
IOWRが消灯しました。
82C55の出力に接続しているLEDが全点灯しました。
このLED回路は82C55の出力がLのときに点灯します。
ですからLEDが全部点灯しているということは、82C55のAポートもBポートもCポートも出力が”00”になっていることを示しています。
82C55はコントロールワードによってポートの向きを設定し直すと、出力に設定されたポートの出力がクリアされて”00”が出力されます。
いまコントロールワードアドレスの”83”にコントロールワード”80”を送って、全ポートの向きを出力に設定しましたから、それで全部のポートの出力が”00”になりました。
74HC74や74HC373などはWR信号がアクティブになった段階でデータが入力されて、そのときから出力も変化しますが、82C55はWRがLになった段階ではまだ出力は変化せず、WRの立ち上がりエッジではじめて出力が変化するようです。
T8(次の命令のT0)の写真です。
T8は一瞬で完了して次の命令のT0になります。
次の命令もOUT命令なので、最後のクロックの写真のみお見せします。
OUT 80命令のT8(次の命令のT0)の写真です。
また、えらくピンボケになってしまいました。
でもOUT 80の実行の結果、AポートにAレジスタの値の”80”が出力されて、PA7−PA0が”80”になっていることは、なんとか確認できます。
82C55の出力に接続しているLEDは、ポートの出力が0のビットが点灯し、1のビットが消灯します。
LEDは一番左のPA7のみ消灯していて残りのビットは点灯していますから、Aポートから出力されている値が”10000000”つまり16進数の”80”であることがわかります。
OUT 81命令のT7の写真です。
OUT 80命令では命令実行後の写真としてT8(次の命令のT0)の写真をお見せしましたが、どうもいまひとつピンときませんから、T7の写真で説明することにします。
OUT 81命令の実行によって、82C55のBポートにAレジスタの値が出力されます。
AレジスタはOUT 81命令の前の、DCR A命令によって、”80”が−1されて、”7F”になっています。
PB7−PB0のLED表示は、PB7のみ点灯していて、残りは全て消灯しています。
Bポートから出力されている値が”01111111”つまり16進数の”7F”であることがわかります。
OUT 82命令のT7の写真です。
OUT 82命令の実行によって、82C55のCポートにAレジスタの値が出力されます。
AレジスタはOUT 82命令の前の、DCR A命令によって、”7F”が−1されて、”7E”になっています。
PC7−PC0のLED表示は、PC7とPC0が点灯していて、残りは全て消灯しています。
Cポートから出力されている値が”01111110”つまり16進数の”7E”であることがわかります。
IN命令のT4の写真です。
OPコードレジスタには”DB”(IN命令のOPコード)がラッチされています。
PC(プログラムカウンタ)は”000D”になっていて、PCADoutが点灯しているので、PC(プログラムカウンタ)の値が、外部アドレスバスA15−A0に出力されています。
MEMRDが点灯していて、外部データバスD7−D0には、メモリアドレス000Dの値”81”が出力されています。
”81”はIN命令で指定するI/Oアドレスです。
DataDIRとDataEnableが点灯していて、内部データバス(innerBUS)も”81”になっています。
regWRが点灯していて、d3−d0が”0111”なのでデータの受け手としてWKLレジスタが選択されます。
WKLregWRが点灯していて、WKLレジスタに内部データバスの値”81”が読み込まれています。
d3−d0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
Aレジスタは、IN命令の前に実行された、DCR Aによって、”7E”になっています。
T5の写真です。
regWR、WKLregWRが消灯し、WKLレジスタに、内部データバスの値”81”がラッチされました。
PCclkが点灯しました。
T6の写真です。
PC(プログラムカウンタ)は+1されて”000E”になりましたが、PCADoutが消灯しているので、外部アドレスバスA15−A0には出力されません。
代わりにWKselが点灯していて、WKレジスタの値が外部アドレスバスA15−A0に出力されています。
IORDが点灯していて、外部アドレスバスの下位8ビットA7−A0がI/Oアドレスであることを示しています。
I/Oアドレス”81”である82C55のBポートにラッチされている値”7F”が外部データバスに読み出されています。
DataDIRとDataEnableが点灯していて、内部データバス(innerBUS)も”7F”になっています。
regWRが点灯していて、d3−d0が”1111”なのでデータの受け手としてAレジスタが選択されます。
AregWRが点灯していて、Aレジスタに内部データバスの値”7F”が読み込まれています。
T7の写真です。
regWR、AregWRが消灯しました。
Aレジスタに、82C55のBポートの値”7F”が書き込まれました。
IN命令の動作はT7で終了し、T8は一瞬だけで次の命令のT0になります(写真は省略します)。
2008.11.10upload
前へ
次へ
ホームページトップへ戻る