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

●メールをいただきました

中島 千明様からメールをいただきました。なんでも学生時代にTTL361個を使うボードを作られたことがあるとのこと(しかもジャノ目基板に手配線!)。
中島 千明様のこちらのサイトで実物写真を見られます(すごい!)。

中島 千明様は、CQ出版社「新世代8051系マイコン入門ハンドブック」の著者です。
こういう立派なご本の著者からメールをいただいたりすると、感激してしまいますね。
わざわざ8080のデータシートを添付してくださり、また8080のインストラクション(命令)ごとにフラグの変化がわかるという、なんとも有りがたいサイトのご紹介までしていただきました。
中島 千明様に感謝申し上げます。今後ともご支援、ご鞭撻をお願いいたします。

実は、私は、この連載記事を始めるにあたって、

IC300個を使ったボードを実際に作ってしまうバカは、世界広しといえども、この私くらいだろう。

と考えて、ひとり、悦にいっておりました。
のですけれど、世界は意外に狭かったというか、本当にいらっしゃったのですねぇ。
ちょっと、ショックで、しばし茫然自失、あとしばらく自己嫌悪、でした。

この方のすごいのは、そんなもんじゃありません。
私はパソコンに向かってただCADを使って描いただけ。
この方は全部、ジャノ目基板に手配線をされたのですね!一本一本被覆をむいて、ハンダ付けをして…!
しかも、LSTTLを使って、361個!
私は74HC、CMOSですから、300個でもなんとか動くだろうと思っていますが(でも正直なところ、心配)、LSTTLで動作させてしまった、というのが、なんとも、「すごい」の一語に尽きます。
それも経験を積んだ技術者ならばともかく、まだ学生のころだった、というのですから、驚きを通り越して、もう「呆然、言う言葉を知らず」、です。

中島 千明様のホームページによりますと、後にCQ出版社「インターフェース」誌の「ハードウェアコンテスト」で優秀賞を獲得されたとのこと。さもあらん、と思います。
氏の益々のご健闘、ご活躍をお祈りいたします。

●やっぱりAMDだったんだ!

中島 千明様にメール添付でいただいたAMD版「8080」のデータシートをさっそく開いてみましたら、そこには「9080」の文字が!

その昔、秋葉原の「信越電機」で初めて手にしたCPU、確かIntelのセカンドソースで製品名は8080ではなくて、9080、そしてメーカーはAMDだったような…

というお話を「第1回」で致しました。

そうか!やっぱりAMD、9080だったんだ!
いやぁ、懐かしい。
中島 千明様、貴重なデータシートをお送りいただき、本当に有難うございました。

●でも残念ながら、フラグについては不明のまま

せっかくお送りいただいたAMDのデータシートだったのですが、やっぱりIntelと同じく、命令ごとのフラグの動作までは記載されていませんでした。うーん。残念。

●そうそう、もうひとつ、ホームページについての情報もいただいておりました

なんでも、8080の命令をクリックすると、なんと命令の動作の説明とともに、フラグの変化まで(!)、命令ごとに知ることができる、のだそうです。
それはすごい。これは、期待できますよ。
さっそく、行ってみました。
URLは、http://www.comsci.us/cpu/8080/matrix.htmlです。

命令をクリックすると、
おおお、やった。とうとう…ありました。
フラグが表示されましたよ!
やっと、捜し物が、みつかりました!

●でも…、なんだか、少し、おかしいような…

ところがですね…。
なんだか、少し、おかしいのですよ…。

たとえば
ADD をクリックすると、
命令の動作説明とともに、フラグ変化についても、表示されるのですが…。
S(sign)と、Z(zero)が変化するのは当然として、なんでP(parity)まで変化するの?
おまけにC(carry)とA(これは何の略だかわからない。ビット位置からすると、halfCarryのことだと思う)がクリアされるって、いくらなんでも、それは、ないんじゃないの?

おかしいのは、ADDだけで、ADCはCもA(H?)もちゃんと変化するとあります。
あー。だけど、やっぱり、PはADCでも変化するゥ?
ADDやSUBでパリティフラグが変化したって、そんなもの、何に利用できるっていうの?

