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

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

[第458回]


●物理メモリアドレスをアクセスする仕組みについて

前回ではZ8S180(Z80)が通常アクセスできる64KBのメモリアドレス(0000〜FFFF)をコモンエリアとバンクエリアに分割する仕組みについて説明しました。
しかしそれだけでは64KBを越えるメモリをアクセスすることはできません。
そもそもなぜコモンエリアなのか、なぜバンクエリアなのか、が理解できなければそこから先の理解ができません。

Z80CPUは皆様ご存知の通りアドレス0000〜FFFFの64KBのメモリ空間しかアクセスできません。
そのことはソフト面から見たときにはZ8S180でも同じです。
ただZ8S180はハード的には1MBのメモリ空間(アドレス00000〜FFFFF)をアクセスすることができます。
ソフトとしては64KBしかアクセスできない機能(命令)を使って、ハード的にアクセス可能な1MBのメモリ空間になんとかアクセスしてしまおうとするのがメモリバンクの仕組みです。

1MBのメモリをアクセスするには20ビットのアドレスライン(A0〜A19)が必要です。
ここでたとえばA16〜A19をI/O(たとえば82C55)の出力につないでおいて、その出力を0〜Fまで切り換えれば、1MBのメモリを16個に分割して通常のZ80の命令でアクセスすることができます。
原理的にはそれがメモリバンクの考え方になります。
そのような回路は実際に作ることが可能ですが、そのようにすると困った問題が出てきます。

たとえば上の例で、I/O出力によって最初A16〜A19を’0’(バイナリ表現では0000)にして物理アドレスの00000〜0FFFFをアクセスしていたとします。
当然今実行中のプログラムはその範囲内にあります。
そしてプログラムでI/Oからの出力を’1’(バイナリ表現では0001)にしたとします。
すると瞬時にメモリバンクが切り換えられ、今0000〜FFFFとしてアクセスしていたメモリ空間が00000〜0FFFFから10000〜1FFFFに変わってしまいます。
当然プログラムそのものが変わってしまいますからCPUが暴走してしまいます。

そうならないために、バンク切り換えで影響を受けない「固定した」コモンエリアが必要なのです。
バンクを切り換えるときには、必ずそのプログラムはコモンエリアに置いて実行します。
そうすればメモリが切り換わっても今実行中のプログラムは影響を受けません。

ということで、コモンエリアとバンクエリアのそれぞれを物理メモリに割り当てる必要があることがおわかりいただけたと思います。
この仕組みはND80ZV(ND80Z3.5)用のCP/M互換DOSのシステムでも使っています。

下の図はそのメモリバンクの切り換えを説明した図です([第160回]参照)。



アドレス8000〜FFFFは固定していますから、ここがコモンエリアです。
アドレス0000〜7FFFはI/Oの出力によってROMとRAMが切り換わりますから、ここがバンクエリアです。
原理的にはこれと同じ仕組みをZ8S180ではもっと大掛かりにかつフレキシブルにして最大1MBのメモリに対して行なうことができます。

それではいよいよ、どうやってコモンエリアとバンクエリアのそれぞれに物理メモリを割り当てるか、その方法について説明をするところまでやってきたのですが、ここでまた、時間がなくなってしまいました。
ですので、この続きは次回にすることにいたします。

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

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