標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第344回]

●ブログでご紹介していただきました

MYCPU80をご購入いただいた方からメールをいただきました。
ご自身のブログでMYCPU80についてご紹介していただいたとのこと。
さっそく拝見させていただきました。
こちらのブログです→ FIAT500と洗車の日々・・・(http://plaza.rakuten.co.jp/flyback/)

到着したばかりの外箱の写真、それから箱から取り出した基板の写真や部品の写真、説明書の写真も撮っていただいています。
こうやって実際にご購入していただいた方からナマの声を発信していただけることは、何よりの支援となります。
「製作の過程もブログに発表していきます」とのこと。楽しみにしております。
皆様もぜひご訪問していただくようおすすめいたします。
供給する側からの言葉ではなくて、ご購入者としての視点から書かれることは、皆様にとっても、より貴重な情報になると思います。

●[9]STA、LDA、STAX、LDAX、XCHG、SPHL、PCHL、INX、DCX、XTHL、SHLD、LHLD、NOP命令回路の動作テストです(操作説明書から)

☆☆☆前回からの続きです☆☆☆

●19. DCX命令のテスト

●19−1. DCX命令のテストプログラムをメモリに書く

メモリに次のプログラムを書きます(1. メモリにデータを書き込む の説明を参考にして操作してください)。

0000 310000   LXI SP,$0000
0003 210000   LXI H,$0000
0006 110000   LXI D,$0000
0009 010000   LXI B,$0000
000C CD3000   CALL $0030
000F 2B       DCX H
0010 1B       DCX D
0011 0B       DCX B
0012 C30C00   JMP $000C
(リスト16) DCX テストプログラム

ペアレジスタHL、DE、BCをデクリメントする、DCX命令のテストプログラムです。
0.5secタイマールーチンをCALLしているため、DCX SPはテストから除外しています。
[注記]0030からのタイマールーチンがないとリスト16のテストプログラムは実行できません。もしもまだタイマールーチンをメモリに書き込んでいない場合には、16−1.タイマールーチン(NOP命令のテストプログラム)をメモリに書く の作業をしてください。

●19−2. テストプログラムを実行する

プログラムの実行の仕方については 4. テストプログラムを実行する を参照してください。
RESETSWを押しながら、ディップスイッチDS3−4をOFFにします。その後RESETSWを離すとプログラムが実行されます。

プログラムが実行されると、BCレジスタ、DEレジスタ、HLレジスタは0000になり、その後は0.5秒毎にBC、DE、HLレジスタが同時に−1されていきます。

☆☆☆操作説明書には図はありますが画像(基板の写真)はありません。でもせっかくのホームページですから、写真もUPいたします。☆☆☆

●テストプログラムを実行中の写真です



ペアレジスタBC、DE、HLの値はいずれもFF9Cです。0000から0.5秒ごとに−1された結果です。

 0000
 FF9C(
 0064
16進数(2進数)の減算については、[第194回]で説明しています。

16進数の64を十進に直すと100です。ペアレジスタの値は0.5秒ごとに−1されますから、
100×0.5=50(秒)です。
ストップウォッチの表示とぴったり一致しました。

●20.STA、LDA、STAX、LDAX命令のテスト

MYCPU80組立説明書 V組立 [9]STA、LDA、STAX、LDAX、XCHG、SPHL、PCHL、INX、DCX、XTHL、SHLD、LHLD、NOP命令回路 の組立作業後に行う動作テストの説明です。

●20−1. STA、LDA、STAX、LDAX命令のテストプログラムをメモリに書く

メモリに次のプログラムを書きます(1. メモリにデータを書き込む の説明を参考にして操作してください)。

0000 310000   LXI SP,$0000
0003 210000   LXI H,$0000
0006 115100   LXI D,$0051
0009 015000   LXI B,$0050
000C CD3000   CALL $0030
000F 23       INX H
0010 7D       MOV A,L
0011 325200   STA $0052
0014 3A5200   LDA $0052
0017 12       STAX D
0018 1A       LDAX D
0019 02       STAX B
001A 0A       LDAX B
001B 6F       MOV L,A
001C C30C00   JMP $000C
(リスト17) STA、LDA、STAX、LDAX テストプログラム

STA、LDA、STAX、LDAXの各命令のテストプログラムです。
いずれもAレジスタの値をメモリにSTORE、またはメモリからLOADする命令です。
STA、LDAはSTORE、LOADするメモリアドレスを直接指定します。
STAX、LDAXはメモリアドレスをBCレジスタ、DEレジスタで指定する「間接アドレッシング」命令です。
HLレジスタを+1したあと、Lレジスタの値をAレジスタに入れます。
Aレジスタの値をSTA命令でアドレス0052に書き込み、すぐにLDA命令で読み出します。
次にSTAX DとLDAX Dで同じようにDEレジスタで示すメモリアドレス(0051)にAレジスタの値を書き込み、読み出しし、その次にSTAX BとLDAX BでBCレジスタで示すメモリアドレス(0050)にAレジスタの値を書き込み、読み出しし、その値をLレジスタに戻します。
この動作を0.5秒ごとに繰り返します。
[注記]0030からのタイマールーチンがないとリスト17のテストプログラムは実行できません。もしもまだタイマールーチンをメモリに書き込んでいない場合には、16−1.タイマールーチン(NOP命令のテストプログラム)をメモリに書く の作業をしてください。

●20−2. テストプログラムを実行する

プログラムの実行の仕方については 4. テストプログラムを実行する を参照してください。
RESETSWを押しながら、ディップスイッチDS3−4をOFFにします。その後RESETSWを離すとプログラムが実行されます。

プログラムが実行されると、BCレジスタは0050、DEレジスタは0051、HLレジスタは0000になり、その後は0.5秒毎にHLレジスタの値が+1されていきます。AレジスタはLレジスタと同じ値になります。

●テストプログラムを実行中の写真です



ペアレジスタHLの値は01E0です。
01E0は十進では480です。
HLレジスタは0.5秒ごとに+1されますから、
480×0.5=240(秒)
240秒=4分ですからストップウォッチの表示とぴったり一致しています。

なおこのSTA、LDA、STAX、LDAXテストプログラムについては、当社ホームページの
つくるCPU[第160回]」(http://www.alles.or.jp~thisida/mycpu160.html)
でも説明をしています。

●21.SHLD、LHLD、XTHL命令のテスト

MYCPU80組立説明書 V組立 [9]STA、LDA、STAX、LDAX、XCHG、SPHL、PCHL、INX、DCX、XTHL、SHLD、LHLD、NOP命令回路 の組立作業後に行う動作テストの説明です。

●21−1. SHLD、LHLD、XTHL命令のテストプログラムをメモリに書く

メモリに次のプログラムを書きます(1. メモリにデータを書き込む の説明を参考にして操作してください)。

0000 310000   LXI SP,0000
0003 010000   LXI B,0000
0006 110000   LXI D,0000
0009 3E00     MVI A,00
000B C5       PUSH B   (8)
000C E3       XTHL      (16)
000D 23       INX H     (8)or(12)
000E 225000   SHLD 0050 (20)
0011 210000   LXI H,0000 (8)
0014 2A5000   LHLD 0050 (20)
0017 E3       XTHL      (16)
0018 C1       POP B     (8)
0019 1C       INR E      (8)
001A C20B00   JNZ 000B  (12)or(8)
001D 14       INR D      (8)
001E C20B00   JNZ 000B  (12)or(8)
0021 3C       INR A      (8)
0022 C30B00   JMP 000B  (12)
(リスト18)SHLD、LHLD、XTHL テストプログラム 

SHLD、LHLD、XTHLの各命令のテストプログラムです。
いずれもHLレジスタとメモリとの間でデータを交換する命令です。
SHLD、LHLDはHLの値をメモリにSTORE、メモリからLOADします。

XTHLはスタックのトップにある2バイトのデータとHLの値とを交換する命令です。

BCレジスタとDEレジスタには初期値0000を入れます。
Aレジスタにも00を入れます。

PUSH B、POP Bは、XTHLの動作を確認するために使っています。
PUSH B命令の実行によって、スタックのトップにはBCレジスタの値が置かれます。
XTHLを実行すると、そのときにスタックトップにある2バイトのデータと、HLレジスタの値とが交換されます。
XTHL命令によって、スタックトップのデータ(実はBCレジスタの値と同じ)がHLレジスタに入り、代わりにHLレジスタの値がスタックに置かれます。
BCレジスタは変化しませんが、動作としては、BCとHLの値を交換したに近い動作になります。
ですから、HLの値は、実はBCの値と同じになっています。

そのHLの値を次のINX Hで+1します。
そしてSHLDとLHLDのテストのために、まずSHLD命令で、メモリの0050にHLの値をSTOREします。
その後に、LHLD命令で、メモリの0050から、ふただび値をHLレジスタに読み込みます。
そしてもう一度、XTHLを実行して、スタックトップのデータ(保存してあった、もともとのHLのデータ)と、現在のHLレジスタの値とを交換します。

ここまでの動作で、スタックトップの値(実はBCレジスタの値)が+1されたことになります。
そして最後に、POP Bで、スタックトップの値をBCレジスタに戻します。
結局、HLレジスタの値は変わることなく、BCレジスタの値だけが+1されたことになります。

実行時間を時計で計って、計算結果と比較できるように、以上の動作を1回実行するごとに、Eレジスタを+1します。
Eレジスタを+1した結果が00でなければ、000Bに戻って繰り返します。
結果が00のときは、Dレジスタを+1します。

Dレジスタを+1した結果が00でなければ000Bに戻って繰り返します。
Dレジスタを+1した結果が00のときは、Aレジスタを+1してから、000Bに戻って繰り返します。

●21−2. テストプログラムを実行する

プログラムの実行の仕方については 4. テストプログラムを実行する を参照してください。
RESETSWを押しながら、ディップスイッチDS3−4をOFFにします。その後RESETSWを離すとプログラムが実行されます。

プログラムが実行されると、DEレジスタは0000、Aレジスタは00になり、A、D、Eをつないだ24ビットカウンタとしてカウントアップしていきます。同時にBCレジスタもカウントアップしていきます。

カウントアップされていく時間を計算してみます。
リスト18の各命令の後ろに()で示されているのが、その命令の実行クロック数です。
必ず繰り返し実行されるのは、000B〜001Cです。
そこで、この範囲の命令が1回実行されるのに必要な時間をまず求めてみます。

000DのINX Hと、001AのJNZ 000Bには実行クロック数が2つあります。
INX Hは、実行した結果、下位8ビットが00になるときだけ12クロックで、それ以外のときは8クロックです。
JNZ 000Bは、Zフラグが立っているときだけ(つまりその前に実行されるINR Eの実行の結果、Eが00になったときだけ)8クロックで、それ以外のときは、12クロックです。

プログラムは、B、C、D、E、Aに00を初期セットするところからスタートします。
H、Lには何がはいっているかわかりませんが、000B〜001Cの中では、B、Cの値がH、Lに入ることになりますから、H、Lも最初は00からスタートすることになります。
INX HとINR Eは同じように、00からスタートして+1ずつインクリメントされていきますから、Lレジスタが00になるタイミングとEレジスタが00になるタイミングは同じになります。
ということは、000DのINX Hと、001AのJNZ 000Bの2つの命令の実行クロック数の合計は、常に20クロックということになります。

その20クロックに残りの命令の実行クロック数を加算すると、合計は124クロックになります。
1マシンクロックは0.5μsですから124×0.5=62μsです。
つまり、000B〜001Cが1回実行されて、HLレジスタ(実はBCレジスタ)とEレジスタが+1されるのに必要な実行時間は62μsということです。
そして、Eレジスタが00からはじまって、また00になるまで、256カウントするたびに、Dレジスタが+1されます。

そこで今度は、Dレジスタが+1されるのにかかる時間を計算してみます。
Eレジスタが256カウントするのにかかる時間は、
62×256=15872μsです。
INR Dとその次のJNZ 000Bの実行クロック数は8+12=20ですから実行時間は10μsです。
これを加算すると、
15872+10=15882μsになります。
これがDレジスタが+1されるのにかかる時間です。

同様にして、Aレジスタが+1されるのにかかる時間を計算します。
Dレジスタが256カウントするたびに、Aレジスタが+1されるのですから、
15882×256−2+10=4065800μsになります。
最後の10はINR Aとその次のJMP 000Bの実行時間です。
その前の−2は、Dレジスタが256カウントする間に、1回だけ結果が00になって、JNZ命令の条件が不成立になるので、残りの255回の実行時間6μsより2μs短くなることによる差を引いているものです。

 以上の計算から、Aレジスタは4.0658秒ごとに+1されていくことがわかります。

●テストプログラムを実行中の写真です



プログラムを実行すると、E、D、AレジスタがカウントアップされますがEレジスタは速すぎて全点灯しているようにしか見えません。
Dレジスタも下位5ビットは全部点灯しているように見えますが、ここは少し割り引く必要があります。ですからDレジスタは9Fではなくて、下位5ビットを1/2にして、90とします。それとAレジスタの3Dをあわせると、3D90になります。
3D90を10進数に直すと15760になります。
Dレジスタが+1カウントアップするのに15.882msかかりますから、
15760×15.882=250300ms
250.3秒です。4分10秒ですからストップウォッチの表示とぴったり一致しています。

上の計算はAレジスタとDレジスタとを合わせて計算しました(この場合多少の誤差を含みます)が、AレジスタとDレジスタを分けて計算しても結果は誤差の範囲内です。。
Dレジスタは90ですから、10進数に直すと144になります。
144×15.882=2287.008ms
Aレジスタは3Dですから、10進数に直すと61になります。
61×4.0658=248.0138sec
248.0138+2.2870=250.3008sec

なおこのSHLD、LHLD、XTHL テストプログラムについては、当社ホームページの
「つくるCPU[第161回]」(http://www.alles.or.jp~thisida/mycpu161.html)
でも説明をしています。

2009.9.26upload

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