標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第275回]
●DAAテストプログラムの実行時間を計ってみました
[第272回]で実行したDAA命令のテストプログラム、5050回実行するというプログラムについてです。
そのときは、スタートしてから終了するまで、1秒ちょいだなぁ、という感じで、こりゃ時計では計測ムリ、と思ってそれで終わってしまいました。
でも、あとで、おおよそならば計測できる方法があることに気がつきました。
今回は、そのご報告です。
なに、簡単なことです。
I/Oポートからプログラムのスタート時と終了時にL、Hの信号を出力して、それをオシロで見ればよいだけのことでした。
「つくるCPU(MYCPU80)」のI/Oポートは、シリアル通信(PIC経由)やスピーカOUTなど用に、アドレス98を割り当てています。
簡単にテストをするには、スピーカOUTのラインを利用するのが一番手っ取り早い方法です。
写真のように、スピーカ出力用トランジスタのベース抵抗のところにオシロのプローブをあてがって、これで準備OKです。
ああ、そうでした。
プログラムもちょいと変更しなければいけませんでした。
2009/7/9 20:22 TEST12_2.TXT
END=4191
;;; MYCPU80 TEST12_2
;;; DAA
;;; 09/6/17 7/9
;
ORG $4100
;
STCK=$5000
ERCNTR=$5001
TCNTR=$5002
REENT=$1033;for ZBK
;
4100 AF XRA A;outport 98 bit4=0
4101 D398 OUT 98
4103 210050 LXI H,STCK
4106 F9 SPHL
4107 210000 LXI H,$0000
410A E5 PUSH H
410B F1 POP PSW;CLEAR FLAG REGISTER; POP PSW
;
410C 320150 STA ERCNTR
410F 220250 SHLD TCNTR
;
4112 0609 MVI B,09
4114 48 MOV C,B
4115 78 LOOP1:MOV A,B
4116 07 RLC
4117 07 RLC
4118 07 RLC
4119 07 RLC
411A B1 ORA C
411B 67 MOV H,A
411C 50 MOV D,B
411D 59 MOV E,C
411E 7A LOOP2:MOV A,D
411F 07 RLC
4120 07 RLC
4121 07 RLC
4122 07 RLC
4123 B3 ORA E
4124 6F MOV L,A
4125 84 ADD H
4126 27 DAA
;compare
4127 E5 PUSH H SAVE "A"
4128 F5 PUSH PSW;SAVE DAA DATA & FLAG
4129 79 MOV A,C
412A 83 ADD E
412B FE0A CPI 0A
412D DA3241 JC JP1
4130 D60A SUI 0A
4132 F5 JP1:PUSH PSW;SAVE LOW 4BITS
4133 3F CMC
4134 78 MOV A,B
4135 8A ADC D
4136 FE0A CPI 0A
4138 DA3D41 JC JP2
413B D60A SUI 0A
413D 3F JP2:CMC
413E F5 PUSH PSW
413F E1 POP H;SAVE CHECK FLAG to L
4140 07 RLC
4141 07 RLC
4142 07 RLC
4143 07 RLC
4144 67 MOV H,A;HIGH 4BITS
4145 F1 POP PSW;LOW4BITS
4146 B4 ORA H
4147 67 MOV H,A;CHECK DATA to H
4148 F1 POP PSW
4149 F5 PUSH PSW;SAVE FLAG
414A BC CMP H
414B C28B41 JNZ ERR
414E F1 POP PSW
414F F5 PUSH PSW;SAVE DATA
4150 7D MOV A,L
4151 DA5C41 JC CFON
;CFOFF
4154 E601 ANI 01
4156 C28B41 JNZ ERR
4159 C36141 JMP NEXT
415C E601 CFON:ANI 01
415E CA8B41 JZ ERR
4161 F1 NEXT:POP PSW
4162 E1 POP H
4163 E5 NEXT2:PUSH H
4164 210250 LXI H,TCNTR
4167 34 INR M
4168 C26D41 JNZ NEXT3
416B 23 INX H
416C 34 INR M
416D E1 NEXT3:POP H
416E 1D DCR E
416F F21E41 JP LOOP2
4172 1E09 MVI E,09
4174 15 DCR D
4175 F21E41 JP LOOP2
4178 0D DCR C
4179 F21541 JP LOOP1
417C 0E09 MVI C,09
417E 05 DCR B
417F F21541 JP LOOP1
4182 210000 LXI H,$0000
4185 E5 PUSH H
4186 3E10 MVI A,10;outport bit4=H
4188 D398 OUT 98
418A 76 HLT
;
418B 210150 ERR:LXI H,ERCNTR
418E 34 INR M
418F C36341 JMP NEXT2
;CFON =415C ERCNTR =5001 ERR =418B
JP1 =4132 JP2 =413D LOOP1 =4115
LOOP2 =411E NEXT =4161 NEXT2 =4163
NEXT3 =416D REENT =1033 STCK =5000
TCNTR =5002
追加したのはプログラムの先頭、4100〜4102に、XRA AとOUT 98を、そしてプログラムの終り4186〜4189にMVI A,10とOUT 98です。
スピーカ出力ライン(アドレス98のビット4)から、プログラムスタート時にLを出力し、プログラム終了時にHを出力します。
今回のプログラム変更のように、命令を追加すると、追加したところから後ろの命令のアドレスが全部変わってしまいます。
もろに影響を受けるのが、その変わってしまったアドレスを指定しているJMP命令やCALL命令です。
TK80のようにアセンブラを使わずに、マシン語コードだけでプログラミングをする、「ハンドアセンブラ」では、こういう変更がなかなかに大変でした。
こういうときに、アセンブラが使えると、ソースプログラムをちょいちょいと直して、再アセンブルするだけですから、それはもう、天と地ほどの開きがあります。
まさに、アセンブラ様々です。
プログラムを実行した結果です。
約1.16秒というあたりでしょうか。
うまく計測できたようです。
参考までに当社のBASIC制御ボードZB28Kでも同じことをやってみました。
やあ、これはまた、速いですねぇ。
当社のZBKボードはZ80互換CPUのKL5C8012を搭載しています。
20MHzのクリスタルを使って、CPUクロック10MHzで実行しますから、そりゃ速いです。
KL5C8012は、さらに特殊な制御方式(パイプライン)を使っていて、ZBKボードの場合、メモリアクセスのために各命令に1ウェイトを追加していますが、それでもZ80の5〜6割アップのスピードで実行します。
つまりCPUクロックは10MHzですが、Z80のクロック換算では15〜16MHzのパフォーマンスということになります。
一方、われらが「つくるCPU(MYCPU80)」はCPUクロック2MHzですから、ZBKボードの実行時間のおおよそ8倍の時間を要する計算になります。
ZBKボードでの実行時間は0.14秒程度のように見えますから、その数字から計算すると、クロック2MHzの8080ならば、実行時間は0.14×8=1.12秒ということになります。
おお、おおむねその程度のパフォーマンスは得られているようです。
今回は、めでたし、めでたし、です。
2009.7.11upload
前へ
次へ
ホームページトップへ戻る