あなた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桁電卓をご覧ください。