2014年05月29日

SD6031WIFをmk2、mk2SRで使用する

  SD6031WIF は、基本は初代PC-6001用です。

  初代機で使用するために、拡張ROMと拡張RAMが搭載されています。
  その拡張ROM/RAMは、他の4機種でも使用する事が出来ます。RAM拡張の改造をすれば、64KRAMのカートリッジとしても使えます。

  ただ、mk2、mk2SRで使用する場合は、SD6031WIF上のSDカードでのFDDアクセスは出来ずに、別にSD6031が必要になります。


  これはもったいないので、SD6031WIF上のSDカードをFDDとして使おうというものです。
 (この案は他の人に聞いたものです)


 ○メリット
  ・SD6031WIFだけで、5機種全てのFDDエミュレータとして使える。
  ・拡張ROM、拡張RAMが5機種全てで使える。
  ・SD6031 に必要だった、DCコネクタが不要になる。


 ○デメリット
  ・mk2、mk2SRで使用する際には、8255を取り外す必要がある。



 ○使用方法

  1)SD6031WIFの8255を取り外します。
  2)mk2、mk2SRの背面のFDDコネクタからケーブルをつなぎ、8255が挿入されていたソケットに接続します。

  後は通常通りの使用方法になります。


 ○回路図

140529_01_SD6031WIF_connect.PNG



  FDDコネクタと8255のソケットへの配線だけです。PC7〜PC0のピン番号がちょっと変則的なので注意が必要です。

  リセットやGNDは接続しません。


 ○実装

  FDDコネクタへの配線は特に問題ないと思います。

  8255のソケットへは、うまく配線する必要があります。

  8255のソケットは、あくまでICソケットですので、薄い板しか挿し込めません。そのため、同じ40ピンのICソケットを使って配線しました。

140529_01_ケーブルソケット部.jpg



  また、これをSD6031WIFに実装するとこんな感じです。

140529_01_ケーブル装着後.jpg



  P6のカートリッジ挿入口に入れるため、高さを出来るだけ低くする必要があります。

  また、左側(AVR側)に配線を寄せておいた方がいいです。



posted by えすび at 19:19| Comment(1) | HW:SD6031 | このブログの読者になる | 更新情報をチェックする

2014年05月28日

SD6031WIFの64KバイトRAM実装の改修

  以前にアップした、SD6031WIFの64KバイトRAM実装についてです。


  RAMを64Kに拡張した場合、初代PC-6001では使用できなくなります。
  これは、初代PC-6001が対応していないためで、初代PC-6001+PC-6006SRでも同様に使用できません。


  これだと困るので、64Kと16Kが切り替えられるように回路を変更しました。

  前の64Kの改造も参考にして下さい。



 ○必要な部品

  ・74LS138 1個
  ・SRM2B256SLMX55(32KバイトSRAM) 1個


  16K切り替えにさらに以下を追加
  ・74LS02  1個
  ・抵抗10K 1個
  ・スイッチ 1個


 ○回路図

140528_01_SD6031WIF_64k_16k(2).PNG

  '15-06-14 回路図を一部修正しました。

  点線内はSD6031からの追加回路です。変更部分以外は記載していません。

  64Kの改造からの変更は、左の点線内の追加回路になります(74LS02と10KとSWの追加)。


  64Kの改造から、A14、A15のアドレス線に対して、それぞれ 74LS02 を追加します。


  実はスイッチをどこに実装するかが一番問題になるかも知れません。私の場合は、PC-6001/6601の切り替えスイッチの隣にジャンパピンを設けるようにしました。当然、基板の穴あけが必要になります。

  74LS02 は、64Kの改造の際に貼り付けた74LS138の上に、貼り付けています。
  74LS02 の足を曲げて先の方を切る際に、1ピン、7ピン、14ピンを残しておくと、後の配線がラクになります。


  74LS02 の代わりに74LS32を使う事も可能ですが、ピン配置が違うので注意して下さい(74LS02のピン配置が他のと違う)。



  実際に組み立てたのがこれになります。右の方の緑色のジャンパピンが16K/64Kの切り替えになります。

結線完(1).JPG



posted by えすび at 19:32| Comment(3) | HW:SD6031 | このブログの読者になる | 更新情報をチェックする

2014年05月26日

