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

●ICが増えてしまいました

オリジナルの8ビットマシンの命令コードでTK80モニタを書き換えてみようとしましたら、途端につかえてしまいました。
やっぱりもう少し欲しい命令がありました。

いずれ詳しく説明するつもりですが、今回設計したCPUボードでは8080に比べて8ビットのレジスタを削減してしまいました。
8080にはA、B、C、D、E、H、Lの7個の8ビットレジスタとPC、SPの2個の16ビットレジスタがあります。
今回のCPUは、8ビットレジスタはA、B、C、Dの4個しかありません。
その代わりに、16ビットレジスタはPC、SPの他に、DA、ADの2個の特殊レジスタを用意しました。
AD、DAといってもADコンバータではありません。
その用途からつけた名前です。

8080ではHLレジスタをメモリの間接アドレッシングに使っています(BC、DEも制限つきで使用できます)。
今回のCPUでは回路を簡略化するために、8080のHLレジスタの役割を、SPで代用しています。
レジスタが少ないのでPUSH、POP命令を省きましたから、スタックはCALL、RETでしか使いません。
ですからSPを一時的に避難させれば、それをメモリアドレスを示すレジスタに利用することができると考えたのです。

ところがうっかりしていて、そのSPのための命令を作るのを忘れていたのです。
で、さっそく作ってしまいました。
追加したのは、以下の命令です。

MOV [im16],SP   …SPをメモリアドレスim16とim16+1にSAVEします(im16は2バイトの即値)
MOV SP,[im16]   …SPをメモリアドレスim16とim16+1からLOADします(im16は2バイトの即値)
MOV SP,im16    …SPにim16を与えます(im16は2バイトの即値)
INR SP
DCR SP

前回お見せしたあとで作成したノートです。
↓に上記5命令の回路を作成しています。

この追加のためにICの数が増えてしまいました。
145個前後になると思います。

●やっぱり4ビットも作ることに…

SP回路のあとのノートには何が書いてあるのかといいますと、実は4ビットについてあらためて検討してみたのです。
8ビットのボードを考えたうえで、それをまずとりあえずは4ビット部分のみ実装できるようにしたらどうだろうか、ということを前回書きました。
でも全ての回路を4ビットにできるものではありませんから、4ビットにしたとしてもICの個数が半分になるわけではありません。
どのくらい減らせるかは、まあ、やってみないとわかりません。

この2週間ほどの試行錯誤の過程で、4ビットのみのボードは使い物にならない、と考えて、初め4ビットあとから8ビット、という案にたどりついたわけなのですが…。

あらためて考えてみると、4ビットも作ってみてもよいのでは、という気持ちになってきました。
4ビットについては、それを無理やりTK80機能と結びつけようとしたところに、無理があったのではないか。
4ビットは拡張性などまでは考慮しないで、とにかく入門的、あるいは学校などでの教材と位置付けて、それでできること以上のものは望まない、というあたりに限定すれば、それなりのものが作れるのでは、と考えました。
で、昨日と今日の2日間で、あらためて、完全4ビット版について設計作業を行いました。
それが上のノートです。

レジスタは4ビットのA、B、C、Dと8ビットのPC、SP、AD、DAです。
PC、SPが8ビットということは、メモリアドレスとしてはわずか256バイトしか使用できません。
でも考えてみれば、TK80だって、512バイトしかなかったわけで、それでもそれなりにプログラムは組めたわけですから、4ビットCPUで256バイトのメモリ空間しかなくても少なすぎるということにはならない、と割り切りました。
データは当然8ビットのうち下位4ビットしか扱えません。
でもそれではメモリの上位4ビットが完全に死んでしまいます。
ここをどうするか、で半日頭を抱えて悩んでいました。

あ。4ビットというのはあくまでデータのビット数のことで、命令コードは8ビットで考えています。
それにしてもメモリの上位4ビットがデータとして扱えない、というのは余りにもったいないですし、それではやれることがかなり制限されてしまいます。
そこで、8ビット版の命令に、さらに4ビット版のみの機能追加をおこない、メモリとレジスタとの間のMOV命令は、メモリの上位4ビットのデータか下位4ビットのデータかを指定することができるようにするとともに、レジスタからメモリに値を書き込むときには、レジスタ2個の値をつないで8ビットの値として書き込むことができるように考えました。

とりあえずは8ビット版で考えた全ての命令を4ビット版でも実行できるように回路を考えてみましたので、ICの数はけっこう多くなってしまいました。
ざっと拾ってみたところでは85個程度になると思います。

このボードを入門用とか教育用というあたりに位置付けたとしますと、85個でもちょっと多いかな、という気もします。
回路基板は85個で設計したうえで、さらにさらにスタンダードな命令回路だけに絞り込んで、たとえばIC40個程度を実装する基本キットにして、それにあとから残りのICを追加して全命令が使えるようにする、ということなら、かなり簡単な組立てキットになるのではありませんでしょうか。

本日は、またまた時間が無くなってしまいましたので、とりあえずは今回の8ビット(および4ビット)のCPUの命令セットをアセンブラニーモニックのみ、まずはご披露いたします。
(8ビット、16ビットのデータを扱う命令は4ビット版では異なっているものもありますが、その差異についての説明はここでは省きます)
詳細はいずれ少しずつ説明していくことにいたします。

●命令セット(アセンブラニーモニック)

NOP
RST
CCF
SCF
MOV r,r’
MOV r,[DA]
MOV r,[SP]
MOV r,[im16]
MOV r,im8
MOV [DA],r
MOV [SP],r
MOV [im16],r
MOV DAL,r
MOV DAH,r
MOV DAL,im8
MOV DAH,im8
MOV r16,r16’
MOV r,ADL
MOV r,ADH
MOV [DA],ADL
MOV [DA],ADH
MOV [SP],ADL
MOV[SP],ADH
ADC r
SBB r
CMP
AND r
OR r
XOR r
INR r
DCR r
INV r
RR r
JNC
JNZ
JMP
JC
JZ
CALL
RET
MOV F,r
MOV r,F
OUT [im8],r
IN r,[im8]
MOV SP,[im16]
MOV [im16],SP
MOV SP,im16
INR SP
DCR SP

2009.11.11upload

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