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

トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆


[第284回]



●ラーメンタイマー(2)

あけましておめでとうございます。
本年もよろしくお願いいたします。

新年最初の回となります今回は前回の続きです。
前回は「ラーメンタイマー」プログラムをRAMに書き込んだところまでで終りました。
今回はそのプログラムを実際に実行してみます。
前回書きましたように1分という長さをプログラムで簡単に作り出すために通常のCPUクロックよりもずっと遅いスローモードで実行します。
スローモードは1命令を約1秒で実行しますから、簡単に1分を算出することができます。

いつものようにMSDOSプロンプト画面でND80Z3.5のZB3BASICのマシン語モニタコマンドで
OT 83,92
OT 82,F4
OT 83,08
と実行してCPUボードをリセット状態にしておいてジャンパピンをSLOWにセットしました。
それで準備完了です。
OT 83,09
でリセットが解除されてCPUが起動します。

写真ではアドレス03が実行されています。
今回はタイマープログラムですからストップウオッチを同時にスタートさせて経過時間もわかるようにしました。

最初のADD A,1とJNZのループが16回実行されてAレジスタが0000になりCFとZFがONになりました。

実は写真をよく見ていただければおわかりになるかと思いますが、今回は写真右上のREGISTER回路基板と下側のMEM/CLOCK回路基板を新しい基板に交換してテストをしています。
REGISTER回路基板はCFとZFを表示するLEDがあるとよいことに気が付いてあとから基板上に手配線で追加しました([第262回]参照)。
またMEM/CLOCK回路基板には同じようにCK0、CK1を表示するLEDをあとから基板上に手配線で追加しました([第275回]参照)。
今回はその両基板ともLED表示回路を追加配線した新しいプリント基板にパーツを実装したものをテストを兼ねて使用しました。
上の写真でREGISTER回路基板の右上隅近くに見える2個のLEDが新しく追加したCFおよびZF表示LEDです。
その部分を拡大しました。

ちょっと見にくいですけれど左側がCFで右側がZFです。
なんとかZFの文字が読めると思います。
また上の写真ではMEM/CLOCK回路基板の左上隅近くに見える2個のLEDが新しく追加したCK1、CK0表示LEDです。
上の写真ではCK1、CK0の両方とも消灯しています。
次の下の写真ではCK0が点灯していますのでそちらのほうを拡大しました。

左側がCK1で右側がCK0です。

上の写真の説明に戻ります。
16回のループが終ってCFとZFが点灯したところでストップウォッチの表示はちょうど30秒になっています。
メモリアドレスは03なので最後のJNZ命令のところですが、CLK表示LEDは00なので、正確に言うと実はまだJNZ命令は実行されていなくてその前の最後のADD A,1が実行された直後だと考えられます。
この時点での実行命令数は最初のOUT 0111、LD A,0を含めると2+2×15+1=33なので1命令が1秒だとするとストップウォッチの値は33秒になるはずです。
実はスローモードのクロックは約2Hz(1命令は4クロックなので実行時間は約1秒)と説明してきましたがこのシステムではCPUクロックにPIC12F629の内蔵発振回路を使っていますので水晶発振ほど正確ではありません。
上の結果から逆算するとスローモード時の1命令の実行時間は1秒よりも少し短くて約0.9秒ぐらいと考えられます。
なおこの値は今回使用したPIC12F629から出力されるクロックなので個々のキットによって多少の違いは出てくるかもしれません。

2回目のADD A,1とJNZのループが16回実行されてAレジスタが0000になりCFとZFがONになりました。

ストップウォッチの表示は約59秒になっています。
メモリアドレスは05になっています。
今回はCLKが01になっていますから最後のJNZ命令が1/4〜2/4ほど実行されたところだと考えられます。
そのように考えて今回の実行命令数を計算すると2×16−0.5=31.5ぐらいになると考えられます。
前回の値は最後のJNZ命令を含まない計算でしたが今回のループに入る前にそれは実行されているはずですから前回の命令実行数は34になりそれに今回の値をあわせると34+31.5=65.5になります。
1命令の実行時間を0.9秒とすると0.9×65.5=58.95となってストップウォッチの値にほぼ一致します。
プログラムではこのあとOUTポートに1分経過を示す○●●○を表示するためのOUT命令が実行されますが上の写真の時点ではまだOUT命令は実行前でOUTポートの表示は○●●●のままです。
OUTポートに○●●○が表示されるまでにその後約1秒かかったとすると、今回のシステムの場合にはちょうどジャスト1分でその表示が出ることになります。
そのように計算してスローモードのクロックを決めたわけではありませんから、これはたまたまそのような結果になっただけです。

