ディスクサブシステム

ディスクサブシステムI/FのI/Oポート

アドレスR/W説明
FChR/W ディスクサブシステムI/F 8255 ポートA
標準状態ではサブシステムからのデータ受信ポート
FDhR/W ディスクサブシステムI/F 8255 ポートB
標準状態ではサブシステムへのデータ送信ポート
FEhR/W ディスクサブシステムI/F 8255 ポートC
Bit76543210
R/WWR
信号 ATN DAC RFD DAV
DAC RFD DAV

ATN W Attension サブシステムにコマンドを送る・コマンドを中断するときに1にする
DAC Data Accepted サブシステムからデータを引き取った後に1にする
RFD Ready For Data サブシステムに対してデータを要求するときに1にする
DAV Data Valid データをポートBに出力した後に1にする
DAC R Data Accepted サブシステムがデータを引き取った後に1になる
RFD Ready For Data サブシステムがデータを要求するときに1になる
DAV Data Valid ポートAにデータが出力された後に1になる
FFhW ディスクサブシステムI/F 8255 コントロール

サブシステムとの通信プロトコル

サブシステムとの通信を行うROM内ルーチン

ラベルアドレス機能
N88N
PUTCOM37CCh017ChAレジスタの内容をコマンドとしてサブシステムに送信する
PUTDAT37D2h0183hAレジスタの内容をサブシステムに送信する
GETDAT3847h01E9hサブシステムから受信したデータをAレジスタに返す
※N88: ワークエリア(EF15h)が 00h でない場合、Lレジスタの内容を2バイト目として高速ハンドシェイクを行う

サブシステム コマンド

コマンド番号はコマンド送信で、パラメータは通常ハンドシェイクで送る
<ドライブ番号>0, 1
<トラック番号>0〜79
<セクタ番号>1〜16 (2D)

コマンド番号00h
機能名イニシャライズ
コマンド形式 ホスト→サブ <00h>
機能 ドライブのモータON、FDCをリセット、ヘッドを初期位置へ戻す
ドライブの動作モード(両面/片面)、リードアフターライトチェックモードは変更しない

コマンド番号01h
機能名ライトデータ
コマンド形式 ホスト→サブ <01h> <セクタ数> <ドライブ番号> <トラック番号> <セクタ番号> <データ列...>
機能 ホストから送信されるデータをディスクに書き込む

コマンド番号02h
機能名リードデータ
コマンド形式 ホスト→サブ <02h> <セクタ数> <ドライブ番号> <トラック番号> <セクタ番号>
機能 指定のセクタからデータを読み出し、サブシステムのバッファに格納する
ホストがデータを得るには、センドデータコマンドを続けて実行する

コマンド番号03h
機能名センドデータ
コマンド形式 ホスト→サブ <03h>
サブ→ホスト <データ列...>
機能 直前のリードデータコマンドで読み込んだサイズのデータをホストに転送する

コマンド番号04h
機能名コピー
コマンド形式 ホスト→サブ <04h> <セクタ数> <ドライブ番号1> <トラック番号1> <セクタ番号1> <ドライブ番号2> <トラック番号2> <セクタ番号2>
機能 セクタ単位でセクタの内容をコピーする

コマンド番号05h
機能名フォーマット
コマンド形式 ホスト→サブ <05h> <ドライブ番号>
機能 ディスクのフォーマットを行う

コマンド番号06h
機能名センドリザルトステータス
コマンド形式 ホスト→サブ <06h>
サブ→ホスト <ステータス>
機能 直前に送られたコマンドの実行結果をメイン側に送る
リザルトステータスの第0ビットが1ならエラー
第6ビットが1ならリードバッファにデータ有り
第7ビットが1ならI/O動作終了

コマンド番号07h
機能名センドドライブステータス
コマンド形式 ホスト→サブ <07h>
サブ→ホスト <ステータス>
機能 ドライブステータスのビット7〜ビット4がドライブの接続状態を示す

