fortran66のブログ

fortran について書きます。

4ビットマイコン(GMC-4) で階乗 

メモリーの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-マイコン シミュレータ
このソフトを使わせていただきました。



F
3
4
E
4
9
1
F
1
C
2
A
7
5
B
8
1
E
F
B
8
F
0
D
2
F
0
5
A
8
2
A
8
8
0
2
5
B
8
4
B
9
2
4
B
1
F
3
4
F
2
3
A
0
5
1
8
7
E
C
E
0
E
C
B
1
D
8
F
3
6
E
C
0
F
3
4
F
0
3
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0