前回の続きです。
参考文献:Mr.PCテクニカルコレクション 秀和システムトレーディング
○ポート0x60:CPUアドレス:0x0000〜0x1FFFの読み出し設定
○ポート0x61:CPUアドレス:0x2000〜0x3FFFの読み出し設定
○ポート0x62:CPUアドレス:0x4000〜0x5FFFの読み出し設定
○ポート0x63:CPUアドレス:0x6000〜0x7FFFの読み出し設定
○ポート0x64:CPUアドレス:0x8000〜0x9FFFの読み出し設定
○ポート0x65:CPUアドレス:0xA000〜0xBFFFの読み出し設定
○ポート0x66:CPUアドレス:0xC000〜0xDFFFの読み出し設定
○ポート0x67:CPUアドレス:0xE000〜0xFFFFの読み出し設定
○ポート0x68:CPUアドレス:0x0000〜0x1FFFの書き込み設定
○ポート0x69:CPUアドレス:0x2000〜0x3FFFの書き込み設定
○ポート0x6A:CPUアドレス:0x4000〜0x5FFFの書き込み設定
○ポート0x6B:CPUアドレス:0x6000〜0x7FFFの書き込み設定
○ポート0x6C:CPUアドレス:0x8000〜0x9FFFの書き込み設定
○ポート0x6D:CPUアドレス:0xA000〜0xBFFFの書き込み設定
○ポート0x6E:CPUアドレス:0xC000〜0xDFFFの書き込み設定
○ポート0x6F:CPUアドレス:0xE000〜0xFFFFの書き込み設定
・SR以降のみに存在するI/Oポートです。
・SRモード(ポート0xC8:bit0=0)以外では動作しません。
・書き込みのみ。読み出しはできません(読み出すと0xFFになる)。
書き込むデータは次の通り。
bit7-4:割り当てるメモリの種別
bit7-4=0000:内部RAM(VRAM)
bit7-4=0010:外部RAM(拡張RAM)
bit7-4=1011:外部ROM1(拡張ROM(nCS2):通常、0x6000〜0x7FFFに割り当てる)
bit7-4=1100:外部ROM2(拡張ROM(nCS3):通常、0x4000〜0x5FFFに割り当てる)
bit7-4=1101:CGROM
bit7-4=1110:SYSTEMROM2(音声合成/漢字)
bit7-4=1111:SYSTEMROM1(BASIC-ROM)
それ以外は未使用
bit3-1:割り当てるメモリの先頭アドレス(アドレスバスA15-13に出力する値)
bit0:常に"0"
◎解説
CPUからメモリなどにアクセスする際に、8Kバイトごとに自由に割り当てる事が出来る機能です(内部RAMは制限あり。後述)。
SRモード専用の機能で、SRモード以外は使用できません。mk2/66モードのポート0xF0〜0xF2に似たような機能がありますが、ポート0xF0〜0xF2はバンク切り替えのイメージです。
設定値の与え方がちょっと分かりにくい(特にbit3-1)ですので、具体的な例を挙げてみます。
SYSTEMROM1(BASIC-ROM)の0x8000〜0x9FFFを、0x0000〜0x1FFFから読み出したい場合は、
・設定するポートは、0x0000から読み出すので、ポート0x60に書き込む。
・設定値bit7-4=SYSTEMROM1(BASIC-ROM)、1111
・設定値bit3-0=エリアの先頭に0x8000を割り当てるから、0x8=1000
となって、ポート0x60に0xF8を書き込む。
外部RAM(拡張RAM)の0x6000〜0x7FFFを、0x4000〜0x5FFFから書き込みたい場合は、
・設定するポートは、0x4000から書き込むので、ポート0x6Cに書き込む。
・設定値bit7-4=外部RAM(拡張RAM)なので、0010
・設定値bit3-0=エリアの先頭に0x6000を割り当てるから、0x6=0110
となって、ポート0x6Cに0x26を書き込む。
このメモリ割り当て機能ですが、回路的にはCPUアドレスのA15-13を入力として、新しくアドレスRA15-13を生成する回路と、チップセレクトを生成する回路になります。
A15-13からRA15-13を生成する回路は、こんな感じです。