3回目のADD A,1とJNZのループが16回実行されてAレジスタが0000になりCFとZFがONになりました。

ストップウォッチの表示は約1分28秒(88秒)になっています。
メモリアドレスは08になっています。
今回もCLKが01になっていますから最後のJNZ命令が1/4〜2/4ほど実行されたところだと考えられます。
そのように考えて今回の実行命令数を計算すると2×16−0.5=31.5ぐらいになると考えられます。
前回の値は最後のJNZ命令の半分と次のOUT命令を含まない計算でしたが今回のループに入る前にそれは実行されているはずですから前回までの命令実行数は67になりそれに今回の値をあわせると67+31.5=98.5になります。
1命令の実行時間を0.9秒とすると0.9×98.5=88.65となってストップウォッチの値にほぼ一致します。

4回目のADD A,1とJNZのループが16回実行されてAレジスタが0000になりCFとZFがONになりました。

ストップウォッチの表示は約1分57秒(117秒)になっています。
メモリアドレスは0Aになっています。
今回もCLKが01になっていますから最後のJNZ命令が1/4〜2/4ほど実行されたところだと考えられます。
そのように考えて今回の実行命令数を計算すると2×16−0.5=31.5ぐらいになると考えられます。
前回の値は最後のJNZ命令の半分を含まない計算でしたが今回のループに入る前にそれは実行されているはずですから前回までの命令実行数は99になりそれに今回の値をあわせると99+31.5=130.5になります。
1命令の実行時間を0.9秒とすると0.9×130.5=117.45となってストップウォッチの値にほぼ一致します。
プログラムではこのあとOUTポートに2分経過を示す○●○○を表示するためのOUT命令が実行されますが上の写真の時点ではまだOUT命令は実行前でOUTポートの表示は○●●○のままです。
OUTポートに○●○○が表示されるまでにその後約1秒かかったとすると、今回のシステムの場合にはスタートしてから1分58秒後にその表示が出ることになります。
前回はちょうど1分で最初の1分経過を示す表示が出たのですがそれは初期設定のためのOUT 0111命令とLD A,0命令が実行されているため約2秒が加算されているためです。
今回のシステムの場合、2度の16回のループとOUTポート出力の実行時間は約58秒と考えられます。

5回目のADD A,1とJNZのループが16回実行されてAレジスタが0000になりCFとZFがONになりました。

ストップウォッチの表示は約2分27秒(147秒)になっています。
メモリアドレスは0Dになっています。
今回はCLKが00になっていますからまだJNZ命令は実行されていなくてその前の最後のADD A,1が実行された直後だと考えられます。
そのように考えて今回の実行命令数を計算すると2×16−1=31ぐらいになると考えられます。
前回の値は最後のJNZ命令の半分と次のOUT命令を含まない計算でしたが今回のループに入る前にそれは実行されているはずですから前回までの命令実行数は132になりそれに今回の値をあわせると132+31=163になります。
1命令の実行時間を0.9秒とすると0.9×163=146.7となってストップウォッチの値にほぼ一致します。

6回目のADD A,1とJNZのループが16回実行されてAレジスタが0000になりCFとZFがONになりました。

ストップウォッチの表示は約2分57秒(177秒)になっています。
メモリアドレスは11になっています。
今回はCLKが00になっていますからまだJNZ命令は実行されていなくてその前の最後のADD A,1が実行された直後だと考えられます。
今回のループに入る前にメモリバンクを切り換えるためにアドレス0Eとアドレス0Fで2回のJMP命令を実行しています。
そのこともあわせて考えて今回の実行命令数を計算すると2+2×16−1=33ぐらいになると考えられます。
前回の値は最後のJNZ命令を含まない計算でしたが今回のループに入る前にそれは実行されているはずですから前回までの命令実行数は164になりそれに今回の値をあわせると164+33=197になります。
1命令の実行時間を0.9秒とすると0.9×197=177.3となってストップウォッチの値にほぼ一致します。
プログラムではこのあとOUTポートに3分経過を示す●○○○を表示するためのOUT命令が実行されますが上の写真の時点ではまだOUT命令は実行前でOUTポートの表示は○●○○のままです。
OUTポートに●○○○が表示されるまでにその後約2秒かかったとすると、今回のシステムの場合にはスタートしてから2分59秒後にその表示が出ることになります。
ねらってスローモードのクロックをそのような値にしたわけではありませんが今回のシステムの場合にはたまたま結果としてはかなり正確な「ラーメンタイマー」が出来ました。

3分経過後の写真です。

シャッターを押すタイミングが悪くてかなり経過してからの写真になってしまいました。
OUTポートに●○○○が表示されHLTが点灯しています。

トランジスタでCPUをつくろう![第284回]
2021.1.3upload

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