標準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加筆訂正
前へ
次へ
ホームページトップに戻る