メモリアクセスに関しては、すべてRA15-13を使うのですが、内部RAM(VRAM)だけは、RA15-14とA13を使っています。多分バグだと思われます。

そのため内部RAM(VRAM)に関しては、以下のような動作になります。
○ポート0x60:CPUアドレス:0x0000〜0x1FFFの読み出し設定
○ポート0x62:CPUアドレス:0x4000〜0x5FFFの読み出し設定
○ポート0x64:CPUアドレス:0x8000〜0x9FFFの読み出し設定
○ポート0x66:CPUアドレス:0xC000〜0xDFFFの読み出し設定
○ポート0x68:CPUアドレス:0x0000〜0x1FFFの書き込み設定
○ポート0x6A:CPUアドレス:0x4000〜0x5FFFの書き込み設定
○ポート0x6C:CPUアドレス:0x8000〜0x9FFFの書き込み設定
○ポート0x6E:CPUアドレス:0xC000〜0xDFFFの書き込み設定
内部RAM(VRAM)を割り当てる場合は、以下の値しか取れない。
0x0000〜0x1FFF:書き込むデータbit7-0=00000000
0x4000〜0x5FFF:書き込むデータbit7-0=00000100
0x8000〜0x9FFF:書き込むデータbit7-0=00001000
0xC000〜0xDFFF:書き込むデータbit7-0=00001100
○ポート0x61:CPUアドレス:0x2000〜0x3FFFの読み出し設定
○ポート0x63:CPUアドレス:0x6000〜0x7FFFの読み出し設定
○ポート0x65:CPUアドレス:0xA000〜0xBFFFの読み出し設定
○ポート0x67:CPUアドレス:0xE000〜0xFFFFの読み出し設定
○ポート0x69:CPUアドレス:0x2000〜0x3FFFの書き込み設定
○ポート0x6B:CPUアドレス:0x6000〜0x7FFFの書き込み設定
○ポート0x6D:CPUアドレス:0xA000〜0xBFFFの書き込み設定
○ポート0x6F:CPUアドレス:0xE000〜0xFFFFの書き込み設定
内部RAM(VRAM)を割り当てる場合は、以下の値しか取れない。
0x2000〜0x3FFF:書き込むデータbit7-0=00000010
0x6000〜0x7FFF:書き込むデータbit7-0=00000110
0xA000〜0xBFFF:書き込むデータbit7-0=00001010
0xE000〜0xFFFF:書き込むデータbit7-0=00001110
また、書き込むデータbit3-1が、RA15-13に出力されますが、内部RAM(VRAM)使用時はRA13は未接続のために、bit1は無視されます。
上記制限のため、例えば
CPUアドレス 0x0000〜0x1FFF に、内部RAM(VRAM)0x4000〜0x5FFF を割り当て
CPUアドレス 0x2000〜0x3FFF に、内部RAM(VRAM)0x2000〜0x3FFF を割り当て
CPUアドレス 0x4000〜0x5FFF に、内部RAM(VRAM)0x0000〜0x1FFF を割り当て
CPUアドレス 0x6000〜0x6FFF に、内部RAM(VRAM)0x2000〜0x3FFF を割り当て
はOK(複数から同じRAMに割り当ててもOK)なのですが、
CPUアドレス 0x0000〜0x1FFF に、内部RAM(VRAM)0x2000〜0x3FFF を割り当て
CPUアドレス 0x2000〜0x3FFF に、内部RAM(VRAM)0x0000〜0x1FFF を割り当て
はNGです。
また、内部RAMはVRAMとして使用されていますが、メモリ割り当てではあくまでもCPUからのアクセスアドレスが変わるだけなので、画面表示への影響はありません。
さらにVRAMでビットマップモードを使用した場合は、メモリ割り当てでアドレス変換された後に、ビットマップ変換がされます。詳しくはSRグラフィックの説明の際に記載します。