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

●前回からの続きを書こうとしたのですが…

何回も書いては消し、また書いては消し、を続けたのですけれど…。
結局、全部消してしまいました。
なんだか理屈っぽくなるばっかりでちっとも面白くありません。

MYCPU80に何か意義があるか?

うーん…。
無くったってよいじゃありませんか。
そんじょそこらにあるもんじゃありません。
このボリュームはハンパじゃありません。
しかもただの模型じゃあありません。動くんですよ。
8080と同じ動作をするんです。
ICの数が何と270個ですよー。
どーです。すごいでしょー。

それでいいじゃありませんか。

これだけのICを並べて、ちゃんとCPUとしてまともに動くってこと自体、すごいことだとは思いませんでしょうか?
このすごいヤツを実際に自分の手で組み立ててみて、それで動いたときの感動!
そりゃあ、ちょいと感激ですよ

☆☆☆ご注文いただいた皆様のお手元に、そろそろキットが行き渡ります。
キットにはもちろん詳細な説明書は付属しておりますけれど、写真などはありません。
組立や動作テストの参考にしていただくこともあるかもしれませんので、[第333回]を最後に中断しておりました、MYCPU基板の組立作業および動作テストの説明を再開いたします。☆☆☆

●[9]STA、LDA、STAX、LDAX、XCHG、SPHL、PCHL、INX、DCX、XTHL、SHLD、LHLD、NOP命令回路の実装です

[第314回]で説明した作業です。
今回はてんこ盛りです。
STA、LDA、STAX、LDAX、XCHG、SPHL、PCHL、INX、DCX、XTHL、SHLD、LHLD、NOP命令の回路を実装します。
実装する部分は、こちらのシルク図で、赤色で着色したところです。

●組立作業を終わったところの写真です

写真をクリックすると拡大画像を見られます。サイズが大きいので(約1MB)、インターネットの低速接続環境では、ダウンロードに時間がかかります。ご注意ください。




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

●16.タイマールーチンをつくる(NOP命令のテスト)

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

●16−1. タイマールーチン(NOP命令のテストプログラム)をメモリに書く

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

(1)2.5msのタイマールーチン

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)
(リスト12) 2.5msタイマールーチン(NOP テストプログラム)

(2)0.5secのタイマールーチン

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)
(リスト13) 0.5secタイマールーチン

CPUクロックは水晶発振ですから、プログラムの実行時間も正確です。
命令を組み合わせることで必要なタイマールーチンを作ることができます。
しかし命令によって、それぞれの実行クロック数が異なりますから、その命令を組み合わせて希望通りのタイマーを作ることは簡単ではありません。
そういうときにNOP命令は、「なにもしないで実行時間だけかかる命令」なので、重宝します。

リスト12はNOPのテストを兼ねていますが、同時に、後々も利用ができるタイマールーチンです。
8ビットのカウンタを使って少ないバイト数で作るタイマールーチンはせいぜいms単位のものになります。
しかし実用上はもう少し長いタイマーがあると便利です。

リスト13はリスト12の2.5msタイマールーチンをCALLすることで作った、0.5secのタイマールーチンです。
リスト12もリスト13も最後がRET命令で終わるサブルーチンですから、単独では実行できません(実行できますが、実行後にRET命令での戻り先がありませんから、暴走してしまいます)。

別に用意するメインルーチンからCALLすることで初めて機能することになります。

命令の後ろの( )はその命令の実行クロック数です。
「つくるCPU」のCPUクロックは2MHzですから、1マシンクロックは0.5μsです。
各命令のクロック数に0.5μsを掛けたものが、その命令の実行時間になります。
命令のクロック数は8080命令説明書を参照してください。

●16−2. 2.5msタイマールーチンの説明です

0040のPUSH PSWと004BのPOP PSWはスタックにAレジスタとフラグを退避するために使います。
DCR A命令の実行によってAレジスタの値とフラグの状態が変化することをサブルーチンの外に伝えないためです。
このようにPUSH/POPを使うことによってレジスタをサブルーチン内だけのローカルなものにすることができます。

