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

●ND80ZHのメモリマップ

あれこれ悩んだ末に決定した、Z80版TK80ボード(ND80ZH)の最終的なメモリマップです。

このようなメモリマップに落ち着く前は、MYCPU80と同じ「TK80モニタプログラム」を0000番地台に置いて、さらにその後ろにND80Zモニタプログラムを置き、両者はディップスイッチで切り換えて選択できるようにする、というものでした。
システムのワークエリアはRAMの一番終わりのアドレス、FFxx番地台に置くようにしていました。

しかし、それではオリジナルのTK80用プログラムがワークエリアとして83xx番地台を使っているため、そのようなプログラムをND80ZHで実行させようとすると、システムワークエリアのアドレスとして使っている83xxをFFxxに書き直さなければ、実行させることができません。

そこで上図のメモリマップのように、0000番地台に置くTK80モニタプログラムは、システムワークエリアを、オリジナルのTK80モニタプログラムと同じように、83xx番地台に置くように変更しました。

しかし、すると、ここでひとつ悩ましい問題が出てきてしまいます。
もともとND80Zモニタプログラムは、7セグメントLED表示ルーチンとか、キー入力ルーチンとかの基本的なサブルーチンも、当然のことながら、ND80Zモニタプログラムの一部としてもっていたのですが、それをND80ZHに移植する段階で、TK80モニタプログラム内のサブルーチンをCALLする形に書き改めたのです。
TK80モニタプログラムがROMBIOSで、ND80Zモニタプログラムがその上にあるOSのようなイメージの構成にしたのです。

前回も書きましたように、今回のND80ZHのモニタプログラムのうちの、TK80モニタプログラム部分は、MYCPU80のための「TK80モニタプログラム」でした。
そのシステムワークエリアはFFxx番地台にあります。
ND80ZモニタプログラムもND80ZHに移植するときに、そのシステムワークエリアをFFxxに置くように書き直しました。
ND80ZHのRAMエリアはMYCPU80と同様に8000〜FFFFの32KBで、7セグメントLEDの表示用データバッファもそのRAMの一番最後のアドレス、FFF8〜FFFFに置かれていますから、そこにシステムワークエリアもまとめて配置するのがごく自然で合理的であるからです。

そのように考えていたのですけれど、そのうちのTK80モニタプログラムについては、ソフトウエアの互換性の観点から、システムワークエリアをFFxxから83xxに変更することにしました。
それならND80Zモニタプログラムのワークエリアも、83xxに移動してしまうか、といいますと、いやあ、それはちょっと方向がおかしいのではありませんか。

TK80用のプログラムはもともと8000〜83FFの範囲のプログラムであったはずですから、その後ろの8400〜FFFFの範囲のRAMエリアは互換性の上からは有っても無くてもどちらでもよいことになります。
しかしND80Zモニタプログラムとしては、そこまでTK80互換にこだわる必要は無いはずですから、するとワークエリアを83xxに置いたりしたら、ユーザーズエリアが8000〜の部分と、8400〜の部分に分断されてしまいます。
それは、いかにもまずいでしょう。

ならばND80ZモニタプログラムはTK80モニタプログラムから切り離して、移植前のように、LED表示ルーチンやキー入力ルーチンも含めた完全に独立したモニタプログラムに再度書き直すか、といいますと、それもしんどい話です。
納期が迫っていることでもありますし、いかにも後ろ向きの作業のようで面白くありません。

かといって、このままでは、ワークエリアを変更してしまったTK80モニタプログラムのキー入力ルーチンなどを、そのままND80ZモニタプログラムがCALLして使うことはできません。

というようにあれこれ迷った挙句、さきほどお見せしましたメモリマップに落ち着きました。
0000〜にオリジナルと同じTK80モニタプログラムを置きます。
このモニタプログラムのRAMワークエリアは7セグメントLED表示バッファを除いては、オリジナルと同じ83xxにあります。

そのTK80と全く同じ動作をするモニタプログラムを0400〜にも置きます。
こちらのモニタプログラムのRAMワークエリアはFFxxにあります。

そしてND80Zモニタプログラムはそのさらに後ろの、0800〜に置きます。
ND80ZモニタのRAMワークエリアもFFxxにあります。
ND80Zモニタプログラムは、0400〜に置いた方の「TK80モニタプログラム」のサブルーチンをCALLします。
これならば何も問題はありません。

この3つのモニタプログラムはディップスイッチで切り換えて選択できるように考えてあります。

●ND80ZHのRAMメモリマップ

ROMのプログラムがそのように3つのモニタプログラムから構成されることになってしまったため、RAMのワークエリアもそれぞれのモニタプログラムによって使われ方が異なってきます。
そこのところはちょっとややこしいことになってしまいましたので、RAMの詳細なメモリマップを作成いたしました。

各モニタプログラムを選択したときのワークエリアの配置を並べて比較できるようにしてみました。
RAMアドレスの8000〜FFFFの広い範囲をカバーするために、ちょいとムリな書き方になってしまいました。
タテ方向の長さは実際のメモリアドレスを等分に表しているものではありません。


図中太線で囲んだ範囲は、各モニタで共通しているワークエリアであることを示しています。
RSTジャンプテーブルはオリジナルのTK80モニタプログラムでは83xxに置かれていましたが、そのままでは都合が悪いので、RST命令によるジャンプ先はFFxxに置くことにしました。
0000〜のTK80モニタプログラムに対しては、RST命令によって、一旦FFxxのジャンプテーブルにジャンプしたあと、そこからさらに83xxのジャンプテーブルに行くようにしてあります。

これで、やっとのことで、途中から気になりだしていた互換性の問題は片付いたかに思えたのでありますが、まだ問題は残っていた、のでありました。

ああ。本日は、ちょいと疲れてしまいましたので、この続きはまた次回にいたします。
2010.3.7upload

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