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

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第296回]


●READ DEC回路

前回からの続きです。
前回は、IMSAI8080にはREAD DEC(READ DECREMENT)の機能はありませんでした(と思います)、と書きました。
IMSAI8080のフロントパネルの機能を踏襲したE−80(仮称)ミニコンにも、その機能はありません。
READ(ADDRESS SET & READ)は、ハードロジックで組んだJP命令(C3H)をCPUに実行させることで、その機能を実現しています。
READ NEXT(READ INCREMENT)は同様にしてNOP(00H)をCPUに実行させることで実現しています。
しかしREAD DEC(READ DECREMENT)の機能を同じ方法で実現することは、IMSAI8080に使われていたCPU、8080ではきわめて困難だったと思います。

Z80ならば、できるのでしょうか?
というのが前回の設問でした。
皆様。お分かりになりましたでしょうか?

Z80には8080になかった多くの命令が追加されています。
その中でも強力な命令と目されるもののうちのひとつが、これから説明をいたします相対ジャンプ命令 JR です。
8080には絶対アドレスを指定するジャンプ命令しかありませんでした。
HLレジスタの値をジャンプ先アドレスにするPCHLだけがそれに近い使い方ができるものでしたが、真の意味での相対ジャンプ命令ではありませんでした。
相対ジャンプ命令は、リロケータブルなプログラム(再配置可能)なプログラムを書くときに必要になってきます。
Z80で追加されたこの機能は特筆すべきもののひとつです。

普通のジャンプ命令とどう違うか、といいますと、普通のジャンプ命令 JP では、ジャンプ先のアドレスを直接指定します。
JP (HL) −−8080ではPCHL−− は間接的に指定しますが、それでも事前にジャンプ先アドレスをHLレジスタに入れておきますから、アドレスをそのまま指定していることに変わりはありません。

これに対して相対ジャンプ命令は、ジャンプ先アドレスを直接指定しません。
その代わりに現在その命令が置かれているアドレスから+○○バイト先に、または−○○バイト前にジャンプせよ、というように指定します。
たとえば「○丁目×番地に行きなさい」というのが絶対ジャンプ命令です。
「今いるところから3軒右の家の前に移動しなさい」というのが相対ジャンプ命令です。

もうお分かりいただけたことと思います。
READ DECを実現するには、この相対ジャンプ命令を使って、「1つ前のアドレスにジャンプする」ようにすればよいのです。

実際にその命令を書きますと
JR −3 (16進数コード18FD)
になります。
ND80ZV(ND80Z3.5)に付属しております、当社オリジナルのZ80アセンブラでは定数は16進数表記のみですから、
JR FD (16進数コード18FD)
になります。

JR −1(JR FF)ではないことに注意してください。
JR命令に限らずその命令およびオペランド(データ部)がCPUに読み込まれた時にPC(プログラムカウンタ)を次のアドレスに進めておく、というのはごく普通の動作であるからです。

実はデバッグの過程で、Z8S180(おそらくHD64180も同じ)ではその当たり前の動作にも例外があることに気付かずしばらく悩むことになったのですが、そのことにつきましてはいずれのちほどお話する機会もあるかと思います。

とにかく、そういうことで、たとえば現在のアドレスが8005Hだったとしますと、そこに書かれたJR命令
8005 18
8006 FD
をCPUが読んだ時点で、PC(プログラムカウンタ)の値は、8007Hになってしまっていますから、8004Hにジャンプするには、JR −3 にしなければなりません。

実際の回路です。
強制的に、コード”18”および”FD”をデータバスに挿入する部分です。
”C3” ”00” と同じ考え方の回路です。

D0〜D2、D5〜D7をダイオードを介してLレベルにすることで、コード”18”をデータバスに乗せています。
またD1のみをダイオードを介してLにすることでコード”FD”をデータバスに乗せています。
各ダイオードの先の回路は、以前に何回かお見せしました。

いままでお見せした回路にコード”18”とコード”FD”を出力する回路を加えました。
回路の動作は”C3”の場合とよく似ていますから、”C3”のための回路をそのまま利用するように考えました。
上の回路では、”C3”を出力するか、”18””FD”を出力するかを選択する回路が隠れています。
その隠れている部分は、前回書きましたもうひとつの問題点、スイッチをどうするかということに関係しています。
ちょっと本日は時間がなくて、そこまでは説明できそうにありません。
ですので今回はスイッチ部分は伏せたまま、ということにいたします。
そのあたりにつきましては、次回に説明することにいたします。

ワンボードマイコンでCP/Mを![第296回]
2013.1.17upload

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