ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 |
2011.6.28 前へ 次へ 目次へ戻る ホームページトップへ戻る |
☆特注品Z80ボードND80ZHの機能説明 TK80コンパチブルで、その上中日電工オリジナルのND80Zとしても動作するというZ80CPUのワンボードマイコンを企画し、その開発準備をしていたところに、ND80Zの特注品の開発依頼をいただきました。製品名はND80ZHです。 新企画のZ80ボード(ND80ZV)はこのあとで製作することになりますが、基本的な機能はND80ZHと共通していますから、まずはND80ZHの機能を説明します。 |
[第20回]
●計算が合いません???
前回は、
TK80のCPUクロックが2MHzだったのに、Z80版TK80ボード(ND80ZH)のCPUクロックが4MHzなので、モニタプログラムのチャタリングタイマーを補正しました。
というお話をいたしました。
CPUクロックが2MHzのボード(TK80)で、9msecのタイマープログラムを、CPUクロックが4MHzのボード(ND80ZH)でそのまま実行したら、4.5msecタイマーになってしまいます。
キー入力時のチャタリングによる誤入力を回避するためのタイマールーチンですから、それが半分の時間になってしまっては、使い物にならない可能性がありますから、クロックを4MHzにしても、約9msecになるように定数を書き換えたのです。
Z80は8080の命令をそのまま実行できますから、単純に考えたら、時間待ちのループ回数を倍にすれば計算が合う、はずでした。
念のために、ということで、オリジナルのままのタイマールーチンの各命令の実行クロック数を全部計算して、そこからD2のサブルーチンの実行時間が9msecになるように、繰り返し回数を計算で求めて、得られた値が、
アドレス02DFのMVI E,23
でした。
16進数の23は十進数では35です。
ところが。
オリジナルのTK80モニタプログラムのその部分は、
MVI E,0C
だったのです。
0Cは十進数では12です。
あれま。計算が合いませんですねえ?
2MHzのときに繰り返し回数が12回だったのですから、4MHzなら24回になるはずでしょう。
それが4MHzだと35回になってしまうのですよお。
5割近くも違うじゃありませんかあ。
なぜえ?
CPUクロック4MHzで約9msecになるように計算で求めて書き直したタイマールーチンをテストプログラムを書いて確認してみたところ、間違い無く約9msecであることは、テストプログラムを実行して得られた出力波形から明らかです(前回[第19回]のオシロの写真)。
では、TK80モニタプログラムが間違っているのか?
いや、いくらなんでも、それはないでしょうよ。
どうでもよいことかもしれませんが…。
いやあ、これはどうでもよいことでは済まされませんでしょう。
むむ。納得がいきません。
こういうことは、やっぱり納得がいくところまで、追及してみたくなってしまいますです。
一旦、気になると、そのままにしておくのが、どうにも気持ちが悪いのですよねえ。
で。
オリジナルのTK80モニタのタイマールーチンの各命令に8080のクロック数を当てはめて、実行時間を計算してみました。
すると、意外な結果になったのです。
; ;CHATTERING TIMER ; ORG $02DD 02DD 1624 D1:MVI D,24;WAIT 1/2 BIT TIME 4.5112MSEC (7) 02DF 1E0C MVI E,0C (7) 02E1 1D DCR E (5) 02E2 C2E102 JNZ $-1 (10) 02E5 15 DCR D (5) 02E6 C2DF02 JNZ $-7 (10) 02E9 C9 RET (10) 02EA 1648 D2:MVI D,48;WAIT 1 BIT TIME 9.0176MSEC (7) 02EC C3DF02 JMP D1+2 (10) 02EF 16D8 D3:MVI D,D8;WAIT 3 BIT TIME 27.0176MSEC (7) 02F1 C3DF02 JMP D1+2 (10)[出典]NEC日本電気鰍sK80ユーザーズ・マニアル |
; ;CHATTERING TIMER ; ORG $02DD 02DD 1624 D1:MVI D,24;=36 ck=7 127.75*36+(7+10)*0.25=4603.25microsec 02DF 1E23 D1_2:MVI E,23;=35 ck=7 7+14*35+14=511 0.25*511=127.75microsec 02E1 1D D1_3:DCR E; ck=4 02E2 C2E102 JNZ D1_3; ck=10 02E5 15 DCR D; ck=4 02E6 C2DF02 JNZ D1_2; ck=10 02E9 C9 RET; ck=10 02EA 1648 D2:MVI D,48;=72 127.75*72+(7+10+10)*0.25=9204.75microsec 02EC C3DF02 JMP D1_2 02EF 16D8 D3:MVI D,D8;=216 127.75*216+27*0.25=27600.75microsec 02F1 C3DF02 JMP D1_2 |
02DD 1624 D1:MVI D,24;WAIT 1/2 BIT TIME 4.5112MSEC (9) 02DF 1E0C MVI E,0C (9) 02E1 1D DCR E (6) 02E2 C2E102 JNZ $-1 (13) 02E5 15 DCR D (6) 02E6 C2DF02 JNZ $-7 (13) 02E9 C9 RET (13) 02EA 1648 D2:MVI D,48;WAIT 1 BIT TIME 9.0176MSEC (9) 02EC C3DF02 JMP D1+2 (13) 02EF 16D8 D3:MVI D,D8;WAIT 3 BIT TIME 27.0176MSEC (9) 02F1 C3DF02 JMP D1+2 (13) |