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

2013年12月07日

ディスクのロードとセーブの問題

 現在、ディスク関連をいろいろと調べているんですが、ちょっと気になって仕様をいくつか。


 1)BSAVE の時は、開始番地、終了番地+1が、セーブされるデータの前にセーブされる。このため、データが4バイト増える。

  これは、解析マニュアルTにも書かれている事です。 


 2)BLOAD の時は、指定した範囲以外にはデータを格納しない。

  当たり前ですが...


 3)SAVE の時は、バイト単位のディスク長がデータにセーブされずに、どれだけのセクタ数を使ったかを記録している。

  FAT を使って、どれだけのクラスタ、セクタ数を使っているかを示しています。このためプログラムのサイズは、セクタ単位(256バイト単位)でしか表せません。数十バイトのプログラムでも、256バイトと見なされます。


 4)SAVE の時は、ワークエリアで示された『プログラムの開始アドレス』、『変数領域の始まり=プログラムの終了アドレス−1』までを、ディスクに書き込んでいる。この時、セクタ単位(256バイト単位)で書き込むため、プログラムの後ろの部分もセーブする。

  『プログラムの開始アドレス』は、0xFA5F、0xFA60 で示されます。『変数領域の始まり=プログラムの終了アドレス−1』は、0xFF56、0xFF57 で示されます。
  このため、このワークエリアを書き換えると、任意の場所のデータをBASICファイルとしてSAVEできます。


 5)LOAD の時は、セクタ単位で、『プログラムの開始アドレス』から順に格納していく。格納し終わったら、リンクポインタの再計算と、『変数領域の始まり=プログラムの終了アドレス−1』を修正する。

  修正の処理は、CLOAD の時も同じ処理が行われますが、CLOAD と LOAD で微妙に違うようです。

 『変数領域の始まり=プログラムの終了アドレス−1』の算出の仕方
  CLOAD:カセットからのデータの格納が終了したアドレス(0x00を10個検出した地点)
  LOAD:リンクポインタを再計算した結果の最終アドレス。

  つまり、AXシリーズなどの、BASIC+データを1本のBASICプログラムにしているものの場合、プログラムの終了アドレスが違うことになります。
  また、カセットにセーブする際のBASICプログラムは、0x00が10個以上続くとNGだったのが、ディスクでは、0x00 が何個も続いても構わないという事になります。



  ディスクでBASICのプログラムを扱う時、5)に付随して問題が発生します。

 ◆AXシリーズなどの、BASIC+データを1本のBASICプログラムにしているものの場合、

  カセットからCLOADする。
  ↓
  ディスクにSAVEする(これは問題なくセーブされる)。
  ↓
  ディスクからLOADする(これも問題なくロードされる)。
  ↓
  ディスクにSAVEする(これができない。終了アドレスが間違っているため)。


 ◆メモリをぎりぎりまで使っているようなプログラムの場合、

  カセットにCSAVEする。
  ↓
  カセットからCLOADする(問題なし)。


  ディスクにSAVEする。
  ↓
  ディスクからLOADする(?OM Error が出ることがある。256バイト単位の管理のため)。



  BASIC-ROMを解析したわけではなく、憶測が入っていますので、間違っているかも知れません。念のため。 


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

2013年07月22日

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

  フロッピーのオート起動時に関してです。


  N60m/N66-BASIC の場合、トラック#0 セクタ#1 を 0xF900〜0xF9FF に読み込みます。
 0xF900〜0xF902が、"SYS" か "RXR" の場合、0xF903 をコールします。


  で、0xF903 からユーザのプログラムを組むのですが、以下の点で注意が必要です。


1)ディスクの読み込みは、0x4274 を使う。

  66 のユーティリティディスクでは、

  ドライブ番号指定:0x51F2
  セクタ読み込み:0x5CFD

  を使っています。


  BASIC が起動した後では特に問題ないんですが、オート起動のプログラムでは、
 BASIC がまだ起動する前で、ワークエリアが設定されていない箇所があります。

  上記の 0x5CFD を使った場合、まだ設定されていないワークエリアの情報を
 使っているため、意図しない箇所に書き込みされる場合があります。


  代わりに 0x4274 を使用すると、上記の問題は回避されます。


