2018年06月07日

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

  P6月間企画...そろそろ息切れ?(その7)


4.P6でよく使用されている内部フォーマットについて

 P6の場合、内蔵/外付ドライブや、外付ドライブの種類の違いなどがあるため、特殊なフォーマットが使われる事があまりありません。

 よく使われているフォーマットは以下の通りです(P6の説明書に書かれているものです)。

 1D:
  トラック#0〜#39(片面使用で、シリンダ番号#0〜#39を使用)
  1トラック=セクタ#1〜#16の16セクタ
  1セクタ=256バイト

  BASICでは、トラック#0〜#34しか扱えないようです。


 1DD:
  トラック#0〜#79(片面使用で、シリンダ番号#0〜#79を使用)
  1トラック=セクタ#1〜#16の16セクタ
  1セクタ=256バイト


 2D:
  トラック#0〜#79(両面使用で、シリンダ番号#0〜#39を使用)
  1トラック=セクタ#1〜#16の16セクタ
  1セクタ=256バイト



 前述の通り、トラック#0セクタ#1は起動時に読み込まれて、その内容が実行されます。

 また、BASICでは、以下のような割り当てがされています。

 1D:
  トラック#18セクタ# 1〜#12:ディレクトリ(ファイル名などが格納されている)
  トラック#18セクタ#13 :ID(属性)
  トラック#18セクタ#14〜#16:FAT(クラスタの使用状態が格納されている)

 1DD/2D:
  トラック#37セクタ# 1〜#12:ディレクトリ
  トラック#37セクタ#13 :ID
  トラック#37セクタ#14〜#16:FAT

 それ以外の部分はユーザ領域として、ファイル本体が格納されます。


 他のページでも説明されているので、そちらも参考にして下さい。
http://p6ers.net/hashi/floppy.html
http://www.geocities.jp/submarine600/ (←ここの『落ちつく』の記事の一部)



5.P6でよく使用されている拡張子とデータ構造について

 P6のフロッピーデータをWindows上で扱う時のフォーマットの話です。

○ベタフォーマット(〜.dsk):
 いわゆるベタファイルです。

 トラック#0セクタ#1〜16
 トラック#1セクタ#1〜16
  :
 トラック#79セクタ#1〜16 (1Dの場合、トラック#39)

 の順で、各セクタのデータ部分のみを連結したものです。

 そのため、ファイルサイズは、

 1D:256x16x40 = 163840バイト(0x28000バイト)
 1DD/2D:256x16x80 = 327680バイト(0x50000バイト)

 になります。


○P31フォーマット(〜.P31):
 SD6031/SD6031WIFで使用されているフォーマットです。
 SDカードにアクセスする際に、簡単にアクセスできるように、1セクタ=512バイトにしています。
 0x00で埋めている部分は使用してませんので、実際には何でも構いません。

 1DD/2D:
  それぞれの1セクタ256バイトの後に、0x00を256バイト続けます。

  トラック#0セクタ#1(256バイト)
  0x00 ×256バイト
  トラック#0セクタ#2(256バイト)
  0x00 ×256バイト
  :
  トラック#79セクタ#16(256バイト)
  0x00 ×256バイト


 1D:
  それぞれの1セクタ256バイトの後に、0x00を256バイト続けます。
  さらに1トラックの後に、0x00を4096バイト続けます。
  (1DD/2Dで奇数トラックに当たる部分をベタ0x00にしています)

  トラック#0セクタ#1(256バイト)
  0x00 ×256バイト
  トラック#0セクタ#2(256バイト)
  0x00 ×256バイト
  :
  トラック#0セクタ#16(256バイト)
  0x00 ×256バイト
  0x00 ×4096バイト
  トラック#1セクタ#1(256バイト)
  0x00 ×256バイト
  :
  トラック#1セクタ#16(256バイト)
  0x00 ×256バイト
  0x00 ×4096バイト
  :
  トラック#39セクタ#16(256バイト)
  0x00 ×256バイト
  0x00 ×4096バイト


 ファイルサイズは、1D、1DD/2Dとも、655360バイト(0xa0000バイト)になります。



○D88フォーマット(〜.d88):
 業界(?)標準のフォーマットです。
 元々、PC-8801用エミュレータのフォーマットのようです。
 トラック数、セクタ数が固定ではないものを対応するために、ヘッダにそれぞれのトラック先頭の場所が書かれています。さらに、それぞれのセクタ先頭に、そのトラック内のセクタ数やCHRN(シリンダ番号、ヘッダ番号、セクタ番号、セクタ長)が書かれています。

 標準的に使用されているため、実フロッピーとのやり取りなどのツールもあります。


 詳しくは、他のページで説明されているので、そちらを参考にして下さい。
