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

●はやくも組立が開始されました

前回ご紹介させていただいたブログ  FIAT500と洗車の日々・・・(http://plaza.rakuten.co.jp/flyback/)
で、はやくもMYCPU80の組立が開始されました。
ひょっとしてうまく動かなかったら、どうしよう…なんて、なんだか私の方がどきどきしてしまいます。

ああ、そうでしたか。
気がつきませんでした。
このブログを書かれているT様(仮にそのように呼ばせていただくことにします)は電源回路だけを先に組み立ててテストされました。

そうですよね。確かにそうしていただいた方がより安全でした。
なにしろ部品点数が多いものですから、ついつい、電源回路だけではなくて、クロック発振回路もリセット回路も全部ひとまとめにして実装するように書いてしまいました。

ここはまずはじめの一歩ですから電源回路だけを組み立てるというようにしていただいた方がいいですね。
電源回路の部品は以下の通りです。

J1 電源ジャック(組立説明書p.20)
D26 ダイオードN04(組立説明書p.18)
C17 電解コンデンサ100μF(組立説明書p.17)
R89 抵抗2.2KΩ(組立説明書p.16)
L287 赤色LED(組立説明書p.18)

これだけの部品をまず実装してから、電源ジャックに、組立キットに付属している+5V電源のプラグを差し込んで、その電源をコンセントに差せば赤色LEDが点灯するはずです。

●続いてクロック発振回路のテストをされました、が…

続いて4MHzの水晶と74HCU04を取り付けて、オシロスコープで4MHzのクロックが出力されていることを確認されました。

確かに、、こんなどでかい基板なのですから、いきなり何個もICをとりつけろ、と言うほうに無理がありました。
私だって、はじめてさわる基板だったなら、そのようにしたい。
自分では何回も組んでいるので、つい供給者の目線になってしまっていました。
こういう点がユーザーの立場だからこそ、見えてくるところです。

オシロスコープをお持ちではない方もみえると思いますので、そうすると、もう少し先まで実装しないと確認のしようが無い、ということも考えて、ここのところは、いくつかのICなどを取り付けるように説明をしています(それだけではなくて、ほかにもわけがあります)。

じつは74HCU04だけを実装しての通電テストは、ちょっとまずいのです。
そのわけにつきましては…
絶対にしてはいけないこと…([第136回])または、ところが…([第206回])をお読みください。

回路図で説明します。

回路図のなかで着色したゲートが74HCU04です。
1ゲート足りませんが、未使用です(回路図にはありませんが、pin9をGNDに落としてあります)。
緑で着色してあるゲートがクロック発振回路で使っているゲートです。
ところが他にも赤で着色したゲートが使われています。それぞれ入力の前段に別のICからの出力がつながっています。

この前段のICが未実装の場合、後段のゲートの入力端子がオープンになってしまいます。
ですから、ここで、74HCU04だけを実装して、水晶発振の状態を確認したい、という場合には74HCU04のpin1、pin11、pin13に100KΩの抵抗を取り付けて、抵抗の他端を+5Vにつないで、+5Vにプルアップしてください。
(100KΩは基板裏に3本、先に実装してお送りしましたが、その分を引かずに全数入れてありますから最終的に3本は余ります)

なお、ついさきほどT様のブログ FIAT500と洗車の日々・・・(http://plaza.rakuten.co.jp/flyback/)  を見させていただきましたら、さらに作業が進んでいました。もう[作業1]は完了です。
「端子オープンになるので、残りの部品も取り付けてからテストをします」と書いてありましたので、安心いたしました。

そのT様からメールをいただきました。
説明書のミスをご指摘いただきました(ご指摘のメールを有難うございました)。

さっそく下記のとおり訂正させていただきます。
(1)集合抵抗B40は1KΩ5素子ですが、回路図bPのB40−4、回路図bQ9のB40−2、B40−3が10KΩになっています。1KΩに訂正願います。
 また組立説明書53頁のB40が10K×5になっています。1K×5に訂正してください。
(2)回路図bQ9でR60−2とあるのはR60−3の間違いですので訂正願います。
(3)組立説明書16頁の抵抗部品表のうちR89−3およびR97(ともに100KΩ)の色表示が茶黒緑金になっていますが、茶黒黄金の間違いですので訂正願います。

ご指摘感謝いたします。今後ともよろしくお願いいたします。

●[9]STA、LDA、STAX、LDAX、XCHG、SPHL、PCHL、INX、DCX、XTHL、SHLD、LHLD、NOP命令回路の動作テストです(操作説明書から)

☆☆☆前々回、前回からの続きです☆☆☆

●22.SPHL、PCHL命令のテスト

MYCPU80組立説明書 V組立 [9]STA、LDA、STAX、LDAX、XCHG、SPHL、PCHL、INX、DCX、XTHL、SHLD、LHLD、NOP命令回路 の組立作業後に行う動作テストの説明です。

●22−1. SPHL、PCHL命令のテストプログラムをメモリに書く

メモリに次のプログラムを書きます(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 210001   LXI H,$0100
0009 F9       SPHL      (8)
000A E9       PCHL      (8)

00FE 00       DB 00
00FF 00       DB 00
0100 3B       DCX SP    (8)or(12)
0101 3B       DCX SP    (8)or(12)
0102 F1       POP PSW   (8)
0103 3C       INR A      (8)
0104 F5       PUSH PSW  (8)
0105 C20901   JNZ $0109   (12)or(8)
0108 03       INX B      (8)or(12)
0109 24       INR H      (8)
010A E5       PUSH H    (8)
010B 210900   LXI H,$0009 (8)
010E E3       XTHL       (16)
010F C9       RET        (8)

01FE 00       DB 00
01FF 00       DB 00
0200 3B       DCX SP    (8)or(12)
0201 3B       DCX SP    (8)or(12)
0202 F1       POP PSW   (8)
0203 3C       INR A      (8)
0204 F5       PUSH PSW  (8)
0205 C20902   JNZ $0209   (12)or(8)
0208 13       INX D      (8)or(12)
0209 25       DCR H      (8)
020A C30A01   JMP $010A   (12)
(リスト19) SPHL、PCHL テストプログラム

SPHL命令とPCHL命令のテストプログラムです。
SPHLはHLレジスタの値をSP(スタックポインタ)に転送する命令です。
PCHLはPC(プログラムカウンタ)にHLの値を転送します。PC(プログラムカウンタ)がHLの値になりますから、HLの値で示すアドレスにジャンプするという動作になります。

リスト19は2つの24ビットカウンタB、C、AとD、E、Aを交互にカウントアップさせる動作をします。
Aレジスタが共用されているため、スタックに値を退避します。
SPHLとPCHLを使って2組のプログラムと2組のスタックを使い分けています。

HLレジスタには初期値として0100を入れています。
この0100は「BCA」カウンタルーチンのエントリアドレスであるとともに、スタックポインタのアドレスでもあります。

次の命令、SPHLで、SP(スタックポインタ)に、この0100がセットされます。
そして、さらにその次の、PCHL命令によって、PC(プログラムカウンタ)にも同じ0100がセットされます。
PCの値が0100になりますから、つまり、これはJMP 0100が実行されるのと同じことです。
したがって、処理の流れは、0100に移ります。

0100と0101にはDCX SP命令があります。
DCX SPを2回実行しますから、SPの値は0100−2で00FEになります。
次にPOP PSWを実行します。
SP(スタックポインタ)に00FEをセットしておいて、POP PSWを実行することで、00FE〜00FFのメモリ内容がAレジスタとフラグレジスタに入れられます。
POP PSWのあと、INR Aを実行して、Aレジスタを+1(インクリメント)します。
そして、PUSH PSW命令で、+1したあとのAレジスタの値をまたスタックに保存します。

Aレジスタが256カウントされて、00になるたびに、その上位カウンタのBCレジスタを+1します。
次にINR Hを実行します。Hレジスタが+1されます。
HLレジスタには「BCA」カウンタルーチンを実行するために、そのエントリアドレスの0100が入っていました。
そのHレジスタが+1されるとHLレジスタの値は、0200になります。

0200はもうひとつのカウンタ「DEA」をインクリメントするためのルーチンのエントリアドレスです。
0200〜のメモリアドレスには、0100〜と同じ動作をするプログラム(対象になるレジスタだけが異なっている)が書かれています。

0100〜のプログラムを実行したあとで、次に実行するプログラムのエントリアドレスである0200をHLレジスタに入れた後、PUSH Hを実行し、最後にRETを実行します。
こうすることで、0200にジャンプしてもうひとつのカウンタルーチンが実行されることになります。
 
このようにして、0100〜のプログラムと0200〜のプログラムが交互に実行され、B、C、AレジスタとD、E、Aカウンタが交互にインクリメントされることを繰り返します。


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

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

プログラムが実行されると、DEレジスタとBCレジスタは0000からカウントアップを開始します。
Aレジスタもカウントアップを続けますが速過ぎてLEDは全点灯しているようにしか見えません。
HLレジスタには0100、0200、0009が高速で繰り返し書き込まれるため、LED表示はそれらの値が合成されて見えます。

カウントアップされていく時間を計算してみます。
リスト19の各命令の後ろに()で示されているのが、その命令の実行クロック数です。

まずはプログラムの流れから見ていきます。
繰り返し実行される部分は0009から後ろです。
0100〜と0200〜はカウントアップされるレジスタがBCであるかDEであるかが違っているだけであとは変わりませんから、0100〜のみの流れを見ていくことにします。

SPHL、PCHLが実行されたあとは、0100のDCX SPから0105のJNZまでは毎回実行されます。
JNZはその前のINR Aの結果によって分岐しますが、ZフラグがONになるのはAレジスタか256回インクリメントされるうちでA=00になる1回だけで、残りの255回はZフラグはOFFですから、ここは毎回0109へのジャンプが実行される、と考えます(INX Bがパスされる)。
その後は0109のINR Hから010FのRETまでが実行されてから0009に戻ります。

以上の流れの実行クロック数を計算します。
 
 8+8+12[*注]+8+8+8+8+12+8+8+8+16+8=120

[*注]0101のDCX SPは8クロックなのに0100のDCX SPは12クロックになっています。
DCX命令は下位レジスタから上位レジスタへのボローが発生するときだけ12クロックで、それ以外は8クロックです。
0100のときのSPには0100が入っていてこれを−1しますから、必ずボローが発生します(0100→00FF)。それが0100のDCX SPのクロック数が12になっている理由です。

120クロックでAレジスタが+1されます。
Aレジスタが256回インクリメントされる度に、BCレジスタが+1されます。

BCレジスタが+1される時間を求めてみます。
実行クロック数は
 120×256−4+8=30724クロック
になります(−4は256回に1回JNZが8クロックになるための補正です。+8はINX Bの実行クロックです)。
じつは、BCレジスタは30724クロックごとにインクリメントされるのではなくて、0100〜のBCレジスタのインクリメントルーチンと0200〜のDEレジスタのインクリメントルーチンは交互に実行されます。
したがってBCレジスタのインクリメントは(DEレジスタのインクリメントも同じ)、0100〜と0200〜の実行クロック数の合計ごとに行われることになります。
0200〜のルーチンは最後のJMP $010Aのクロック数だけ余分にかかります。
ですから0200〜の実行クロック数は
(120+12)×256−4+8=33796になります。
したがってBCレジスタまたはDEレジスタが+1されるときの実行クロック数は、30724+33796=64520クロックになります。

1クロックは0.5μsですから、実行時間は
 64520×0.5=32260μs になります。

約32msごとにCレジスタ(またはEレジスタ)がカウントアップされるので、LED表示の様子は、上位ビットは点滅して見えても下位数ビットは全点灯しているようにしか見えません。
そこで、次にBレジスタ(Dレジスタ)が+1される時間を計算してみます。
Cレジスタ(Eレジスタ)が256カウントされるごとにBレジスタ(Dレジスタ)が+1されるのですから、その実行時間は、
32.260×256+0.002×2=8258.564msになります。
+0.002×2は、Bレジスタ(Dレジスタ)が+1されるときは、Cレジスタ(Eレジスタ)からの繰り上がりが発生しているわけですから、そのときのINX命令で余計にかかる2μsです。交互に1回ずつの合計ですから、その2倍です(INXもDCXと同じように、下位レジスタから上位レジスタへの繰り上がりがあるときは4クロック長くなります)。

以上の計算から、Bレジスタ(Dレジスタ)は約8秒ごとに+1されます。

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

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



プログラムを実行すると、DEレジスタとBCレジスタがカウントアップされますがEレジスタ、Cレジスタの下位2〜3ビットくらいは速すぎて全点灯しているように見えます。
DEレジスタとBCレジスタの値は同じです。
写真では15DFに見えますが下位3ビットは割り引いて考えます。
ですからBレジスタは15ですがCレジスタはD8とします。

Cレジスタの値のD8を10進数に直すと216になります。
Cレジスタは32.26msごとに+1されますから
216×32.26=6968.16msです。

Bレジスタの値の15を10進数に直すと21になります。
Bレジスタは8258.564msごとに+1されますから
21×8258.564=173429.844msです。

6968.16+173429.844=180398.004msですから180.398秒です。
180秒は3分ですからストップウォッチの表示とぴったり一致しています。

なおこのSPHL、PCHL テストプログラムについては、当社ホームページの
「つくるCPU[第163回]」(http://www.alles.or.jp~thisida/mycpu163.html)「つくるCPU[第165回]」(http://www.alles.or.jp~thisida/mycpu165.html)
でも説明をしています。

2009.9.27upload

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