2)内蔵ドライブか、外付けドライブか、どちらから読んだのかを判別する。

  ディスクからデータを読み出す際は、ROM内ルーチンの 0x4274 を使えば、
 内蔵ドライブか、外付けドライブかを判別する必要はありません。

  ただ、ROM 内ルーチンを使わない場合、内蔵ドライブ/外付けドライブの
 両方のルーチンを書く必要があります。
  両方のルーチンを書いて、起動時に使用した方のドライブのルーチンを使えば、
 同じ事が実現できます。


  ここで問題なのは、起動時に使ったドライブが、内蔵なのか外付けなのを
 判別する必要があるという事です。
  通常、66/66SR の場合は内蔵ドライブなのですが、SD6031WIF などのような
 外付け回路を使ってアクセスする事により、外部ドライブにもなり得ます。
  そのため、判別方法が必要になります。


  で、判別方法です。

 A)P6初代機、6001mk2、6001mk2SR の場合、外付け
  ディスク用のバッファがない場合は、外付けです。

 B)66、66SR の場合、ポート0xD4 のFDDモータの状態を確認する。
  ポート0xD4は、内蔵ドライブのFDD のモータが動作/停止を示します。

  データを読み込んだ後に、このポート0xD4 を読み込むと、

 動作中の場合は、内蔵ドライブからのアクセス
 停止中の場合は、外付けドライブからのアクセス

  と判別できます。


  ただ、実際に判別する場合、ちょっと厄介な処理が必要になります。

 ・内蔵ドライブを持たない機種では、モータON/OFF のポートを叩くと誤動作する事がある。
 ・モータは自動的に停止するため、データを読み込んでからすぐにアクセスする必要がある(数秒以内)。
 ・ポート0xD4 にアクセスするためには、ドライブを内蔵ドライブに切り替える必要がある。


  実際に組んでみると、以下のようになります。


判別プログラム


  ここまでする必要がある事はあまりありませんが、参考まで。


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

2013年06月22日

外付けFDDへのアクセス方法

  SD6031/SD6031WIF だけではなく、PC-6031、PC8031 などの外付けのFDD に対するアクセス方法についてまとめました。


  まず、外付けFDD と、P6 との接続ですが、PC-8001/8801 と同じように、8255 を介して接続されています。

FDDとの接続



  8255 の先は、PC-8031 などの賢いFDDは Z80 が搭載されているんですが、PC-6031 などは、8049 が搭載されています。そのため P6系では、88系などのような、FDD に搭載されているCPUを使う命令がありません。

  SD6031/SD6031WIF は 8255 はありませんが、その代わりをAVRが行っています。大体PC-6031 と同じような感じです。

  上の図で分かるように、(ATNを除いて)左右の 8255 への接続が同じようになっています。このため、左右の8255 の制御を同じような手順で処理しています。

  P6側→外付けFDD と送信する場合、P6側:送信処理、外付けFDD側:受信処理となります。
  逆に、P6側←外付けFDD と送信する場合、P6側:受信処理、外付けFDD側:送信処理となります。

  この時、P6側の受信処理と、外付けFDD側の受信処理は、基本的に同じ手順になります。送信処理に関しても同様です。


  具体的な手順は以下の通りです。


  通常のデータ送信/受信(1バイト)
送受信1バイト



  上の手順を P6 で行う場合は、P6 or インタフェースカードに搭載されている 8255 を制御する必要があります。

  P6 の場合、8255 のモード0という状態で、入出力を行います。使用する I/O ポートは以下の通りです。

  0xB1:bit2 = 1 を設定すると、外部FDDにアクセスが可能(66/66SR のみ)。
  0xD0:8255 の port-A
  0xD1:8255 の port-B
  0xD2:8255 の port-C
  0xD3:8255 の 制御

  通常の外部FDDで使う状態は、

  モード0
  port-A = 入力
  port-B = 出力
  port-C 3-0 = 入力
  port-C 7-4 = 出力

  です。

  この設定をするためには、OUT &HB1,&HF7 として、外部FDD に切り替えた後に OUT &HD3,&H91 とします(初期化のようなものなので最初だけでよい)。

  66/66SR 以外は、OUT &HB1,&HF7 は必要ないんですが、あった方が他の機種に持っていった時のトラブルが回避できます。

  port-A/B は、直接ポート0xD0/D1 に対して入出力すれば、データが入出力できます。
  port-C も、直接ポート0xD2 に対して入出力できますが、ポート0xD3を使って1ビット単位の出力も可能です。
  ポート0xD3 に、1000BBBP を出力します。BBB には出力するport-C のビット、P には、0にするか1にするかを出力します。例えば、port-C のビット6(DAC)を1にするには、OUT &HD3,&H8D、ビット7(ATN)を0にするには、OUT &HD3,&HE0 とします。


  上の通常のデータ送信/受信(1バイト)を P6 で組んだ場合は、次のようになります。

  通常データの送信(1バイト)
