標準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

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