あなたCPUなんか創ってどうするのかしら?! 第4章 第3節
~あんたCPUなんか創ってどうするのよ?! Vol.4~
2018/10/8
技術書典5 け39
第4章 第3節 0→99カウントアップ
CNT99: | ; 0→99 | |||||
020 | 60 | MOV | A | 0 | ||
021 | A2 | MOV | [2] | A | ; 10の位 | |
CNT991: | ||||||
022 | 42 | MOV | A | [2] | ; 表示 | |
023 | AE | MOV | [0xE] | A | ||
024 | 71 | MOV | B | 1 | ||
025 | BF | MOV | [0xF] | B | ||
026 | 60 | MOV | A | 0 | ||
027 | A1 | MOV | [1] | A | ; 1の位 | |
CNT992: | ||||||
028 | 41 | MOV | A | [1] | ; 表示 | |
029 | AE | MOV | [0xE] | A | ||
02A | 70 | MOV | B | 0 | ||
02B | BF | MOV | [0xF] | B | ||
02C | 21 | ADD | A | 1 | ; カウント | |
02D | A1 | MOV | [1] | A | ||
02E | 26 | ADD | A | 6 | ; 9以下か? | |
02F | E8 | JNC | CNT992 | |||
030 | 02 | |||||
031 | 42 | MOV | A | [2] | ; 繰り上げ | |
032 | 21 | ADD | A | 1 | ||
033 | A2 | MOV | [2] | A | ||
034 | 26 | ADD | A | 6 | ; 9以下か? | |
035 | E2 | JNC | CNT991 | |||
036 | 02 | |||||
037 | FB | JMP | START | |||
038 | 00 | ; 終了 |
全速力で0から99までのカウントアップを行います。TD4EX4の速度確認用のプログラムです。
テンキーの0を押した状態で電源ONもしくはリセットで起動します。
このような速度を求められるプログラムの場合、一般的なCPUではRAMを使用せず、CPU内のレジスタだけを使って処理を行います。RAMよりもレジスタの方が高速だからです。
TD4EX4の場合も同様にアキュムレーターだけを使ってカウントアップをしたいところですが、ちょっとした問題があるためRAMを使わざるを得ません。
その問題とは、比較命令が無い事です。
このカウントアップのプログラムは10進数でカウントします。そのためカウントアップのたびに1の位と10の位がそれぞれ10以上になったかどうか確認する必要があります。
TD4EX4には比較命令が無いため、カウントアップ後のレジスタから10を減算することで、10以上になったかどうか確認するしかありません。すると当然ですが、アキュムレーターの内容は破壊される事になります。そのためカウントアップの結果はいちいちRAMに格納せざるを得ず、レジスタだけで高速にカウントアップすることができません。
と言う訳で、せっかくアキュムレーターが2個あるにもかかわらず、0→99のカウントアップは非効率で遅いプログラムとなっています。