2013/4/17:プログラム修正
PC-6601本体はあるけどユーティリティディスクがない場合、未フォーマットの1D/2Dのディスクメディアが手元にあったとしてもどうにもなりません。そこから一歩進むための手順メモです。まずは、どうしてどうにもならなくなってしまうのかをざっくりと説明します。
とにかく1D/2D(2DDも?)のフロッピーディスクの先頭部分だけでもフォーマットできれば、ディスクアクセス可能な状態でBASICが起動できます。それさえできれば、あとはディスクアクセス用の命令を使って、ディスクを完全にフォーマット出来るようになるわけです。ディスクをフォーマットするには、まずはフォーマットされたディスクが必要という、鶏が先か卵が先か状態からの脱出です。
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
この状態で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へ復帰。