PC-6031/PC-8031 などのフロッピードライブと同じように、SD6031/SD6031WIFでもPC-6001側からコマンドを送信して、制御します。
SD6031 は既存のコマンド以外に独自のコマンドを追加しています。これにより、従来のフロッピードライブでは出来なかった事(ex:ハードディスクモード)が出来るようになっています。
追加されているコマンドは、コマンド番号0x80〜0x88、0xFD〜0xFE です。
以下が SD6031/SD6031WIF で使用できるコマンドの一覧です(最新のファームの分です)。
1)書き込みコマンド群
○コマンド0x01:WRITE DISK(ディスクへの書き込み)
P6→SD6031:0x01 書き込むセクタ数 ドライブ番号 トラック番号 セクタ番号 書き込みデータ…書き込みデータ
○コマンド0x11:HIGH SPEED WRITE(高速ハンドシェークでのディスクへの書き込み)
P6→SD6031:0x11 書き込むセクタ数 ドライブ番号 トラック番号 セクタ番号 書き込みデータ…書き込みデータ
○コマンド0x83:EXPAND WRITE(ディスクへの拡張版書き込み)
P6→SD6031:0x83 書き込むセクタ数 ドライブ番号 トラック番号上位 トラック番号下位 セクタ番号 書き込みデータ…書き込みデータ
○コマンド0x84:EXPAND HIGH SPEED WRITE(高速ハンドシェークでのディスクへの拡張版書き込み)
P6→SD6031:0x84 書き込むセクタ数 ドライブ番号 トラック番号上位 トラック番号下位 セクタ番号 書き込みデータ…書き込みデータ
○コマンド0x86:DOUBLE HIGH SPEED WRITE(4バイトハンドシェークでのディスクへの拡張版書き込み)
P6→SD6031:0x86 書き込むセクタ数 ドライブ番号 トラック番号 セクタ番号 書き込みデータ…書き込みデータ
○コマンド0x87:EXPAND DOUBLE HIGH SPEED WRITE(4バイトハンドシェークでのディスクへの拡張版書き込み)
P6→SD6031:0x87 書き込むセクタ数 ドライブ番号 トラック番号上位 トラック番号下位 セクタ番号 書き込みデータ…書き込みデータ
書き込みコマンドが複数存在するのは、
・一度に書き込むバイト数が、1バイト/2バイト/4バイト
・トラック番号の指定の仕方が、8ビット/16ビット
の3通り×2通り=6通りの指定の方法があるためです。
やる事は全て同じで、指定したセクタに対して、データを書き込みます。
1セクタは256バイトですので、一度に256×セクタ数分のデータを書き込みます。
複数のセクタにまたがって書き込む事は可能ですが、トラックをまたぐことは出来ません。
○コマンド0x05:FORMAT
P6→SD6031:0x05 ドライブ番号
指定のドライブをフォーマットします。具体的には、データの部分を 0xFF で埋めます。このコマンドは通常の1D/1DD(2D)フォーマットのイメージファイルのみに使用してください。HDDイメージなどは使用しないで下さい。
2)読み出しコマンド群
○コマンド0x02:READ DATA(ディスクからの読み出し)
P6→SD6031:0x02 書き込むセクタ数 ドライブ番号 トラック番号 セクタ番号
○コマンド0x85:EXPAND READ(ディスクからの拡張版読み出し)
P6→SD6031:0x85 書き込むセクタ数 ドライブ番号 トラック番号上位 トラック番号下位 セクタ番号
○コマンド0x03:TRANSFER BUFFER(ディスクからの読み出し)
P6→SD6031:0x03
SD6031→P6:読み出しデータ…読み出しデータ
○コマンド0x12:HIGH SPEED TRANSFER READ DATA(2バイトハンドシェークでのディスクからの読み出し)
P6→SD6031:0x12
SD6031→P6:読み出しデータ…読み出しデータ
○コマンド0x88:DOUBLE HIGH SPEED TRANSFER READ DATA(4バイトハンドシェークでのディスクからの読み出し)
P6→SD6031:0x88
SD6031→P6:読み出しデータ…読み出しデータ
書き込みコマンドと同じく、読み出しコマンドも指定方法により複数存在します。
READ DATA系で、ディスクからバッファにデータを読み出し、TRANSFER BUFFER系でそのデータをP6側に転送します。
3)ドライブの設定、状態の読み出し
○コマンド0x00:INITIALIZE
P6→SD6031:0x00
初期化コマンドですが、SD6031/SD6031WIF では何もしていません。
○コマンド0x06:COMMAND STATUS
P6→SD6031:0x06
SD6031→P6:STATUS情報(下記)
STATUS情報は以下の通りです(1バイトのデータ)。
bit7:常に1
bit6: READ DATA系を実行した後に1、TRANSFER BUFFER系を実行した後に0
bit5-1:常に0
bit0:直前のコマンドがエラー時に1、エラーがなければ0
○コマンド0x07:DRIVE STATUS
P6→SD6031:0x07
SD6031→P6:STATUS情報(下記)
STATUS情報は以下の通りです(1バイトのデータ)。
bit7:ドライブ#3を使用時に1
bit6:ドライブ#2を使用時に1
bit5:ドライブ#1を使用時に1
bit4:ドライブ#0を使用時に1
bit3-0-1:常に1
現在のファームでは、常に0xFF が返されています(4ドライブ使用)。将来的に修正する可能性があります。
○コマンド0x0B:GET MEMORY
P6→SD6031:0x0B アドレス上位 アドレス下位 バイト数上位 バイト数下位
SD6031→P6:メモリ情報・・・メモリ情報
フロッピードライブのROMの内容を読み出す命令です。
BASIC-ROM から読み出される場合があるため、SD6031/SD6031WIF では、特定のアドレスを読み出した時に特定の値を返すようにしています。
○コマンド0x14:DRIVE STATUS
P6→SD6031:0x14 ドライブ番号
SD6031→P6:ST3
uPD765A の ST3 を返します。SD6031/SD6031WIF では、SDカード、イメージファイルにライトプロテクトが設定されている場合には 0x40 を、そうでない場合は 0x00 を返します。
○コマンド0x17:SET MODE
P6→SD6031:0x17 設定情報
1D/1DD(2D) の設定の変更を行います。
bit7-4:未使用
bit3:ドライブ#3の設定(0で1D、1で1DD/2D)
bit2:ドライブ#2の設定(0で1D、1で1DD/2D)
bit1:ドライブ#1の設定(0で1D、1で1DD/2D)
bit0:ドライブ#0の設定(0で1D、1で1DD/2D)
リセット直後は、すべてのドライブで1Dモードです。
○コマンド0x18:ASK MODE
P6→SD6031:0x18
SD6031→P6:設定情報
コマンド0x17 で設定した情報を読み出すコマンドです。
○コマンド0x80:SET SECTOR DATA(開始/終了セクタ番号のセット)
P6→SD6031:0x80 ドライブ番号 開始セクタ番号 終了セクタ番号
使用するイメージファイルの開始セクタ番号、終了セクタ番号を変更します。この番号を変更する事で、1トラック内のセクタ数が決まります(終了セクタ番号−開始セクタ番号+1)。リセット直後は、開始セクタ番号=0x01、終了セクタ番号=0x10です。
トラック番号の開始番号は変更できません。トラックの終了番号は特に制限していません(チェックの対象としていません)。
○コマンド0x81:ASK SECTOR DATA(開始/終了セクタ番号の読み出し)
P6→SD6031:0x81 ドライブ番号
SD6031→P6:開始セクタ番号 終了セクタ番号
SET SECTOR DATA で設定した値を読み出します。
4)イメージファイル関連
○コマンド0x82:REPORT DISK IMAGE LENGTH(イメージファイル長の読み出し)
P6→SD6031:0x82 ドライブ番号
SD6031→P6:イメージファイル長×4(最上位から送信される)
現在選択しているイメージファイルの長さを読み出します。P31 ファイルのファイル長を読み出しますので、実際にデータがある部分の2倍が読み出されます。
例えば、普通のフロッピーイメージの場合は、(256×2)×16×80 = 655360 バイトになります。
○コマンド0xFD:GET IMAGE FILE
P6→SD6031:0xFD ドライブ番号
SD6031→P6:
0x01、ファイル#1のファイル名1バイト目…ファイル#1のファイル名8バイト目、
0x01、ファイル#2のファイル名1バイト目…ファイル#2のファイル名8バイト目、
:
0x01、ファイル#nのファイル名1バイト目…ファイル#nのファイル名8バイト目、
0x00
SDカードに格納されているイメージファイルの一覧を取得します。イメージファイルの数分だけ、0x01+ファイル名(8バイト)の9バイトを順番に送信してきます。最後に0x00が送信されます。返してくるバイト数は、9×ファイル数+1 になります。P6側では、0x00 が受信されるまで読み出す必要があります。
ファイル名は、拡張子を除いた8文字です。拡張子はP31に固定されてます。ファイル名が8文字未満の場合は、空白(0x20)で埋められます。
○コマンド0xFE:SET IMAGE FILE
P6→SD6031:0xFE ドライブ番号 ファイル名1バイト目…ファイル名8バイト目
指定したドライブ番号のイメージファイルを、指定するファイルにします。ファイル名などは、GET IMAGE FILE と同じです。
コマンド0x04:COPY コマンドは、新しいバージョンから廃止しました。


do you have schematics about the PC-6031 (Disk Unit)?
I ask because I want help the MAME/MESS developer to add the disk driver for the P6 series.
もし回路図が入手できるのならば、88系の外付けディスクドライブで代用が可能です。
例えば、PC-8031や、PC-80S31 などが使用可能です。
実際に私の環境では、PC-6001mk2やPC-6001mk2SRに、PC-80S31K を接続して使用しています。