メモリーの50H−57Hにある8ワード[むしろニブルと言うべきか](1ワード=4ビット)ビッグエンディアン10進数をIX、58H−5FHにあるものをIYとし、キーボードから入力する4ビット整数をIAとするとき、IX=IA*IX+IYを計算し、さらにIY=0とします。
計算結果は、8セグLEDに上の桁から順に点灯させ、その表示を繰り返します。一通り表示し終えたタイミングでキーボードから入力すると、前回の計算結果を引き継いで計算を繰り返します。
IX=1、IY=0と初期値を与えてから、キーボードからの入力を1,2,3,4・・と与えてゆくことで、階乗を十進表示で求められます。
2,5,10を飛ばすことで、末尾の二つの00を消去できるので、10桁の13!まで求められます。
1! | 1 |
2! | 2 |
3! | 6 |
4! | 24 |
5! | 120 |
6! | 720 |
7! | 5040 |
8! | 40320 |
9! | 362880 |
10! | 3628800 |
11! | 39916800 |
12! | 479001600 |
13! | 6227020800 |
ソースコード
プログラムは大きく3つの部分に分けられます。掛け算を行う演算部分03H-19H,結果のコピーとゼロクリアを行う部分1CH-31H,結果をLEDに表示しキーボードからの入力を受け付けるI/O部分34H-4DHです。
はじめは、掛け算のルーチンを作っていたのですが、思い直して色々サブルーチンを組み合わせたので構成がイマイチです。I/O部分の出来がいまいちです。結果はメモリーを直接読むことにして、I/Oを簡略化し、階乗専用のプログラムにすべきだったかもしれません。
番地 | 機械語 | ラベル | ニーモニック | コメント | |
00 | F 3 4 | JUMP (LED) | |||
03 | E 4 | init: | CAL CMPL | mult loop counter initialization | |
05 | 9 1 | mult_loop: | AIA 1 | mult loop counter increment | |
07 | F 1 C | JUMP (sum_exit) | |||
0A | 2 | CH | |||
0B | A 7 | TIY 7 | sum loop counter init | ||
0D | 5 | sum_loop: | MA | ||
0E | B 8 | AIY 8 | |||
10 | 1 | A O | dummy: force flag = 1 | ||
11 | E F | CAL DEM+ | sum loop counter increment | ||
13 | B 8 | AIY 8 | |||
15 | F 0 D | JUMP (sum_loop) | |||
18 | 2 | CH | |||
19 | F 0 5 | JUMP (mult_loop) | |||
1C | A 8 | sum_exit: | TIY 8 | ||
1E | 2 | CH | |||
1F | A 8 | TIY 8 | |||
21 | 8 0 | TIA 0 | |||
23 | 2 | copy_zero_loop: | CH | ||
24 | 5 | MA | copy | ||
25 | B 8 | AIY 8 | |||
27 | 4 | AM | |||
28 | B 9 | AIY 9 | end copy | ||
2A | 2 | CH | |||
2B | 4 | AM | zero | ||
2C | B 1 | AIY 1 | end zereo | ||
2E | F 3 4 | JUMP (LED) | |||
31 | F 2 3 | JUMP (copy_zero_loop) | |||
34 | A 0 | LED: | TIY 0 | ||
36 | 5 | LED_loop: | MA | ||
37 | 1 | A O | LED on | ||
38 | 8 7 | TIA 7 | wait 0.8sec | ||
3A | E C | CAL TIMER | |||
3C | E 0 | CAL RSTO | LED off | ||
3E | E C | CAL TIMER | |||
40 | B 1 | AIY 1 | |||
42 | D 8 | CIY 8 | |||
44 | F 3 6 | JUMP (LED_loop) | |||
47 | E C | CAL TIMER | |||
49 | 0 | KA | keyboard input | ||
4A | F 3 4 | JUMP (LED) | repeat LED display | ||
4D | F 0 3 | JUMP (init) | begin calculation |
エミュレータ コードファイル
FX-マイコン シミュレータ
このソフトを使わせていただきました。