2005/5/15 SET MODEに関する記述を修正
2005/5/15 DSKF関数の両面ディスクに関する記述を修正
2005/5/15 フォーマットプログラムに関する記述を修正
PC-6601SRを中古でゲットしたけどユーティリティディスクもマニュアルもなくて、せっかくのフロッピーディスクが使えないんだけど、という人向けのディスクフォーマットプログラムです。 フォーマットしたディスクさえあれば、BASICでsave/loadが出来るようになるので、ベーマガプログラムや自作ゲームを入力してから保存出来るようになりますね。
また、PC-6601SRのディスクドライブは、1Dと1DDの両方のメディアが扱えたり、PC-6601とは起動時の動作が違うようなので、 実機で色々と試してみました。BASICのload/save/files命令レベルでの確認なので、マシン語では柔軟に1D/1DDを扱えるのかもしれませんが、そのへんの事は調べてません。
とにかくディスクをフォーマットしたい人は、ページ中盤の「PC-6601SRだけでフォーマット済みディスクを作成する」まで読み飛ばしてください。
本体背面のドライブ数設定スイッチが1/2台に設定されている状態での確認です。
上記(2)の起動状態から、F4でPC-6601モードに移行すると、再度、ディスクアクセスが始まります。1分ほど放置しておくと、How many files?の表示になります。
PC-6601のユーティリティディスク(1D)に入れ替えてfilesを実行するとI/Oエラーになってしまいます。
PC-6601SRのユーティリティディスク(1DD)に入れ替えてfilesを実行するとファイル一覧が表示されます。また、フォーマット済みの1DDディスクへの書き込みもできました。
このことから、1DDモードとして起動していることがわかります。
上記(2)の起動状態から、F5キーでPC-6601SRモードに移行すると、how many files?の表示になります。この状態でPC-6601SRのユーティリティディスク(1DD)に入れ替えてfilesを実行すると ファイル一覧が表示されloadも可能です。また、フォーマット済みの1DDディスクへの書き込みもできました。
上記(3)の状態ではPC-6601の起動モードになっています。このままfilesを実行するとPC-6601用ユーティリティディスク(1D)内のファイル一覧が表示されloadも可能です。
ただし、PC-6601用のフォーマットユーティリティを起動し、1DディスクをフォーマットしようとするとI/Oエラーになってしまいます。 1Dの読み込みはできるが、書き込みは出来ない、ということになります。
上記(3)の状態で、1DDディスクに入れ替えてfilesを実行するとI/Oエラーになります。1Dのオートスタートで起動した場合は、1DDディスクへのアクセスは出来ないようです。
上記(4)の状態から、MODE5(PC-6601モード)かMODE6(6601SRモード)でBASICを起動してfilesを実行するとエラーになります。 files前に1DDのディスク(66SRユーティリティ等)に入れ替えてからfilesを実行するとファイルの一覧が表示されloadも可能です。 オートスタートではないフォーマット済み1Dディスクから起動した場合、1DDモードになるようです。
・1DDメディアの読み込みと書き込みができる
・1Dメディアのオートスタートに設定されているディスクを入れてオートスタートすると、1Dモードとして動作する。ただし読み込みのみで書き込みはできない
・本体起動時に1Dオートスタート以外のディスクを入れておくと、1DDの読み書きができる状態で起動する
もっとザックリとまとめると、「1Dオートスタートディスク、つまり、PC-6601で作成されたオートスタートディスクで起動した時のみ1D読み込みモードになる。それ以外はすべて1DDモード」ということになります。
1Dドライブの場合 - N60拡張BASIC / N66BASIC ディスクファイルの構造
トラック | セクタ | 内容 |
---|---|---|
0-17 | すべて | ユーザ領域 |
18 | 1-12 | ディレクトリ |
18 | 13 | ID |
18 | 14-16 | FAT |
19-34 | すべて | ユーザ領域 |
※ハードウェア上はトラック35-40も使えます。参照:PC-6601用3.5インチ1DディスクのLinuxでの読み取りに関する覚え書き
1DDドライブの場合
トラック | セクタ | 内容 |
---|---|---|
0-36 | すべて | ユーザ領域 |
37 | 1-12 | ディレクトリ |
37 | 13 | ID |
37 | 14-16 | FAT |
38-79 | すべて | ユーザ領域 |
上記のことからわかるように、PC-6601SRでは、フォーマット済みのディスクがなくても、BASIC起動時にディスクドライブ使用可能状態にすることができます。(PC-6601ではできません)
手元にPC-6601SRと、未フォーマットの1DD(2DDでも可)のディスクがあれば、下記の手順でBASICで読み書きできるフォーマット済みディスクを作成できます。
※ここのプログラムでは、うまくフォーマット出来ない場合があるようです。 AKIKAWAさんが作成された別のフォーマットプログラムがありますので、 下記のプログラムでダメな場合は、こちらでも試してみてください。
100 CLS:CLEAR512:RESTORE 300
110 DR=1
120 POKE &HED66,DR-1:ADDR=&HD000
130 FOR I=ADDR TO ADDR+&H4B
140 READ D$:D=VAL("&h"+D$)
150 POKE I,D:NEXT I
160 DT=DSKF(DR,5):POKE ADDR+1,DT
170 PRINT "insert disk to drive - ";DR
180 PRINT "formatting begins and press [Y] key."
190 EXEC&H123
200 K$=INKEY$:IF K$="Y" OR K$="y" THEN 220
210 GOTO200
220 EXEC ADDR+2:IF PEEK(&HD000)=1 THEN 400
230 PRINT "end."
240 END
300 DATA00,00,B7,CD,95,01,38,3E,21,00
310 DATAB0,11,01,B0,3E,FF,77,01,FF,0F
320 DATAED,B0,21,00,BC,11,01,BC,AF,77
330 DATA01,FF,00,ED,B0,3A,01,D0,F5,87
340 DATA0E,FE,26,BD,6F,71,24,71,24,71
350 DATA2C,71,25,71,25,71,11,00,B0,F1
360 DATA47,0E,01,3E,10,37,CD,98,01,D0
370 DATA3E,01,32,00,D0,C9
400 PRINT "disk I/O error."
マシン語部分で何をしているのかはこちら。
ORG 0D000H
Z0002: DB 00 ;D000 00 result code
Z0001: DB 00 ;D001 00 Directory Track番号
OR A ;D002 B7
; ディスクの物理フォーマットルーチン
; ED66H: drive number - 1
; [結果]
; CY ... 1:error, 0:success
CALL 0195H ;D003 CD 95 01
JR C,ERROR ;D006 38 3E
LD HL,0B000H ;D008 21 00 B0
LD DE,0B001H ;D00B 11 01 B0
LD A,0FFH ;D00E 3E FF
LD (HL),A ;D010 77
LD BC,0FFFH ;D011 01 FF 0F
LDIR ;D014 ED B0
LD HL,0BC00H ;D016 21 00 BC
LD DE,0BC01H ;D019 11 01 BC
XOR A ;D01C AF
LD (HL),A ;D01D 77
LD BC,0FFH ;D01E 01 FF 00
LDIR ;D021 ED B0
LD A,(Z0001) ;D023 3A 01 D0
PUSH AF ;D026 F5
ADD A,A ;D027 87
LD C,0FEH ;D028 0E FE
LD H,0BDH ;D02A 26 BD
LD L,A ;D02C 6F
LD (HL),C ;D02D 71
INC H ;D02E 24
LD (HL),C ;D02F 71
INC H ;D030 24
LD (HL),C ;D031 71
INC L ;D032 2C
LD (HL),C ;D033 71
DEC H ;D034 25
LD (HL),C ;D035 71
DEC H ;D036 25
LD (HL),C ;D037 71
LD DE,0B000H ;D038 11 00 B0
POP AF ;D03B F1
LD B,A ;D03C 47
LD C,01H ;D03D 0E 01
LD A,010H ;D03F 3E 10
SCF ;D041 37
; ディスクとセクタ単位の入出力ルーチン
; ED66H: drive number - 1
; Areg: sector数
; Breg: track番号
; Creg: sector番号
; DEreg: データ格納メモリの先頭アドレス
; CY = 1 ... 出力処理
; CY = 0 and Z = 0 ... 入力
; CY = 0 and Z = 1 ... チェック
; [結果]
; DE: 次のアドレス(DE + A*256)
; CY: 1 ... error , 0 ... success
CALL 0198H ;D042 CD 98 01
RET NC ;D045 D0
ERROR:
LD A,01H ;D046 3E 01
LD (Z0002),A ;D048 32 00 D0
RET ;D04B C9
END
上記のフォーマットプログラムに出て来るDSKF関数ですが、PC-6001mkII/6601のDSKF関数と違い、PC-6001mkIISR/6601SRでは機能拡張されています。
[機能] ディスクに関する情報を与えます
[書式] DSKF (d,[f])
d:ドライブ番号(1 or 2)
f:機能(0≦f≦10)
[解説] ドライブ番号で指定されたディスクに関する情報を関数の値として返します。<機能>は値として返す情報の種類を指定します。省略された時はディスクの残り容量をクラスタ単位で返します。
0:最大トラック番号
1:1トラック当たりのセクタ数
2:片面ディスク(0を返す)あるいは両面ディスク(1を返す)
3:1トラック当たりのクラスタ数
4:ボリューム当たりのクラスタ数
5:ディレクトリトラック番号
6:1クラスタ当たりのセクタ数
7:FATの開始セクタ番号
8:FATの終了セクタ番号
9:FATの数
10:ディスク属性の入っているセクタ番号
機能2で、ディスクが片面か両面かを取得できるようになっていますね。PC-6001mkIISRに2DDディスクドライブを接続したり、PC-6601SRに2DDドライブを増設したら両面として値が返ってくるのでしょうか(未確認)。→ 2DDドライブをつなげても 1が返ってくることはないそうです。88系のDSKF命令と互換を
・PC-6601で1DD状態で1D以上のトラックを使えるの?とか、そういうところは調べてません。BASIC、というか、BIOS内で辻褄合わせしていると思いますが。
・PC-6601SRのユーティリティディスクには、1Dディスクに保存されているファイルを1DDディスクに転送するプログラムが入っています。同じドライブで、1Dから読み取り、1DDに書き込むという処理をするものなので、1Dと1DDを任意に切り換えることが可能だということです。BASIC+マシン語のプログラムで独自にFATやディレクトリを読み取ってディスクアクセスをしているようなのですが、ちゃんとはプログラムを読んでいません。マシン語部分では、ディスクにコマンド17hを送っているようです。コマンド17hはSET MODEだそうですから、これで1Dと1DDを切り換えているのかなと。
→ えすびさんからの情報で、違うそうです。
> SET MODE に関しては、外部ドライブ用のコマンドです。 mk2SR+外部ドライブや、66SR+SD6031WIF のようなドライブの場合に使います。 私のブログに書きましたが、内蔵ドライブに関しては、1D/1DDを切り替える スイッチはありません。単純に、シークをする際に、トラック番号を×2しているだけです。
・マシン語を使って1Dディスクへの書き込みが出来るかどうかは調べていません。
@onda_toさんから教えて頂いたことをメモとして書き残しておきます。
・PC-6601のコロニーオデッセイはPC-6601SRでは起動しない。
・PC-6601とPC-6601SRの両方で起動し、データセーブできるゲームタイトルがある。サンダーフォースとトリトーン。