パソピア7/700用フロッピーディスクのフォーマットプログラムを作ってみる。
BIOSでFDDを制御するためには、まずパラメータのセット(Fn#=18)が必要
・Cレジスタ:Function(Fn)#=18(FDDパラメータセット)
・HLレジスタ:Buffer先頭アドレス
・Dレジスタ:Track#
・Eレジスタ:Sector#
・Bレジスタ:Read/Write Sector数
・Aレジスタ:FDD Paramter
- bit7:Side (0 or 1)
- bit6-5:00...両面倍密度, 01...片面倍率度, 10...両面単密度, 11...片面単密度
- bit4-3:00固定
- bit2-0:装置番号-1 (0-3)
FDDパラメータセット(Fn#=18)後、以下いずれかのFn#で再びBIOSコール
・Fn#=19:Disk Read(Seek & Read)
・Fn#=20:Disk Write(Seek & Write)
・Fn#=21:Disk Write(Seek & Write with Check)
・Fn#=22:Disk Write Delete(Seek & Write Delete)
・Fn#=23:Disk Restore(Seek to Zero)
・Fn#=24:Disk Format(Seek & Write ID)
・Fn#=25:Disk Check(Check Disk Status)
BIOSコールから戻ってきた際に、キャリーフラグが立つとエラー発生。
・Aレジスタ:終了ステータス
- "0"=30h:正常
- "1"=31h:Not Ready
- "8"=38h:Write Protect
など。
エラー時のリトライは1回ずつ入れることにした。
アンフォーマットのフロッピーだと、最初にトラック毎にIDの書き込みが必要。
IDを書かずにデータ書き込みするとID errorで失敗する。
フォーマット処理フローは以下の通り
(1) 装置初期化
・Fn#18でパラメータセット
- Aレジスタ:FDD Paramter=装置番号-1(0-3)をセット
・Fn#23でDisk Restore
- Aレジスタ:FDD Paramter=07hをセット
(2) トラック毎にID書き込み
・Fn#=18でパラメータセット
- HLレジスタ:ID Buffer先頭アドレス。バッファには以下104バイトを書き込んでおく
- 1バイト目:Track#
- 2バイト目:Side0(00h) or Side1(01h)
- 3バイト目:Index(01h→1Ah)
- 4バイト目:単密度(00h) or 倍密度(01h)
→上記を26回繰り返し4バイト×26回=合計104バイト
- Dレジスタ:Track#
- Eレジスタ:Sector#=E5h
- Bレジスタ:Read/Write Sector数=40h
- Aレジスタ:FDD Paramter=装置番号-1(0-3)をセット(Side1は+80h)
・Fn#24でWrite ID
- Aレジスタ:FDD Paramter=8Dhをセット
(3) Disk読み込みチェック
・Fn#=18でパラメータセット
- HLレジスタ:Read Buffer先頭アドレス。
- 読み込み用に16セクタ(最大4,096バイト)分のバッファを用意しておく
- Dレジスタ:Track#
- Eレジスタ:Sector#=01h
- Bレジスタ:Read/Write Sector数=10h
- Aレジスタ:FDD Paramter=装置番号-1(0-3)をセット(Side1は+80h)
・Fn#=23でDisk Seek & Read
- Aレジスタ:FDD Paramter=30hをセット
(4) Track0.Side0→Track0.Side1→Track1.Side0→Track1.Side1→...
→Track34.Side0→Track34.Side1の順番で(2)(3)を繰り返し。
但しTrack18のWrite ID後、ディレクトリ・ディスク属性・FATをSide0に書き込み
・Fn#=18でパラメータセット
- HLレジスタ:Read Buffer先頭アドレス。
- バッファにはディレクトリ・ディスク属性・FATを書き込んでおく
- Dレジスタ:Track#=12h
- Eレジスタ:Sector#=01h
- Bレジスタ:Read/Write Sector数=10h
- Aレジスタ:FDD Paramter=装置番号-1(0-3)をセット
・Fn#=21でDisk Write with Check
- Aレジスタは変更なし
(5) Disk Restore
・Fn#18でパラメータセット
- Aレジスタ:FDD Paramter=装置番号-1(0-3)+80hをセット
・Fn#23で装置初期化
- Aレジスタ:FDD Paramter=07hをセット
上記の流れで処理を組んでコンパイル。できたバイナリをBASICと組み合わせ。
パソピア7のエミュレータで確認。
うまく行ったっぽい。
エミュが作成したd88イメージをバイナリエディタで確認したが、問題なさそう。
初代パソピアT-DISK BASICでの読み書きもエミュレータで確認。
パソピア7でフォーマットしたディスクは、初代パソピアでも使えそう。実機での動作確認はパソピア700。フォーマット、データ読書きも大丈夫そう。
FDフォーマッタのRAMPACイメージとBASICテキストをアップしました。
パソピア7と初代パソピアはエミュレータでしか確認できていないので、すぐ試せる方は試して報告してもらえると助かります。
ありがとうございます。これでエミュでの使用幅が広くなりました。(^^)b
返信削除ご報告を受けているかもしれませんが、パソピア7と
返信削除PA7221と言うドライブでフォーマットし、
簡単にですがファイル保存も行えるコトを確認
致しました。
一度CRCエラーが発生したのですが、再度実行すると、
エラー無くフォーマットが完了致しました。
ドライブが古いですし、コンデンサを全部交換した
装置で、そちらに問題がある可能性もありますが。
あまり、ご協力出来なくて申し訳ありませんが、
出来る限り試させていただきます。
報告ありがとうございます、助かります。
削除純正フォーマッタはBIOSエラー時3回リトライしてましたが、このフォーマッタは1回リトライにしています。BIOSからエラーが返ってきた場合、処理中断する可能性が高くなっていると思います。
貴重な報告、ありがとうございました!