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

●INR、DCRのフラグについて

前回、8080のフラグについての説明のところで、なにやら意味深長なことをちらりと書きました。
おわかりになりましたでしょうか?

もういちど、8080のフラグのビット位置を示します。
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
S Z - H - P - C

このビット位置をよーく頭に入れていただいた上で、もう一度、前回説明した結果の値とフラグを見てみることにいたしましょう。
前回の説明と重複しますが、INR rの結果の値とフラグについて確認をしてみます。

結果の値は、
0403 0201 00FF 0405 0004 0403 0002 0001 5400 84FFの部分でした。

実行された結果は、後ろから前に向かっていく順で保存されています。一番後ろのFFがINR Bの結果の値で84がフラグです。
結果の値だけを見ていくと、FF→00→01→02→03→04→05と+1ずつ加算されていることがわかります。
INR命令を実行しているのですから、当然の結果です。
では、その結果の値と合わせて、フラグを見てみることにします。

最初のFFは初期値FEに対してINRを実行した結果として、+1されてFFになりました。
このときのフラグは84です。
10000100です。
ビット7とビット2が1になっています。
ビット7はS(サイン)フラグです。FFは負の数ですからSフラグがセットされます。
2進数の負数については、[第14回]で説明をしています。

では、ビット2は何でしょう?
あれ、P(パリティ)フラグです。

パリティフラグは、Z80では数値演算用のオーバーフローフラグと同じビット位置を共用することになることから、INR、DCRおよびADD、SUBなどの数値演算命令にパリティフラグがあるのはおかしい、というようなことを理由にして、INR、DCRなどの数値演算命令からパリティフラグを外してしまうことを勝手に決めてしまいました。
このあたりの経緯につきましては、INR、DCRとパリティフラグについては[第19回][第20回][第21回]で説明をしています。
またINR、DCR命令からパリティフラグを除外したことについては[第58回]に書きました。

ずっと、そういうことでやってきたのですけれど…。
まあ、それについては後ほど詳しく説明することとしまして、せっかくですからもう少しフラグの動きを見てみます。
次の値は00です。
フラグは54になっています。
01010100です。

結果が0なのですからZ(ゼロ)フラグがセットされます。
FFに+1した結果00になったのですから、ビット3からビット4への繰り上がりが発生しています。
ですからH(ハーフキャリー)フラグもセットされます。
本当はこのときビット7からも繰り上がりが発生しているのですけれど、INR、DCRではC(キャリー)フラグは変化しませんから、Cフラグはセットされません。
ここでもP(パリティフラグ)がセットされています。

次の結果は01です。フラグは00です。
その次の結果は02ですがここでもフラグは00です。

その次に結果の値が03になると、フラグは04になっています。
00000100です。
P(パリティ)フラグだけがセットされました。

●8080のパリティフラグ

パリティというのは、1バイトのなかで1のビットが偶数個あるのか、奇数個あるのかを示す言葉で、データのシリアル伝送(RS232C通信)において、伝送誤りを検出するためのひとつの方法としても使われています。
8080では8ビットの数のうち、1のビットが偶数個あるときに、P(パリティ)フラグがセットされます。

もともと計算の中でパリティを扱ってみても意味のあることではありません。
だいたいはデータ伝送においてエラーが発生したことを検出するために用いられるわけですから、INRとかDCR、あるいはADD命令の結果に対してパリティフラグがセット、リセットされたとしても、それがどのように利用されるのか、首をかしげてしまいます。

ということで、INR、DCR命令については、P(パリティ)フラグを無視することに決めました、という説明を上でもしたのですけれど、でもなんとなく面白くないのですよねぇ。

ときどき引き合いに出します、8080User’sManual、そのINR r命令のところを見てみますと、はっきりと書いてあるのです。


なんたって、All condition flags except CY are affectedですものねぇ。
CYというのは、C(キャリー)フラグのことです。

実は作業が進んで、全部の命令の回路ができてしまった段階で、さらにこうしてほとんどの作業が終わって、あとは仕上げの作業のみ、というところで、あらためてパリティフラグの回路を見てみますと、それほど目のカタキにしてまで、パリティフラグを排除しなければならないというほどのことでもなかったのですよね。
INR、DCR命令と、さらにADD、SUB関係の命令にパリティフラグを復活させるのに必要な回路は、たかだかわずかに2個のORゲートを追加すればよいだけ、ということがわかりました。

うーん。
またもや、追加変更か…。
さらに回路配線図をよーく眺めてみましたら、なんとか空いている74HC32のゲートが利用できそう…に見えてきました。
その間の配線も、なんとか隙間を縫って進めばできないことはない…。
こうなってくると、やっぱり、やるしかないのですよね。

で、やってしまいました。

●パリティフラグの回路です

変更前の回路図は[第179回]にあります。
ですが、戻って見ていただくというのも面倒なことですから、下に再掲することにいたします。

パリティフラグはAND、OR、XORに限定して考えていましたので、論理演算回路の一部として扱っています。
図の下部で74HC86で構成しているのがパリティフラグのために1のビットが偶数個であるか奇数個であるかを検出する回路で、その結果によってパリティフラグをセット(PFset)、リセット(PFres)します。

そしてこちらが、INR、DCR、ADD、SUB関係の命令においてもパリティフラグをセット、リセットするように変更したあとの回路図です。

図の下のほうの真中あたりにある2個のORゲート(74HC32)が、新たに追加したゲートです。
このORゲートによって、図の上部のADD、SUBなどの算術演算回路とパリティフラグ回路がつながりました。
この図の外からになりますが、INR、DCR回路からもINRPFenblという信号を受けることで、パリティフラグ回路がINR、DCRの回路ともつながりました。
2009.6.25upload

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