手抜き版 - ユーティリティディスクのないPC-6601でBASICからディスクを使えるようにする

2013/4/17:プログラム修正

PC-6601本体はあるけどユーティリティディスクがない場合、未フォーマットの1D/2Dのディスクメディアが手元にあったとしてもどうにもなりません。そこから一歩進むための手順メモです。まずは、どうしてどうにもならなくなってしまうのかをざっくりと説明します。

とにかく1D/2D(2DDも?)のフロッピーディスクの先頭部分だけでもフォーマットできれば、ディスクアクセス可能な状態でBASICが起動できます。それさえできれば、あとはディスクアクセス用の命令を使って、ディスクを完全にフォーマット出来るようになるわけです。ディスクをフォーマットするには、まずはフォーマットされたディスクが必要という、鶏が先か卵が先か状態からの脱出です。

手順その1

  1. PC-6601背面のドライブ数切り替えスイッチを0に設定して電源を入れます。
  2. MODE5, PAGE2を設定してBASICを起動します。
  3. 下記のプログラムを入力します。(とりあえず230行目から340行目は入力しなくてもいいです)
  4. 実行前にプログラムをテープにCSAVEしておくと安心です。
  5. PC-6601背面のドライブ数切り替えスイッチを1にします。
  6. RUNでプログラムを実行します。
  7. 指示に従い、ドライブにディスクを入れてYを押します。
  8. フロッピーディスクがカタカタいうので見守ります。
  9. SN Errorになります。

SN Errorになるのは、背面のドライブ数を切り換えてもBASICではドライブを再認識しないのでディスク関連の命令が実行できないからです(230行目から340行目は、ディスク内にFATやディレクトリエントリを作成しているBASICプログラムなのです)。ただ、この時点でフロッピーディスクのフォーマットは完了しているので、ここでPC-6601をリセットすると、ディスクを認識した状態でBASICが起動します。

66fmt.zip ... 下記のプログラムをテープに保存したWAVファイル。パソコンとPC-6601のカセット端子を専用ケーブルでつないで、WAVファイルをパソコンで再生すればCLOADできます。


10 SCREEN1,1,1:COLOR16,1,1
20 CLS:CLEAR512
30 PRINT"- PC-6601 DISK FORMATTER -"

40 ADDR=&HD000
50 FOR I=ADDR TO ADDR+&H40
60 READ D$:D=VAL("&h"+D$)
70 POKE I,D:NEXT I
80 EXEC&H42B9
90 DR=PEEK(ADDR)

100 PRINT"Insert disk in drive1. Push Y key."
110 EXEC&H1058
120 K$=INKEY$:IFK$<>"y"ANDK$<>"Y"GOTO120

200 EXECADDR+2:IFPEEK(ADDR+1)=0GOTO230
210 IFPEEK(ADDR+1)<>1GOTO400
220 FORT=0TO800:NEXT

230 FIELD#0,128 AS A$,128 AS B$
240 S$=CHR$(255)
250 FOR N=1 TO 7:S$=S$+S$:NEXT
260 LSET A$=S$:LSET B$=S$
270 FOR S=1 TO 12:DSKO$ DR,18,S:NEXT
280 T$=CHR$(254)+CHR$(254)
290 LSET A$=LEFT$(S$,36)+T$+LEFT$(S$,90)
300 FOR S=14 TO 16:DSKO$ DR,18,S:NEXT
310 S$=CHR$(0)
320 FOR N=1 TO 7:S$=S$+S$:NEXT
330 LSET A$=S$:LSET B$=S$
340 DSKO$ DR,18,13
350 PRINT "complete."
360 end

400 PRINT"disk i/o error."
410 end

510 DATA 01,00
520 DATA 3A,00,D0,57,3E,F3,D3,B1,DB,DE,B7,28,2E,15,F3,3E
530 DATA F3,D3,B1,3E,FF,D3,C3,3D,D3,C2,DB,F0,32,64,FE,3E
540 DATA 61,D3,F0,D5,CD,0F,78,D1,DC,31,D0,AF,32,01,D0,3A
550 DATA 64,FE,D3,F0,3E,F7,D3,B1,FB,C9,14,7A,CD,ED,51

手順その2

  1. PC-6601背面のドライブ数切り替えスイッチを1にします。
  2. PC-6601を起動します。
  3. 先ほどのフロッピーディスクを入れます。
  4. BASIC選択画面が出て来るので、MODE5,FILES1,PAGE2で起動します。
  5. 先ほどのプログラムをもう一度入力するかCLOADします。
  6. プログラムをRUN実行します。
  7. ディスクがフォーマットされます。

この状態でFILESを実行してOKと表示されればフォーマットとBASICからの読み書き設定が完了しています。このままSAVE命令でフォーマットプログラムを保存してみて、FILES、LOAD命令で動作確認するといいと思います。

おわり。

えすびさんから色々と手がかりとやる気を頂きました。本当にありがとうございます。


補足1:このプログラムはPC-6601付属のユーティリティディスク内にあるフォーマットプログラムを改編したものです。必要最低限の機能しかないので、誰が書いても同じようなプログラムになると思いますので、権利的には大丈夫かなと。

ディレクトリエントリやFATの生成もマシン語で作ってしまえば、DSKO$,FIELD命令などを使わずに一発でフォーマット済みディスクを作成できるのですが、面倒だったので2段階の手順にしました。


補足2:DATA部のマシン語アセンブルリスト

	ORG	0D002H

	LD	A,(0D000H)	;D002
	LD	D,A		;D005

	LD	A,0F3H		;D006
	OUT	(0B1H),A	;D008	内蔵ドライブへの変更

	IN	A,(0DEH)	;D00A	ナゾ
	OR	A		;D00C
	JR	Z,Z0000		;D00D	エラー処理へ

	DEC	D		;D00F

	DI			;D010

	LD	A,0F3H		;D011
	OUT	(0B1H),A	;D013	内蔵ドライブへの変更

	LD	A,0FFH		;D015
	OUT	(0C3H),A	;D017
	DEC	A		;D019
	OUT	(0C2H),A	;D01A	VOICE ROM選択

	IN	A,(0F0H)	;D01C
	LD	(0FE64H),A	;D01E	保存しておく

	LD	A,061H		;D021
	OUT	(0F0H),A	;D023	メモリブロック指定

	PUSH	DE		;D025
	CALL	0780FH		;D026	Write ID(Format) / VOICE ROM内のディスクBIOSルーチン
	POP	DE		;D029

	CALL	C,Z0001		;D02A

	XOR	A		;D02F	処理正常終了をBASICに伝えるフラグ用
	LD	(0D001H),A	;D030

Z0001:	LD	A,(0FE64H)	;D033	以前のF0Hの値
	OUT	(0F0H),A	;D036

	LD	A,0F7H		;D038	外付けドライブへの変更
	OUT	(0B1H),A	;D03A
	EI			;D03C
	RET			;D03D

Z0002:	INC	D		;D03E

Z0000:	LD	A,D		;D04B
	CALL	051EDH		;D04C	DN Error表示後BASICへ復帰。