標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第355回]
●メールで説明書のミスをご指摘いただきました
また説明書が間違っていました(急いで作ったから、というのは言い訳ですけれど、ほんとにちょっと多くて恥ずかしいです)。
何回かブログをご紹介させていただいたYT様からです。
「MYCPU80操作説明書40ページ26.STC、CMC、CMA命令のテストは組立作業[10]の後で行うテストですが、そのうちのCMAは、このあとの[11]の組立作業で行うインバート回路を組み付けてからでないと動作しないと思うのですが…」
あっ。…その通りでした。
ご指摘いただいて、思い出したのですが、確かこの26.のテストは作業[10]のあとで確認したつもりだったのですが、うっかりしていて、そのテストをしていなかったことに気がついたのは、作業[11]が終わったあとでした。
うーん。[11]の作業をしてしまったあとでは、テストの写真をUPするわけにはいかんなぁ。
まっ。テストだけしておけばいいか。
それでここのテストをしている写真がないのです。
そういうときに限ってこういうミスがあるのですよねぇ。
ご指摘の通りでMYCPU80操作説明書40ページのテストプログラムは次の[11]の作業の完了後におこなってください。
今気がついたのですが、ページの一番下、(リスト24)が、RLCテストプログラム になっています。
(リスト24)STC、CMC、CMAテストプログラム の間違いですので、訂正をお願いいたします。
YT様。たびたびご指摘いただき有難うございました。
YT様からは、「今回のミスは回路図等の資料と、それからステップ動作をさせてみることで、簡単に原因がわかりました」というコメントをいただき、つづけて
やはりすごいです。このキット。
特にステップ動作が。CPUの動作を理解するのに、これ以上のものは無いでしょう。
という、お褒めの言葉をいただきました。
とってもうれしいです。
有難うございました。
●別の方からもメールをいただきました
もう作業[10]まで進んでいますよ、と書いていただいたのは、MYCPU80キットをご購入いただいたNN様です。
NN様からも何箇所か説明書のミスをご指摘いただきました。
以下に列記しますので、ご訂正をお願いいたします。
1)MYCPU80組立説明書30ページの抵抗の部品表で、R33(1KΩ)も取付穴の間隔がほかの抵抗よりも広くなっています。ご注意ください。
2)MYCPU80操作説明書19ページの次の文が間違っています。下の(正)に訂正してください。
(誤)プログラム実行前のレジスタの値がFFだったとすると、FF+1=00なので、プログラムの実行後は00が表示されます。
(正)プログラム実行前のレジスタの値が00だったとすると、00−1=FFなので、プログラムの実行後はFFが表示されます。
3)MYCPU80操作説明書31ページ20−2.テストプログラムを実行する
の説明文で「AレジスタはLレジスタと同じ値になります」とありますが、「Aレジスタは全点灯しているように見えます」が正しい説明です。
プログラムを実行すると、Aレジスタはタイマーサブルーチンの中でデクリメントを繰り返すため、LEDは全点灯しているようにしか見えません。
NN様。ご指摘いただき有難うございました。
今後ともよろしくお願いいたします。
じつはNN様からも、
MYCPUのいい所は中身が見えるところだと思います。パッケージに入ったLSIだと、レジスタの内容や読み書きの状態を直接見ることができませんが、これだとLED表示で見ることができます。
というお言葉をいただきました。
そこは、このボードで一番こだわったところなので、そのように評価していただけると、とてもうれしいです。
NN様。有難うございました。
●パスコンについて
NN様からは、ご質問もいただきました。
パスコンが若干少ないように思うのですが、TTLとC-MOSの違いによるものでしょうか?
昔のメモリーボードなどにはIC1〜2個につき、1個のパスコンがついていたと思うのですが。
そのようにお感じになられた方がほかにもみえるのでは、と思います。
少ないです。
一番の理由は、そのスペースが確保できなかったから、です。
でも、昔から私は余りパスコンは使いませんでした。
ただダイナミックRAM(あのリフレッシュが必要な、です)にはRAM1〜2個に1個、タンタルコンデンサを入れたように記憶しています。
TTLとCMOSの違いは確かに大きいと思います。
入力信号に対する余裕が全然違いますから、ノイズに対しても断然有利ですし、そもそも前回書きましたように消費電流が非常に少ないわけですから、その意味からもパスコンの必要度は低くなると思います。
大体このパスコンなるものはきわめていいかげんなところがある、と私は思います。
教科書などには、お尋ねのように、IC数個に1個はパスコンを入れよ、などと大抵は書いてあるようです。
んじゃ、IC1個にパスコン1個を抱かせればいいか、って言いますと、いや、そこまでしなくても…、ということになると思います。
じゃあ、いったい何個いれたら正解なの?と聞くと、多分だれも正解は出せないと思います。
そこは、それ、できるだけたくさんいれておいたほうが安全だから…。
ところが、そのようにして、まあ、そのようにかなりいいかげんな、あいまいな理由というか動機によって適当にいれてしまったパスコンなのですが、ひとたび入れてしまうと、これががぜん存在感を主張しているように見えてしまうから不思議です。
ちょうどスペースが空いているから入れておこーか、といういいかげんな気持ちで入れたパスコンでも、その後の設計変更で、そこに入れられなくなって、そのパスコンを外そうということになってくると、これがまた、躊躇してしまうのですよねぇ。
こいつを外して、もしかして誤動作したらどーしよう、なんて頭を抱えて苦悶したりしてしまいます。
確かに必要なパスコンもあると思いますよ。中には。
でも、入れておくに越したことはないから、まっ、入れておこーよ、くらいの気持ちで入れてあるものも多いのではありませんかねぇ。
IC1個にパスコン1個を抱かせた基板なんていかにもいかにも信頼性が高いように見えてしまうじゃぁありませんか。
そーすると、営業上は、「おめー、そんなもん、けちらずに、いっぱい入れとけよな」、つうことになると思います。
中日電工は営業が下手なのです。つうか、あまり売る気がない。困ったものです。
名古屋モンはケチなのです。むだなものは使いません。はい。
せっかくですから、時間ができたら、MYCPU80で使っているパスコンを全部とっぱらって、誤動作するかどうか試してみるつもりです。それで誤動作したら、やっぱりパスコンが利いている、っていう証明になりますよね。
では、現在の状態で、もしも誤動作してしまったら(そーいう恐ろしいことは考えないことにしていますけれど)、そしたら、もっとパスコンを追加したら、誤動作しなくなる?
さあ、どうでしょうか、ねぇ。
☆☆☆前回からの続きです☆☆☆
●32.EI、DI命令(INT回路)のテストです(MYCPU80操作説明書から)
MYCPU80組立説明書 V組立 [12]ADD、SUB、CMP、DAD、DAA、RST、INT命令回路 の組立作業後に行う動作テストの説明です。
●32−1. EI、DI命令(INT回路)のテストプログラムをメモリに書く
メモリに次のプログラムを書きます(1. メモリにデータを書き込む の説明を参考にして操作してください)。
0000 310000 LXI SP,$0000
0003 AF XRA A
0004 FB EI
0005 00 NOP
0006 00 NOP
0007 04 INR B
0008 C30700 JMP $0007
0038 3C INR A
0039 FB EI
003A C9 RET
(リスト30)割込みテストプログラム
リスト30のプログラムは2つの部分に分かれています。
0000〜000Aがメインプログラムで0038〜003Aが割込みプログラムです。
8080の割込みにはRST命令が利用されます(RST命令については31. RST命令のテストを参照してください)。
8通りあるRST命令の中でもRST 7(コードFF)は、外部に割込み制御回路を必要とせず、INT割込み信号を与えるだけで割込みを実行させることができるので、8080ではRST 7が割込み命令としてごく普通に利用されます。
MYCPU80はRST 7だけではなくて、RST 0〜RST 6命令の割込みも実行できますが、そのためには外部に割り込み制御回路が必要になりますから、ここではその必要のない、RST 7を使って割込みのテストを行います。
プログラムは非常に簡単なものです。
割込みはスタックを利用しますから、スタックポインタの設定が必要です。
プログラムの先頭にLXI SP命令を置きます。
リセット後は割込みは禁止状態になっていますから、割込みを受け付けるためにはEI命令で割込み許可を与えておく必要があります。
その後はBレジスタをインクリメントし続けます。
0005と0006にNOPがありますが、割込みに必要なものではありません。あとで利用したいことが出てきますからこうしておきます。
RST 7命令を利用した割込みプログラムは0038から書きます。
今回はテストですから割込みプログラムも簡単なものです。
INR AでAレジスタを+1するだけです。
割込みが受け付けられると、割込み禁止状態になってしまいますから、メインルーチンに戻る前に割込み許可状態にしておかないと次からの割込みが受け付けられなくなります。
メインルーチンに戻るためのRET命令の直前にEI命令を置きます。
EI命令の次の命令の実行後に割込みが許可されるからです。
●32−2. コネクタケーブルの準備
割込みを実行させるためには外部から割込み信号(INT)を入力する必要があります。
INT信号は16pフラットケーブル用コネクタCN2の9番端子に配線してあります。
CN2端子接続図
RESETIN | 1 | 2 | RESETOUT |
MEMRD | 3 | 4 | MEMWR |
IORD | 5 | 6 | IOWR |
BUSRQ | 7 | 8 | BUSAK |
INT | 9 | 10 | INTRD |
EXCLKENL | 11 | 12 | EXCLK |
T2 | 13 | 14 | M1 |
+5V | 15 | 16 | GND |
なおこのテストでは使いませんが、RST 7以外の割込みを使う場合や、外部にI/O回路を接続するためには、バス信号への接続が必要になります。
それらの信号線は26pフラットケーブル用コネクタCN1に配線してあります(33. コネクタ端子接続図参照)。
16pフラットケーブルのコネクタがついていない方の9番と16番の被覆を先端から1cmほどはがしてください(23−1.テスト用の回路を準備する を参照してください)。
以上のように作業した16pフラットケーブルコネクタをCN2に接続します。コネクタの△マークと基板面のシルク印刷の△マークを合わせる向きで接続します。このとき16本のコネクタ端子がずれたりしないで全部フラットケーブルコネクタにおさまっていることを確認してください。
●32−3. テストプログラムを実行する
プログラムの実行の仕方については 4. テストプログラムを実行する を参照してください。
RESETSWを押しながら、ディップスイッチDS3−4をOFFにします。その後RESETSWを離すとプログラムが実行されます。
Bレジスタが高速でインクリメントされるため、BレジスタのLEDは全点灯しているように見えます。
その他のレジスタには変化はありません。
この状態で16pフラットケーブルの9番と16番を一瞬だけショートさせてみます。
少し乱暴な方法ですが今回はテストなので簡単にできる方法でやってみました。
人間の感覚では一瞬に過ぎなくてもコンピュータにとっては非常に長い時間です。
MYCPU80の割込みは、INT入力端子にLレベルの信号を与えることで実行されます。立下りエッジではなくてLの期間中有効な信号として認識されます。
割込みが受け付けられると、アドレス0038からの割り込みプログラムが実行されます。
割込みプログラムの実行が終了してメインプログラムにリターンしてきたときに、まだINT信号がアクティブ(L)になったままだと、再び割込みが発生して、割り込みプログラムが実行されます。
INT入力を一瞬Lにしただけでも、割込み処理に対しては非常に長い時間ですから、数十回以上も割込みが実行されます。
その結果Aレジスタが一瞬でかなりの回数インクリメントされ、LEDにはその結果が表示されます。
上のテストでは16pフラットケーブルの9番と16番を一瞬だけショートさせてみましたが、もっと長い時間ショートさせてみると、どうなるでしょうか。
そうすると、Bレジスタが停止してしまいます。
これは割込み処理が終了してメインプログラムに戻った直後に再び割込みが発生することが繰り返されるため、その間は、メインプログラムの命令が全く実行されなくなるからです。
[注記]MYCPU80はINT端子にLレベルの信号を入力することで割込みが受け付けられますが、CPUによってはHレベルの信号であったり、立下りエッジや立上りエッジであるものなどがあります。
ちなみにZ80はLレベル信号入力ですが8080はHレベル信号入力です。
●32−4. DI命令のテスト
リスト30の
0005 00 NOP を
0005 F3 DI に書き換えてください。
前のNOPではなくて後ろのNOPを書き換えます。
念の為、書き換えたあとのメインプログラムのリストを下に示します。
0000 310000 LXI SP,$0000
0003 AF XRA A
0004 FB EI
0005 00 NOP
0006 F3 DI
0007 04 INR B
0008 C30700 JMP $0007
このようにしてから、32−3. と同じことをしてみます。
すると割込みは受け付けられなくなってしまいます。これはEIの直後にDIが実行されて、それ以後割込みの受け付けが禁止されてしまうからです。
しかし、先に16pフラットケーブルの9番と16番をショートさせたままにしておいて、RESETSWを押す(押してから離す)と、今度は、32−3. と同じように割込み動作が続けられます。
これは先にINT信号がアクティブになっているため、EI命令が実行された直後に割込みが発生し、その後もINT信号がアクティブである間は、割込みプログラムからメインルーチンに戻るとすぐにまた次の割込みが受け付けられてしまうので、DI命令が実行されないまま割込みだけが繰り返し実行されてしまうからです。
一旦16pフラットケーブルの9番と16番を離すと、DI命令が実行されてしまうため、それ以後は9番と16番をショートさせても割込みは発生しなくなります。
ここでEIとDIの間にNOPが入っているのは、割込みが許可されるのはEI命令の次の命令の実行後だからです。
この場合NOP命令の実行後(DI命令の直前)に割込みが可能になります。
もしもNOPがないと、割込みが可能になるのはDI命令の実行後になるため、実際には割込み可能にはならなくなってしまいます。
そのことを確認するために、0005にF3を書き、0006に00を書いてから、同じようにテストをしてみてください。
なお割込みについては、当社ホームページの
「つくるCPU[第242回]」(http://www.alles.or.jp/~thisida/mycpu242.html)〜
「つくるCPU[第246回]」(http://www.alles.or.jp/~thisida/mycpu246.html)
でも説明をしています。
●33. コネクタ端子接続図
CN1
D0 | 1 | 2 | D1 |
D2 | 3 | 4 | D3 |
D4 | 5 | 6 | D5 |
D6 | 7 | 8 | D7 |
A0 | 9 | 10 | A1 |
A2 | 11 | 12 | A3 |
A4 | 13 | 14 | A5 |
A6 | 15 | 16 | A7 |
A8 | 17 | 18 | A9 |
A10 | 19 | 20 | A11 |
A12 | 21 | 22 | A13 |
A14 | 23 | 24 | A15 |
+5V | 25 | 26 | GND |
CN2
RESETIN | 1 | 2 | RESETOUT |
MEMRD | 3 | 4 | MEMWR |
IORD | 5 | 6 | IOWR |
BUSRQ | 7 | 8 | BUSAK |
INT | 9 | 10 | INTRD |
EXCLKENL | 11 | 12 | EXCLK |
T2 | 13 | 14 | M1 |
+5V | 15 | 16 | GND |
CN3
IN7 | 1 | 2 | IN6 |
IN5 | 3 | 4 | IN4 |
IN3 | 5 | 6 | OUT7 |
OUT6 | 7 | 8 | OUT5 |
+5V | 9 | 10 | GND |
☆☆☆やっと[12]までの説明が終わりました。MYCPU操作説明書はここまでで終わりです。
残る[13]の作業はTK80回路です。
[13]の組立が終わるとついに完成です。
[13]の作業後のテストは「TK80回路の操作説明書」で行います。☆☆☆
2009.10.7upload
2009.10.8誤記訂正
前へ
次へ
ホームページトップへ戻る