PC-6601SRの内蔵フロッピーディスクについて

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台に設定されている状態での確認です。

  1. 本体起動時にドライブにディスクが挿入されていない場合、永遠に起動メニューが表示されない。 → 実機で10分ほど放置して確認。
  2. 本体起動時になんらかのディスクが入っている場合、1分ほど放置すると起動メニューが表示される。 → 実機で確認。ディスクは何でもよく、2HDやアンフォーマットの1DDディスクでも起動した。
  3. PC-6601のユーティリティディスク(1D)を入れて起動すると、6601のユーティリティ画面が表示される。
  4. PC-6601でフォーマットした1Dディスク(オートスタート無しのディスク)を入れて起動すると、即座にモード選択画面が表示される。

検証1

上記(2)の起動状態から、F4でPC-6601モードに移行すると、再度、ディスクアクセスが始まります。1分ほど放置しておくと、How many files?の表示になります。

PC-6601のユーティリティディスク(1D)に入れ替えてfilesを実行するとI/Oエラーになってしまいます。

PC-6601SRのユーティリティディスク(1DD)に入れ替えてfilesを実行するとファイル一覧が表示されます。また、フォーマット済みの1DDディスクへの書き込みもできました。

このことから、1DDモードとして起動していることがわかります。

検証2

上記(2)の起動状態から、F5キーでPC-6601SRモードに移行すると、how many files?の表示になります。この状態でPC-6601SRのユーティリティディスク(1DD)に入れ替えてfilesを実行すると ファイル一覧が表示されloadも可能です。また、フォーマット済みの1DDディスクへの書き込みもできました。

検証3

上記(3)の状態ではPC-6601の起動モードになっています。このままfilesを実行するとPC-6601用ユーティリティディスク(1D)内のファイル一覧が表示されloadも可能です。

ただし、PC-6601用のフォーマットユーティリティを起動し、1DディスクをフォーマットしようとするとI/Oエラーになってしまいます。 1Dの読み込みはできるが、書き込みは出来ない、ということになります。

検証4

上記(3)の状態で、1DDディスクに入れ替えてfilesを実行するとI/Oエラーになります。1Dのオートスタートで起動した場合は、1DDディスクへのアクセスは出来ないようです。

検証5

上記(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モード」ということになります。

資料:BASICでのトラックの割り当て

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だけでフォーマット済みディスクを作成する

上記のことからわかるように、PC-6601SRでは、フォーマット済みのディスクがなくても、BASIC起動時にディスクドライブ使用可能状態にすることができます。(PC-6601ではできません)

手元にPC-6601SRと、未フォーマットの1DD(2DDでも可)のディスクがあれば、下記の手順でBASICで読み書きできるフォーマット済みディスクを作成できます。

  1. PC-6601SR背面のドライブ数設定を1に設定する
  2. PC-6601SRを起動してディスクを本体に入れる
  3. 未フォーマットのディスクの場合、1分ほど待つとメニューが表示されるのでF5キーを押してPC-6601SRモードでBASICを立ち上げる
  4. フォーマットプログラムを実行する
  5. フォーマットプログラムは、本体付属のユーティリティディスクに入っているのですが、それだと結局、ユーティリティディスクがないとディスクを使えないという話になってしまいますから、 ユーティリティディスク内のフォーマットプログラムから一部抜粋したリストを公開します

※ここのプログラムでは、うまくフォーマット出来ない場合があるようです。 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関数

上記のフォーマットプログラムに出て来る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の両方で起動し、データセーブできるゲームタイトルがある。サンダーフォースとトリトーン。