標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
やっと(!)MYCPU80の改良型基板製作に着手しました!!
[第845回]
●BUSRQスイッチ
MYCPU80をお持ちの方はご存知ですが、そうでない方にとっては「トグルスイッチがあることはわかるがメモリにどうやってデータやプログラムを書くのか」疑問に思われるかもしれません。
そこでその仕組みを簡単に説明しておきます。
MYCPU80基板の右端に4PDIPスイッチがあります。
そのbSをONにするとアドレスバス、データバスやその他の制御信号がCPU回路から切り離されて、アドレススイッチ、データスイッチやWRITEスイッチなどがアクティブになってメモリから値を読み出したり、書き込んだりすることができるようになります。
このときメモリから読み出された値は前回説明しましたようにデータスイッチのすぐ上側にある8個のLED(DATA BUS)に表示されます。
プログラムを実行するときは「リセットスイッチを押しながら」上の写真のBUSRQ(DIPSWのbS)をOFFにしたのち、リセットスイッチから指を離します。
●[6]INR、DCR回路
さて今回はINR、DCR回路の組立です。
基板左上部のINR、DCRレジスタとフラグレジスタを実装します。
Aレジスタの右側にも作業箇所があります。
今回は実装する部品の点数は比較的少ないです。
●INR命令のテスト
DIPSWのbS(BUSRQ)をOFFにした状態で電源をONにします。
テストの前に電源が入っていたらDIPSWのbS(BUSRQ)をOFFにした状態で数秒間電源をOFFにしてから電源をONにします。
こうすることでレジスタの値がFFになります(回路の状態でそうならないこともあります)。
MYCPU80操作説明書にあるINR命令のテストプログラムをメモリに書いて実行します。
下のリストがINRテストプログラムです。
B、C、D、E、H、L、Aレジスタをインクリメントしてホルトするだけの簡単なプログラムです。
0000 04 INR B 0001 0C INR C 0002 14 INR D 0003 1C INR E 0004 24 INR H 0005 2C INR L 0006 3C INR A 0007 76 HLT |
プログラムを実行しました。
レジスタの値がFFから+1されて00になりました。
このとき基板上部のフラグレジスタも変化します。
その部分を拡大しました。
左からS(サインフラグ)、Z(ゼロフラグ)、H(ハーフキャリーフラグ)、P(パリティフラグ)、C(キャリーフラグ)です。
INR、DCR命令ではキャリーフラグは変化しません(命令実行前の状態をそのまま維持します)。
8080ではパリティフラグは結果の値によって変化しますがMYCPU80ではパリティフラグも変化しません(この文を書いたときには「変化しない」と思ったのですが、それが間違いだったことがこのあとでわかることになります)。
サインフラグは結果が負(FF〜80)の時に1になります(点灯します)。
結果が正またはゼロ(7F〜00)のときは0になります(消灯します)。
ゼロフラグは結果が00のときに1になります。
ハーフキャリーフラグはビット3からの桁上げ(またはビット4からのボロー)があったときに1になります。
上の状態でリセットスイッチを押して離すとプログラムが一度だけ実行されてホルトするので、レジスタの値が+1されます。
各レジスタの値が01になりました。
Z(ゼロ)フラグとH(ハーフキャリー)フラグが消灯しました。
もう一度リセットスイッチを押して離しました。
レジスタの値が02になりました。
もう一度リセットスイッチを押して離しました。
レジスタの値が03になりました。
●DCR命令のテスト
今度はDCR命令のテストです。
MYCPU80操作説明書にあるDCR命令のテストプログラムをメモリに書いて実行します。
下のリストがDCRテストプログラムです。
B、C、D、E、H、L、Aレジスタをデクリメントしてホルトするだけの簡単なプログラムです。
0000 05 DCR B 0001 0D DCR C 0002 15 DCR D 0003 1D DCR E 0004 25 DCR H 0005 2D DCR L 0006 3D DCR A 0007 76 HLT |
プログラムを実行しました。
さきほどのINR命令のテストでレジスタの値が03だったところでDCR命令を実行しましたから−1されて02になりました。
一度リセットスイッチを押して離しました。
レジスタの値が01になりました。
もう一度リセットスイッチを押して離しました。
レジスタの値が00になりました。
基板上部のフラグレジスタのZ(ゼロ)フラグが点灯しました。
もう一度リセットスイッチを押して離しました。
00から−1したのでレジスタの値はFF(−1)になりました。
フラグレジスタのZ(ゼロ)フラグが消灯して、S(サイン)フラグが点灯しました。
H(ハーフキャリー)フラグも点灯しています。
●INRレジスタがおかしい?
HPに写真を載せるために整理をしていて、おかしいことに気が付きました。
基板左上部のINRレジスタのLEDが全く点灯していません。
MYCPU80の回路では各レジスタはただのレジスタでINR、DCRの機能はありません。
それではどうやってレジスタのINR、DCRをしているかといいますと、命令の対象となるレジスタから一旦INRレジスタに値を送って、そこでINRまたはDCRを実行して、それから結果の値をもとのレジスタに送っているのです。
その動作から考えると、INRレジスタに値が表示されないはずはありません。
さては?
と思ってそのあたりの配線を調べてみましたら。
またしても配線ミス(配線忘れ)がみつかりました。
上の写真のように追加配線をしてから、もう一度INRプログラムを実行してみました。
おお。
INRレジスタのLEDも表示されるようになりました。
ところがこの写真を見ていて、またしても「あれ?」というところに気が付きました。
さっきまでずっと点灯していたパリティフラグが消えている?
えっ?
パリティフラグ?
ずっと上のところで「MYCPU80ではパリティフラグは変化しません」と書きました。
しかしよくよく考えてみたら、変化しないパリティフラグをLED表示しているのはおかしい?
実はMYCPU80付属の8080命令書にそのように書いていましたので、そのように書いたのですけれど。
うむむ。
ひょっとするとパリティフラグ回路は生きているのではあるまいか?
そこで過去記事を調べてみましたら。
ちゃんと書いておりました。
[第259回]でパリティフラグ回路を復活させたと書いておりました。
うーん。
そういうことだったか。
それにしても、上で修正した回路はただのLEDの表示回路だったのですけれど、どうしてパリティ回路に影響したのでしょう?
ちょいと謎です。
それはそれとしまして、そういうことになりますとパリティフラグについても動作を確認しておかなければいけませんでしょう。
あ。
申し訳ありません。
そういう次第でMYCPU80付属の8080命令説明書のパリティフラグについての記載は間違っております(なるべく早い機会に訂正しておくことにいたします)。
●パリティフラグの確認
8080では計算の結果の8ビットの値の1のビットの数が偶数のときにパリティフラグが1になります。
そのことを今回のINR命令のテストで確認してみます。
まずは電源をONしたときの初期状態です。
INRレジスタはクリアされずに意味のない値が表示されています。
そのほかのレジスタの値はFFです。
フラグレジスタも全フラグが1になっています。
パリティフラグの確認のため、INR命令のテストプログラムを続けて実行します。
最初に実行するとレジスタの値は00になりました。
S(サイン)フラグ以外は1になりました。
ビット1の数が0のときもパリティフラグは1になります(点灯します)。
レジスタの値が01なので、パリティフラグは消灯しました。
レジスタの値が02のときも、1のビットの数は1(奇数)なのでパリティフラグは0になります(消灯します)。
レジスタの値が03のときはパリティフラグが1になります。
レジスタの値が04のときパリティフラグは0になります。
レジスタの値が05のときパリティフラグは1になります。
レジスタの値が06のときパリティフラグは1になります。
レジスタの値が07のときパリティフラグは0になります。
レジスタの値が08のときパリティフラグは0になります。
レジスタの値が09のときパリティフラグは1になります。
レジスタの値が0Aのときパリティフラグは1になります。
レジスタの値が0Bのときパリティフラグは0になります。
おお。
正しく動作しているようです。
このあとメモリに対するインクリメント命令(INR M)、デクリメント命令(DCR M)についてもテストしましたが、長くなってしまいますから省略します。
また写真は撮りませんでしたが、DCR命令についてもINRレジスタ、パリティフラグともに正しく動作、表示が行なわれることも確認しました。
TTLでCPUをつくろう![第845回]
2018.2.19upload
前へ
次へ
ホームページトップへ戻る