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

●[7]JMP命令回路の実装です

[第312回]で説明した作業です。
今回はJMP命令の回路を実装します。
実装する部分は、こちらのシルク図で、黄緑色で着色したところです。
ところがその黄緑色のうち画面左下方にあるWKHレジスタ回路は[第326回]で説明しましたように、[5]のMVI回路で必要であることがわかりましたので、先に組み付けてしまいました。
すると今回の作業はほんとにわずかです。
じきに完了してしまいました。

いよいよJMP命令のテストです。
JMP命令、特に条件JMP命令が使えると、うんとプログラムらしくなります。
さっそくテストしてみたのですが…。
JMPできません。
またしても、配線のミスか…?

●ICの組み付け順序が間違っていました

回路図を調べてみたところ、配線のミスではなくて、[第326回]のときと同じく、必要な回路を後回しにしていたことがわかりました。
回路図bP5の一部です。


黄緑色で囲ったところは、次の[8]で組み付ける予定になっていたのですが、この回路はJMP命令で使われていることがわかりました。
ほかにもまだありました。

回路図bP6の一部です。



黄緑色で囲ったところは、次の[8]で組み付ける予定になっていたのですが、この回路もJMP命令で使われていることがわかりました。
IC41、IC51の74HC03とIC173の74HC05を追加で組み付けました。

あらためてJMP命令のテストプログラムを実行してみたところ、今度は無事動作いたしました。やれやれ、です。

●必要なICを追加実装したあとの基板の写真です

写真をクリックすると拡大画像を見られます。サイズが大きい(約1.4MB)ので、インターネットの低速接続環境では、ダウンロードに時間がかかります。ご注意ください。



●[7]JMP命令回路の動作テストです(操作説明書から)

●12.JMP命令のテスト

MYCPU80組立説明書 V組立 [7]JMP命令回路 の組立作業後に行う動作テストの説明です。

●12−1. JMP命令のテストプログラムをメモリに書く

メモリに次のプログラムを書きます(1. メモリにデータを書き込む の説明を参考にして操作してください)。

0000 3E00   MVI A,00
0002 47     MOV B,A
0003 4F     MOV C,A
0004 57     MOV D,A
0005 5F     MOV E,A
0006 0C     INR C
0007 C20600 JNZ $0006
000A 04     INR B
000B C20600 JNZ $0006
000E 1C     INR E
000F C20600 JNZ $0006
0012 14     INR D
0013 C30600 JMP $0006
(リスト8) JMP テストプログラム

[注記]JNZとJMP命令のジャンプ先アドレスが0006ではなくて$0006になっていますが、これは当社オリジナルの8080アセンブラで16進数アドレスを表記するときのルールです。

●12−2. テストプログラムを実行する

プログラムの実行の仕方については 4. テストプログラムを実行する を参照してください。
RESETSWを押しながら、ディップスイッチDS3−4をOFFにします。その後RESETSWを離すとプログラムが実行されます。

このプログラムは8ビットのレジスタC、B、E、Dを直列につないで32ビットのカウンタにしたものです。最初にCレジスタが00からFFまでインクリメントし、FFから00になるときに、その上位にあるBレジスタがインクリメントされます。そのようにして、C、B、E、Dの順にカウントが進みます。

カウントが進む様子はレジスタのLEDで目視することができますが、CレジスタとBレジスタは非常に高速なのでほとんど全点灯しているようにしか見えません。
Cレジスタが+1カウントアップするのにかかる時間は、INR C命令とJNZ $0006命令の実行時間を加算したものになります。

8080命令説明書から、INR Cの実行クロック数は8クロック、JNZ命令の実行クロック数は12クロックまたは8クロックです。JNZ命令はCが00になるときだけは8クロックですがその他の場合には12クロックです。
MYCPU80のCPUクロックは2MHzですから、1マシンクロックは0.5μSです。
ですからCレジスタが+1カウントアップするのにかかる時間は、
 (8+12)×0.5=10μSということになります。

