2015年5月16日土曜日

パソピア7でBIOSアクセス

パソピア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の並び順
00018単密度:128バイト0
1118倍密度:256バイト2
20916単密度:128バイト1
31916倍密度:256バイト3
40118倍密度:256バイト4
51186
609165
719167
・・・
6801718倍密度:256バイト68
6911870
70091669
71191671
7201818倍密度:256バイト72
7311874
74091673
75191675
・・・
13603418倍密度:256バイト136
137118138
1380916137
1391916139
※セクタ番号は、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に書き込まれていた。


0 件のコメント:

コメントを投稿