F6は十進数では246になります。
DCR AとJNZが246回繰り返し実行されるほかは、その他の命令が1回ずつ実行されますから、0040からのタイマールーチンの実行クロック数は下のように計算できます。
8+6+(8+12)×246−4+4+4+4+4+8+8=4962
−4はJNZの最後の一回が8クロックであるための補正です。
1マシンクロックは0.5μsですから、このタイマールーチンの実行時間は4962×0.5=2481μsになります。
2.5msに少し足りませんが、これは上位のサブルーチン(0.5secタイマールーチン)で正確な2.5msのタイマーにするための補正を考慮しているためです。

●16−3. 0.5secタイマールーチンの説明です

C8は十進数では200になります。
CALLとDCR AとJNZが200回繰り返し実行されます。
この3つの命令の実行クロック数は18+8+12=38です。
CALLは2.5msタイマールーチンをCALLしていますから、1回のCALL毎に4962クロックが加わります。
38+4962=5000クロックですから、このループを1回実行する毎にちょうど2.5msかかることになります。
それを200回繰り返しますから、2.5×200=500msです。

実際にはこのループの前後にも命令があります。
その部分の実行クロック数を計算します。
8+6+8+8−4=26クロックです。−4はJNZの最後の1回が4クロック少ないための補正です。
26×0.5=13μsです。全体の500msに比べてわずかですから、普通の用途でしたらこのくらいの値は無視できます。

なおこのタイマールーチンについては、当社ホームページの
「つくるCPU[第157回]」(http://www.alles.or.jp~thisida/mycpu157.html)
でも説明をしています。

ここで作ったタイマールーチンは次のXCHG命令のテスト他で使います。

●17.XCHG命令のテスト

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

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

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

0000 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
(リスト14) XCHG テストプログラム

ここではXCHG命令の動作テストをするのが目的ですが、リスト14は、それと同時にMOV MやINR M、DCR Mもテストするプログラムになっています。
またアドレス0030の0.5secタイマールーチンをCALLすることで、NOP命令の動作テストを兼ねています。
[注記]0030からのタイマールーチンがないとリスト14のテストプログラムは実行できません。もしもまだタイマールーチンをメモリに書き込んでいない場合には、16−1.タイマールーチン(NOP命令のテストプログラム)をメモリに書く の作業をしてください。

このプログラムは、メモリアドレスの0050と0051をレジスタBとレジスタCのワークエリアとして利用し、0.5秒後にBレジスタ用ワークエリア(0050)をインクリメント(+1)し、次の0.5秒後にCレジスタ用ワークエリア(0051)をデクリメント(−1)し、それを繰り返します。
ワークエリアアドレスはHLレジスタを使って指定しますが、HLレジスタに0050が入っているときにもうひとつのアドレス0051はDEレジスタに入れられます。HLレジスタとDEレジスタの値を交換するのにXCHG命令が使われます。
 
●17−2. テストプログラムを実行する

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

プログラムが実行されると、最初BレジスタとCレジスタは共に00になり、HLレジスタは0050、DEレジスタは0051になります。
0.5秒後にBレジスタが+1され、HLレジスタとDEレジスタの値が交換されます@。
その次の0.5秒後にCレジスタが−1され、ふたたびHLレジスタとDEレジスタの値が交換されますA。
@Aが繰り返し実行されます。

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

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



Bレジスタは5A、CレジスタはA6です。
5Aは十進では90です。
Bレジスタは1秒ごとに+1されますから、ちょうど経過時間(秒)と同じです。
90秒=1分30秒ですからストップウォッチの表示とぴったり一致しています。

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

●18. INX命令のテスト

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

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

メモリに次のプログラムを書きます(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 23       INX H
0010 13       INX D
0011 03       INX B
0012 C30C00   JMP $000C
(リスト15) INX テストプログラム

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

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

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

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

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



ペアレジスタBC、DE、HLの値はいずれも0104です。十進に直すと260です。ペアレジスタの値は0.5秒ごとに+1されますから、
260×0.5=130(秒)になります。
130秒=2分10秒ですからストップウォッチの表示とぴったり一致しています。

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

2009.9.25upload

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