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

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

[第459回]


●論理アドレスから物理アドレスへの変換

前回までのところで、Z8S180では、ソフトウェアで直接指定できるメモリアドレス0000〜FFFFの64KBのメモリ空間をバンクエリアとコモンエリアに分割して扱うということを説明しました。
しかしそれは前回説明しましたように、メモリバンクを切り換えたときにプログラムが暴走してしまうのを防ぐための仕組みなので、それだけでは64KBを越えるメモリをアクセスできるようにはなりません。

Z8S180(Z80も同じ)のレジスタは8ビットか16ビットです。
8ビットのレジスタLとHを直列につないで16ビットのレジスタとして、それでメモリアドレスを指定できるように、たとえばHLレジスタとDEレジスタを直列につないで32ビットのメモリアドレスを示すようにできればよいのですけれど、Z80にもZ8S180にもそんな都合の良い仕組みはありません。
それでは16ビットしかないレジスタを使ってどうやって20ビットのメモリアドレスを指定しているのでしょうか?

そのために今まで説明をしてきましたコモンエリアとバンクエリアを物理アドレスに結びつけるI/Oレジスタが用意されています。
CBR(コモンベースレジスタ、0038H)とBBR(バンクベースレジスタ、0039H)です。

その名の通りCBRはプログラムで指定する16ビットのメモリアドレスがコモンエリアの範囲内である場合に、そのアドレス(論理アドレス)を1MBのメモリをアクセスできる20ビットの物理アドレスに変換するためのベースアドレスを保持するレジスタです。
同様にBBRは16ビットの論理アドレスがバンクエリアにある場合に、その論理アドレスを20ビットの物理アドレスに変換するためのベースアドレスを保持するレジスタです。

下の図はCBRとBBRのリセット直後の値(どちらも00H)のときの論理アドレスと物理アドレスの関係を示しています。

物理アドレスの00000〜0FFFFがそのままプログラムで直接アクセスできるメモリ空間(0000〜FFFF)に割り当てられています。
そういうことなのですが、しかしこれではなんのことだかさっぱりわかりません。

そこで下の図を見てください。
これはCP/Mモードのときに物理アドレスの10000〜17FFFをバンクメモリ(0000〜7FFF)に割り当てているところです。

コモンエリアは変わりませんからCBRはデフォルト(00H)のままです。
BBRには図のように10Hを指定します。

何をやっているかといいますと、図の下部に示しましたように、BBR、CBRは20ビットのメモリアドレスのうちの上位8ビットを示しているのです。
そしてその8ビットの値と16ビットの論理アドレスを加算して20ビットの物理アドレスが算出されます。
この例ではBBRと論理アドレスのORを取っているようにも見えますが、ORではなくて算術加算されます。

分かりやすいようにBBRの下位4ビットは0にしていますが、0以外の値を置くこともできます。
E−80の場合バンクエリアは32KBですから、物理アドレスも32KBずつに分割するようにすることがもっとも合理的です。
その場合には、BBRの値は、10H、18H、20H…というように8刻みの値になります。

説明の途中ですが、本日もまた時間がなくなってしまいました。
この続きは次回にいたします。

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

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