標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第11回]

●新しい組立キットを考えました!

今回は先回の続きでDAAについて説明をするつもりだったのですが、突然に、新しい企画を思いついてしまったものですから、今回は予定を変更して、そちらの紹介をしたいと思います。

8080のTTLモデルをつくる、ということでスタートしたのですけれど、いざやってみると、なかなかどうしてすごいことになってしまいました。すでに書きましたように、とりあえず回路図もできあがり、基板図も一部未チェックながらおおむねできあがりました。
が、基板サイズもベラボーなら、使用ICもベラボーで、なんと300個!
これじゃあとても商品にはならないわ!
といっぺんにめげてしまいました。

それでもせっかくここまでやってきたのですから、なんとかモノにしてみたい。
そこで思いついたのが、規模を縮小すること。
8080の完全なコピーにこだわるから、こんなすごいことになってしまったのですが、たとえば教材とか趣味でとか、トレーニングで、とかというような目的ならば、何もいまさら8080に完全にこだわる必要もないのでは、と思ったわけです。

では、どこをどう削ろうか、と考えてみたのですが、どこをどのように削っても、なにしろレジスタだけでも相当な面積を占めてしまうのですから、命令を削った程度ではそれほどICの数も減らないし、基板面積もそれほど小さくはなりません。

いっそ、思い切って4ビットにしてみたら…。

●4ビットCPUの組立キットです!

これならば、レジスタ部分の面積もALU(数値論理演算)回路部分の面積も半分になります。ついでにレジスタの数も思い切って減らすことにしました。
命令の種類も当初はぐっと減らして、4ビットだから16種類でいいか、と考えました。

しかし、命令がたった16ではいかにも少ない。まったく面白くない。
4ビットCPUというと、8080以前に4004なんてCPUがあったそうですが(詳細はまったくわかりません)、一方、なんですか、IC数個でつくるお手軽CPUのつくりかた、などという本もあったりするようです。

しかし、しかし、たとえ初志を曲げて、8ビットを4ビットに落としてしまったとしても、プラモデル的なおもちゃをつくろう、とはまったく思いません。あくまで、限りなくホンモノに近いキットをつくりたい!
レジスタは4bitにしたとしても、いまどき4bit幅のメモリなんて、入手不能。どうせメモリは8bit。ということは命令コードも一度に読みこむのは8bit。それなら何も命令コードまで4bitにむりやり押さえなくてもよいのでは?
おお、すると、あの命令も使いたい、この命令も捨てがたい、ということで、当局の不拡大方針はあえなく無視されて、またぞろあやしくも規模拡大の轍をふむことになってしまいました。大丈夫でしょうかねぇ…。ひょっとすると、また、企画倒れになってしまうのでは…。

そもそも、そのようなものが、ちゃんとできるかどうか。あれこれ命令を並べるのはよいが、結局、だめだ、できないわ、では余りに情けない話です。皆様にこうやって公表するからには、とりあえずは、じっさいにせめて回路図くらいは描いてみてからにすべきです。
そこで、さっそくコードの設計からとりかかり、各命令の回路図を例によって、ノートに一生懸命描いてみました。
7月16日、17日の2日間で、やってしまいましたよ!(ほんま、かいな?)

まずは企画した4ビットマイコン(マイコンピュータということで、MC4と、とりあえず名づけました)の命令コード表とレジスタ一覧を紹介することにいたします。

●4bitマイコンボードMC4命令コード表

