標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
やっと(!)MYCPU80の改良型基板製作に着手しました!!
[第856回]
●[12]ADD、SUB、CMP、DAD、DAA、RST、INT命令回路
とうとう、といいますか、やっと、といいますか、今回の作業でついに完成です。
残っておりました算術演算回路と割込処理回路を実装することで、全回路が実装できました。
完成写真です。
●ADD、ADC、SUB、SBB、CMP命令のテスト
ADDはAレジスタとAおよびそのほかのレジスタ、メモリとの加算命令です。
加算の結果はAレジスタに入れられます。
SUBはAレジスタからAおよびそのほかのレジスタ、メモリの値を減算して結果をAレジスタに入れる命令です。
ADCはADDの演算にC(キャリー)を加える加算命令です。
SBBはSUBの演算からさらにC(キャリーだがこの場合にはボロー)を減じる減算命令です。
CMPはSUBと同じ計算をしますが、Aレジスタの値は変わりません。
フラグだけが変わります。
Aレジスタとその他のレジスタ、メモリとの値の比較に使われます。
ADD、ADC、SUB、SBB、CMP命令のテストプログラムのリストです。
0000 21AB56 LXI H,$56AB 0003 118934 LXI D,$3489 0006 7D MOV A,L 0007 83 ADD E 0008 4F MOV C,A 0009 7C MOV A,H 000A 8A ADC D 000B 47 MOV B,A 000C 11CD12 LXI D,$12CD 000F 3E89 MVI A,89 0011 93 SUB E 0012 6F MOV L,A 0013 3E34 MVI A,34 0015 9A SBB D 0016 67 MOV H,A 0017 BC CMP H 0018 C21D00 JNZ $001D 001B BD CMP L 001C 76 HLT 001D 76 HLT |
上記の命令のほかに、即値(定数)との間で演算をおこなうADI、ACI、SUI、SBI、CPI命令もありますが、ADD〜CMPと基本的な部分はすべて同じ回路を共有していますから、ここでのテストは省略します。
最初にAレジスタの値ABとEレジスタの値89が加算(ADD)され、結果の値34がCレジスタに入れられます。
このときキャリーが発生します。
そのキャリーとAレジスタの値56とDレジスタの値34とが加算(ADC)され、結果の値8BがBレジスタに入れられます。
次にAレジスタの値89からEレジスタの値CDが減算(SUB)され、結果の値BCがLレジスタに入れられます。
このときボローが発生します。
次にAレジスタの値34からDレジスタの値12とボローとが減算(SBB)され、結果の値21がHレジスタに入れられます。
そのあとAレジスタとHレジスタが比較(CMP)されます。
Aレジスタの値21がHレジスタに入れられた直後ですから、A=HでZフラグが1になります。
したがってその次のJNZはパスされて、その次のCMP命令が実行されます。
Aレジスタの値21とLレジスタの値BCが比較されます。CMP命令の比較はSUBと同じ計算をしますから、21−BCの計算になります。その結果キャリーフラグが立ちます。
最後にHLT命令が実行されます。
プログラムが正しく実行されれば、B=8B、C=34、A=21、H=21、L=BCになりC(キャリー)フラグがセットされたあと、アドレス001CのHLT命令で停止します。
ADD、ADC、SUB、SBB、CMP命令のテストプログラムを実行中の写真です。
このほかにもまだテストする命令が残っていますが、本日は時間がなくなってしまいましたので、それについては次回に書くことにします。
TTLでCPUをつくろう![第856回]
2018.3.2upload
前へ
次へ
ホームページトップへ戻る