ここは 本編を読んでからの寄り道です。今のTTA-8の回路のまま 試せます。 足し算・引き算・NAND に、記憶と条件分岐を組み合わせると、専用の回路がない計算も プログラムで作れます。
「残り回数」を変数に入れ、1を引き、0か調べて戻れば、決まった回数の繰り返しです。 7章 のカウントダウンは、そのままこの仕組みを使っています。
| 残り回数 | すること |
|---|---|
| 3 | 仕事を1回して、残りを2にする |
| 2 | 仕事を1回して、残りを1にする |
| 1 | 仕事を1回して、残りを0にする |
| 0 | JZ でおわりへ進む |
足し算を繰り返すと かけ算になります。では、わり算は?
17個のおはじきを、1個ずつ数えて組に入れます。 5個たまるたびに「できた組」を1増やし、組の中の数を0に戻します。
| 数え終わった個数 | できた組(商) | 今の組に入っている数(余り) |
|---|---|---|
| 5 | 1 | 0 |
| 10 | 2 | 0 |
| 15 | 3 | 0 |
| 17 | 3 | 2 |
だから 17 ÷ 5 = 3 あまり 2 です。 「大きい・小さい」を直接調べる命令がなくても、「5と同じになったか」で組を作れます。
10 REM 17 / 5 : $Q = しょう, $R = あまり, $E = 0でわるエラー
20 $N = 17 : $D = 5 : $Q = 0 : $R = 0 : $E = 0
30 IF $D = 0 THEN $E = 1 : GOTO 120
40 IF $N = 0 THEN GOTO 120
50 $N = $N - 1
60 $R = $R + 1
70 IF $R <> $D THEN GOTO 40
80 $R = 0
90 $Q = $Q + 1
100 GOTO 40
120 OUT $Q
130 END
ラボのサンプル 「わり算 17÷5」 を選べます。ファイルは programs/basic/divide.bas です。
実行すると商の3がLEDに出ます。ラボの変数で $Q = 3、$R = 2 を見つけましょう。
余りをLEDで見たければ、120行を OUT $R に変えます。
$N は残り個数なので、最後は0になります。
30行は 0で割る場合を分ける処理です。そのときは計算せず、$E を1にします。
このプログラムで扱う数は0〜255、割る数は通常1〜255です。
試そう:20行を変えて、20÷5、3÷5、0÷5、17÷0 を試そう。 商だけでなく、余りと
$Eも確認してください。
よく使う「割る数を、引けるだけ引く」方法も作れます。 ただし8bitの引き算では 3−5 が254に回り込むため、引いた値が0でないだけでは「まだ引ける」と判断できません。 ここでは比較の仕組みを追加せずに追えるよう、1個ずつ数える方法を選びました。
NAND は「AND の答えを反転する」演算です。8bitの各桁で 同じことを行います。 まず1bitだけを見ます。
| A | B | A AND B | A NAND B |
|---|---|---|---|
| 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 0 |
| 作りたい演算 | NAND での作り方 |
|---|---|
| NOT A | A NAND A |
| A AND B | T = A NAND B として、T NAND T |
| A OR B | (A NAND A) NAND (B NAND B) |
たとえば A=12(00001100)、B=10(00001010)なら、AND は8、OR は14です。 表の中のかっこは説明用です。TinyBASIC改では かっこを使えないので、途中の値を変数に保存します。
10 $A = 12 : $B = 10
20 $C = $A NAND $B
30 $C = $C NAND $C
40 OUT $C
50 END
これは NAND だけで AND を作り、8を出す例です。 途中の値を保持するレジスタやRAMも、計算を組み立てる大事な部品です。
NAND は、ビットの論理演算を組み立てる基本になります。 ADD・SUB に記憶・JZ・JMPを組み合わせると、かけ算やわり算のように 手順のある計算を作れます。 ADD・SUB・NANDの3回路だけで、記憶や分岐なしに何でもできる、という意味ではありません。
TTA-8では 数は8bit、変数は32個、プログラムは256バイトです。 大きな数は何個かの箱に分けて扱えますが、そのための命令と記憶場所も必要になります。 速さや容量が足りなくなったら、回路やメモリをどう増やすかを 次の発展編で考えましょう。