前回は10進法の加算APIを用いましたが、今回は16進数の和ルーチンを使って見ました。
I/O 部分は省略して、掛ける 4bit の数の入力だけで、出力は機械停止後に手動でメモリーを見ることにしました。
メモリーのアサインメントは、プログラム短縮化の為に前回と仕様を変えました。
メモリーの50H−57H にある8ワード(1ワード=4ビット)ビッグエンディアン16進数をIX、58H−5FHにあるものを IY とし、キーボードから入力する4ビット整数を IA とするとき、IY=IA*IX+IY を計算し、さらに IX=IY, IY=0 とします。最終的な結果は IX (50H−57H) に入ります。
計算終了後7セグが点灯します。新たな数を入力すると計算中が終わるまで消灯します。
計算例
はじめにIX=1、IY=0を初期化し、キーボードから1,2,3・・・と順次入力してゆくことで、階乗は普通に12!まで計算できます。
| 1! | 1H |
| 2! | 2H |
| 3! | 6H |
| 4! | 18H |
| 5! | 78H |
| 6! | 2D0H |
| 7! | 13B0H |
| 8! | 9D80H |
| 9! | 58980H |
| A! | 375F00H |
| B! | 2611500H |
| C! | 1C8CFC00H |
| D! | 17328CC00H |
| E! | 144C362800H |
実行時の豆知識としては、6 RUN でデバッグモードで動きます。
ソースコード
IB レジスタを掛ける数のループカウンタに、IX レジスタをキャリーフラグに使っています。
IA レジスタはメモリーアクセス用の受け皿、IY レジスタはメモリーアクセスのインデックス・レジスタになります。
| 番地 | 機械語 | ラベル | ニーモニック | コメント | |
| 00 | 0 | inp: | KA | ||
| 01 | F 0 0 | JUMP (inp) | |||
| 04 | E 0 | CAL RSTO | 7seg. LED off | ||
| 06 | E 4 | CAL CMPL | loop counter init. | ||
| 08 | 9 1 | mult_loop: | AIA 1 | ||
| 0A | F 3 A | JUMP (copy_zero) | exit | ||
| 0D | A 0 | TIY 0 | |||
| 0F | 2 | CH | |||
| 10 | A 7 | TIY 7 | |||
| 12 | 5 | sum_loop: | MA | ||
| 13 | 2 | CH | |||
| 14 | D 1 | CIY 1 | |||
| 16 | F 2 2 | JUMP (flag_leave_0) | no carry | ||
| 19 | 2 | CH | |||
| 1A | 9 1 | AIA 1 | |||
| 1C | F 2 3 | JUMP (flag_leave_1) | carry again | ||
| 1F | 2 | CH | |||
| 20 | A 0 | TIY 0 | carry flag clear | ||
| 22 | 2 | flag_leave_0: | CH | ||
| 23 | B 8 | flag_leave_1: | AIY 8 | ||
| 25 | 6 | M+ | |||
| 26 | F 2 C | JUMP (flag_set) | set carry flag 1 | ||
| 29 | F 3 0 | JUMP (flag_untouch) | won't change carry flag | ||
| 2C | 2 | flag_set: | CH | ||
| 2D | A 1 | TIY 1 | |||
| 2F | 2 | CH | |||
| 30 | 4 | flag_untouch: | AM | ||
| 31 | B 7 | AIY -9 | loop counter decrement | ||
| 33 | F 1 2 | JUMP (sum_loop) | |||
| 36 | 2 | CH | |||
| 37 | F 0 8 | JUMP (mult_loop) | |||
| 3A | A 7 | copy_zero: | TIY 7 | loop counter init. | |
| 3C | B 8 | cz_loop: | AIY 8 | ||
| 3E | 5 | MA | copy from | ||
| 3F | E E | CAL DEM- | zero clear | ||
| 41 | B 9 | AIY -7 | move to | ||
| 43 | 4 | AM | |||
| 44 | B F | AIY -1 | loop counter decrement | ||
| 46 | F 3 C | JUMP (cz_loop) | |||
| 49 | 1 | AO | 7seg. LED on | ||
| 4A | F 0 0 | JUMP (inp) | goto start |