コマンド番号08h
機能名テストメモリ
コマンド形式 ホスト→サブ <08h>
サブ→ホスト <ステータス>
機能 サブシステムのメモリテストを行う
80h: OK
81h: NG

コマンド番号09h
機能名センドメモリ
コマンド形式 ホスト→サブ <09h> <開始アドレスH> <開始アドレスL> <終了アドレスH> <終了アドレスL>
サブ→ホスト <データ列...>
機能 サブシステムのメモリ内容をホストに転送する

コマンド番号0Ah
機能名アウトマージンサポート
コマンド形式 ホスト→サブ <0Ah> <データ>
機能 サブシステムのI/OポートF7hに指定のデータを出力する(利用価値なし)

コマンド番号0Bh
機能名センドメモリ2
コマンド形式 ホスト→サブ <0Bh> <開始アドレスH> <開始アドレスL> <バイト数H> <バイト数L>
サブ→ホスト <データ列...>
機能 サブシステムのメモリ内容をホストに転送する

コマンド番号0Ch
機能名レシーブメモリ
コマンド形式 ホスト→サブ <0Ch> <開始アドレスH> <開始アドレスL> <バイト数H> <バイト数L>
機能 ホストからサブシステムのメモリにデータを転送する

コマンド番号0Dh
機能名エグゼキュート
コマンド形式 ホスト→サブ <0Dh> <開始アドレスH> <開始アドレスL>
機能 サブシステムの指定アドレスから実行を開始する

コマンド番号0Eh
機能名ロードデータ
コマンド形式 ホスト→サブ <0Eh> <セクタ数> <ドライブ番号> <トラック番号> <セクタ番号> <開始アドレスH> <開始アドレスL>
機能 ディスクからデータを読み出し、サブシステムの指定のアドレスに格納する

コマンド番号0Fh
機能名セーブデータ
コマンド形式 ホスト→サブ <0Fh> <セクタ数> <ドライブ番号> <トラック番号> <セクタ番号> <開始アドレスH> <開始アドレスL>
機能 サブシステムの指定のアドレスのデータをディスクに書き込む

コマンド番号10h
機能名ロード&ゴー
コマンド形式 ホスト→サブ <10h>
機能 イニシャライズ後、ドライブ1、トラック0、セクタ1の256バイトのデータをサブ側の5000hに読み込み、実行する

コマンド番号11h
機能名高速ライトデータ
コマンド形式 ホスト→サブ <11h> <セクタ数> <ドライブ番号> <トラック番号> <セクタ番号> <データ列...>
機能 データ列を高速ハンドシェイクで転送する以外は、01hのライトデータと同じ

コマンド番号12h
機能名高速センドデータ
コマンド形式 ホスト→サブ <12h>
サブ→ホスト <データ列...>
機能 データ列を高速ハンドシェイクで転送する以外は、03hのセンドデータと同じ

コマンド番号13h
機能名エラーインフォ
コマンド形式 ホスト→サブ <13h>
サブ→ホスト <コマンド> <ST0> <ST1> <ST2> <C> <H> <R> <N>
機能 最後にFDCが実行したコマンドとFDCのステータスをホストに転送する

コマンド番号14h
機能名センスデバイスステータス
コマンド形式 ホスト→サブ <14h> <ドライブ番号>
サブ→ホスト <ステータス>
機能 FDCのステータスをホスト側に返す
Bit0UnitSelect0
Bit1UnitSelect1
Bit2HeadSelect
Bit3TwoSided
Bit4Track00
Bit5Ready (常に1)
Bit6WriteProtected
Bit7Fault

コマンド番号15h
機能名高速センドメモリ
コマンド形式 ホスト→サブ <15h> <開始アドレスH> <開始アドレスL> <バイト数H> <バイト数L>
サブ→ホスト <データ列...>
機能 データの転送に高速ハンドシェイクを使用する以外は 0Bh のセンドメモリと同じ
転送バイト数は偶数でなければならない