http://papicom.net/p6v/tech.html
http://www.geocities.jp/submarine600/ (←ここの『落ちつく』の記事の一部)



○それぞれの変換ツール

 D88、P31相互変換
http://tulip-house.ddo.jp/digital/SD6031/index.html

 D88、DSK相互変換
http://p6ers.net/bernie/develop/d88todsk.html

 D88作成
http://www.geocities.jp/submarine600/ (←ここの『R&D』の『PC-6000 シリーズ用 D88 ディスクイメージ書き込みツール』)

 また、拙作のPC-8801から変換するソフトの中に、d88todsk、d88todsk1dd、などがありますが、これはD88ファイルの任意のトラック、セクタからデータを抜き出すソフトです。


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

2018年06月06日

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

  P6月間企画(その6)


3.オート起動にまつわる事その2

 BASICのプログラムをオート起動で動かしたい時に使う方法です。

 前述の通り、フロッピーからオート起動をした場合、BASICのモードは選べるんですが、それ以降のページ指定や、コマンドなどは設定できません。

 その代わり、ファンクションキーフラグを使う方法で、人間がキーボードから入力する事を代用できます。


 ファンクションキーポインタ:0xfb8d〜0xfb8e(モード1〜5)/ 0xe8ce〜0xe8cf(モード6)
 ファンクションキーフラグ :0xfa32(モード1〜5) / 0xe6d3(モード6)


 ファンクションキーフラグに文字数を設定すると、ファンクションキーポインタからの文字列をキー入力したと解釈され、自動的にキー入力が行われます。

 設定できる文字数は0xffまでで、文字列は 0x00 でも終了と見なされます。



○モード1〜5でオート起動するプログラム例(トラック#0セクタ#1)

org 0xf900

START:
db "SYS"

ld a,(FUNCCNT)
ld (0xfa32),a
ld hl,FUNCBUF
ld (0xfb8d),hl
ld a,$04 ; モード5で起動
ld (0xff4e),a
ret

FUNCCNT:
db FUNCBUF_end - FUNCBUF
FUNCBUF:
db "0",$0d ; Files
db "3",$0d ; Pages
db "run ",$22,"TETRIS.BAS",$22,$0d

FUNCBUF_end:


 MODE=5、Files=0、Pages=3で起動後、TETRIS.BAS をロードして、RUNします。



○モード6でオート起動するプログラム例(トラック#0セクタ#1)


org 0xc000

START:
db "IPL"

ld a,(FUNCCNT)
ld (0xe6d3),a ; ファンクションキーフラグをセット
ld hl,FUNCBUF
ld (0xe8ce),hl ; ファンクションキーポインタをセット

xor a ; Zflag=1:メニューを出さずにモード6にする
ld a,0x02 ; Files=2に設定
ret


FUNCCNT:
db FUNCBUF_end - FUNCBUF
FUNCBUF:
db "run ",$22,"PBOYP6.BAS",$22,$0d

FUNCBUF_end:


 モード6で起動後、PBOYP6.BAS をロードして、RUNします。



 この方法の唯一の欠点は、途中にSTOPキーを押すと止まる、事です(^^;)


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

2018年06月05日

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

  P6月間企画?(その5)


2.オート起動
  トラック#0セクタ#1の内容でオート起動が出来るのですが、これまた機種によって動作が変わります。


 ・PC-6001+拡張BASIC
  オート起動できません。
  mk2のBASIC-ROMを使用してオート起動を可能にするパッチが、西田ラジオさんで公開されています。
  http://tulip-house.ddo.jp/digital/SD6031WIF/index.html
  これにより、mk2相当になります。

 ・PC-6001mk2/PC-6601
  "SYS"のオート起動が出来ます。

 ・PC-6001mk2SR/PC-6601SR
  "SYS"、"RXR"、"IPL"のオート起動が出来ます。


  オート起動は、トラック#0セクタ#1の内容を読み込んで、そこに書かれている内容を実行します。

1)トラック#0セクタ#1の最初の3バイトが、"SYS"、"RXR"の場合

 モード5(mk2/66モード)で起動。0xf900〜にトラック#0セクタ#1の内容を読み込み、call 0xf903 が実行されます。
 起動プログラムから ret した場合は、そのままBASIC選択画面になりますが、0xff4e に、モード−1の値を書き込むと、そのBASICを選択した事に出来ます。
 例えば 0xff4e に 0x01 を書き込むと MODE=2 を選択した事になり、How Many Pages ? の画面になります。

  "SYS"と"RXR"の違いは、"SYS"が1Dフォーマット、"RXR"が1DD/2Dフォーマットになります("RXR"は、SRのみ)。


2)トラック#0セクタ#1の最初の3バイトが、"IPL"の場合

 モード6(SRモード)で起動。0xc000〜にトラック#0セクタ#1の内容を読み込み、call 0xc003 が実行されます。
 起動プログラムから ret した場合は、Zflag=0ならそのままBASIC選択画面になります
 Zflag=1なら、選択画面にならずにSR-BASICが起動します。また、AregがFilesの値になります。