SRのピギーバックROMについて

  ツイッターで話題になっていたのを調べました(^^;)


  初期の、というか大抵のmk2SR、66SRに搭載されているROMで、なぜか2階建てのROMがあります。
  親子亀みたいに、ROMの上にROMを実装しているものです(ピギーバックという)。

  mk2SR だと IC6、66SRだと IC9 です。


  なぜわざわざこういう事をしているかですが、どうも不具合対応のようです。
  ROMなのでプログラムが入っているワケですが、そのプログラムに致命的なバグがあったので、急遽EPROMを使って改修したのだと思います。


  ちゃんとバグなしの、普通のROMのmk2SR/66SRも存在するようです(うちのmk2SR/66SRは、両方とも親子亀でした)。


  バグありの方は、型番が HN613256 N63 で、バグなしの方は、HN613256 N95 です。
  N63とかN95とかいうのはマスク番号と呼ばれるもので、マスクROMの場合はROMのバージョン番号のようなものです。


  で、面白そうなので、どんなバグだったのかを調べてみました。


  そのままでは調べられないので、ちょっと加工します。

  これがその親子亀のROMです。見づらいですが2階建てです。

piggy1.jpg



  さらにソケットに挿して3階建てにします。そして、上のマスクROMからのみ出力がるように加工します。

piggy2.jpg



  後は通常通り、saver3で吸い出し、普通のROMと比較しました。


  修正された箇所は、音声合成のルーチンです(SYSROM2.64の0x4000〜)。
  FD周りが修正されたのかと思ったのですが、音声合成のルーチンが変更されています。

  比較した結果ですが、処理が増えている場所があり、その影響でアドレスがずれたりしていました。
  しかし、本質的には、5箇所のようです。


 1)66-BASIC と SR-BASIC の区別方法の修正(0x4016〜0x401C)
  音声合成ルーチンは、66-BASICでもSR-BASICでも、同じものが使われるようです。この際、どちらのBASICで動いているかの区別をしているような

のですが、その判別方法に問題があったようです。

  修正前は、アドレス0x0000のデータが0xC3ならばSR-BASICと判断してます。完全に間違いですが(^^;)...


 2)0x40D5〜0x40FFが0x00に変更されている
  修正前は何かのプログラムが入っています。

  CALL 0x0ADC とか、LD HL,(37C1H) とかあるので、どうもROMではない他のソフトのルーチンが入っているように思えます。
  CP/Mのプログラムかなぁ...


 3)何かのルーチンで分岐条件が一つ削除されている(0x42D5〜0x42D8)
  詳細はよく分かりません。


 4)0x43A8の後に処理が追加されている
  追加されている処理は、66-BASICの時のリード側のバンク切り替え処理です。

  SR-BASICでは、リード側のバンク切り替えは、ポート0x60〜0x67で行いますが、66-BASICでは、ポート0xF0、0xF1で行います。
  66-BASICでの、リードのバンク切り替え処理を追加しているみたいです。


 5)0x56B2〜0x56BFが0x00に変更されている。
  修正前は何かのプログラムが入っています。

  こっちは音声合成処理の一部のようなんですが、未使用なので上記4)の処理を追加するために削除されたようですね。



  多分...66-BASICでの音声合成のテストが不十分だったのか、工程的に後回しだったために、かなり後に発見されたバグのようですね...

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

2014年05月21日

SRのVRAMについて(4)

  SRのVRAM関連を調べていて(というか違うプログラムを作っていて)、どうもハードウエアのバグらしきものを見つけました。


  発生条件が確定していないんですが、今の所

  ・MODE6でグラフィックを2画面使う。
  ・ポート0xC9 で画面を頻繁に切り替える。

  画面を切り替えた時に、たまーに書き込んでいない部分のVRAMに、データが書き込まれます。

  どうも、ページ切り替えと、画面表示で、NGなタイミングがあるようなんですが、詳細を調査中です。
 

  MODE6 のテキスト2画面や、テキストとグラフィック、さらには、MODE1〜5に関して同じ問題が発生するかどうかは不明です。
 (多分、MODE1〜5は大丈夫だと思うんですが...)

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

2014年05月17日

mk2SRで66SRのメニュー画面を出す

  タイトル通りです(^^;)


  66SRとmk2SRのROM内容は、キャラクタROMやBASIC-ROMなど、全て同じです。

  じゃあ、という事で、mk2SR上で、66SRの起動メニューを表示させてみます。


