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

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第312回]


●Z8S18020のウェイトサイクル

前回までのお話の流れからいたしますと、今回は当然IPL(Initial Program Loader)の説明に入らなければならないところなのでありますが。
やっぱり脱線してしまいます。

少し前になりますが、ND80ZVなどをご購入いただいた古くからのお客様からメールをいただきました。
[第306回]をお読みになって、
「CPUクロック20MHzのZ80でよく82C55が動いていますね。82C55は何を使っているのかわかりませんが、よく誤動作しないものだと感心しています」
というお便りでした。

え…と。
せっかく感心していただきましたのですが、それはちょいと誤解でありまして、ここしばらく書いておりますテスト作業はクロック20MHzではなくて10MHzでやっております。
おまけにしっかりとウェイトがかかってしまっておりますのです。

メールをいただいたので、そのことについて急遽書くことにしました、というわけではありません。
実は[第306回]のあたりを書きましたときに、ウェイトサイクルについても書かなければ、と思いつつ、いつものことですっかり忘れてしまっておりました。
メールをいただいてそのことを思い出しました。
で。
早いところ書いておきませんと、また忘れてしまいますので、今回は予定を変更して、ウェイトサイクルについて書くことにした次第です。

[第305回]でロードしましたMUSICプログラムには当初しっかりと悩まされてしまいました。
そのあたりのことにつきましては[第263回]のあたりに書いております。
そこでも書いておりますが、Z8S180はリセット後はメモリREAD、メモリWRITEとI/O READ、I/O WRITEの各マシンサイクル毎にそれぞれ3クロックのウェイトが挿入されます。
多くの命令では1マシンサイクルは3クロックですから、そこにさらに3クロックが追加されるということになりますと、CPUクロックが10MHzだったとしても、実際にはせいぜい半分の5MHz程度のパフォーマンスしかないということになります。

そういうことですから、誤動作せずに動いても何の不思議でもありません。
しかし、実際にそれがどの程度のパフォーマンスであるのか、ちょっと確認してみたいという気になりました。
せっかくMUSICプログラムがきっかけになったことでもありますから、このプログラムを利用してみることにいたしました。
MUSICプログラムのリストは[第263回]でお見せしました。
その中に1msecのタイマーサブルーチンがあります。
T1MSです。
命令の実行クロック数をもとにして、実行時間を計算してちょうど1msecになるようにしています。

そこで、このサブルーチンをCALLするごとに、82C55の出力をH、L交互に変化させるようにして、その出力をオシロで見てみました。
比較のために、同じ動作をするプログラムをND80ZV(ND80Z3.5)と、E80(仮称)ミニコンの両方で実行して、その結果を写真に撮りました。

まずはND80ZV(ND80Z3.5)です。
テストに使ったプログラムはこちらです。
2013/2/6  15:20  ndtime.txt
END=801E
              ;;; music 09/10/9 10/10 10/12 10/15 
              ;;;
              ;;;MUSIC from MYCPU80 MUSIC
              ;10/6/4 6/5 6/15 for ND80Z3 CLK=6MHz
              ;7/20 9/24
              ;13/2/6 time test
              ;
              	ORG $8000
              ;
8000 3EEF     LOOP:LD A,EF         ;sp out=H,DMAoff
8002 D398     	OUT (98),A
8004 CD1180   	CALL T1MS
8007 3ECF     	LD A,CF		;sp out=L,DMAoff
8009 D398     	OUT (98),A
800B CD1180   	CALL T1MS
800E C30080   	JP LOOP
              ;
8011 F5       T1MS:PUSH AF		;CK=11....11+7+10+10+10=48/6(8microsec)
8012 3E5F     	LD A,5F		;=99  CK=7
8014 E5       T1MS2:PUSH HL;DUMMY CLK=11-----------------
8015 E5       	PUSH HL;DUMMY CLK=11               |
8016 E1       	POP HL;DUMMY CLK=10                |CK=60/6(10microsec)
8017 E1       	POP HL;DUMMY CLK=10                |
8018 00       	NOP ;CLK=4                         |
8019 3D       	DEC A		;CK=4        |10x99=990microsec
801A C21480   	JP NZ,T1MS2	;CK=10---
801D F1       	POP AF		;CK=10
801E C9       	RET		;CK=10 + CALL CK=10
              ;
              ;END
LOOP         =8000  T1MS         =8011  T1MS2        =8014  

こちらが上のプログラムを実行したときの82C55の出力をオシロで観測したときの写真です。


プログラムの通り、T1MSの実行時間はちょうど1msecです。
ND80ZV(ND80Z3.5)のCPUはZ80(6MHz)で、CPUクロックもちょうど6MHzです。

下がE−80(仮称)ミニコンのテストプログラムです。
82C55のアドレスや出力ポートは違いますが、T1MSサブルーチンはND80ZV(ND80Z3.5)でのテストプログラムと全く同じです。

2013/2/6  15:20  e80time.txt
END=8025
              ;;; music 09/10/9 10/10 10/12 10/15 
              ;;;
              ;;;MUSIC from MYCPU80 MUSIC
              ;10/6/4 6/5 6/15 for ND80Z3 CLK=6MHz
              ;7/20 9/24
              ;12/11/27 for E-80 clock?
              ;13/1/27
              ;2/6 time test
              ;
              	ORG $8000
              ;
8000 310000   START:LD SP,$0000
8003 3E88     	LD A,88;A=out,B=out,CH=in,CL=out
8005 D3FB     	OUT (FB),A
8007 3E03     LOOP:LD A,03         ;sp out=H (pc1=H)
8009 D3FB     	OUT (FB),A
800B CD1880   	CALL T1MS
800E 3E02     	LD A,02		;sp out=L (pc1=L)
8010 D3FB     	OUT (FB),A
8012 CD1880   	CALL T1MS
8015 C30780   	JP LOOP
              ;
8018 F5       T1MS:PUSH AF		;CK=11....11+7+10+10+10=48/6(8microsec)
8019 3E5F     	LD A,5F		;=99  CK=7
801B E5       T1MS2:PUSH HL;DUMMY CLK=11-----------------
801C E5       	PUSH HL;DUMMY CLK=11               |
801D E1       	POP HL;DUMMY CLK=10                |CK=60/6(10microsec)
801E E1       	POP HL;DUMMY CLK=10                |
801F 00       	NOP ;CLK=4                         |
8020 3D       	DEC A		;CK=4        |10x99=990microsec
8021 C21B80   	JP NZ,T1MS2	;CK=10---
8024 F1       	POP AF		;CK=10
8025 C9       	RET		;CK=10 + CALL CK=10
              ;END
LOOP         =8007  START        =8000  T1MS         =8018  
T1MS2        =801B   


こちらがE−80(仮称)ミニコンでの実行結果です。
こちらのCPUクロックは10MHzですが、各命令のマシンサイクル毎に3クロックのウェイトが挿入されています。


クロック6MHzのときに1msecになるはずのところが、1.5msecかかってしまっています。
逆算するとこのときの実質クロックは4.5MHzということになります。
これはさすがに遅いです。

こういうことがわかってしまいますと、いくらなんでもこのままにして、はいおしまい、というわけにはいきませんでしょう。

果たしてノンウェイトにしたら、一体どのくらいのパフォーマンスになるのでありましょうか?
しかしそもそも、ノンウェイトでも誤動作せずに動いてくれるのでありましょうか?
さらにはクロックを20MHzにしてみたら、それでも動いてくれるものなのでありましょうか?

今回は時間がありません。
次回に続きます。

ワンボードマイコンでCP/Mを![第312回]
2013.2.8upload

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