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

標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
やっと(!)MYCPU80の改良型基板製作に着手しました!!





[第858回]


●RST命令のテスト

RST命令は1バイトのCALL命令です。
RST命令はCALLするアドレスが決まっていて、そのアドレスによってRST 0〜RST 7の8通りの命令があります。
今回はそのうちのRST 1をテストします。
下はRST命令のテストプログラムのリストです。

0000 310000  LXI SP,$0000
0003 04      INR B
0004 CF      RST 1
0005 76      HLT
0006 00      NOP
0007 00      NOP
0008 3C      INR A
0009 0C      INR C
000A C9      RET

RST 1はアドレス0008から始まるサブルーチンをCALLします。
サブルーチンをCALLしますから、プログラムの先頭でスタックをセットします。
LXI SPの実行後、INR Bを実行し、RST 1を実行したあとHLTで停止します。
0008から始まるサブルーチンではAレジスタとCレジスタをそれぞれ+1してからリターンします。
0006、0007にあるNOPに意味はありません。
0005のあと0008までの間には何も無いことを強調するためにNOPを入れました。

プログラムを実行すると、Aレジスタ、BレジスタとCレジスタがそれぞれ+1されます。
RESETSWを押す(押してから離す)と、再びプログラムが実行され、レジスタの値が+1されて表示されます。
RESETSWを押すたびに(押してから離すごとに)、プログラムが実行されて、レジスタが+1されます。
上のリストではAレジスタとCレジスタはRST 1が実行されない限りインクリメントされないので、それが+1されたということは、RST 1が正しく実行されたことを示しています。

RST命令のテストプログラムを実行したあとの写真です。

リセットスイッチを押すたびにAレジスタ、Bレジスタ、Cレジスタが+1されます。

●EI命令のテスト

EIは割込みを許可する命令です。
マスク可能な割込みとしては普通は上で説明したRST 0〜RST 7の1バイトコール命令を利用します。
リセット後は割込み禁止状態になっていますから、割込みを使うためにはEI命令を実行しておく必要があります。

下のリストはEI命令のテストプログラムです。

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

上のリストのプログラムは2つの部分に分かれています。
0000〜000Aがメインプログラムで0038〜003Aが割込みプログラムです。
8080の割込みにはRST命令が利用されます。
8通りあるRST命令の中でもRST 7(コードFF)は、外部に割込み制御回路を必要とせず、INT割込み信号を与えるだけで割込みを実行させることができるので、8080ではRST 7が割込み命令としてごく普通に利用されます。

プログラムは非常に簡単なものです。
割込みはスタックを利用しますから、スタックポインタの設定が必要です。
プログラムの先頭にLXI SP命令を置きます。
リセット後は割込みは禁止状態になっていますから、割込みを受け付けるためにはEI命令で割込み許可を与えておく必要があります。
その後はBレジスタをインクリメントし続けます。
0005と0006にNOPがありますが、割込みに必要なものではありません。あとで利用したいことが出てきますからこうしておきます。

RST 7命令を利用した割込みプログラムは0038から書きます。
今回はテストですから割込みプログラムも簡単なものです。
INR AでAレジスタを+1するだけです。
割込みが受け付けられると、割込み禁止状態になってしまいますから、メインルーチンに戻る前に割込み許可状態にしておかないと次からの割込みが受け付けられなくなります。
メインルーチンに戻るためのRET命令の直前にEI命令を置きます。
EI命令の次の命令の実行後に割込みが許可されるからです。

割込みを実行させるためには外部から割込み信号(INT)を入力する必要があります。
INT信号は16pフラットケーブル用コネクタの9番端子に配線してあります。

プログラムを実行させるとBレジスタが高速でインクリメントされるため、BレジスタのLEDが全点灯しているように見えます。
その他のレジスタには変化はありません。
この状態で16pフラットケーブルの9番と16番を一瞬だけショートさせてみます。
16番はGNDです。

人間の感覚では一瞬に過ぎなくてもコンピュータにとっては非常に長い時間です。
MYCPU80の割込みは、INT入力端子にLレベルの信号を与えることで実行されます。立下りエッジではなくてLの期間中有効な信号として認識されます。
割込みが受け付けられると、アドレス0038からの割り込みプログラムが実行されます。
割込みプログラムの実行が終了してメインプログラムにリターンしてきたときに、まだINT信号がアクティブ(L)になったままだと、再び割込みが発生して、割り込みプログラムが実行されます。

INT入力を一瞬Lにしただけでも、割込み処理に対しては非常に長い時間ですから、数十回以上も割込みが実行されます。
その結果Aレジスタが一瞬でかなりの回数インクリメントされ、LEDにはその結果が表示されます。

INT命令のテストプログラムを実行中の写真です。


●DI命令のテスト

DIはEIの逆の働きをする命令です。
DIを実行するとマスク可能な割込みは受け付けられなくなります。

下のリストはDI命令のテストプログラムです。

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

0038 3C      INR A
0039 FB      EI
003A C9      RET

さきほどのEIのテストプログラムの
0006 00 NOP を
0006 F3 DI に書き換えました。
このようにしてから、EIのテストと同じことをしてみます。
すると割込みは受け付けられなくなってしまいます。
これはEIの直後にDIが実行されて、それ以後割込みの受け付けが禁止されてしまうからです。

これでMYCPU80の全命令回路のテストが終りました。
厳密に言えば、たとえば条件付きジャンプ命令のうちJNZしかテストをしなかった、というようにテストを省略しているところもありますが、省略をしないテストプログラムは、別途USB接続をしたあとで実行することもできますから、回路の組立途中のテストとしてはこの程度で十分ではないかと思います。

●組立に要した時間と組立に使ったハンダの量

当連載として組立を開始したのが2月16日で本日が3月4日ですが、実際の製作では組立を開始したのは2月15日で完成したのは2月24日でしたから丁度10日間かかったことになります。
しかしこの間毎日終日組立作業をしていたのではなくて、その間に写真を撮ったり、急ぎの注文に対応するため作業を中断したりしていますから、ゆっくり作業しても1日3〜4時間作業して1週間程度で完成すると思います。

さてそれではこの巨大基板の組立にはどのくらいのハンダを使ったでしょうか?
それを確認するために新品の巻きハンダを用意しました。

私は0.8mmの糸ハンダを使っています。
写真のものは1Kgです。
組立作業が完了したあとで確認してみたところ、意外と少ししか消費していなくてちょうど80gしか減っていませんでした。
人によって使う量にばらつきがあると思いますし、このあとTK−80回路も製作しなければなりませんからもう少し必要ですが、それでも100g〜150gていど用意すれば十分でしょう。

TTLでCPUをつくろう![第858回]

2018.3.4upload

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