パソピア7にはBIOSが搭載されているので、BIOSコールを試してみる
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~ではなく、1~16なので注意
※トラック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に書き込まれていた。