BIOSを呼びだす場合は、Cレジスタにファンクション番号をセットした後、0005hをコールする。
ファンクション番号によっては、各レジスタに必要なパラメータをセットしておく
BIOSコールを呼び出すBASICプログラムを用意してみました。
100 'Pasopia7 BIOS Call Test (C) 2015 zak
110 CLEAR ,&HEFFF 120 FOR I=&HF000 TO &HF02D 130 READ A$ 140 POKE I,VAL("&H"+A$) 150 NEXT I 160 FOR I=0 TO 6 170 IF I=5 THEN PRINT"H"; ELSE IF I=6 THEN PRINT"L"; ELSE PRINT CHR$(I+65); 180 INPUT " Register &H",A$ 190 POKE &HF034-I,VAL("&H"+RIGHT$("00"+A$,2)) 200 NEXT I 210 A=&HF000:CALL A 220 PRINT"-----" 230 FOR I=0 TO 6 240 IF I=5 THEN PRINT"H"; ELSE IF I=6 THEN PRINT"L"; ELSE PRINT CHR$(I+65); 250 A=PEEK(&HF034-I): 260 PRINT " Register &H";RIGHT$("0"+HEX$(A),2) 270 NEXT I 280 A=PEEK(&HF035) 290 PRINT "F Register &H";RIGHT$("0"+HEX$(A),2) 300 END 310 DATA C5 :'F000 PUSH BC 320 DATA D5 :'F001 PUSH DE 330 DATA E5 :'F002 PUSH HL 340 DATA F5 :'F003 PUSH AF 350 DATA 2A,2E,F0 :'F004 LD HL,(F02Eh) 360 DATA ED,5B,30,F0 :'F007 LD DE,(F030h) 370 DATA ED,4B,32,F0 :'F00B LD BC,(F032h) 380 DATA 3A,34,F0 :'F00F LD A,(F034h) 390 DATA CD,05,00 :'F012 CALL BIOS 400 DATA 32,34,F0 :'F015 LD (F034h),A 410 DATA ED,43,32,F0 :'F018 LD (F032h),BC 420 DATA ED,53,30,F0 :'F01C LD (F030h),DE 430 DATA 22,2E,F0 :'F020 LD (F02Eh),HL 440 DATA F5 :'F023 PUSH AF 450 DATA C1 :'F024 POP BC 460 DATA 79 :'F025 LD A,C 470 DATA 32,35,F0 :'F026 LD (F035h),A 480 DATA F1 :'F029 POP AF 490 DATA E1 :'F02A POP HL 500 DATA D1 :'F02B POP DE 510 DATA C1 :'F02C POP BC 520 DATA C9 :'F02D RET |
このプログラムを使って、BIOS経由でFDDの情報を読み込んでみます。
FAT情報がTrack18(12h), Head0, Sector1に保存されているので、その内容を読み込んでみます
まずは起動時の「How may disk drives」に、ドライブ数を指定。
FDをセットした後、上記プログラムをRUN
各レジスタにセットするパラメータを聞かれるので、A~Lレジスタの値を入力
FDDパラメータのセット(ファンクション番号18=12h)における、各レジストリの値は以下の通り。
- A=&H00 (0-2bit:DriveNumber, 3-4bit:0, 5-6bit:DriverType, 7bit=DiskSide)
- B=&H10 (Read/Write SectorNumber)
- C=&H12 (FDD Parameter Set: BIOS Function Number 18=12h)
- D=&H12 (Track Number: 12h=18)
- E=&H01 (Sector Number)
- H=&HE0 (Distnation Address: HL=E000h)
- L=&H00
Lまで入力してRETURNを押すと、BIOSコールを実行し、戻ってきたレジストリを表示して終了する
続いてディスク読み込み(ファンクション番号19=13h)を行う
パラメータは無いので、Cレジストリに13hのみセットして実行
キャリーフラグ(Fレジスタの0bit)が0なら成功、1なら失敗
Aレジスタが30h(文字の"0")の場合は成功、31h(文字の"1")の場合はNotReadyです
成功した場合は、出力先アドレス(HL)にE000hをダンプしてみるとFAT情報が書き込まれています
FAT情報には、16バイト毎に以下のファイル情報が書かれています
- 0-8byte:ファイル名
- 9byte:ファイル属性(BSAVEで保存したファイルは01h)
- 10byte:クラスタ番号
- 11-15byte:未使用(FFh)
クラスタ番号は、以下の順番で並んでいる
クラスタ番号 | ヘッド | トラック | セクタ | サイズ | D88の並び順 |
---|---|---|---|---|---|
0 | 0 | 0 | 1~8 | 単密度:128バイト | 0 |
1 | 1 | 1~8 | 倍密度:256バイト | 2 | |
2 | 0 | 9~16 | 単密度:128バイト | 1 | |
3 | 1 | 9~16 | 倍密度:256バイト | 3 | |
4 | 0 | 1 | 1~8 | 倍密度:256バイト | 4 |
5 | 1 | 1~8 | 6 | ||
6 | 0 | 9~16 | 5 | ||
7 | 1 | 9~16 | 7 | ||
・・・ | |||||
68 | 0 | 17 | 1~8 | 倍密度:256バイト | 68 |
69 | 1 | 1~8 | 70 | ||
70 | 0 | 9~16 | 69 | ||
71 | 1 | 9~16 | 71 | ||
72 | 0 | 18 | 1~8 | 倍密度:256バイト | 72 |
73 | 1 | 1~8 | 74 | ||
74 | 0 | 9~16 | 73 | ||
75 | 1 | 9~16 | 75 | ||
・・・ | |||||
136 | 0 | 34 | 1~8 | 倍密度:256バイト | 136 |
137 | 1 | 1~8 | 138 | ||
138 | 0 | 9~16 | 137 | ||
139 | 1 | 9~16 | 139 |
※トラック0・ヘッド0のみ単密度で、1セクタあたり128バイトとなる。
※D88ファイルに吸い出した場合、トラックx・ヘッド0・セクタ1~16 → トラックx・ヘッド1・セクタ1~16の順番で記録されるため、クラスタ番号と並び順が異なる
先ほどダンプしたファイル情報の場合、最初のファイルのクラスタ番号が47h(=71)なので、
トラック:17
ヘッド:1
セクタ:9-16
を見に行くと、ファイルのデータ中身が見えるはず。。BASICのDSKI$()関数では、トラック0・ヘッド0は取得できない制限がある(ここだけ単密度だから?)ので、どうしても読みたい場合はBIOSを直接コールすると取得できるはず。
試してみると、
結果を見ると、16セクタ×128バイト(単密度)=2048(800h)バイトぶんのデータがE000h~E7FFhに書き込まれていた。
0 件のコメント:
コメントを投稿