・やり方

  1)SR-BASICを起動します(MODE=6)。
  2)mon コマンドでモニタに入ります。
  3)SA000 で、A000から以下のデータを入力します。

   FD 21 03 E2 DD 21 53 62 AF 3C C3 76 E6

  4)B でモニタを抜けて、EXEC&HA000 を実行します。


LD IY,0E203H
LD IX,06253H
XOR A
INC A
JP 0E607H ; ポート0x63=0xE2にして、JP 6253Hをする




  当然、66SRでmk2SRの起動メニューも出せます。

  1)SR-BASICを起動します(MODE=6)。
  2)mon コマンドでモニタに入ります。
  3)SA000 で、A000から以下のデータを入力します。

   FD 21 03 E2 DD 21 53 62 AF C3 76 E6

  4)B でモニタを抜けて、CLS:EXEC&HA000 を実行します。


LD IY,0E203H
LD IX,06253H
XOR A
JP 0E607H ; ポート0x63=0xE2にして、JP 6253Hをする



  一発ネタですね(^^;)

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

2014年05月15日

P6のフロッピー関連(4)

  SRを含めて、ディスク周りの話です(余りまとまってません)。


1.内蔵ドライブの起動時のドライブの認識

  66/66SRは内蔵ドライブを持っていますが、ドライブの認識は次のように行います。

  起動時に、まず内蔵ドライブ1、2に対して、SPECIFYコマンドを発行した後、RECALIBRATEコマンドを発行します。この時、ドライブが接続されていないと、レスポンスが返ってきません。タイムアウトになれば、そのドライブは接続されていないと認識します。

  また、背面のドライブ数切り替えスイッチは、nDS0、nDS1 を物理的に接続するか、切断するかを切り替えています。ドライブ数0にした場合は、nDS0、nDS1は接続されず、ドライブ数1は、nDS0のみ接続されます。

  さらに、READY信号を使っていないため、BASICでは「常にドライブにはディスクが入っている」という認識です。

  そのため、起動時にドライブが存在した場合は、必ずドライブ1のディスクのトラック#0セクタ#1が読めるまで、ずーーっと待っています。タイムアウト処理でスキップするようにすればよさそうなんですけどねぇ。


2.SRの1D/1DDについて

  66SRは、1DDドライブを積んでいます。

  66との互換を図るため、1Dのディスクを読めるようにBASICが対応していますが、66SRの1DDドライブは、物理的には、1DDのディスクしか読めません。

  1Dのディスクを読む時は、1DDのディスクの偶数トラックに相当する部分を読んでいるだけです。トラック間隔が丁度2倍になるので、この方法で読み込めます。

  トラック#0セクタ#1が"SYS"で始まっているディスクは、起動時に1Dと判断します(起動時に1度だけ判断します)。BASIC内部で1D/1DDのフラグを持っており、トラック間隔を2倍にするかどうかを決めています。

  1Dのディスクに書き込む時も同様なのですが、1Dに比べてトラック幅が狭いため、書き込みが不安定だったり、66などの1Dドライブで読み込めない事があるようです。


posted by えすび at 19:17| Comment(4) | P6解析:FDC周り | このブログの読者になる | 更新情報をチェックする

2014年05月12日

SRのVRAMについて(3)

  SRのVRAMのアクセス関連の調査中です。


  先日挙げた、


 ○グラフィックモードの場合


 ☆ポート0xC8 bit3=0 にすると、ポート0xCE、ポート0xCFで座標アクセスが出来る。逆に直接アクセスができない。
 ☆座標アクセスの際は、ページ番号によりポート0xC8 bit4を変更する。通常は、下位32K(ページ0)。
 ☆ポート0xC8 bit3=1 、bit4=0 にした場合、通常環境では暴走する。これは、BASICのワークエリアにアクセスができないため。

  ☆の1つ目の項目はこれで正解のようです。

  ただやっかいなのは、X座標0〜319、Y座標0〜203 の範囲なのですが、I/Oとしては両方とも16ビットあるため、範囲外にアクセスした時にどうなるかを調べる必要があります(調査中ですが、多少ヘンな動きをします)。

  また、上位32Kに座標アクセス(ビットマップアクセス)するためには、プログラムを二段階に組む必要があるので、まだ調べきれていません。



  ちなみに、画面を表示させながら、ディスクからロードするには、以下の方法で実現できます。

  SCREEN 2,2,2:POKE &HED1D,&HEE:BLOAD "ファイル名"


  0xED1D は、ポート0xC8の値を保存しているワークエリアで、VSYNC割り込みで読み出してポート0xC8に設定しています。

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