SENDDATA


  通常データの受信(1バイト)
RCVDATA


  外部FDD からの信号が変化するのを待っている箇所に関しては、タイムアウトの処理などを入れた方がいいでしょう。


  上の処理は、通常のデータ送信/受信でしたが、コマンドに関しては別の処理を使います。

  コマンドデータ送信/受信(1バイト)
コマンド送受信



  通常のデータ送信/受信の前に、ATN の制御が入るだけです。

  P6 で組んだ場合は次のようになります。

  コマンドの送信(1バイト)
SENDCMD


  コマンドは、P6側から外部FDDにのみ出力しますので、P6側で受信する事はありません。


  通常のデータ送信/受信(1バイト)と、コマンドデータ送信/受信だけで、一通りの制御が可能になります。例えば、INITIALIZE コマンドだと、コマンド送信で0x00 を送信して完了します。COMMAND STATUS だと、コマンド送信で0x06 を送信、その後、データ受信を1回だけ実行します。


  通常のデータ送信/受信には、1バイト以外に2バイトと4バイトがあります。これは送受信を高速にするために拡張されている手順になります。まずは2バイトのデータ送信/受信です。

  通常のデータ送信/受信(2バイト)
送受信2バイト


  2バイトの送受信は、ほぼ1バイトと同じ手順でデータを2回出力しています。

  P6 で組んだ場合は次のようになります。

  通常データの送信(2バイト)
SEND2DATA


  通常データの受信(2バイト)
RCV2DATA


  4バイトの送信/受信に関しては、SD6031/SD6031WIF のオリジナルです。

  通常のデータ送信/受信(4バイト)
送受信4バイト


  4バイトの送受信は、基本の手順は2バイトの送受信と同じで、port-A、port-B の方向を同じ方向に変えています。そのため、2倍の4バイトの送受信を可能にしています。また、さらに高速化のために256バイト送受信を1つの単位にしています。2バイト同時に送信/受信しますが、先に送受信されるのは、出力が port-B、入力が port-A です。


  P6 で組んだ場合は次のようになります。

  通常データの送信(4バイト)
SEND4DATA


  通常データの受信(4バイト)
RCV4DATA

  2バイト送信/受信と構成が違うのは、INR/OUTR を使って高速化を図っているためです。


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

2013年06月16日

「P6のフロッピー関連」の修正

  3/19 に書き込んだ『P6のフロッピー関連』に関して、一部を修正、追加しました。


  修正したのは、『3.ドライブ番号』です。

  外付け4ドライブの挙動に関して修正しました。


  追加したのは、『4.フロッピーのオート起動』です。

  オート起動時のモード選択に関して、追記しました。


  ブログの右側にある、『カテゴリー別アーカイブ』の中の P6解析:FDC周り を選んでもらうと表示されます。



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

2013年05月29日

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

  P6オフで、FDDの実機を触る機会がありましたので、コマンドを調べました。

  調査したのは、PC-6031 と PC-6031SR です。どのコマンドが使えるかを調べました。


○PC-6031
 00H:INITIALIZE
 01H:WRITE DISK
 02H:READ DATA
 03H:TRANSFER BUFFER
 05H:FORMAT
 06H:COMMAND STATUS
 07H:DRIVE STATUS

 04H のCOPY がありません。ほとんど使いませんが。
 最低限のものしかない、という感じですね。


○PC-6031SR
 00H:INITIALIZE
 01H:WRITE DISK
 02H:READ DATA
 03H:TRANSFER BUFFER
 04H:COPY
 05H:FORMAT
 06H:COMMAND STATUS
 07H:DRIVE STATUS
 0BH:GET MEMORY
 11H:WFAST RITE DISK
 12H:FAST TRANSFER BUFFER
 17H:SET MODE

 PC-6031 と比べて、2バイト転送のコマンドと、1DD 対応の SET MODE が増えています。
 GET MEMORY も追加されていますが、これはドライブ判別に使われているようです。
 また、なぜか COPY が追加されています。

 一番の注意なんですが、18H の GET MODE がありません!
 GET MODE コマンドを発行すると、なぜかドライブが不安定になります。
 原因は不明です。調査したドライブ固有の問題の可能性はあります。


 結局、外付けドライブのプログラムを組む際は、最低限のコマンドのみにする必要があります。

 まあ、他のコマンドは殆ど使わないんですけど。


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

