あなたCPUなんか創ってどうするのかしら?! 第4章 第3節

~あんたCPUなんか創ってどうするのよ?! Vol.4~

2018/10/8
技術書典5 け39

第4章 第3節 0→99カウントアップ

 CNT99: ; 0→99
02060 MOVA0
021A2 MOV[2]A; 10の位
 CNT991: 
02242 MOVA[2]; 表示
023AE MOV[0xE]A
02471 MOVB1
025BF MOV[0xF]B
02660 MOVA0
027A1 MOV[1]A; 1の位
 CNT992: 
02841 MOVA[1]; 表示
029AE MOV[0xE]A
02A70 MOVB0
02BBF MOV[0xF]B
02C21 ADDA1; カウント
02DA1 MOV[1]A
02E26 ADDA6; 9以下か?
02FE8 JNCCNT992
03002
03142 MOVA[2]; 繰り上げ
03221 ADDA1
033A2 MOV[2]A
03426 ADDA6; 9以下か?
035E2 JNCCNT991
03602
037FB JMPSTART
03800 ; 終了

全速力で0から99までのカウントアップを行います。TD4EX4の速度確認用のプログラムです。

テンキーの0を押した状態で電源ONもしくはリセットで起動します。

このような速度を求められるプログラムの場合、一般的なCPUではRAMを使用せず、CPU内のレジスタだけを使って処理を行います。RAMよりもレジスタの方が高速だからです。

TD4EX4の場合も同様にアキュムレーターだけを使ってカウントアップをしたいところですが、ちょっとした問題があるためRAMを使わざるを得ません。

その問題とは、比較命令が無い事です。

このカウントアップのプログラムは10進数でカウントします。そのためカウントアップのたびに1の位と10の位がそれぞれ10以上になったかどうか確認する必要があります。

TD4EX4には比較命令が無いため、カウントアップ後のレジスタから10を減算することで、10以上になったかどうか確認するしかありません。すると当然ですが、アキュムレーターの内容は破壊される事になります。そのためカウントアップの結果はいちいちRAMに格納せざるを得ず、レジスタだけで高速にカウントアップすることができません。

と言う訳で、せっかくアキュムレーターが2個あるにもかかわらず、0→99のカウントアップは非効率で遅いプログラムとなっています。