Cレジスタが00から次の00までカウントアップして、その上位のBレジスタが+1カウントアップするのにかかる時間は、その257倍(Bレジスタの+1アップの分も含める)ですから、2570μS(2.57mS)になります。
JNZ命令は256回に1回は8クロックになりますから、正確に計算すると、2570−4×0.5=2568μSです。

Bレジスタが00から次の00までカウントアップして、その上位のEレジスタが+1カウントアップするのにかかる時間は、2.568×256≒657.4mSになります。

[注記]上記の計算の詳細については、当社ホームページの
「つくるCPU[第148回]」(http://www.alles.or.jp~thisida/mycpu148.html)
を参照してください。

Eレジスタは657.4mSに1回カウントアップされますから、LEDに表示されるEレジスタの値に657.4mSを掛けることで、プログラム開始からの経過時間を求めることができます。

たとえば、Eレジスタが00から次の00までカウントアップして、その上位のDレジスタが+1されたとき、つまりDレジスタが1でEレジスタが00になったときのスタートからの経過時間は、次の計算によって求められます。
16進数の100は10進数の256ですから、
 657.4×256=168294.4mS
約168.3秒になります。

テストプログラム(リスト8)はJMP命令とJNZ命令をテストするだけのプログラムです。
条件JMP命令にはJNZのほかにもJZ、JNC、JC、JPO、JPE、JP、JMの各命令があります。
しかしそれらの命令はデコード回路以外ではJNZと同じ回路になっていますから、JNZが正しく動作すればそのほかの条件JMP命令も正しく動作すると考えてもよいでしょう。
そこでここではJNZ以外の条件JMP命令のテストは省略することにしました(全ての命令をテストするテストプログラムは、TK80回路完成後に実行できるものを用意してあります)。

☆☆☆操作説明書からのコピーはここまでです。
操作説明書には図はありますが画像(基板の写真)はありません。でもせっかくのホームページですから、写真もUPいたします。☆☆☆

●テストプログラムを実行中の写真です


Dレジスタが01、Eレジスタが5Fを表示しています。
015Fは10進数に直すと、351です。
Eレジスタが+1するのには0.6574秒かかりますから、
351×0.6574=230.7秒になります。
230.7秒は3分50秒7ですから、ストップウォッチの表示とぴったり一致しました。

●8080命令説明書(3)

☆☆☆[第330回]の続きです☆☆☆

●[6] その他の算術演算、CPU制御命令

57. DAA         コード 27        クロック10(4)
 加算後のAレジスタの内容をBCD表示2桁に直します。動作はかなり複雑ですが、8ビットの数をBCD2桁とみなして加減算した後この命令を行うことによって、結果もBCD2桁で得られるものです。したがって、加算を行う前の数値がBCD表現で誤っている場合(例えばABとか7D)はDAA命令によっても正しい結果は得られません。Z80は減算後のDAAにも対応していますが、8080は加算のみで減算には対応していません。加算にはADD、ADCのほかINC命令も含まれます。結果が0のときZ=1、マイナスの時S=1、また、結果のビットが1であるものが偶数個あるときP=1、またさらに上位桁へのキャリー、ボローが出た場合はC=1になります。

58. CMA         コード 2F        クロック10(4)
 Aの内容の1、0を反転します(各ビット毎 1→0、0→1にする)。フラグは変化しません。

59. CMC         コード 3F        クロック6(4)
 キャリーフラグCを反転します。他のフラグは変化しません。

60. STC         コード 37        クロック6(4)
 キャリーフラグCをセットします。他のフラグは変化しません。

61. NOP         コード 00        クロック4(4)
 何も実行しないで次の命令に進みます(No Operation)。

62. HLT        コード 76        クロック4(7)
 割込かリセットがかかるまでCPUの実行を停止します。

63. DI          コード F3        クロック6(4)         

 割込を禁止します。DI命令の実行後はINT信号が入力されても新たな割込は発生しません。
リセット後は割込禁止状態になります。

64. EI          コード FB        クロック6(4)

 EI命令が実行されると、その次の命令の実行後から割込が受け付け可能状態になります。
 EI命令の実行後ではなくて、その次の命令の実行後から、割込みの受け付けが可能になるようにしている理由は、割込み処理プログラムの最後は通常RET命令で終わっているために、もしEI命令の実行後に割込みの受け付けが可能になっていると、割込み処理が終わってメインプログラムに戻るためのRET命令が実行される前に次の割込みが受け付けられてしまい、二重に割込みが実行されてしまう可能性が出てくることを避けるためです。

●[7] 16ビット算術演算命令
 
65. DAD B   コード 09        クロック16(10)
 HLの内容とBCの内容を加算し、結果をHLに入れます。ビット17からのキャリーがあればC=1になります。ビット11からのキャリーがあればH=1になります。

66. DAD D   コード 19        クロック16(10)
 HLとDEとを加算し、結果をHLに入れます。フラグについては65.DAD Bと同じです。

67. DAD H   コード 29        クロック16(10)
 HLの内容を2倍にします。フラグは65.DAD Bと同じです。

68. DAD SP   コード 39        クロック16(10)
 HLとSPとを加算し、結果をHLに入れます。フラグは65.DAD Bと同じです。

69. INX B      コード 03      クロック12または8(5)
 BCの内容を+1します。フラグは変化しません。
 下位レジスタから上位レジスタへのキャリーがあるときは12クロック、ないときは8クロックです。

70. INX D      コード 13      クロック12または8(5)
 DEの内容を+1します。フラグは変化しません。
 下位レジスタから上位レジスタへのキャリーがあるときは12クロック、ないときは8クロックです。

71. INX H      コード 23      クロック12または8(5)
 HLの内容を+1します。フラグは変化しません。
 下位レジスタから上位レジスタへのキャリーがあるときは12クロック、ないときは8クロックです。

72. INX SP      コード 33      クロック12または8(5)
 SPの内容を+1します。フラグは変化しません。
 下位レジスタから上位レジスタへのキャリーがあるときは12クロック、ないときは8クロックです。

73. DCX B      コード 0B     クロック12または8(5)
 BCの内容を−1します。フラグは変化しません。
 下位レジスタから上位レジスタへのボローがあるときは12クロック、ないときは8クロックです。

74. DCX D      コード 1B     クロック12または8(5)
 DEの内容を−1します。フラグは変化しません。
 下位レジスタから上位レジスタへのボローがあるときは12クロック、ないときは8クロックです。

75. DCX H      コード 2B     クロック12または8(5)
 HLの内容を−1します。フラグは変化しません。
 下位レジスタから上位レジスタへのボローがあるときは12クロック、ないときは8クロックです。

76. DCX SP      コード 3B     クロック12または8(5)
 SPの内容を−1します。フラグは変化しません。
 下位レジスタから上位レジスタへのボローがあるときは12クロック、ないときは8クロックです。

●[8] 回転、シフト命令 
                             
77. RLC        コード 07     クロック10(4)             
 Aレジスタの内容を1ビット左にシフトし、ビット7のデータをビット0に入れると共にキャリーCにも入れます。C以外のフラグは変化しません。



78. RAL         コード 17     クロック10(4) 
 キャリーを含め9ビットのデータを左に1ビット回転させます。C以外のフラグは変化しません。



79. RRC        コード 0F     クロック10(4) 
 Aの内容を右に1ビットシフトさせると共にビット0のデータをキャリーCにも入れます。C以外のフラグは変化しません。



80. RAR         コード 1F クロック10(4)
 キャリーを含め9ビットのデータを1ビット右に回転させます。C以外のフラグは変化しません。




●[9] ジャンプ命令  このグループの命令は、フラグに影響を与えません。

81. JMP B3B2       コード C3×××× クロック12(10)
 16ビットのデータB2B3で示されるアドレスにジャンプします。
B2B3については 8.LDA B3B2 の説明を参照してください。

82. JNZ B3B2    コード C2×××× クロック 12(Z=0)または8(Z=1) (10)
 ZフラグがセットされていなければB2B3で示されるアドレスにジャンプします。
B2B3については 8.LDA B3B2 の説明を参照してください。

83. JZ B3B2     コード CA×××× クロック 12(Z=1)または8(Z=0) (10)
 ZフラグがセットされていたらB2B3で示されるアドレスにジャンプします。
 B2B3については 8.LDA B3B2 の説明を参照してください。

84. JNC B3B2    コード D2×××× クロック 12(C=0)または8(C=1) (10)
 CフラグがセットされていなければB2B3で示されるアドレスにジャンプします。
B2B3については 8.LDA B3B2 の説明を参照してください。
 
85. JC B3B2     コード DA×××× クロック 12(C=1)または8(C=0) (10)
 CフラグがセットされていたらB2B3で示されるアドレスにジャンプします。
 B2B3については 8.LDA B3B2 の説明を参照してください。

86. JPO B3B2    コード E2×××× クロック 12(P=0)または8(P=1) (10)
 PフラグがセットされていなければB2B3で示されるアドレスにジャンプします。
 B2B3については 8.LDA B3B2 の説明を参照してください。

87. JPE B3B2    コード EA×××× クロック 12(P=1)または8(P=0) (10)
 PフラグがセットされていたらB2B3で示されるアドレスにジャンプします。
 B2B3については 8.LDA B3B2 の説明を参照してください。

88. JP B3B2     コード F2×××× クロック 12(S=0)または8(S=1) (10)
 SフラグがセットされていなければB2B3で示されるアドレスにジャンプします。
 B2B3については 8.LDA B3B2 の説明を参照してください。

89. JM B3B2     コード FA×××× クロック 12(S=1)または8(S=0) (10)
 SフラグがセットされていたらB2B3で示されるアドレスにジャンプします。
B2B3については 8.LDA B3B2 の説明を参照してください。 

90. PCHL     コード E9 クロック8(5)
 ペアレジスタHLの内容をプログラムカウンタPCにロードします。つまりHLで示されるアドレスへジャンプします。

●過去記事へのリンク

[第312回]でつけたリンクと同じですけれど、何かのお役に立てば、ということでここにも置くことにしました。

08/9/8   [第61回]●JMP命令の説明です●話の順番として、JMP命令をデコードする回路です●2枚目の基板にある全命令のデコード回路です●JMP命令のタイミングチャートです
08/9/9   [第62回]●JMP命令の回路図です●2番目の基板にICを取り付けました
08/9/10  [第63回]●条件JMP命令●条件JMP命令(条件不成立のとき)のタイミングチャート●2枚目の基板に部品を全部実装しました
08/9/23  [第76回]●JMP命令のクロック毎の動作の写真です
08/10/4  [第87回]●条件JMP命令のクロック毎の動作の写真です●JZ命令のクロック毎の動作の写真です(1)●DCR A命令実行後のフラグの状態です●JNZ命令のクロック毎の動作の写真です(1)
08/10/5  [第88回]●JNZ命令のクロック毎の動作の写真です(2)●INR A命令実行後のフラグの状態です●JZ命令のクロック毎の動作の写真です(2)
08/10/6  [第89回]●JP命令のクロック毎の動作の写真です(1)●DCR A命令実行後のフラグの状態です●JM命令のクロック毎の動作の写真です(1)
08/10/7  [第90回]●JM命令のクロック毎の動作の写真です(2)●INR A命令実行後のフラグの状態です●JP命令のクロック毎の動作の写真です(2)
09/1/25  [第147回]●INR/DCRレジスタを実装しました●JMP命令の回路を実装しました●ワークレジスタがおかしい…
09/1/27  [第148回]●INR命令とJNZ命令を使ったプログラム●INR命令の実行時間●JNZ命令の実行時間●プログラムの実行時間
09/6/30  [第264回]●JMP、CALL、RET、PCHLのテストプログラムです

2009.9.11upload
2009.9.12一部追記・修正

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