2013年03月19日

P6のフロッピー関連

  P6のBASIC-ROMで対応している、フロッピー関連の情報をまとめてみました。
  特に、SRと外付けドライブが出てくると、話がかなりややこしいです。


1.外付けドライブについて

  外付けドライブは、すべてのP6で接続が可能。
  ただし、以下の条件あり。

  初代機:拡張ユニット(相当)が必要。8255+0xD0〜0xD3のデコーダ回路。
      拡張BASICが必要。

  66、66SR:接続のためのインタフェース回路が必要、8255+αの回路。


  接続可能な外付けドライブは、

  PC-6031  :1D
  PC-6031SR :1DD
  PC-8031  :2D 1D
  PC-80S31  :2D
  等が接続が可能。

  1DDと2Dは、外付けドライブとしては同じものとみなされる。
 (0〜79トラックのメディアとして扱うため)


  PC-6031SR と PC8031 は、1D/1DD(1D/2D) の切り替え機能を持っている。
  リセット直後は1Dモードで、SetModeコマンド で、1DD(2D)に切り替える事が可能。

  PC-6031は、1D 固定です。


2.電源投入後(リセット後)のドライブの認識について


 ・初代機、mk2
  外付けドライブの接続確認を行う。手順は次の通り。
  ○8255のポート(0xD0〜0xD3)をアクセスして、8255が接続しているかを確認する。
  ○その後、外付けドライブに対して、Initialize、DriveStatusコマンドを発行して、ドライブが接続されているかを確認する。

 ・66
  最初に内蔵ドライブの接続確認を行う。手順は次の通り。
  ○uPD765に対して、Specifyコマンドの後、ドライブ#1、ドライブ#2にRecalibrateコマンドを発行し、ドライブが接続されているかを確認する。

  次に外付けドライブの接続確認を行う。手順は、mk2と同様。


 ・mk2SR、66SR
  最初に内蔵ドライブの接続確認を行う。手順は、66と同様。

  次に外付けドライブを確認する。
  手順は、mk2と同様の処理の後、GetMemoryコマンドを使ってドライブの0x07FE の値を読み出し、0xFFでない場合は以下を行う。
  ○ SetModeコマンドを発行する。コマンドが正常終了した場合は、1D/1DD(1D/2D)切り替えが出来るドライブだと判断し、1DD(2D)に切り替える。

  また、ドライブの0x07FE の値が0xFFでない場合は、メディアへの読み書き時、通常の1バイト送信/受信ではなく、2バイト送信/受信を行う。


  mk2SR、66SRに、1D 固定のドライブを接続した時は、起動時間が遅くなります。これは、存在しないSetModeコマンドを発行して、タイムアウトでエラーになるまで待っているためです。



3.ドライブ番号

  内蔵ドライブ#1、内蔵ドライブ#2、外付けドライブ#1、外付けドライブ#2の順で、認識できたものから順に、ドライブ番号1〜4が割り当てられる。
  files コマンドの場合、files 1、files 2 、files 3、files 4 となる。

  外付けドライブが4つ存在しても、#3、#4は認識しない。

  初代PC-6001+拡張BASIC と、mk2 は、外付けドライブを4つまで認識する。
  66/mk2SR/66SR は、内蔵2つ+外付け2つが最大で、外付け4つは認識しない。


