あなたCPUなんか創ってどうするのかしら?! 第4章 第7節
~あんたCPUなんか創ってどうするのよ?! Vol.4~
2018/10/8
技術書典5 け39
第4章 第7節 1桁電卓
| CALC1E: | ; +-×÷ | |||||
| 140: | 43 | MOV | A | [3] | ; 演算キー | |
| 141: | 2C | SUB | A | 4 | ||
| 142: | ED | JNC | CALC1F | ; 入力済 | ||
| 143: | 1A | |||||
| 144: | 44 | MOV | A | [4] | ; 演算未入力 | |
| 145: | A5 | MOV | [5] | A | ; XをYに移動 | |
| 146: | 60 | MOV | A | 0 | ||
| 147: | A4 | MOV | [4] | A | ||
| 148: | 41 | MOV | A | [1] | ; 演算確定 | |
| 149: | 26 | SUB | A | 0xA | ||
| 14A: | A3 | MOV | [3] | A | ||
| 14B: | F1 | JMP | CALC1B | ; X入力に戻る | ||
| 14C: | 19 | |||||
| CALC1O: | ; =キー処理 | |||||
| 150: | 43 | MOV | A | [3] | ; 演算キー | |
| 151: | 2C | SUB | A | 4 | ||
| 152: | E1 | JNC | CALC1P | ; 入力済 | ||
| 153: | 1B | |||||
| 154: | F1 | JMP | CALC1B | ; X入力に戻る | ||
| 155: | 19 | |||||
| CALC1N: | ; =直後の演算 | |||||
| 160: | 41 | MOV | A | [1] | ; 演算を確定 | |
| 161: | 26 | SUB | A | 0xA | ||
| 162: | A3 | MOV | [3] | A | ||
| 163: | F1 | JMP | CALC1B | ; X入力に戻る | ||
| 164: | 19 | |||||
| CALC1M: | ||||||
| 170: | 68 | MOV | A | 8 | ; マイナス | |
| 171: | AE | MOV | [0xE] | A | ||
| 172: | 72 | MOV | B | 2 | ||
| 173: | BF | MOV | [0xF] | B | ||
| 174: | 60 | MOV | A | 0 | ; 10進補正 | |
| 175: | 85 | SUB | A | [5] | ||
| 176: | AE | MOV | [0xE] | A | ||
| 177: | 70 | MOV | B | 0 | ||
| 178: | BF | MOV | [0xF] | B | ||
| 179: | F5 | JMP | CALC1L | |||
| 17A: | 1F | |||||
| CALC1: | ; 1桁電卓 | |||||
| 180: | 6F | MOV | A | 0xF | ; AC | |
| 181: | A1 | MOV | [1] | A | ; 最後のキー | |
| 182: | A2 | MOV | [2] | A | ; 直前のキー | |
| 183: | A3 | MOV | [3] | A | ; +-×÷ | |
| 184: | AE | MOV | [0xE] | A | ; 2桁目消灯 | |
| 185: | 71 | MOV | B | 1 | ||
| 186: | BF | MOV | [0xF] | B | ||
| 187: | 60 | MOV | A | 0 | ||
| 188: | A4 | MOV | [4] | A | ; 数値Xクリア | |
| 189: | A5 | MOV | [5] | A | ; 数値Yクリア | |
| 18A: | AE | MOV | [0xE] | A | ; 3桁目消灯 | |
| 18B: | 72 | MOV | B | 2 | ||
| 18C: | BF | MOV | [0xF] | B | ||
| CALC1A: | ||||||
| 18D: | 44 | MOV | A | [4] | ; X表示 | |
| 18E: | AE | MOV | [0xE] | A | ||
| 18F: | 70 | MOV | B | 0 | ; 1桁目 | |
| 190: | BF | MOV | [0xF] | B | ||
| CALC1B: | ||||||
| 191: | 41 | MOV | A | [1] | ; 最後のキー | |
| 192: | A2 | MOV | [2] | A | ||
| 193: | 62 | MOV | A | 2 | ; CALC1C | |
| 194: | A0 | MOV | [0] | A | ||
| 195: | F0 | JMP | KBDIN | ; キー入力 | ||
| 196: | 08 | |||||
| CALC1C: | ||||||
| 197: | A1 | MOV | [1] | A | ; 最後のキー | |
| 198: | 26 | SUB | A | 0xA | ; 数値X処理 | |
| 199: | E5 | JNC | CALC1D | |||
| 19A: | 1D | |||||
| 19B: | 2C | SUB | A | 4 | ; +-×÷か? | |
| 19C: | E0 | JNC | CALC1E | |||
| 19D: | 14 | |||||
| 19E: | 2F | SUB | A | 1 | ; =か? | |
| 19F: | E0 | JNC | CALC1O | |||
| 1A0: | 15 | |||||
| 1A1: | F0 | JMP | CALC1 | ; AC処理 | ||
| 1A2: | 18 | |||||
| CALC1F: | ; 演算入力済 | |||||
| 1AD: | 6D | MOV | A | 0xD | ; 直前のキー | |
| 1AE: | 82 | SUB | A | [2] | ||
| 1AF: | E0 | JNC | CALC1N | ; =処理へ | ||
| 1B0: | 16 | |||||
| CALC1P: | ; 演算実行 | |||||
| 1B1: | 43 | MOV | A | [3] | ||
| 1B2: | 2F | SUB | A | 1 | ||
| 1B3: | E1 | JNC | CALC1G | ; 加算 | ||
| 1B4: | 1E | |||||
| 1B5: | 2F | SUB | A | 1 | ||
| 1B6: | E3 | JNC | CALC1H | ; 減算 | ||
| 1B7: | 1C | |||||
| 1B8: | 2F | SUB | A | 1 | ||
| 1B9: | E1 | JNC | CALC1G | ; 乗算 | ||
| 1BA: | 1E | |||||
| 1BB: | 2F | SUB | A | 1 | ||
| 1BC: | E3 | JNC | CALC1H | ; 除算 | ||
| 1BD: | 1C | |||||
| 1BE: | F0 | JMP | CALC1 | ;エラー | ||
| 1BF: | 18 | |||||
| CALC1H: | ; 減算 | |||||
| 1C3: | 45 | MOV | A | [5] | ; Y=Y-X | |
| 1C4: | 84 | SUB | A | [4] | ||
| 1C5: | A5 | MOV | [5] | A | ||
| 1C6: | E0 | JNC | CALC1M | ; マイナス | ||
| 1C7: | 17 | |||||
| CALC1I: | ||||||
| 1C8: | 45 | MOV | A | [5] | ||
| 1C9: | AE | MOV | [0xE] | A | ; 結果表示 | |
| 1CA: | 70 | MOV | B | 0 | ||
| 1CB: | BF | MOV | [0xF] | B | ||
| 1CC: | 6D | MOV | A | 0xD | ; 最後のキー | |
| 1CD: | 81 | SUB | A | [1] | ||
| 1CE: | E1 | JNC | CALC1B | ; 入力に戻る | ||
| 1CF: | 19 | |||||
| 1D0: | 41 | MOV | A | [1] | ; +-×÷ | |
| 1D1: | 26 | SUB | A | 0xA | ||
| 1D2: | A3 | MOV | [3] | A | ||
| 1D3: | F1 | JMP | CALC1B | ; X入力に戻る | ||
| 1D4: | 19 | |||||
| CALC1D: | ; 数値X処理 | |||||
| 1D5: | 41 | MOV | A | [1] | ; 数値X格納 | |
| 1D6: | A4 | MOV | [4] | A | ||
| 1D7: | 42 | MOV | A | [2] | ; =直後か? | |
| 1D8: | 22 | SUB | A | 0xE | ||
| 1D9: | ED | JNC | CALC1A | ; NO | ||
| 1DA: | 18 | |||||
| 1DB: | 6F | MOV | A | 0xF | ; =直後 | |
| 1DC: | A3 | MOV | [3] | A | ; +-×÷ | |
| 1DD: | 60 | MOV | A | 0 | ||
| 1DE: | A5 | MOV | [5] | A | ; 数値Y | |
| 1DF: | FD | JMP | CALC1A | |||
| 1E0: | 18 | |||||
| CALC1G: | ; 加算 | |||||
| 1E1: | 70 | MOV | B | 0 | ; 繰り上げ | |
| 1E2: | 45 | MOV | A | [5] | ; Y=Y+X | |
| 1E3: | 04 | ADD | A | [4] | ||
| 1E4: | E7 | JNC | CALC1J | |||
| 1E5: | 1E | |||||
| 1E6: | 71 | MOV | B | 1 | ||
| CALC1J: | ||||||
| 1E7: | A5 | MOV | [5] | A | ||
| 1E8: | 26 | ADD | A | 6 | ; 10進補正 | |
| 1E9: | EC | JNC | CALC1K | |||
| 1EA: | 1E | |||||
| 1EB: | 71 | MOV | B | 1 | ||
| CALC1K: | ||||||
| 1EC: | 3F | SUB | B | 1 | ||
| 1ED: | E8 | JNC | CAKC1I | ; 補正不要 | ||
| 1EE: | 1C | |||||
| 1EF: | AE | MOV | [0xE] | A | ; 補正結果 | |
| 1F0: | 60 | MOV | A | 0 | ||
| 1F1: | AF | MOV | [0xF] | A | ||
| 1F2: | 61 | MOV | A | 1 | ; 2桁目 | |
| 1F3: | AE | MOV | [0xE] | A | ||
| 1F4: | AF | MOV | [0xF] | A | ||
| CALC1L: | ||||||
| 1F5: | 6B | MOV | A | 0xB | ; AC待ち | |
| 1F6: | AE | MOV | [0xE] | A | ||
| 1F7: | 4E | MOV | A | [0xE] | ; キー入力 | |
| 1F8: | 22 | ADD | A | 0x2 | ||
| 1F9: | 2F | ADD | A | 0xF | ||
| 1FA: | E1 | JNC | CALC1B | ; AC処理へ | ||
| 1FB: | 19 | |||||
| 1FC: | F5 | JMP | CAKC1L | |||
| 1FD: | 1F | ; 終了 |
TD4EX4の機能チェック用に作成したプログラムです。前述のキャリーフラグの問題もこれで発見しました。
CPUの機能を確認しながらプログラムを作成していったので、プログラムそのものは0x140番地から始まっているにもかかわらず、エントリーポイントは0x180になっているなど、かなりのスパゲティ・プログラムになってしまいました。
プログラミングの参考にはなりませんので、純粋に電卓のプログラムの知りたい方は次節に掲載している2桁電卓をご覧ください。