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周り | このブログの読者になる | 更新情報をチェックする

2015年11月09日

SD6031/SD6031WIFのファームウエアについて


  そういえば、このブログでアップしていなかったので、SD6031/SD6031WIFの最新版のファームウエアをアップします。


SD6031firm_130610.zip

  通常のSD6031/SD6031WIF用です。
  (http://sbeach.seesaa.net/article/387861570.html
  (http://sbeach.seesaa.net/article/387861572.html



SD6031firm_130723.zip

  HDDモードと4バイト転送モードを実装しています。


  SD6031firm_130723 は、基板を改造してマルチディスク対応にした、SD6031/SD6031WIF用です。
  (http://sbeach.seesaa.net/article/387861586.html
  上記の機能に加えて、マルチディスク対応にしています。
posted by えすび at 23:48| Comment(14) | HW:SD6031 | このブログの読者になる | 更新情報をチェックする

ウィザードリィforP6(7)(ver1.1リリース)

  ウィザードリィ for P6


  88版→P6への変換ツールをリリースします。

  変換ツールの変更のみで、生成された結果は変わりません。
  そのため、以前に既に変換を行っている場合は、新しく実行する必要はありません。


wiz1_p6_ver1_1.zip

wiz2_p6_ver1_1.zip

wiz3_p6_ver1_1.zip


 ・変更内容

  binpaste.exe が実行できない環境があるため、binpaste.exe を使用しないようにした。


  説明などは、同梱のドキュメントを参照して下さい。


  シナリオ#1、#2、#3用です。

2015年11月08日

パレット機能

  テクノウを作るに当たり機能ごとに書くのもいいんですが、画面周りが非常に大変そうなので...
  とりあえずI/Oポート順に攻めてみたいと思います。


  参考文献:Mr.PCテクニカルコレクション 秀和システムトレーディング


○ポート0x40:色番号16(HGRB=1111)のパレット色設定
○ポート0x41:色番号15(HGRB=1110)のパレット色設定
○ポート0x42:色番号14(HGRB=1101)のパレット色設定
○ポート0x43:色番号13(HGRB=1100)のパレット色設定

(ポート0x44〜0x4F:ポート0x40〜0x43のイメージ)


 ・SR以降のみに存在するI/Oポートです。
 ・SRモード(ポート0xC8:bit0=0)以外でも動作します。
 ・書き込みのみ。読み出しはできません(読み出すと0xFFになる)。

  書き込むデータは次の通り。

  bit7-4:don't care
  bit3:Hの反転
  bit2:Gの反転
  bit1:Rの反転
  bit0:Bの反転


◎解説
 いろいろとユーザには理解しがたい仕様のパレット設定です。

 なぜ、4色だけなのか?せめて8色なら88からの移植がラクなのに。
 なぜ、色番号13〜16なのか?せめて色番号1〜8なら、88で出せる色はそのまま使えるのに。

 と、88からの移植にすごく不向きなパレットです。

 設定する値は出したい色の反転を設定します。これもなぜ反転か不明ですが...

 例えば、色番号13に白(HGRB=1111)の設定する場合は、ポート0x43 に 0x00を出力します。


 また、SR-BASICのグラフィック全般に言える事ですが、SR-BASICではVSYNC割り込みを使って、常に画面設定をしています。

 そのため、SR-BASICのコマンドラインから、

 SCREEN 2,2,2:LINE (0,0)-(319,199),16,BF

 の後に

 OUT &H40,&H05

 としても、色番号16の白(HGRB=1111)が、赤(HGRB=1010)になりません。

 SR-BASICではなく、N66-BASIC(MODE5)で同じ事を実行した場合、ちゃんと所望の動作をします。
 (ただし、SCREEN 2,2,2 → SCREEN 3,2,2 とする)


 SR-BASICでは、ポート0x40〜0x43に出力した値をワークエリアに持っています。

 ポート0x40:0xED1F
 ポート0x41:0xED20
 ポート0x42:0xED21
 ポート0x43:0xED22

 これを使って、

 10 SCREEN 2,2,2:LINE (0,0)-(319,199),16,BF
 20 POKE &HED1F,&H05
 30 GOTO 30

 とすると、色番号16の白(HGRB=1111)が、赤(HGRB=1010)になります。



 このパレットが性能を発揮するのは、MODE5の320x200ドット表示の色を変える時ぐらいかも知れません。

posted by えすび at 12:25| Comment(0) | P6解析:画面周り | このブログの読者になる | 更新情報をチェックする

2015年11月07日

66SRキーボード修理

  ちょっと前ですが、某氏の66SRのキーボードを修理しました。

  66SRのキーボードは本体と分かれているために、繋いでいるケーブルを挿すコネクタ周りが故障しやすいです。
  大抵はそのコネクタ(本体とキーボードの両方)を半田付けし直すと直ります。

  今回もそれだろうと思っていましたが、違っていました。


  電池ホルダーへのリード線も断線していたので、そこを修理して電池駆動(赤外線通信)にしたのですが、LEDが光りません。
  ちなみに赤外線LEDは肉眼では光っているのが見えません。デジカメなどを通すと光っているのが分かります。


  ちゃんと調べないとダメそうなので、回路図と照らし合わせてダメな部分を確定させました。

pc6601SR_keyboard1.PNG

pc6601SR_keyboard2.PNG


  電池駆動にして、とりあえずサブCPU の uPD80C49HC(IC401:1ページ目左側)から調べました。

  VCC:5V(OK)
  VDD:0V(?)
  RESET:0V(?)


  このキーボードが電池駆動で動作していない時はパワーダウンモードになります。
  その時は VDD は0Vになりますが、通常動作時は 5V になります。

  回路図を見て、さらにちょっと測定した結果、パワーダウンモードから復帰するには、
 キーボードをどれでもいいから押せばいいことが分かりました。

  キーボードをどれか押すと、74HC30(IC402:1ページ目右上)の出力(nNODATA)が "L"→"H" となります。

  この信号(nNODATA)をクロックとしている D-FFの 40H74(IC404:2ページ目右上)が動き、VDDが "L" → "H" となる回路です。


  で、実際の動作ですが...なぜか 40H74 が動作していませんでした。
  ICの足を直接測定していたんですが、入力は全て正しい値を示しているのに、出力が全然動きませんでした。


  理由は分かりませんが 40H74 が壊れているようでした。

  結局、40H74 を手持ちの 74HC74 と交換すると全く問題なく動作しました。


  珍しく汎用のICが壊れた事例です。

posted by えすび at 17:40| Comment(0) | P6実機:製作・修理・改造など | このブログの読者になる | 更新情報をチェックする

151107_03_テクノウ3草案(能書き)

  最近、P6へのソフトウエア移植ばっかりやっていて、解析記事などがおろそかになっていました。テクノウ Vol.2(回路図篇)も発行してしまったので、次のテクノウvol.3をそろそろ作っていこうかと思います。

  テクノウvol.3をいきなり作っていくのは結構大変なので(挫折が見えている)、あんまりまとまらない感じでブログに書き溜めていき、それを編集するような格好にしたいと思います。

  過去に書いた内容など、重複した部分も出てきますがご容赦を。



posted by えすび at 15:56| Comment(0) | P6解析:その他 | このブログの読者になる | 更新情報をチェックする

マイトアンドマジックforP6(1)(リリース)

  マイトアンドマジック for P6


  88版→P6SRへの変換ツールをリリースします。

mm1p6.zip


  説明などは、同梱のドキュメントを参照して下さい。
  エミュレータでは、PC-6001VW ver309a、PC-6001V ver123 で動作を確認しています。


  ある程度しか遊べてないのでバグがあるかも知れません(特に画面周り)。
  知らせて頂けると幸いです。



  ちなみに実行画面は、↓こんな感じです。


151107_02_マイトアンドマジック実行画面1.jpg

151107_02_マイトアンドマジック実行画面2.jpg

151107_02_マイトアンドマジック実行画面3.jpg

151107_02_マイトアンドマジック実行画面4.jpg


ファンタジー2forP6(1)(リリース)

  ファンタジー2 for P6


  88版→P6SRへの変換ツールをリリースします。

ph2_p6.zip


  説明などは、同梱のドキュメントを参照して下さい。
  エミュレータでは、PC-6001VW ver309a、PC-6001V ver123 で動作を確認しています。

  あまり遊べてないのでバグがあるかも知れません(特に画面周り)。
  知らせて頂けると幸いです。



  ちなみに実行画面は、↓こんな感じです。88版と比べて、オープニングの妖精さんがちょっと老けた?

151107_01_ファンタジー2実行画面.jpg