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

●STA命令とLDA命令

今回はSTA命令とLDA命令について説明します。
STA(store A direct)はAレジスタの値を、この命令コードに続く2バイトで示すメモリアドレスに書き込む命令です。
LDA(load A direct)はSTAとは逆に、命令コードに続く2バイトで示すメモリアドレスの値をAレジスタに書き込む命令です。
命令コードは次の通りです。

命令コード(2進数)   命令コード(16進数)  ニーモニック    
00110010           32          STA adrs
00111010           3A          LDA adrs

adrsは16ビットの値で、前回説明したJMP命令のアドレスと同じ用法です。
命令コードの次のメモリアドレスに、指定アドレスの下位バイトを置き、さらにその次のメモリアドレスに、指定アドレスの上位バイトを置きます。

たとえば、アセンブラニーモニックで、

STA 1234

と書くと、この命令は、Aレジスタの値を1234番地に書き込め、という命令になります。
マシン語コードは、指定アドレスを含めると3バイトになります。
上記のSTA 1234 が、メモリの0100番地から書かれている例を下に示します。

アドレス  2進数      16進数  ニーモニック
0100   00110010   32       STA
0101   00110100   34      (下位アドレス)
0102   00010010   12      (上位アドレス)

同じ例をLDA命令の場合について示します。

アドレス  2進数      16進数  ニーモニック
0100   00111010   3A       LDA
0101   00110100   34      (下位アドレス)
0102   00010010   12      (上位アドレス)

●STA命令、LDA命令のタイミングチャートです



T4〜T7の期間の動作はJMP命令と全く同じです。
2バイトの値をメモリから読み込んで、ワークレジスタWKL、WKHに格納します。

JMP命令では読み込んだワークレジスタの値を、PC(プログラムカウンタ)にコピーしましたが、STA命令、LDA命令では、ワークレジスタの値をそのまま外部アドレスバスに出力します。
WKselという信号をアクティブにすると、ワークレジスタと外部アドレスバスを仕切っている74HC244が開いて、ワークレジスタ(WKH、WKL)の値が外部アドレスバスに出力されます。
WKselについては、ワークレジスタの回路図([第23回])を参照してください。

その状態で、STAの場合にはAレジスタの値をメモリに書き込みます。
LDAの場合にはメモリの値をAレジスタに書き込みます。
メモリとレジスタの間のMOV命令と同じようですが、MOV命令のメモリはHLレジスタでメモリアドレスを示したのに対して、STA命令、LDA命令では、WKレジスタの値でメモリアドレスを示します。

STA命令では、T8、T9でAレジスタの値をデータバスに出力するためにregRDをアクティブにしていますが、s3〜s0がありません。
Aレジスタはs3〜s0=”1111”で選択されるので、何も指定しなくてregRDをアクティブにするだけでよいのです。
同じ理由でLDA命令ではT8でregWRのみアクティブにしています。

●STA命令、LDA命令の回路図です



図の右上のところで、PCtoReg16をアクティブにしています。
PCtoReg16はJMP命令の回路図([第62回])にありました。
T4〜T7の部分がJMP命令と全く同じです。この部分は他の命令にも共通しているものがありますから、命令回路から独立させて、他の命令回路でも利用できるようにしてあります。
PCtoReg16信号をアクティブにするだけで、JMP命令、STA命令などの、T4〜T7の動作を実行します。
2008.9.11upload

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