復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第318回]
●82C55A−2耐久テストプログラムの実行時間を計算する
前回テストをいたしました82C55A−2耐久テストプログラムの実行時間を計算してみました。
実は20MHzについては水晶発振ではなくてセラミック発振子を使っています([第267回]参照)。
そういうこともありまして、どの程度正確な発振を行なっているのかということも、この際確かめておきたいと思ったからでもありました。
実際にその計算を行なってみて、いくら水晶発振ではないからといっても、余りに計算結果が違いすぎるということから、Z8S180のI/O命令のクロック数がHD64180のそれとは異なっているということにたどりついたのでした([第316回]参照)。
実行時間の計算は各命令のクロック数をもとにして、それに繰り返し回数を乗じて算出を行ないました。
プログラムのエントリ部分と最後の部分、それとBASICプログラムは、約5分かかる1回の処理について1回しか実行されませんから、これは十分無視できると考えて計算から除外することにしました。
計算の基礎(クロック数)は前回お見せしましたプログラムリストに直接記入いたしました。
2013/2/11 8:52 e80iorwt.txt END=8070 ;;; E-80 82c55 read/write test ;13/2/11 ; ORG $8000 ; PA=$F440 PB=$F442 ; 8000 AF XOR A 8001 013200 LD BC,$0032 8004 ED79 OUT (C),A 8006 0E36 LD C,36 8008 ED79 OUT (C),A ; 800A 3E80 START:LD A,80 800C D3E3 OUT (E3),A 800E D3E7 OUT (E7),A 8010 D3EB OUT (EB),A 8012 D3EF OUT (EF),A 8014 50 LD D,B 8015 58 LD E,B 8016 60 LD H,B 8017 68 LD L,B 8018 7B LOOP:LD A,E 4 ------- 8019 D3E0 OUT (E0),A 11 | 801B D3E1 OUT (E1),A | 801D D3E2 OUT (E2),A | 801F D3E4 OUT (E4),A | 4+(11*9)=103 8021 D3E5 OUT (E5),A | 8023 D3E6 OUT (E6),A | 8025 D3E8 OUT (E8),A | 8027 D3E9 OUT (E9),A | 8029 D3EA OUT (EA),A ----------- ;check 802B DBE0 IN A,(E0) 10 -- 802D BB CP E 4 | 20 --- 802E 2039 JR NZ,INERR 6 -- | 8030 DBE1 IN A,(E1) | 8032 BB CP E | 8033 2034 JR NZ,INERR | 8035 DBE2 IN A,(E2) | 8037 BB CP E | 8038 202F JR NZ,INERR | 803A DBE4 IN A,(E4) | 803C BB CP E | 803D 202A JR NZ,INERR | 803F DBE5 IN A,(E5) | 8041 BB CP E | 20*9=180 8042 2025 JR NZ,INERR | 8044 DBE6 IN A,(E6) | 8046 BB CP E | 8047 2020 JR NZ,INERR | 8049 DBE8 IN A,(E8) | 804B BB CP E | 804C 201B JR NZ,INERR | 804E DBE9 IN A,(E9) | 8050 BB CP E | 8051 2016 JR NZ,INERR | 8053 DBEA IN A,(EA) | 8055 BB CP E | 8056 2011 JR NZ,INERR -------------- ; 8058 7B LD A,E 4 ------- 8059 D3EC OUT (EC),A 11 | 805B 7A LD A,D 4 | 805C D3ED OUT (ED),A 11 | 805E 7D LD A,L 4 | 65 805F D3EE OUT (EE),A 11 | 8061 13 INC DE 4 | 8062 7B LD A,E 4 | 8063 B2 OR D 4 | 8064 20B2 JR NZ,LOOP 8 or 6 -- (103+180+65)*65536=22806528 8066 2C INC L 4 8067 20AF JR NZ,LOOP 8 (22806528-2+12)*256=5838473728 ; 8069 ED5340F4 INERR: LD (PA),DE 806D 2242F4 LD (PB),HL 8070 C9 RET ; ;END INERR =8069 LOOP =8018 PA =F440 PB =F442 START =800A |
プログラムリスト中に記入しましたクロック数の合計は5838473728になりました。
CPUクロックは20MHzですから、1クロックは50ns(0.05μs)です。
そこで上記の値に0.05を掛けると、
5838473728×0.05=291923686.4(μs)
になります。
これを秒の単位に直してmsの位まで求めますと
291.924秒になります。
4分51秒9です。
念のために、前回の実行結果から1回の実行時間の平均値を求めてみることにします。
実行を開始したのは16:40:07です。
終了したのは翌日の08:45:23です。
カウンタの値は第1回目の終了時が0で最後が197ですから、この間に198回実行したことになります。
この間の時間を秒で求めてみます。
実行時間は16:05:16ですから16×3600+5×60+16=57916秒
これを198で割ると
57916/198=292.505(秒)です。
理論値との誤差は
(292.505−291.924)/291.924=0.581/291.924=0.00199
になります。
誤差0.2%です。
上のほうにも書きましたように、E−80(仮称)ミニコンでのCPUクロック20MHzは当初設計にはなかったもので、水晶発振ではなくて、後から追加した40MHzセラミック振動子回路からクロックを供給しています([第267回]参照)。
しかし、こうしてみますとセラミック振動子もなかなかの精度だと感心してしまいますね。
その精度が確認できたこともまずまずの成果でありましたし、当初の設計として考慮していなかった20MHzという周波数で、一昼夜に及ぶ連続運転でも全く誤動作しなかったということは、回路の安定性を見る上で非常に大きな成果であると思います。
なにしろぐっちゃぐちゃのスパゲッティ回路([第294回])でこの成績なのですものね。
ちょいと自慢したくなってしまいますです。
今回のテストの主目的でありますところの、82C55A−2に対する20MHzクロックでのREAD、WRITEも予想外の好成績、といいますか100%のジャストミートで、まことに喜ばしい限りです。
めでたしめでたし、で終るはずだったのでありますが。
毎度のことでありまして、私の場合、どーいうわけか、なかなか終ってくれないのでありますね。これが。
もう半年以上も前のことになってしまいますが。
E−80(仮称)ミニコン開発プロジェクトを進めていきます過程で、CPUにZilog社のZ8S180を採用することになりました。
Z8S180は日立のHD64180のセカンドソースであるらしい、ということでさっそくY様からはHD64180の解説書をお送りいただきました。
Z8S180については検討の過程で、Zilogのサイトから英文MANUALをダウンロードしていたのでありますが。
そりゃあ、日本語の解説書のほうがなんたって有難い。
で。
ダウンロードした英文MANUALは「積ん読」状態になっておりました。
ところが今回の一件で、日立のHD64180のセカンドソースはZ80180で、現在手元で試験中のZ8S180はZilogが独自に改良を加えたバージョンアップ版であるらしいことがわかりました。
現行最終版にはオリジナルのHD64180にはなかった機能が複数組み込まれていることがわかりました。
なおそうではないタイプのZ8S180もありますから注意が必要です(SL1960モデル。後ほど説明するつもりです)。
それがわかりました以上、あらためてZ8S180の英文MANUALを読まないわけにはいきませんでしょう。
で。
とりあえずざっと目を通しはじめましたところ。
しょっぱなから、なんだこりゃあ、という記述に目が留りました。
●clock−doubler
Z8S180にはCLOCK−DOUBLERなる機能がある、と書いてあります。
[出典]Zilog社 Z8S180 PRODUCT SPECIFICATION(赤四角は筆者)
この機能によって、内部クロックを外部入力クロックの倍にすることができる、と書いてあります。
おお!
こんな機能はHD64180にはありません。
これはもっと早く気付くべきでありました。
で。
どうやるかといいますと。
内蔵I/Oレジスタの1EHのビット7によってそのように設定できるようです。
ビット7は X2 CLOCK MULTIPLIER である、と書いてあります。
このビットはデフォルトでは0になっていて、その場合にはCPUクロック(内部クロック)は通常のスピード(外部周波数の1/2)なのですが、このビットを1にしますと、内部クロックが外部クロックの倍になるのだそうです(ここのところの理解が間違っておりました。それじゃあ2倍ではなくて4倍です)。
うむむ?
倍?
つうことは外部クロックが10MHzのときに、内部クロックが20MHzになるということか???
実は、実際にそのように設定してみますと、倍にはなりません。
倍にするには他にも設定が必要であることが、後になってからわかりました。
うう。
そーいうことは一緒にまとめて書いておいてほしいなあ。
どうもおかしいなあ、という記述もありまして、
This feature only operates efectively with frequencies of 10−16MHz(20−32MHz internal).
というあたりなど、それじゃあその範囲外はどうなるの?
という疑問も出てまいります。
本日は時間がなくなってしまいました。
あれこれにつきまして、次回に続きます。
ワンボードマイコンでCP/Mを![第318回]
2013.2.14upload
前へ
次へ
ホームページトップへ戻る