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

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

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

第4章 第7節 1桁電卓

  CALC1E:   ; +-×÷
140:43MOVA[3]; 演算キー
141:2CSUBA4
142:EDJNCCALC1F ; 入力済
143:1A
144:44MOVA[4]; 演算未入力
145:A5MOV[5]A; XをYに移動
146:60MOVA0
147:A4MOV[4]A
148:41MOVA[1]; 演算確定
149:26SUBA0xA
14A:A3MOV[3]A
14B:F1JMPCALC1B ; X入力に戻る
14C:19
  CALC1O:   ; =キー処理
150:43MOVA[3]; 演算キー
151:2CSUBA4
152:E1JNCCALC1P ; 入力済
153:1B
154:F1JMPCALC1B ; X入力に戻る
155:19
  CALC1N:   ; =直後の演算
160:41MOVA[1]; 演算を確定
161:26SUBA0xA
162:A3MOV[3]A
163:F1JMPCALC1B ; X入力に戻る
164:19
  CALC1M:
170:68MOVA8; マイナス
171:AEMOV[0xE]A
172:72MOVB2
173:BFMOV[0xF]B
174:60MOVA0; 10進補正
175:85SUBA[5]
176:AEMOV[0xE]A
177:70MOVB0
178:BFMOV[0xF]B
179:F5JMPCALC1L
17A:1F
  CALC1:   ; 1桁電卓
180:6FMOVA0xF; AC
181:A1MOV[1]A; 最後のキー
182:A2MOV[2]A; 直前のキー
183:A3MOV[3]A; +-×÷
184:AEMOV[0xE]A; 2桁目消灯
185:71MOVB1
186:BFMOV[0xF]B
187:60MOVA0
188:A4MOV[4]A; 数値Xクリア
189:A5MOV[5]A; 数値Yクリア
18A:AEMOV[0xE]A; 3桁目消灯
18B:72MOVB2
18C:BFMOV[0xF]B
  CALC1A:
18D:44MOVA[4]; X表示
18E:AEMOV[0xE]A
18F:70MOVB0; 1桁目
190:BFMOV[0xF]B
  CALC1B:
191:41MOVA[1]; 最後のキー
192:A2MOV[2]A
193:62MOVA2; CALC1C
194:A0MOV[0]A
195:F0JMPKBDIN ; キー入力
196:08
  CALC1C:
197:A1MOV[1]A; 最後のキー
198:26SUBA0xA; 数値X処理
199:E5JNCCALC1D
19A:1D
19B:2CSUBA4; +-×÷か?
19C:E0JNCCALC1E
19D:14
19E:2FSUBA1; =か?
19F:E0JNCCALC1O
1A0:15
1A1:F0JMPCALC1 ; AC処理
1A2:18
  CALC1F:   ; 演算入力済
1AD:6DMOVA0xD; 直前のキー
1AE:82SUBA[2]
1AF:E0JNCCALC1N ; =処理へ
1B0:16
  CALC1P:   ; 演算実行
1B1:43MOVA[3]
1B2:2FSUBA1
1B3:E1JNCCALC1G ; 加算
1B4:1E
1B5:2FSUBA1
1B6:E3JNCCALC1H ; 減算
1B7:1C
1B8:2FSUBA1
1B9:E1JNCCALC1G ; 乗算
1BA:1E
1BB:2FSUBA1
1BC:E3JNCCALC1H ; 除算
1BD:1C
1BE:F0JMPCALC1 ;エラー
1BF:18
  CALC1H:; 減算
1C3:45MOVA[5]; Y=Y-X
1C4:84SUBA[4]
1C5:A5MOV[5]A
1C6:E0JNCCALC1M ; マイナス
1C7:17
  CALC1I:
1C8:45MOVA[5]
1C9:AEMOV[0xE]A; 結果表示
1CA:70MOVB0
1CB:BFMOV[0xF]B
1CC:6DMOVA0xD; 最後のキー
1CD:81SUBA[1]
1CE:E1JNCCALC1B ; 入力に戻る
1CF:19
1D0:41MOVA[1]; +-×÷
1D1:26SUBA0xA
1D2:A3MOV[3]A
1D3:F1JMPCALC1B ; X入力に戻る
1D4:19
  CALC1D:   ; 数値X処理
1D5:41MOVA[1]; 数値X格納
1D6:A4MOV[4]A
1D7:42MOVA[2]; =直後か?
1D8:22SUBA0xE
1D9:EDJNCCALC1A ; NO
1DA:18
1DB:6FMOVA0xF; =直後
1DC:A3MOV[3]A; +-×÷
1DD:60MOVA0
1DE:A5MOV[5]A; 数値Y
1DF:FDJMPCALC1A
1E0:18
  CALC1G:   ; 加算
1E1:70MOVB0; 繰り上げ
1E2:45MOVA[5]; Y=Y+X
1E3:04ADDA[4]
1E4:E7JNCCALC1J
1E5:1E
1E6:71MOVB1
  CALC1J:
1E7:A5MOV[5]A
1E8:26ADDA6; 10進補正
1E9:ECJNCCALC1K
1EA:1E
1EB:71MOVB1
  CALC1K:
1EC:3FSUBB1
1ED:E8JNCCAKC1I ; 補正不要
1EE:1C
1EF:AEMOV[0xE]A; 補正結果
1F0:60MOVA0
1F1:AFMOV[0xF]A
1F2:61MOVA1; 2桁目
1F3:AEMOV[0xE]A
1F4:AFMOV[0xF]A
  CALC1L:
1F5:6BMOVA0xB; AC待ち
1F6:AEMOV[0xE]A
1F7:4EMOVA[0xE]; キー入力
1F8:22ADDA0x2
1F9:2FADDA0xF
1FA:E1JNCCALC1B ; AC処理へ
1FB:19
1FC:F5JMPCAKC1L
1FD:1F    ; 終了

TD4EX4の機能チェック用に作成したプログラムです。前述のキャリーフラグの問題もこれで発見しました。

CPUの機能を確認しながらプログラムを作成していったので、プログラムそのものは0x140番地から始まっているにもかかわらず、エントリーポイントは0x180になっているなど、かなりのスパゲティ・プログラムになってしまいました。

プログラミングの参考にはなりませんので、純粋に電卓のプログラムの知りたい方は次節に掲載している2桁電卓をご覧ください。