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 として下さい。