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

●8080はこんなICなのだ!

と、まあ、大上段に振りかぶってみたのですけれど、さて、困った。
手元には、8080に関する資料がまったく残っていない。全部捨ててしまったらしい。
いや、ひょっとすると、先年亡くなった、じい様の家の物置をちょいと拝借しているので、そこに押し込んであるのかもしれない…。
しかし、わざわざでかけていって、ほこりだらけの物置を引っ掻き回すのも、いかにも面倒な話だ…。
とりあえずレジスタと命令については、Z80の資料から逆に類推して整理しなおすことも可能だが、それにはかなり面倒な作業を覚悟しなければならない。
というわけで、はやくも企画はみごとに暗礁に乗り上げてしまったか…。

こんなときにインターネットというのは、まことに便利で、本当に助かってしまいます。
最初には、神楽坂製作所さまのサイトにいきつき、そのサイト内のご紹介によって、半導体コレクション展示会場さまというまことにありがたいサイトを拝見させていただきました。
両サイトさまにあった8080全命令表はじつに簡潔にして十分なものでしたので、さっそくありがたく参考にさせていただくことにいたしました。
両サイトの管理者さまに、あつく御礼申し上げます。

という次第でからくも座礁は切りぬけることができました。

さて、そこで、8080の内容紹介です。

まずは8080のレジスタです。
8080には8ビットのレジスタがA、B、C、D、E、H、Lと7個あり、このうちAは加減算、論理演算の結果の格納やローテイト、入出力などの命令に唯一使用できるレジスタで、主レジスタともいうべきものです。
またH、Lレジスタは両者をつないで16ビットのレジスタとして、MOV命令などで外部メモリを参照する際のアドレッシングレジスタとして利用することができます。
BC、DEレジスタも同じようにメモリアドレスを示すレジスタとして使うことができますが、HLレジスタとは異なり特定の命令においてのみ限定的に使用されるにとどまります。
この説明のように、B、C、D、E、H、Lの各レジスタはそれぞれ独立した8ビットのレジスタとして使われますが、特定の命令では、Bを上位8ビット、Cを下位8ビットとして結合し、16ビットのレジスタBCとして使用されます。
同様にD、Eは16ビットレジスタDEとして、H、Lは16ビットレジスタHLとして使用されますが、Aレジスタはつねに8ビットのレジスタとして単独に用いられます。
また16ビットレジスタHLは16ビット加算命令DADの加算結果格納用レジスタとしても使われます。
BC、DEも16ビット加算命令DADの対象レジスタとして使用されますが、HLとは異なり加算結果の格納用には使用できません。
16ビットのレジスタペアHLとDEにはその内容を交換する命令、XCHGが用意されていますが、BCにはその機能は用意されていません。
このように、8080のレジスタには汎用である面と専用である面の両方の役割が与えられています。
このことは、レジスタ回路を設計するうえで、かなりの面倒を予想させます。
なお、8080にはこのほかに同じく8ビットのフラグレジスタがあります(といっても実際に使われているのは5ビットのみなのですが…!)。ここまで書いてきてはじめて気がつきました。そうだったのか!

実はZ80ではフラグは6ビット使われているのです。
すでに書きましたように、手元には、もう8080の詳しい資料が何も残っていません。しかし、Z80に関する資料ならばいっぱいありますし、何よりこの頭の中に知識と経験としていっぱいつまっています。
幸いZ80は8080の上位互換CPUですから、Z80の命令機能のうち、8080にも存在するものについて、Z80の資料をもとに作業してもよい、と考えられます。
ところが、このフラグの数の違いについては、最初はピンときませんでした。Z80の動作から考えると、やはりフラグは6個必要なはずなのですが…。
ここではIQサプリよろしく、思わせぶりに書くことにします。
Z80では、ある命令を実行するには、8080にはないフラグが必要になります。その命令とは何で、そしてその理由とは何でしょうか?
この答えについては、後ほど説明いたします。
回路を考えながら、いったい8080の開発者はこのフラグなしでどうやってこの動作を実現させたのだろう?
当初、その答えはみつかりませんでしたが、しかしフラグの数まで8080に完全に合わせなくても、要は8080の動作と同じことがTTLでできればよいわけですから、それ以上は踏み込んで考えないで、フラグについてはZ80と同じ6個でいくことにしました。

