標準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 | c |
1011 01 ss | RL r | rotate register left | c |
1011 10 ss | RRC r | rotate register right through carry | c |
1011 11 ss | RLC r | rotate register left through carry | c |
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 | c |
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 | z |
1100 11 ss | DEC r | decrement register | z |
1101 aaaa | IN adrs4 | in | |
1110 aaaa | OUT adrs4 | out | |
11vvv111 | RST n | restart | |
レジスタ | |||
A | 4bit | ss=11、dd=11 | |
B | 4bit | ss=00、dd=00 | |
C | 4bit | ss=01、dd=01 | |
F | 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
前へ
次へ
ホームページトップに戻る