2014年05月10日

SRのVRAMについて(2)

  SRのVRAMのアクセス関連がよく分からないので調べてみました。まだ途中ですが。


  Mr.PC Technical Collection を参考にしているのですが、間違っている所もあるようです。

  どうやったら、思っているモードの画面が表示されるのかがかなり分かり難いです。

  I/Oポートの0xC0〜0xCFをアクセスすればよさそうなのですが、いまいちすっきりしません。また、BASICからI/Oポートにアクセスしても、VSYNC割り込みの時に変更されるので、挙動が分かりにくくなっています。

  そこでプログラムを作ってみました。


srgraph.zip



  サブCPU以外の割り込みを禁止して、0xC1〜0xCF にアクセスできるようにしています。

  走らせると、0xC0〜0xCF に出力する値を入力すると、その値を出力します。
  任意のキー(スペースキーがベスト)を元に戻ります。

  事前に、0x0000〜0x7FFFにグラフィックデータをロードさせると、挙動が分かりやすいです。



Mr.PC Technical Collection でのI/Oポートの説明は以下の通りです。

 ポート0xC1
  bit7-4:1固定
  bit3:1=横320ドット。0=横640ドット。
  bit2:1=キャラクタモード。0=グラフィックモード。
  bit1:1=40文字。0=80文字。
  bit0:1=縦200ライン。0=縦204ライン。

 ポート0xC8
  bit7-5:1固定
  bit4:ビットマップのページ指定。1=上位32K。0=下位32K。
  bit3:1=ビットマップDisable。0=ビットマップEnable。
  bit2:1=20行。0=25行。
  bit1:1=バスリクエストOFF。0=バスリクエストON。
  bit0:1=旧BASIC。0=SR-BASIC

 ポート0xC9
  bit7-4:0固定
  bit3-0:VRAMアドレス指定(ページ1〜16)



  これを動作ごとにまとめた結果が以下の通りです。


 ○キャラクタモードの場合

  ポート0xC1 bit2=1にする。
  画面サイズは、ポート0xC1 bit1 と、ポート0xC8 bit2 で決定する。
  表示ページは、ポート0xC9 で決定する。

  ポート0xC1 bit3、bit0 は、グラフィックモード用の設定のため、無関係になる。

  ポート0xC8 bit0=0 に設定しておく必要あり(SR-BASICのため)
  ポート0xC8 bit3=1 に設定しておく。


 ○グラフィックモードの場合

  ポート0xC1 bit2=0にする。
  画面サイズは、ポート0xC1 bit3 bit0 で決定する。
  表示ページは、ポート0xC9 で決定する。ただし、bit2-0 は無視される。bit3=ページ番号となる。

  ポート0xC1 bit1 と、ポート0xC8 bit2 は、キャラクタモード用の設定のため、無関係になる。

  ポート0xC8 bit0=0 に設定しておく必要あり(SR-BASICのため)


 ☆ポート0xC8 bit3=0 にすると、ポート0xCE、ポート0xCFで座標アクセスが出来る。逆に直接アクセスができない。
 ☆座標アクセスの際は、ページ番号によりポート0xC8 bit4を変更する。通常は、下位32K(ページ0)。
 ☆ポート0xC8 bit3=1 、bit4=0 にした場合、通常環境では暴走する。これは、BASICのワークエリアにアクセスができないため。

  最後の☆の行に関しては、まだ調査中です。

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

2014年05月09日

SD6031WIFの64KバイトRAM実装

  すっかり忘れていたものを実行しました。


  SD6031WIF は、元々16KバイトのRAMを積んでいます(PC-6006相当)。
  初代PC-6001以外でも、mk2以降でも使用できます。ただし、当然外部RAM扱いです。

  mk2、mk2SRで使用する場合は、スイッチをPC-6601側にすることで使用可能です。
  この際、FDDは、本体後ろのコネクタのFDDインタフェースを使う事になり、SD6031WIF上のSDカードは使用できません。


  SD6031WIFを改造する事で、外部RAMを64Kバイトまで拡張することが可能です。

  以下、SD6031WIFの改造方法を記します。


 ○必要な部品

  ・74LS138 1個
  ・SRM2B256SLMX55(32KバイトSRAM) 1個

  元々、基板に実装されているものと同じものです。秋月通商で、5個300円で販売されています。