3)mk2/66で、トラック#0セクタ#1の最初の3バイトが、"SYS"以外の場合

 1Dフォーマットで、通常のBASIC選択画面が表示されます。


4)mk2SR/66SRで、トラック#0セクタ#1の最初の3バイトが、"SYS"、"RXR"、"IPL"以外の場合

 接続されているドライブのフォーマットで、通常のBASIC選択画面が表示されます。

 つまり...
 mk2SRで、外付ドライブが1DD/2Dの場合は、1DD/2Dフォーマットで起動します。
 mk2SRで、外付ドライブが1Dの場合は、1Dフォーマットで起動します。
 66SRで、内蔵ドライブが有効になっている場合は、1DDフォーマットで起動します。
 66SRで、内蔵ドライブ無効、外付ドライブが1DD/2Dの場合は、1DD/2Dフォーマットで起動します。
 66SRで、内蔵ドライブ無効、外付ドライブが1Dの場合は、1Dフォーマットで起動します。

 ややこしい...

 要するに通常は1DD/2Dで、外付ドライブが1Dの場合のみ、1Dフォーマットで起動という事です。




3.オート起動にまつわる事

1)拡張ROMが先に確認される

 拡張ROMとオート起動のフロッピーを同時に使った場合、拡張ROMが優先されます。
 拡張ROMでBASICに返ってくるものは、その後にオート起動のフロッピーが確認されます。

 これを利用しているのが、戦士のカートリッジ(旧、mk2)です。


2)オート起動は、内蔵が先に確認される

 66/SRの場合、内蔵と外付の両方にドライブが付けられますが、このときに内蔵ドライブを先にチェックします。内蔵ドライブが有効になっている場合は、ディスクの内容や有無に関わらず、内蔵ドライブ#1のみがオート起動の対象になります。
 66/SRで外付ドライブから起動させたい場合は、本体後ろのドライブ数を0に合わせると、内蔵ドライブが無効になります。
 mk2/SRと、66/SRで内蔵ドライブを無効にした場合は、外付ドライブ#1がオート起動の対象になります。


3)どのドライブから起動されたかを知る

 どのドライブが使用可能なのかは、以下のワークを読み出すと分かります(66/mk2SR/66SR)。

 モード5(SYS/RXR):0xfe74
 モード6(IPL) :0xed5a

 bit7-0=外付#2、外付#1、内蔵#2、内蔵#1、"0"、"0"、"0"、"0"
 ドライブがある場合は、該当ビットが"1"になります。

 2)で記載した通り、内蔵#1が有効の場合は内蔵#1から起動され、内蔵#1が無効の場合は外付#1から起動される事になります。

 そのため、bit4=1なら内蔵#1から、bit4=0なら外付#1から起動されると判断できます。


 mk2の場合、0xfe74には別のデータが書かれていますが、0x22と固定値です。
 ちょうどbit4=0なので、同じルーチンで外付#1から起動と判断できます。

 mk2のドライブ数は、0xfb3b に書かれています(0x00〜0x04)。


 起動されたドライブではなく、どのドライブを読み込んでいるかを知るためには、かなり面倒な手順が必要になります。
 http://sbeach.seesaa.net/article/387861583.html

 が、ここまで必要な事はないでしょう。


4)ディスクの読み出しは、0x4274(モード5)、0x0198(モード6)を使用する

 モード5の場合、0x51f2を使用しているものもありますが、ワークエリアが設定されていません。
 そのために意図しない場所にワークデータが書き込まれる事があります。

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


