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

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





[第849回]


●タイマールーチンを作る(NOPのテスト)

このあたりで今までに作った回路の命令を利用して、タイマールーチンを作ります。
同時にNOP命令のテストを兼ねています。
タイマールーチンは2本のプログラム(サブルーチン)でできています。

1)2.5msタイマープログラム(NOP命令のテストプログラム)

0040 F5       PUSH PSW (8)
0041 3EF6     MVI A,F6  (6)
0043 3D       DCR A    (8)
0044 C24300   JNZ $0043 (12) or (8)
0047 00       NOP      (4)
0048 00       NOP      (4)
0049 00       NOP      (4)
004A 00       NOP      (4)
004B F1       POP PSW (8)
004C C9       RET      (8)

()の中の数字は各命令の実行クロック数です。
MYCPU80の命令クロックは0.5μsですから()内の数に0.5μsを掛けたものがその命令の実行時間になります。
NOP命令は何もしない命令ですが、このプログラムのように実行時間そのものが必要なときには重宝します。

PUSH PSW、POP PSWはAレジスタとフラグレジスタを退避するために使っています。
こうすることでAレジスタとフラグレジスタをこのサブルーチンの中だけで使うローカルなレジスタにすることができます。
F6は246です。
DCR AとJNZを246回繰り返し実行します。
このままでは不足する端数時間をNOPで補っています。
このプログラムの実行時間は下のように計算できます。
8+6+(8+12)×246−4+4+4+4+4+8+8=4962
4962×0.5=2481μs(2.481ms)
−4はJNZの最後の1回が8クロックになることの補正です。
2.5msに少し足りませんが、これはこのサブローチンをコールする上位のサブルーチン(下のプログラムリスト)を正確な0.5msサブルーチンにするための補正を考慮しているためです。

2)0.5秒タイマープログラム

0030 F5       PUSH PSW (8)
0031 3EC8     MVI A,C8  (6)
0033 CD4000   CALL $0040 (18+4962)
0036 3D       DCR A     (8)
0037 C23300   JNZ $0033  (12) or (8)
003A F1       POP PSW  (8)
003B C9       RET       (8)

C8は200です。
CALLとDCRとJNZが200回繰り返し実行されます。
この部分の1回の実行時間は
18+4962+8+12=5000
5000×0.5=2500μs
ちょうど2.5msになります。
それを200回繰り返しますから2.5×200=500msです。
実はその前後にも命令があるため、わずかですがさらに実行時間がかかります。
8+6+8+8−4=26
26×0.5=13μs
−4はJNZの最後の1回が8クロックになることの補正です。

この程度の時間の差が問題になるようなことは滅多にありません。
今回のプログラムはタイマールーチンのひとつのサンプルです。
ふつうはもっとアバウトでよいような用途がほとんどだと思います。

●XCHG命令のテスト

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

00000 310000   LXI SP,$0000
0003 215000   LXI H,$0050
0006 115100   LXI D,$0051
0009 010000   LXI B,$0000
000C 70       MOV M,B
000D EB       XCHG
000E 70       MOV M,B
000F EB       XCHG
0010 CD3000   CALL $0030
0013 34       INR M
0014 46       MOV B,M
0015 EB       XCHG
0016 CD3000   CALL $0030
0019 35       DCR M
001A 4E       MOV C,M
001B C30F00   JMP $000F

このプログラムはXCHG命令のテストプログラムですが、同時にMOV MやINR M、DCR M命令のテストも兼ねています。
プログラムを実行するとHLレジスタは0050、DEレジスタは0051になり、B、Cレジスタは00になります。
1)0.5秒後にBレジスタが+1され、HLレジスタとDEレジスタの値が交換されます。
2)その次の0.5秒後にCレジスタが−1され、HLレジスタとDEレジスタの値が交換されます。
以後1)2)が交互に繰り返されます。

プログラムを実行中の写真です。


今回の組立作業範囲のテストはほかにもいくつかあるのですが、本日は時間がなくなってしまいました。
残りのテストについては次回以降に説明します。

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

2018.2.23upload

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