http://akizukidenshi.com/catalog/g/gI-01461/



 ○回路図

  SD6031WIF_64k.PNG


  点線内は追加回路です。変更部分以外は記載していません。

  改造の概略は以下の通りです。

  改造前
  A13-0 → 元々のSRAM の A13-0
  GND → 元々のSRAM の A14
  nRAS2 と nEXCAS の OR → 元々のSRAM の CS

  ↓
  改造後

  A13-0 → 元々のSRAM の A13-0
  A13-0 → 追加のSRAM の A13-0
  A14 → 元々のSRAM の A14
  A14 → 追加のSRAM の A14

  (nRAS2 と nEXCAS の OR )AND A15=0 → 元々のSRAM の CS
  (nRAS2 と nEXCAS の OR )AND A15=1 → 追加のSRAM の CS


 ○実際の改造

 1)まず、元々のSRAMの1ピンと20ピンの足を上げます。

SRAM加工(1).jpg


 2)その上に、追加のSRAMを付けます。この時、20ピンのみ接続しません。

SRAM加工(2).jpg

SRAM加工(3).jpg


 3)LS138の足を開いて、先をちょんぎります。

LS138加工(1).jpg


 4)SD6031WIF上に両面テープで貼るんですが、基板上にスルーホールがあるために、絶縁テープを貼ります。

LS138加工(2).jpg


 5)絶縁テープの上にLS138を両面テープで貼ります。

LS138加工(3).jpg


 6)後はがんばって配線するだけです。コネクタからの配線箇所がちょっと分かり難いです。

  A15の取り出し部分です(黄色の配線が繋がっている箇所)。

A15取り出し.jpg


  A14の取り出し部分は裏面になります。赤い配線の方です。白い配線は別の改造です。

A14取り出し.jpg

裏面から表面に持ってくるのがまた面倒です。私は穴を開けましたが...



  配線完了すると、こんな感じになりました。

結線完(1).jpg

結線完(2).jpg



  外部RAMをチェックするのには、前にアップしたプログラムを使用して下さい。

http://sbeach.seesaa.net/article/387861564.html

memcheck.zip



posted by えすび at 19:14| Comment(0) | HW:SD6031 | このブログの読者になる | 更新情報をチェックする

2014年05月07日

SRのVRAMについて

  SRのVRAMは、構成が結構ヘンなんですが...


  気になるツイッターの発言を見つけました。

 『SRのグラフィックをBSAVEしたデータをロードする際、SCREENを表示させずに裏側でBLOADさせるとちゃんと画面が表示されるが、SCREENを表示させた状態でBLOADさせると画面がちゃんと表示されない』

  実際にやってみました。


  SR上でグラフィックデータを作るのが面倒だったので、P6VW上で、以下の手順でデータを作りました。

 1)適当なソフトを走らせて、0x0000〜0x7FFFをgetbinコマンドで一度ファイルに落とす。
 2)フォーマット済みの.d88を挿入して、モード6で立ち上げて、setbinコマンドでVRAMにデータを戻す。
 3)BSAVE "ファイル名",0,&H8000 で、ディスクにセーブする。


  上記の.d88を使って、P6VW上で

 ・SCREEN 2,2,2:BLOAD "ファイル名"

  をすると、確かに変なロード状態になります。


  で、問題はここからで、

 ○P6VW
 ○P6V
 ○iP6plus
 ○実機

  で、この変なロード状態に差異があります。

  実機では、最下行だけにロードデータが表示されるのですが、エミュレータでは、X座標が0〜255の分だけは表示されてしまいます。


  何となく予想はついているんですが、まだちゃんと調査できていません。


  また、上記の.d88ファイルを使って、

 ・SCREEN 2,2,2 を実行した後、SCREEN 1 で、BLOAD "ファイル名"

  を実行した場合、

 ○P6VW
 ○iP6plus

  では、正常な画像が表示されるんですが、

 ○P6V
 ○実機

  では、正常な画像が表示されません。X座標が256〜319のデータがナゼか1行置きに表示されます。

  多分、P6VWで作成したデータ自体がおかしいんだと思いますが、これも調査中です。


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