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周り | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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


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