コマンド番号16h
機能名高速レシーブメモリ
コマンド形式 ホスト→サブ <16h> <開始アドレスH> <開始アドレスL> <バイト数H> <バイト数L> <データ列...>
機能 データの転送に高速ハンドシェイクを使用する以外は 0Ch のレシーブメモリと同じ
転送バイト数は偶数でなければならない

コマンド番号17h
機能名セットサーフィスモード
コマンド形式 ホスト→サブ <17h> <モードH>
機能 各ドライブを片面モードにするか両面モードにするかを指定する
Bit3〜Bit0 0:片面 1:両面
起動時は全ドライブが片面モードになっている

コマンド番号18h
機能名センドサーフィスモード
コマンド形式 ホスト→サブ <18h>
サブ→ホスト <サーフィスモード>
機能 サーフィスモードをホストに送る

コマンド番号19h
機能名セットリードアフターライト
コマンド形式 ホスト→サブ <19h>
機能 リードアフターライトチェックを行うようにする
このコマンド実行後は、ディスクへの書き込みを伴うコマンドの実行後に自動的にリードアフターライトチェックを行う
エラーを検出すると、リザルトステータスのエラービットがセットされる

コマンド番号1Ah
機能名リセットリードアフターライト
コマンド形式 ホスト→サブ <1Ah>
機能 リードアフターライトチェックを行わないようにする

コマンド番号1Bh
機能名リジューム
コマンド形式 ホスト→サブ <1Bh>
機能 セットブレークポイントで停止したサブシステムの実行を再開する
セットレジスタコマンドでPCを変更し、そのアドレスから実行することも可能

コマンド番号1Ch
機能名セットブレークポイント
コマンド形式 ホスト→サブ <1Ch> <アドレスH> <アドレスL>
機能 指定のアドレスにブレークポイントをセットする
ブレークポイントは1ヶ所しかセットできない
ブレークポイントで停止するとリセットされる

コマンド番号1Dh
機能名セットレジスタ
コマンド形式 ホスト→サブ <1Dh> <レジスタID番号> <データH> <データL>
機能 リジュームコマンド(1Bh)で実行を再開するときのレジスタ内容を指定する
レジスタIDレジスタ
0A F
1B C
2D E
3H L
4A' F'
5B' C'
6D' E'
7H' L'
8IX
9IY
10- I
11PC
12SP

コマンド番号1Eh
機能名センドレジスタ
コマンド形式 ホスト→サブ <1Eh> <レジスタID番号>
サブ→ホスト <データH> <データL>
機能 ブレークポイントで停止した時点のレジスタ値をホストに送る

2HDドライブ搭載機で拡張されたサブシステム コマンド

コマンド番号1Fh
機能名セットディスクモード
コマンド形式 ホスト→サブ <1Fh> <ドライブ番号> <ディスクコード>
機能 指定のディスクコードに従ってディスクモードをセット
ディスクコード
Bit76543210
信号 0 0 DSK SPC 0 SCR

DSK ディスクの種類 00: 1D/2D系
01: 1DD/2DD系
10: 1HD/2HD系
SPC 1HDs/2HDs系の選択 0: 非選択
1: 選択
SCR セクタ長 01: 256バイト/セクタ
10: 512バイト/セクタ
11: 1024バイト/セクタ

コマンド番号20h
機能名センドディスクモード
コマンド形式 ホスト→サブ <20h> <ドライブ番号>
サブ→ホスト <ディスクコード>
機能 ディスクモードをホストに送る

コマンド番号21h
機能名セットバウンダリモード
コマンド形式 ホスト→サブ <21h> <バウンダリモード>
機能 バウンダリモードを設定する
0: リード/ライトの範囲を1D/2Dのディスクに限定する
1: リード/ライトの範囲をセクタ長256バイトのディスクに限定する(1HDs/2HDsのディスクを含む)
2: サブシステムで対応可能なすべてのディスクのリード/ライトを許可する

