TTA-8

発展1. ADD・SUB・NAND で どこまで計算できる?

ここは 本編を読んでからの寄り道です。今のTTA-8の回路のまま 試せます。 足し算・引き算・NAND に、記憶と条件分岐を組み合わせると、専用の回路がない計算も プログラムで作れます。

繰り返しは、前の命令へ戻ることで作る

「残り回数」を変数に入れ、1を引き、0か調べて戻れば、決まった回数の繰り返しです。 7章 のカウントダウンは、そのままこの仕組みを使っています。

残り回数 すること
3 仕事を1回して、残りを2にする
2 仕事を1回して、残りを1にする
1 仕事を1回して、残りを0にする
0 JZ でおわりへ進む

足し算を繰り返すと かけ算になります。では、わり算は?

17個を、5個ずつの組に分ける

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 から NOT・AND・OR を作れる

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バイトです。 大きな数は何個かの箱に分けて扱えますが、そのための命令と記憶場所も必要になります。 速さや容量が足りなくなったら、回路やメモリをどう増やすかを 次の発展編で考えましょう。


← 10. つぎの ぼうけんへ | つぎへ → 発展2. CPU を大きくする