2015年11月21日

メモリ割り当て

  前回の続きです。


  参考文献: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を生成する回路は、こんな感じです。

151121_01_メモリ割り当て1.jpg



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

151121_01_メモリ割り当て2.jpg



 そのため内部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グラフィックの説明の際に記載します。
posted by えすび at 16:09| Comment(0) | P6解析:CPU周り | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。