4.フロッピーのオート起動

  フロッピーからのオート起動よりも拡張ROMの方が先のため、併用する時は注意が必要。


 ・初代機
  オート起動は不可。

 ・mk2、66
  ドライブ番号1のトラック#0、セクタ#1(先頭セクタ)の256バイトを0xF900〜0xF9FFにロードする。
  0xF900〜0xF902 が "SYS" ならば、0xF903 をCALLする。
  "SYS"以外の場合は、BASICの選択画面になる。

  "SYS" 文字列がある場合は、0xF903 から独自のプログラムが走る事になる。
  しかし、そのままRET した場合は、"SYS"以外の場合と同様に、BASICの選択画面になる。

  この時、0xFF4E に モード番号-1 を書き込むと、RET した時にそのモードを選択した状態になり、モード選択の画面をスキップできる。


 ・mk2SR、66SR
  ドライブ番号1のトラック#0、セクタ#1(先頭セクタ)の256バイトを0xC000〜0xC0FFにロードする。
  0xC000〜0xC002 の内容により、以下の処理を行う。

  "SYS"の時、ドライブを1Dにして、66-BASICへ移行(上記66のオート起動を実行する)
  "RXR"の時、ドライブ状態はそのままで、66-BASICへ移行(上記66のオート起動を実行する)

  "IPL"の時、0xC003 をCALLする。

  CALLから返ってきた時は、Zflag=0 なら、BASICの選択画面になる。
  Zflag=1 なら、BASIC選択画面にならずに、SR-BASIC(MODE=6)が立ち上がる。
  FILESの数は、CALLから返ってきた時のAregの値になる(ノーチェックなので設定値に注意が必要)。

  また、0xFF4E に モード番号-1 を書き込むと、Zflag=1 の時と同様の動作をする。



  "SYS"、"RXR"、"IPL"以外の時、BASICの選択画面になる。


  "RXR" は、"SYS"の1文字前、という意味のようです。



5.SRでの1D/1DD(1D/2D)の切り替えの注意

  1DD(2D)のドライブを使っている時は、先頭セクタが"SYS" で始まっているフロッピーで起動した場合以外は、1DD(2D)となっているはずである。
  外付けドライブが1D固定のものに関しては、必ず1Dである(当たり前であるが)。

  動作しているBASICのモードとは直接関係がないので、66-BASICで1DD(2D)とか、SR-BASICで1Dとかが有り得る。


  また、66SRの内蔵ドライブは1DDであるが、ソフトウエア的に1Dとしてアクセスしている(単純に偶数トラックだけにアクセスする)。
  フラグで1Dか1DDかを切り替えているようである。

  このフラグが外付けドライブの1D/1DD(1D/2D)のフラグと共通しているらしく、外付けドライブを1D固定のもの(PC-6031等)にすると、内蔵ドライブも1Dになってしまう(バグ?)。

  つまり、66SRにつながれている内蔵ドライブ、外付けドライブに関係なく、全て1Dドライブ、全て1DD(2D)ドライブという認識になるようである。




  CP/M や独自でフロッピーインタフェースをプログラムしている場合は、上記の限りではありません。
  ハードウエア的には、どんな種類のものでも接続は可能ですので。




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

2013年01月12日

ディスク関連(11)

  ツイッターで見つけた発言について。

>>FM77AV20以降の2DDドライブは66SRにはいけるけど、66にはどうなん? 教えてエロい人。

  私宛ではないでしょうが(^^;


  結論から言うと、66に2DDドライブやSRの1DDドライブを接続しても使えるはずです。


  FDD の制御関連は、PC-6601とPC-6601SR では機能的に全く同じです。
 (インバータ×2をバッファに変更する、みたいな変更があります)

  そのため、制御さえちゃんとすれば、問題なく使えるはずです。


  注意点は4点ほど。

1)1D のドライブとの混在は不可
  uPD765A は、同時に4ドライブの制御が出来ますが、シーク時間などの設定は個別に設定できないためです(Specifyコマンド)。

2)シリンダ番号は1DD/2DD は0〜79になる
  当たり前ですね(^^;) サーフェス番号を適切に与えると、2DDにもアクセスが可能です。

3)書き込み時、0xD8 のポートを適切に設定する
  ナゾのポートですが、シリンダ番号により、0か1を与えるようです。
  1D の場合と1DD の場合で、その閾値が違うようです。

4)当然、BASICからは普通には使えません


  無難な使い方は、66SR のROMからディスク関連のルーチンを取り出す事でしょう。


  実際に66にFM-77AV20のドライブ(2DD)を付けて、ブートさせてみました。

  普通のソフトはダメですが、ディスクアクセス関連を自分で作った某こら息子は
 見事に動きました。

  ベルーガはダメだった...ROMルーチン使ってたかな?



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

2012年06月08日

ディスク関連(8)の2

 さらに遅い外付けドライブですが、先の内蔵ドライブのアクセス時間にさらにオーバーヘッドが加わります。

 それは、FDDとPC本体でハンドシェークで通信をしているからで、それも1バイトずつのハンドシェークの通信をしています。

 FPGAで測定した結果です。

 セクタ1 :112〜118ms
 セクタ16:194〜200ms


 ハンドシェークの部分は、多分実機と似たような作りになっているので、あまり時間差はないと思います。


 このハンドシェークの時間を減らすために、2バイトずつの高速転送とかもありますが、実はディスクの回転速度が支配的だったりします...

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