うーん。多分、P(parity)フラグは、回路の都合で、寄生的というか派生的というか、たまたまそうなっちゃっているのでは?
すると、納得できないのは、ADDのCとAのクリアだけ、ということなのですが、これは、多分ホームページ作成者の単なるコピーミスなのではありますまいか?

●でも、気になるので…、もう少し、探ってみました

まあ、この辺はもうどーでもいいことなのですけれど、でも、なんとなく、気になってしまいます。
そういえば、そうそう、突然に思い出しました。
たしか、どこか、本箱の奥のほうに、「マイコンゲーム21」(産報出版。岸田孝一編)がまだ捨てずに残っていたような…。
やっと、見つけ出しました。

ひょっとしたら…!
巻末に、ありました。
「TK80」の命令セットとフラグの動作が!

それによると、やっぱり、ADDでもSUBでも、INRでもDCRでもP(parity)は変化するようです。

蛇足ですけれど、同書によると、「TK80」(cpu=NEC版8080)のフラグには、本家Intelの8080では空きになっていたbit5に「SUB」フラグが追加されていることがわかります。
おー、このフラグを利用してNEC版8080は、減算後のDAAをやっていたのだ(「第16回」)。

同書記載の資料によって、フラグ変化について、やっとはっきりわかりました(といっても、NEC版の8080についてなのですけれど)。
それによると、論理演算命令の、ANA、XRA、ORA、ANI、XRI、ORIのC(carry)には0クリアの表記があり、またSTCではC=1、CMCではCインバートの記号がありますが、その他の命令で変化するフラグについては、ただ変化を意味する記号のみで、命令によって一意にset/resetされるフラグはないようです。

するとやっぱりさきほどのホームページで、ADD命令でCとA(H)が0になる、というのはミスコピーということでしょうね。

そして、ADD、SUB、INR、DCRでのP(parity)は意味も無く演算結果によって、evenまたはoddを示すように変化するのでしょうね(変なの)。

INR、DCRは当初V(overflow)フラグの回路を入れていたのですけれど、8080にはparityのみあってoverflowを示すフラグ機能は無かったことがわかったため、回路図も訂正し、基板配線からも削除してしまいました(第19回)。

それなのに、いまさら、またP(parity)フラグの回路を追加するだなんて…。
でも、ほんとのことをいいますと、V(overflow)は条件の設定があってそこそこの回路が必要なのですけれど(第21回)、P(paritey)はもうセットが組んであってそこをアクティブにすればよいだけなので、ゲート1個追加するだけなのです。
それはそうなのですけれど、ADDやSUBやINRやDCRの演算結果によってP(parity)フラグをset、resetしてみたって、何の意味もない(はずだと、私は思います)ので、いまさらINR、DCR回路にP(parity)フラグ回路を追加することは致しません。

●算術演算命令のP(parity)フラグには意味は無いのか?

私が、ADDやSUBなどの算術演算命令ではP(parity)フラグに意味が無い、などと繰り返し書いたりすると、きっと、

意味が無いものが、ついていたりはしないでしょう?
また、あなたの単なる思い込みなのでは、ありませんか?

などと言われてしまいそうです。
本当は、8080の設計者にお聞きすればいいのですけれど…。

あー。設計者様は、いらっしゃるじゃありませんか。
8080を企画設計したのは、日本人で、当初ビジコン社という電卓メーカーに勤めていてその後Intelに移られた、嶋 正利氏だそうです。
氏の回顧録がインターネット上に公開されています。時間がたつとリンクが切れてしまうかもしれませんが、とりあえず、ご紹介させていただきます。
嶋 正利氏の「プロセッサ温故知新」です。
この方は確か8080だけではなくて、その後Z80の開発にもたずさわられた、でしたよね?

いくらなんでも嶋 正利氏に直接お尋ねすることはできませんけれど、ちょいと楽しく推理ゲームをすることはできます。

●名探偵の推理

8080にはP(parity)フラグのみあって、V(overflow)フラグはありません。
したがって、ADD、SUB、INR、DCRなどの算術演算命令でPフラグが変化するとすれば、それは計算の結果1のビットが偶数個あればeven、奇数個あればoddということで、あくまでパリティフラグとしてset/resetされるしかありません。