5)mk2SR/66SR+外付1DD/2Dドライブで、1Dディスクを読み出す
 (1DDドライブで1Dディスクを読み書きする時のトラック幅問題は、今は考えません)

 普通のBASICで作成された1Dディスクを、mk2SR/66SR+外付1DD/2Dドライブで読み出したい場合、普通には読めません。

 上の2、4)の通り、ヘッダに何も書かれていないディスクで起動すると、1DD/2Dフォーマット対応になってしまうからです。モード1〜5にしても、1DD/2Dフォーマットのままです。



 SD6031/SD6031WIFを使っていると、ドライブが1DD/2Dドライブ扱いのため、この問題に引っ掛かります。

 mk2+SD6031の構成で、モード5で作ったデータを、mk2SR+SD6031の構成で、同じモード5でも読めない状態になるんですね。


 回避する方法ですが、『"SYS"のヘッダのディスクで、BASICに戻ってくるもので起動する』が一番簡単です。
 例えば、6601のユーティリティディスクや、拙作のSD6031用のプログラムセレクタなどです。


 自作する場合は、1Dフォーマットをしたディスクに、トラック#0セクタ#1の先頭から4バイトを
 0x53,0x59,0x53,0xc9 として下さい。


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

2018年06月04日

P6のフロッピー関連まとめ(1)

  P6月間なので...(その4)

  何度かフロッピー関連に関して書いたんですが、いろいろと分かりにくいのと欲しい情報がまとまっていないようなので、再度まとめる事に挑戦してみます。既出なものが多数あると思いますがご容赦を。


1.P6のBASICで認識できる、フロッピーディスク、フロッピードライブの種類
  機種によってドライブが内蔵されていたり、1DD/2Dが扱えるようになっていたりと、かなりごちゃごちゃになっています。


 ・PC-6001+拡張BASIC
  外付1Dドライブ(ex:PC-6031)+1Dディスク
  外付ドライブ1〜4まで認識します。オート起動はできません。


 ・PC-6001mk2
  外付1Dドライブ(ex:PC-6031)+1Dディスク
  外付ドライブ1〜4まで認識します。オート起動が可能です。


 ・PC-6601
  内蔵1Dドライブ+1Dディスク
  外付1Dドライブ(ex:PC-6031)+1Dディスク
  内蔵ドライブ1〜2、外付ドライブ1〜2まで認識します。


 ・PC-6001mk2SR
  外付1DDドライブ(ex:PC-6031SR)+1DDディスク
  外付2D ドライブ(ex:PC-80S31) +2D ディスク
  外付1D ドライブ(ex:PC-6031) +1Dディスク
  外付ドライブ1〜2まで認識します。

  シリーズで唯一ドライブが2つしか認識しません。
  mk2SRのBASIC-ROMはP6SRと同じために、内蔵ドライブがない分だけ少なくなっています。


 ・PC-6601SR
  外付1DDドライブ(ex:PC-6031SR)+1DDディスク
  外付2D ドライブ(ex:PC-80S31) +2D ディスク
  外付1D ドライブ(ex:PC-6031) +1Dディスク
  内蔵1DDドライブ+1DDディスク
  内蔵ドライブ1〜2、外付ドライブ1〜2まで認識します。


  PC-6601/SRで外付ドライブを使用するためには、追加のハードが必要です。
http://sbeach.seesaa.net/article/387861528.html

  8255+αの簡単な回路ですが正式リリースはされていません(普通は要らないですし)。
  その割に、BASICではちゃんと対応しているというナゾ。


  初代/mk2/66は 1D しか扱えませんが、mk2SR/66SRは、1D 以外に、1DD/2D が扱えます。

  P6から見て、1DD と 2D の区別はありません。
  外付ドライブに対して、両面指定のコマンドを出力した時の動作が、
  PC-80S31 :1D/2D のディスクの両面を使う(=2D)
  PC-6031SR:シリンダ数を80シリンダ使う(=1DD)
  となるためです。


  1Dしか扱えない初代/mk2/66に、外付1DDドライブ(ex:PC-6031SR)や外付2Dドライブ(ex:PC-80S31)をつけた場合は、外付1Dドライブとして動作します。

  ですのでBASICでは、初代/mk2/66は、1Dしか扱う事ができません。
  しかし、自分でプログラムを書けばこの限りではありません。例えば、移植Wizシリーズは全て1DD/2Dでも動作します。


  ちなみにSD6031やSD6031WIFは、PC-80S31/PC-6031SR相当です。SDカード上では、データをトラック番号で扱っているため、1DD/2Dの区別はありません。

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

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