2012年04月09日

ディスク関連(3)-2

  FDD周りは、回路図で確認すると、PC-6601とPC-6601SR は全く同じなので、
  PC-6601SR の ROMをディスアセンブラしてみました。

  SRの方も、VOICEROM の方にディスクルーチンがありました。

  内容は殆ど同じなんですが、例の 0xD8 は若干違いました。

  PC-6601 :トラック番号が20未満は1。20以上は0。
  PC-6601SR:トラック番号が59未満は1。59以上は0。


  ディスクの物理的な位置とかに関係があるかも知れません。


(2013-01-12:ポート番号を修正)

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

ディスク関連(3)

  ディスク関連のルーチンをディスアセンブラして、解析がだいたい終わりました。

  この辺りは、『PC-6001mkII 解析マニュアル』には、詳しく書かれていません。

  目的はI/O ポートの調査なんですが、不明なものが何個かあります。

  0xD8、0xDA、0xDE の3つです。

  0xDA は、DMA転送のサイズのようなんですが、パラメータの与え方がちょっとヘンです。

  0xDE は、エラーのリトライの時に値を変えているので、何かの調整値っぽいです。
  (0x08 を中心に前後±3ぐらい振ってます)

  0xD8 が全くのナゾで、書き込み時にトラック番号により、0か1を与えています。


  『PC-6001mkII 解析マニュアル』に記載されていない、0xD4、0xD6 は、ディスクのモータ関連です。


  一通り確定した所で、まとめた表をアップしたいと思います。


(2013-01-12:ポート番号を修正)





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

2012年04月02日

ディスク関連(2)

  PC-6601 は内蔵ドライブを持っていますが、回路図を見る限り、外付けドライブも使えるようです。

  PC-6001用には、拡張ユニット(PC-6011)がありますが、これがそのまま使えそうで多分使えません(持っていないのでよく分かりませんが)。


  これが PC-6011 の予想回路図で、

PC-6011予想回路図


  こうする事で、PC-6601 で使う事が出来ます(多分)。

PC-6011mk2回路図



  デコード方法がが変わっているだけです。拡張コネクタの7ピンが、初代P6 とmk2以降で変更されていて、その7ピンを使う事になります。


  PC-6601用の拡張ユニットって発売されているのかなぁ?


  ちなみに、制御する BASIC の方はちゃんと対応していて、同時に使用することが可能なようです。
  同時に使用した場合、内蔵ドライブからドライブ番号が割り当てられます。
  例えば、内蔵ドライブ1基、外付け2基の場合、内蔵ドライブが#1、外付けドライブが#2、3になるようです。

  あくまで、ROM を解析した結果ですが。




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

ディスク関連(1)

  ディスク関連に着手しました。

  といっても、とりあえずは情報集めです。


  P6初代機、mk2 は、外付けドライブで、PC-66 は内蔵ドライブです。
  使っている時は特に分からないんですが、ハード的にもソフト的にも大きく違います。

  外付けドライブは、インテリジェント型といって、CPUやらメモリやらをドライブ内部に搭載しています。また、フロッピーをコントロールするためのコントローラ(μPD765A )も搭載されています。

  内蔵の方は、μPD765A、データ転送用のバッファ、それらをコントロールするカスタムLSI しかなく、他のコントロールはメインCPU とROM が行っています。

  どっちか片方だけの実装にしたくなります...


  この辺りの情報の収集のためにネットでいろいろと調べたんですが、PC-8801 などの書籍の方が詳しそうでした。

  結局、以下のものがありました。

 ・フロッピーディスク 入門ハンドブック(PC-8801mkII PC-9801 and PC-8881 PC-80S31)
  これがかなり詳しいです。μPD765A のコントロール、インテリジェント型のFDDのコントロールの両方とも記載されています。

 ・PC-8801、mkII DISK 活用ハンドブック
  インテリジェント型のFDDのコントロールのプログラムなどが記載されています。

 ・フロッピーディスク装置のすべて
  ハードの本です。μPD765A の周辺回路などに関しても記載されています。また、フロッピーのフォーマットなども記載されています。

 ・プロテクト活用ハンドブック
  μPD765A や他のコントローラを使ったプロテクトの方法が記載されています。基本的な事も書かれています。


  全部、大阪市立図書館で借りてきました。P6関連は、大阪市、大阪府には殆どないんですが、88 ならあるようです。


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