命令コード アセンブラ表記 動作 フラグ変化
0000 dd ss MOV rm,rm move register/memory to register/memory ただしMOV m,mは不可
0001 imm MVI imm move data(imm4bit) to A
0010 imm CPI imm compare data(imm4bit) from A ただしAは変化しない c,z
0011 imm SBI imm subtract data(imm4bit) from A 結果はAに c,z
0100 imm ANI imm AND data(imm4bit) with A 結果はAに c=0,z
0101 imm ORI imm OR data(imm4bit) with A 結果はAに c=0,z
0110 imm XRI imm EXCLUSIVE-OR data(imm4bit) with A 結果はAに c=0,z
0111 imm ADI imm ADD data(imm4bit) to A 結果はAに c,z
1000 00 ss CMP r compare register from A  ただしAは変化しない c,z
1000 01 ss SBB r subtract register with carry from A 結果はAに c,z
1000 10 ss SUB r subtract register from A 結果はAに c,z
1000 11 ss ADC r ADD register with carry to A 結果はAに c,z
1001 00 ss AND r AND register with A 結果はAに c=0,z
1001 01 ss OR r OR register with A 結果はAに c=0,z
1001 10 ss XOR r EXCLUSIVE-OR register with A 結果はAに c=0,z
1001 11 ss ADD r ADD register to A 結果はAに c,z
1010 00 00 JNC adrs8 if not carry,jump to adrs(2バイト命令)
1010 00 01 JC adrs8 if carry,jump to adrs(2バイト命令)
1010 00 10 JNZ adrs8 if not zero,jump to adrs(2バイト命令)
1010 00 11 JZ adrs8 if zero,jump to adrs(2バイト命令)
1010 01 00 JMP adrs8 jump to adrs(2バイト命令)
1010 01 01 JP(BC) jump to (BC),indirectly BCレジスタで示すアドレスにジャンプする
1010 01 10 MOV W,BC move BC to Workregister
1010 01 11 MOV BC,W move Workregister to BC
1010 10 00 CALL adrs8 call subroutine
1010 10 01 RET return from subroutine
1010 10 10 MOV W,AF move AF to Workregister
1010 10 11 LDSB load BC to SP
1010 11 00 PUSH BC push BC
1010 11 01 PUSH AF push AF
1010 11 10 POP BC pop BC
1010 11 11 POP AF pop AF c,z
1011 00 ss RR r rotate register right
1011 01 ss RL r rotate register left
1011 10 ss RRC r rotate register right through carry
1011 11 ss RLC r rotate register left through carry
1100 00 00 MOV AF,W move Workregister to AF c,z
1100 00 01 INX BC increment BC
1100 00 10 STC set carry c=1
1100 00 11 CLC clear carry c=0
1100 01 00 CMC complement carry
1100 01 01 DCX BC decrement BC
1100 01 10 EI enable interrupt
1100 01 11 DI disable interrupt
1100 10 ss INC r increment register
1100 11 ss DEC r decrement register
1101 aaaa IN adrs4 in
1110 aaaa OUT adrs4 out
11vvv111 RST n restart
レジスタ
4bit ss=11、dd=11
4bit ss=00、dd=00
4bit ss=01、dd=01
4bit flag register、ただし使用しているのは、carryとzeroの2ビットのみ
Workreg 8bit 内部的に使用しているワークレジスタ
PC 8bit program counter
SP 8bit stack pointer

4bitレジスタBとCは結合して、8bitのレジスタとしても使用できる。目的はBCの内容を8ビットのメモリアドレスとして、メモリを間接的に示すことに使用する。MOV命令における、mはBCによる間接アドレッシングで示される。
またJP(BC)命令では、BCで示す8bitのアドレスにジャンプする、間接ジャンプ命令のためにも使用される。
この間接ジャンプ命令と条件付ジャンプ命令を組み合わせることによって、プログラム作成時点でジャンプ先を固定することなく、データ処理の過程で必要な複数の分岐先にジャンプすることが可能になる。

どうです、すごいモノでしょう?
こうなると、DOS/V上で実行できる、クロスアセンブラも作ってしまいたくなってきます(いずれ、作りましょうか?)。

●ところで、ICの使用個数は減ったのでしょうか?

減ったことは減ったのですけれど、でもまだ少し多いかも…。ざっと数えてみると130個ほど…(まだ、実際に基板設計にはとりかかっていませんから、最終的には多少の増減はすると思いますが)。

でも、これならば必ずしも実現不可能ではないと、思います。
今回の設計では、アクセスできるアドレスも8bitに制限してしまったために、プログラム、データエリアとして使用できるのは、わずかに256バイトしかありません。でもまあ、トレーニングとか趣味、教養としては、とりあえずは、それでもよいのでは?
まだプログラムの入力方法については、確定していませんが、基本的にはスイッチをパチパチやりながら、1バイトずつ命令コードを入力していくことを考えています。それなら、200バイトくらいが作業の限界と思いますから、十分でしょう。

一方それに比べて、命令機能の方はご覧いただいた通り、これなら8ビットCPUと比較し得る十分な機能をそなえている、と言えると思います。
演算命令としても、ADD、SUBに加えてキャリーつき演算のADCおよびSBBももっていますし、論理演算のAND、OR、XORもちゃんとそなわっています。サブルーチンコールは言うに及ばず、PUSH、POPといったスタック操作まで可能です。
さらには、なんと8080と同じ割り込み機能と、主に割り込みで利用される1バイトのサブルーチンコール命令RSTまでついているのです!
こういった全ての機能について、回路図つきの解説書をキットに付属させようと考えています(これは、大変な作業量になりそうです)。

しかし中には、
サブルーチンとか割り込みとか、そんなところまでは、いらん!
と、おっしゃる方もいらっしゃるかもしれません。
そこで、できれば、この回路を2〜3枚の基板に分割して、初級、中級、上級のように機能をクラス分けして、初級基板のみでも十分動作可能なものにしたいと思います。それなら、いきなり100個以上ものICをハンダづけするような、組立キットにしなくてもすみます。
このボードについては、ぜひとも実現したいと思います(まだ、8080の基板の試作も完了していないのに…)。
2008.7.18upload

前へ
次へ
ホームページトップに戻る