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

復活!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

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