スロット

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

  • スロット

スロットと呼ばれる方式はメモリ拡張の仕組みでZ80b物理アドレス64KB空間を
リニアに拡張するのではなく、16KBごとにページングされたアドレス領域を相互に切り替える事で
アドレス空間の拡張と、外部外付けカートリッジへの対応を実現している。

Z80CPUの設計上は64Kbの物理アドレッシングを持つので、このメモリ空間を4つに分割し
16KB単位のページングを行なう。




スロットの16KB単位のページは他の64Kbメモリ空間と切り替える事でメモリを拡張するが、
その基本的なイメージを示す。


0 FFFF
---------------
|p0 |p1 |p2 |p3 |
---------------
p0=0x0
p1=0x4000
p2=0x8000
p3=0xFFFF


CPUのデフォルトの物理アドレス64KBがある。この空間は16KBごと4つの区画に分割されている。
それぞれをp0-p3と呼ぶ。これはメモリ空間の切替の最小単位でもある。

基本スロット拡張メモリアドレス空間(通常はプライマリと呼ぶ)は通常は4つ存在する。
それぞれ16KB領域で区分された4つのアドレスを持つので、この場合アドレスの単純合計は
256KBとなる。
したの例では、ABCDの英字がスロット拡張アドレス、p0-p3が16KB区画のページを意味する。


------------------
|p0  |p1  |p2  |p3 |A
------------------
|p0 |p1 |p2 |p3 |B
------------------
|p0 |p1 |p2 |p3 |C
------------------
|p0 |p1 |p2 |p3 |D
------------------

ここで基本スロットと呼ばれる拡張では、論理メモリー空間がABCDと4つあり、
このアドレス空間が64KB物理アドレスにマッピングされる。
単純な例では物理的にマッピングされる際は、下記のようにページp0,p1はスロットAをポイントし、
ページp2,p3はスロットDをポイントする、という具合に物理アドレスにマッピングされる。

64KB Address

----------------------
|p0,A |p1,A |p2,D |p3,D |
----------------------

注意が必要な点はリニアにアドレスを拡張するものではないことと、ページングは自由自在に
物理アドレス(ページに)割り当てできないこと。

ページp0は同じp0を持つスロットC(p0),D(p0)などと切り替える事は可能だが、スロットC(p2)などと
切り替える事はできない。
p0(ページ0)とはアドレス位置が違うので、他のスロットのページアドレス空間ではアドレスを切り替えられない。
スロット拡張はアドレス空間のページ0との間でしかアドレスフレームをページングすることが出来ない。


この4つの基本スロットと呼ばれる仕組みはさらに拡張スロットと呼ばれる仕組みを持つ。
これはスロット0にさらにメモリアドレスの選択肢を4つ持つもので、一つのスロットAが、
A-AからA-Dまでの4つのアドレス空間を持つ。
基本スロット4に対してさらに拡張スロットが4あるので、16個の論理アドレス空間を
64KBの物理アドレス空間にマッピングすることができる。
この方法で合計1MBのアドレス空間を拡張する。

物理アドレスへの変換は以下のようになる。


16bit Z80 CPU Address ----------+---------> 20bit Phisical Address
|
4bit Slot Extend----------------+

ハードウエア的にはアドレス線がA20まであるのではなく、SLOT信号が設けられ出力される形式
だったはずなので、CS信号のような使い方になる。つまりA0-A15の16bitアドレスと、SLOT信号
4つでアドレッシングする。


スロットのメモリ拡張のアドレッシングはPIOのI/Oポートにより選択される。
実際の利用は専用のAPI(BIOS)を経由して用い、直接PIOポートを制御しない。
スロットを使うメモリ拡張のAPIはROMBIOSにある。APIにはスロット拡張による論理アドレス空間の
メモリーのR/W、APIまたは機械語ルーチンのCALL、スロットページ切替などがある。

スロット関連APIは16KB ROMイメージの作成のslotutil.asm に書かれている内容を参考に、
レジスタ経由で値を渡すC関数を作ればよい。関数はextern宣言され本体はアセンブラで書かれているが
引数の部分やAPI実行前のレジスタ保存などに注意すればよい。
やっていることは単にラッパー関数を作っているだけ。C関数としてアセンブラを呼ぶ方法は理解しておく必要がある。

現代的なWindowsなどのOSではこれらメモリアクセスはOSが管理するが、8bitマシンでは
全ての制御はアプリケーションが意識して管理する事になる。
スロット拡張は物理アドレスをページングしているので、間違えれば当然プログラムは誤動作する。

このスロットと呼ばれるメモリ拡張はMSXの基本的なもので初期の頃から実装されており
外部カートリッジ接続にも対応する仕組み。
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。