mz-80K FD (注)T3444Aをベースに解析していますので間違いがあるかもしれません。


IPLをFDインターフェイス内に持っておりmz−80Kの0F000H−0F3FFHに拡張して モニタからFDコマンドで起動するドライブを選択します したがってオートスタートはありません 更にCPU速度の都合で2D、1Dが直接制御出来ない(転送不可)ので2Sドライブとなります   使用ポートはI/Oポートの0F8H−0FBHまで使用(一部上位8ビットもドライブ制御等で使用) FDCはT3444Mで、T3444A(IBM3740フォーマット用)と殆どピンは同じで 25ピン(SIDE SELECT用が追加)がMZ用に変更されたようです このFDC1つでドライブを最大4台まで制御出来ます(ポートは固定なのでこれ以上の接続は出来ません)   ディスク容量は1セクタ128バイト、1トラックは16セクタ分、 片面35トラック、両面なので70トラック 128*16*70=143360バイト(140Kバイト)の容量になります    
IPL mz−80Kの電源を入れるとSP−1002だと オートスタートはなくFDコマンドでディスクブートとなります 起動するドライブを聞いてくるので1から4(CRのみドライブ1)で指定します 指定したドライブからトラック0のセクタ1〜14を09800H〜09EFFHにロード 09800Hが0C3Hだったらブートディスクとみなし09800Hにジャンプします 09800Hが0C3H以外ならデータディスクとみなしブートエラーになります     フォーマット トラックは表0,2,4…で裏1,3,5…となります システムではトラック0〜69と指定しますが FDC設定ではトラック0〜 34とサイド0〜1で設定します  ・−−−−−−−−−−−−−−−−−−・  | システム |  FCDの設定   |  |−−−−−−+−−−−−−−−−−−|  |トラック 0|トラック 0、サイド0|  |トラック 1|トラック 0、サイド1|  |トラック 2|トラック 1、サイド0|  |      |      :    |  |      |      :    |  |トラック68|トラック34、サイド0|  |トラック69|トラック34、サイド1|  ・−−−−−−−−−−−−−−−−−−・           ・−インデックスホール(先頭トラック)       |    ・−インデックスアドレスマーク       |    |  ―――――+―――――――――――――――――――――――――――――――――――――――――――   |GAP|GAP| |GAP|ID   |GAP|DATA |GAP|ID   |GAP|   |274|46 | |32 |フィールド|   |フィールド|   |フィールド|   |……   |バイト|バイト| |バイト|   01| A |   01| B |   02| A |  ―――――――――――――――――――――――――――――――――――――――――――――――――     IDフィールドnn   ――――――――――――――――――――――――――――――――――   |ID  |トラック|    |セクタ |    |   |   |   |アドレス|アドレス|000H|アドレス|000H|CRC|CRC|   | マーク|バイナリ|    |バイナリ|    |   |   |   ――――――――――――――――――――――――――――――――――      DATAフィールドnn   ――――――――――――――――――――――――――――   |DATA|             |   |   |   |アドレス| DATA 128バイト |CRC|CRC|   | マーク|             |   |   |   ――――――――――――――――――――――――――――      GAP A            GAP B         書き込み開始           書き込み終了           |               |   ――――――――+―――――     ―――――+―――――――――――――   |0FFHまたは|000H|     |    :0FFHまたは|000H|   |000H   |    |     |1バイト:000H   |    |   |  11バイト|6バイト|     |    :  26バイト|6バイト|   ――――――――――――――     ―――――――――――――――――――    ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・  |             |クロックビット パターン| データビット パターン|  |−−−−−−−−−−−−−+−−−−−−−−−−−−+−−−−−−−−−−−−|  |インデックスアドレスマーク|    0D7H    |    0FCH    |  |  ID  アドレスマーク|    0C7H    |    0FEH    |  | DATA アドレスマーク|    0C7H    | 0FBH(0F8H) |  ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・        トラック0  セクタ 1〜14 IPL領域 先頭に0C3H,mm,nnがあれば                 ブートディスクとしてメモリに転送、実行を行なう  セクタ15〜16   +000H   +001H       ボリューム 0−128 (0の場合 マスターディスク)   +002H〜+003H 空きセクタ数    トラック1  セクタ 1〜14 ディレクトリ領域 (1ファイル64バイト 最大20ファイル)   +000H       属性 000H=エンドマーク   +001H〜+010H ファイルネーム   +011H       ライトプロテクト   +012H〜+013H サイズ    下位、上位の順   +014H〜+015H 先頭アドレス 下位、上位の順   +016H〜+017H 実行アドレス 下位、上位の順   +018H〜+03DH 予備   +03EH       トラック   +03FH       セクタ  トラック4  セクタ 1    |      データ領域  トラック69  セクタ16  
ドライブモータの制御とドライブの指定 1つのFCDで最大4ドライブの指定、ドライブの使用禁止の制御も出来ます 他のPCならFD用ポートに出力するなりするのですがmz−80FIOではIN命令で制御します。   ポート0F8Hは実際にはここだけ16ビットの入力になり、BCレジスタで指定します。  d15:未使用  d14: 〃  d13: 〃  d12:TND(Transfer Endd)1=連続してセクタをアクセスしない、0=連続してセクタをアクセスする    d11:Drive Motor 1=オン、0=オフ  d10:SE          1=ドライブ使用可、0=ドライブ使用禁止  d9:S1 ドライブセレクト  d8:S0 ドライブセレクト         SE、S1、S0=0、0、0 ドライブ1を選択                  0、0、1 ドライブ2を選択                  0、1、0 ドライブ3を選択                  0、1、1 ドライブ4を選択                  1、0、0 ドライブ1の使用禁止                  1、0、1 ドライブ2の使用禁止                  1、1、0 ドライブ3の使用禁止                  1、1、1 ドライブ4の使用禁止    (例)ドライブのモーターオン、TND=0、ドライブ1      LD BC,008F8H ;d11=1      IN A,(C)    (例)ドライブのモーターオフ、TND=0、ドライブ1      LD BC,000F8H ;d11=0      IN A,(C)  
コマンド ポート0FAHにデータを出力するとFDCのM3〜M0にコマンドを出力 ヘッドの移動、ディスクの読み書きが出来ます   コマンド000H SZ:Seek Zero(使用可)  ドライブのヘッドをトラック0(外周)まで移動   M3:0   M2:0   M1:0   M0:0   コマンド030H SK:Seek  ドライブのヘッドを指定したトラックまで移動   M3:0   M2:0   M1:1   M0:1   コマンド080H WI:Write Index/Id   M3:1   M2:0   M1:0   M0:0   コマンド0A0H SI:Seek and Write Index/ID(使用可)  SK(コマンド030H)とWI(コマンド080H)を実行  指定したトラックのフォーマットを実行  ディスクが1回転する間に連続して   インデックス アドレスマーク   全てのIDフィールド(16セクタ)   各ギャップ  の書き直しを行う  IDアドレスマーク直後のID情報4バイト ”トラックアドレス、000H、セクタアドレス、000H”  をプログラム側で設定する必要があります   RQM=1 ID情報に書き込み可   RQM=0 ID情報に書き込み不可(16セクタまで書き込んだ)     M3:1   M2:0   M1:1   M0:0       コマンド050H RD:Read Data  指定したセクタを1バイト単位で読み  連続してセクタを読む場合はTND=0に指定します   M3:0   M2:1   M1:0   M0:1   コマンド070H SR:Seek and Read Data(使用可)  SK(コマンド030H)とRD(コマンド050H)を実行   M3:0   M2:1   M1:1   M0:1   コマンド090H WD:Write Data  指定したセクタを1バイト単位で書き込み  連続してセクタを読む場合はTN=0に指定します。   M3:1   M2:0   M1:0   M0:1   コマンド0D0H WL:Write Data with Deleted Data Address Mark WDと同様の処理 データフィールドの先導マークとしてデリーラッドデータアドレスマークが書き込まれる 連続セクタの書き込み不可   M3:1   M2:1   M1:0   M0:1   コマンド0B0H SD:Seek and Write Data(使用可)  SK(コマンド030H)とWD(コマンド090H)を実行   M3:1   M2:0   M1:1   M0:1   コマンド0F0H SL:Seek and Write Data with Deleted Data Address Mark  SK(コマンド030H)とWL(コマンド0D0H)を実行   M3:1   M2:1   M1:1   M0:1   コマンド010H NS:Sence Drive Status ドライブがレディ状態(DRDY=1)か調べる 2台以上のドライブを制御する場合にはカレントトラックレジスタの修正に使われます   M3:0   M2:0   M1:0   M0:1  
STATUS ・−−−−−−−−−−−−−・ |CRDY|S1 S2 S3| |−−−−+−−−−−−−−| |  1 | 1  1  0|ドライブがレディでない状態でコマンドSZ以外を実行 |    |        |またはライトプロテクトの状態で書き込み関係のコマンドを実行 |  1 | 0  1  0|IDフィールド検出不能 |  1 | 1  0  1|IDフィールドのトラックアドレスが0FFH(デフェクティブトラック) |  1 | 1  1  1|シークエラー |  1 | 0  0  1|データフィールドに誤りを検出 |  1 | 0  1  1|ファイル アンセーフ |  1 | 0  0  0|誤りを検出することなくコマンドの実行を完了 |  1 | 1  0  0|誤りを検出することなくコマンドの実行を完了 |    |        |(RD,SRのデリーテッド・データアドレスマークで先導されるデータフィールドを読み込んだ場合) ・−−−−−−−−−−−−−・   ステータスとコマンドの対応表 ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ |CRDY|S1 S2 S3|                                | |−−−−+−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−| |  1 | 1  1  0|   SK、RD、WD、WL、WI、SR、SD、SL、SI、NS| |  1 | 0  1  0|      RD、WD、WL、   SR、SD、SL      | |  1 | 1  0  1|      RD、WD、WL、   SR、SD、SL      | |  1 | 1  1  1|      RD、WD、WL、   SR、SD、SL      | |  1 | 0  0  1|      RD、         SR            | |  1 | 0  1  1|         WD、WL、WI、   SD、SL、SI、  | |  1 | 0  0  0|SZ、SK、RD、WD、WL、WI、SR、SD、SL、SI、NS| |  1 | 1  0  0|      RD、         SR            | ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・   
使用ポート 0F8H:入力(入力なのですがI/Oポートのd8〜12を出力パラメータとして0F8Hを読むことで出力を行っています。)    d15:未使用  d14: 〃  d13: 〃  d12:TND(トランスファエンド) 1=連続してセクタをアクセスしない、0=連続してセクタをアクセスする  d11:ドライブモータ        1=オン、0=オフ  d10:SE             1=ドライブ使用可、0=ドライブ使用禁止  d9:S1 ドライブセレクト     00=ドライブ1、01=ドライブ2  d8:S0 ドライブセレクト     10=ドライブ3、11=ドライブ4     TNDの連続アクセス    T3444A セクタ26の次は同じトラックのセクタ1に移動    T3444M セクタ16の次は同じトラックのセクタ1に移動、RQM=0になる(未確認)       0F8H:出力 SES(Select Sector Address)  d7:サイド  d6: −  d5: −  d4:セクタ d4 0   =ID情報  d3:セクタ d3 1〜16=セクタ  d2:セクタ d2  d1:セクタ d1  d0:セクタ d0     0F9H:入力 FDC  d7:未使用  d6: 〃  d5: 〃  d4: 〃  d3: 〃  d2:DRDY 1=ドライブ レディ、0=ドライブ ビジィ  d1:CRDY 1=FDC  レディ、0=FDC  ビジィ  d0:RQM  1=リクエスト不可 、0=リクエスト 可     DRDY:34ピン Drive Ready   CRDY:37ピン Contoller Ready   RQM :14ピン Request Memory Refence    1=データ受信不可 、0=データ受信可(リード時)    1=データ転送不可 、0=データ転送可(ライト時)   0F9H:出力 SET(Select Track Address)  トラックの指定     0FAH:入力 SEM(Select Command/Status)  d7:C3(CRDY)  d6:C2(S1)  d5:C1(S2)  d4:C0(S3)  d3:未使用  d2: 〃  d1: 〃  d0: 〃   0FAH:出力 SEM(Select Command/Status)  d7:M3  d6:M2  d5:M1  d4:M0  d3:未使用  d2: 〃  d1: 〃  d0: 〃     0FBH:入力 PRM(Permit Memory Refernce)   データ リード 0FBH:出力 PRM(Permit Memory Refernce )   データ ライト  
主なROMルーチン 0F000H:000H ROM ID 0F001H:初期設定 0F01CH:ドライブの選択        トラック0 セクタ1〜14 リード、メモリ09800Hに転送        ブート     0F090H:ドライブ モータ オン 0F0A7H:ドライブ モータ オフ 0F0B2H:シーク ゼロ 0F0BDH:FDCがREADYになるまで待つ 0F0D9H:FDCステータス 0F0FFH:PRMドライブ(ドライブの起動) 0F13BH:IPLリード        IX=ディスクデータ         +0:ドライブ         +1:トラック設定値         +2:セクタ 設定値         +3:サイズ下位         +4:サイズ上位         +5:ロードまたはセーブ アドレス下位         +6:ロードまたはセーブ アドレス上位         +7:アクセス中のトラック         +8:アクセス中のセクタ  
mz−80Kのコーナへ Home へ戻る