コマンド番号22h
機能名センドバウンダリモード
コマンド形式 ホスト→サブ <22h>
サブ→ホスト <バウンダリモード>
機能 バウンダリモードをホストに送る

コマンド番号23h
機能名ドライブレディチェック
コマンド形式 ホスト→サブ <23h> <ドライブ番号>
サブ→ホスト <ステータス>
機能 ディスク挿入チェック
00h: ディスクが挿入されている
FFh: ディスクが挿入されていない

コマンド番号24h
機能名エクスパンドフォーマット
コマンド形式 ホスト→サブ <24h> <ドライブ番号> <データ>
機能 初期化データを指定してディスクをフォーマットする

1HDs/2HDsについて

トラック0をFMモード・セクタ長128バイトで、残りをMFMモード・セクタ長256バイトでフォーマットした1HD/2HDディスク。このフォーマットの1HD/2HDディスクはオートブートが可能。
トラック0のリード/ライトは256バイト単位で行われるため、セクタ番号は奇数のみ指定可能・セクタ数は実際の1/2を指定する


サブシステム側のI/Oポート

アドレスR/W説明
F4hW ドライブ制御
Bit76543210
信号
CLK DSI TD1 TD0 RV1 RV0

CLK ? ?
DSI ? ?
TD1 ドライブ2 トラック密度 0: 48TPI (2D)
1: 96TPI (2DD/2HD)
TD0 ドライブ1 トラック密度
RV1 ドライブ2 モード 0: 2D/2DD
1: 2HD
RV0 ドライブ1 モード
F8hW モータ制御
Bit76543210
信号
PSEN
MON1 MON0

PSEN ? ?
MON1 ドライブ2 モータ制御 0: モータOFF
1: モータON
MON0 ドライブ1 モータ制御
R FDC μPD765A TC入力
このポートをリードするとFDCにTC信号が入力される
FAhR FDC μPD765A ステータスレジスタリード
Bit76543210
信号 RQM DIO NDM CB D3B D2B D1B D0B

RQM Request for Master DIO==0のとき: データレジスタにデータを書いてよい
DIO==1のとき: データレジスタからデータを読んでよい
DIO Data Input/Output 0: CPU → FDC
1: CPU ← FDC
NDM Non-DMA Mode Non-DMAモードでデータ転送中
CB FDC Busy 1: FDCがコマンドフェーズ・リザルトフェーズ・エグゼキューションフェーズを実行中 コマンド受付不可
DnB FDn Busy ドライブn がSEEKコマンドによるシーク動作を実行中であるか、
シーク動作終了の割り込み要求を保留中
FBhW FDC μPD765A データレジスタライト
R FDC μPD765A データレジスタリード
FChR/W ディスクサブシステムI/F 8255 ポートA
標準状態ではホストからのデータ受信ポート
FDhR/W ディスクサブシステムI/F 8255 ポートB
標準状態ではホストへのデータ送信ポート
FEhR/W ディスクサブシステムI/F 8255 ポートC
Bit76543210
R/WWR
信号
DAC RFD DAV ATN DAC RFD DAV
FFhW ディスクサブシステムI/F 8255 コントロール

サブシステム メモリマップ

    0000h   ┌────────┐
            │  システムROM   │
    0800h   ├────────┤
            :      空き      :
    4000h   ├────────┤
            │書き込みバッファ│
    5000h   ├────────┤
            │読み込みバッファ│
    6000h   ├────────┤
            │     未使用     │
    7F00h   ├────────┤
            │  ワークエリア  │
    8000h   ├────────┤
            :      空き      :
    FFFFh   └────────┘
MシリーズのシステムROMは8Kバイト(0000h〜1FFFh)
戻る