私は算術演算命令においてパリティフラグは何の役にも立たない、と思っているのですが、そうではなくて、仮に、8080の開発当時に、それが意味あるものとして、意図的に設計されたものだったとしましょう。

ところでZ80では8080にはなかったV(overflow)フラグが追加されました。
どこに?
というと、なんとP(parity)フラグと同じビット(bit2)に重ねて追加されたのです。
これは、実に奇妙なことのように思えます。

なぜなら、8080のフラグは「がら空き」だったからです。
8080は8ビットのフラグビットのうち、5ビットを定義しただけでしたので、まだ残り3ビットが未使用のまま空いていました。

嶋 正利氏は、Z80を開発したとき、どうしてV(overflow)フラグを8080で未使用だった残りの3ビットに割り当てないで、わざわざP(parity)フラグに重ねて設定してしまったのでしょうか?

Z80は8080の上位互換CPUというコンセプトのもとに開発されたはずです。
だからこそ、機械語レベルで8080との互換性を維持するために、空いていた残り少ない8ビットコードを利用して、無理矢理2バイトに拡張した多くの命令を詰め込むしかなかった、のだと思います。
そこまではっきりしたコンセプトがあったはずなのに、P(parity)フラグについては、8080との互換性を完全に否定してしまっているというのは、いったいどうしたことなのでしょうか?

新たなフラグを追加するときに、空いているビットに割り当てるというのは、しごく当然の考えで、事実、NEC版8080も減算のためのDAA補正のために、SUBフラグを追加したのですが、それはオリジナルのIntel8080では空いていた、bit5に割り当てたのですし、Z80でも同じ目的で追加したNフラグは、これも8080では未使用であったbit1に割り当てられているのです。

Z80では、ADD、SUB、INR(INC)、DCR(DEC)などの算術演算ではP/Vフラグはパリティフラグとしては機能せず、オーバーフローフラグとして働きます。
ということは、もしも8080で、それらの命令においてパリティフラグが必要だったプログラムがあったとすると、その点については、Z80は8080互換ではないわけで、したがってプログラムの書き換えが必要になってしまうはずです。

先に8080を開発し、次にその上位互換CPUとしてZ80を開発した、同一人である嶋 正利氏が、この点に何の考慮もしなかったとは考えられません。
P(parity)フラグの互換性を維持することは困難なことでもなんでもなく、ただV(overflow)フラグを、Nフラグを割り当ててもなお未使用で残されていたbit3かbit5に割り当てるだけでよいのですから、そのことを考えると、V(overflow)フラグをP(parity)フラグに重ねて割り当てたというのは、むしろ意図的にわさわざそのようにした、のだとしか考えられません。

なぜ?

嶋 正利氏に聞いてみないことには、その本当の理由はわかりませんが、多分、嶋氏自身が8080で算術演算命令の実行によってP(parity)フラグがset/resetされることが気になっていた、のではないでしょうか?
だからこそ、Z80を8080互換として設計したというのに、その互換性を犠牲にしてまで、算術演算命令のP(parity)フラグだけは、上からV(overflow)フラグをかぶせてしまい、新しい機能(overflowフラグ)を追加すると同時に、消してしまいたかった機能(算術演算命令のparityフラグ)をこっそり除去してしまったのではないでしょうか?

以上、名探偵毛利小五郎のおっちゃんの推理でした。

●試作基板が、いよいよ、出来てきそうですよ!

さきほど、基板屋さんから電話がありました。

ハンダレベラ仕上げって依頼なんだけど、レベラの下請けから連絡があって、
「ちょっと配線が混んでいるから、レジストが無いとむつかしいのでは?みんなくっついちゃうよー」
って言うんだけど…。

あー。そうか。そうだよね。うっかりいつものつもりで頼んじゃった。
あ、なら、それ、いいです。レベラ無しってことで。

じゃ、フラックスだけで。

そう、それで、いいです。お願いしまーす。

う、う、う。いよいよ、ですよぉ。
2008.8.8upload

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