2022年11月13日日曜日

パソピア7/700用のFDフォーマッタ

パソピア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と初代パソピアはエミュレータでしか確認できていないので、すぐ試せる方は試して報告してもらえると助かります。

3 件のコメント:

  1. ありがとうございます。これでエミュでの使用幅が広くなりました。(^^)b

    返信削除
  2. ご報告を受けているかもしれませんが、パソピア7と
    PA7221と言うドライブでフォーマットし、
    簡単にですがファイル保存も行えるコトを確認
    致しました。

    一度CRCエラーが発生したのですが、再度実行すると、
    エラー無くフォーマットが完了致しました。

    ドライブが古いですし、コンデンサを全部交換した
    装置で、そちらに問題がある可能性もありますが。

    あまり、ご協力出来なくて申し訳ありませんが、
    出来る限り試させていただきます。

    返信削除
    返信
    1. 報告ありがとうございます、助かります。
      純正フォーマッタはBIOSエラー時3回リトライしてましたが、このフォーマッタは1回リトライにしています。BIOSからエラーが返ってきた場合、処理中断する可能性が高くなっていると思います。
      貴重な報告、ありがとうございました!

      削除