今この文を書く過程で、あらためて半導体コレクション展示会場さまのサイトにある、8080についての記述を読み直していて、はじめて気がついたのです。そこで、もう一度、そうか!そうだったのか!(まるで、名探偵コナン、ですね)
後ほど、詳しく説明するまで、このことについてはしばしお待ちください。

8080にはさらに16ビットの専用レジスタが2個あります。命令コードをメモリから順に読み出すための、メモリアドレスを格納するプログラムカウンタと、レジスタなどの内容をメモリに一時的に退避格納するためのメモリアドレスを保持するスタックポインタです。
それぞれ役割も働きもかなり異なるレジスタがこれだけあるわけですから、このレジスタ群の回路を設計するだけでも相当にホネの折れる作業を覚悟しなければなりません。

そしていよいよ8080の命令コードです。
こちらの方は、上でご紹介させていただいた神楽坂製作所さまのサイトに余りに簡潔な形で整理されておりましたものですから、思わずそのままコピペさせていただいてしまいました。あしからずご了承を賜りたくお願い申し上げます。

命令コード アセンブラ表記
01 ddd sss MOV rm, r
01 ddd 110 MOV r, M
01 110 110 HLT
00 ddd 110 MVI rm, imm
00 ddd 100 INR rm
00 ddd 101 DCR rm
10 000 sss ADD rm
10 001 sss ADC rm
10 010 sss SUB rm
10 011 sss SBB rm
10 100 sss ANA rm
10 101 sss XRA rm
10 110 sss ORA rm
10 111 sss CMP rm
11 000 110 ADI imm
11 001 110 ACI imm
11 010 110 SUI imm
11 011 110 SBI imm
11 100 110 ANI imm
11 101 110 XRI imm
11 110 110 ORI imm
11 111 110 CPI imm
00 000 111 RLC
00 001 111 RRC
00 010 111 RAL
00 011 111 RAR
11 000 011 JMP addr
11 011 010 JC addr
11 010 010 JNC addr
11 001 010 JZ addr
11 000 010 JNZ addr
11 110 010 JP addr
11 111 010 JM addr
11 101 010 JPE addr
11 100 010 JPO addr
11 001 101 CALL addr
11 011 100 CC addr
11 010 100 CNC addr
11 001 100 CZ addr
11 000 100 CNZ addr
11 110 100 CP addr
11 111 100 CM addr
11 101 100 CPE addr
11 100 100 CPO addr
11 001 001 RET
11 011 000 RC
11 010 000 RNC
11 001 000 RZ
11 000 000 RNZ
11 110 000 RP
11 111 000 RM
11 101 000 RPE
11 100 000 RPO
11 vvv 111 RST vec
11 011 011 IN port
11 010 011 OUT port
00 pp0 001 LXI rp, imm1
11 pp0 101 PUSH rr
11 pp0 001 POP rr
00 110 010 STA addr
00 111 010 LDA addr
11 101 011 XCHG
11 100 011 XTHL
11 111 001 SPHL
11 101 001 PCHL
00 pp1 001 DAD rp
00 pp0 010 STAX rx
00 pp1 010 LDAX rx
00 pp0 011 INX rp
00 pp1 011 DCX rp
00 101 111 CMA
00 110 111 STC
00 111 111 CMC
00 100 111 DAA
00 100 010 SHLD addr
00 101 010 LHLD addr
11 111 011 EI
11 110 011 DI
00 000 000 NOP

このコード表をあらためてじっくりと見てみると、個別にざっくりと切り崩せそうなところが何箇所かあることに気がつきます。それはそのはずで、8080の設計者が思いつくままに命令をコードに割り当てていった、などということはなかったはずで、当然機能別にデコードし易いようにコードを割り振っていったと考えられるからです。
しかしながら8080の内部回路とそっくり同じ回路をTTLで実現できるとは思われないので、いろいろ都合が悪いところがでてきて、なかなかすっきりした回路にはならないところもでてくるだろうことも当然に予想されます。

なかなかに、前途多難ではあります。
2008.7.11upload
2008.7.15加筆訂正

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