本来のドライブ(PC-6031/PC-80S31等)のコマンドは 0x00〜0x7f で、SD6031/SD6031WIF で新たに追加したコマンドは0x80〜0xfe になります。
従来からのコマンドは以下の通りです。
1)書き込みコマンド群
○コマンド0x01:write data
P6→SD6031 0x01 セクタ数 ドライブ番号 トラック番号 セクタ番号 書き込みデータ…書き込みデータ
○コマンド0x11:high speed write data
P6→SD6031 0x11 セクタ数 ドライブ番号 トラック番号 セクタ番号 書き込みデータ…書き込みデータ
○コマンド0x83:expand write data
P6→SD6031 0x83 セクタ数 ドライブ番号 トラック番号上位 下位 セクタ番号 書き込みデータ…書き込みデータ
○コマンド0x84:expand high speed write data
P6→SD6031 0x84 セクタ数 ドライブ番号 トラック番号上位 下位 セクタ番号 書き込みデータ…書き込みデータ
○コマンド0x86:double high speed write data
P6→SD6031 0x86 セクタ数 ドライブ番号 トラック番号 セクタ番号 書き込みデータ…書き込みデータ
○コマンド0x87:expand double high speed write data
P6→SD6031 0x87 セクタ数 ドライブ番号 トラック番号上位 下位 セクタ番号 書き込みデータ…書き込みデータ
書き込みコマンドが複数存在するのは、
・一度に書き込むバイト数が、1バイト/2バイト/4バイト
・トラック番号の指定の仕方が、8ビット/16ビット
の3通り×2通り=6通りの指定の方法があるためです。
やる事は全て同じで、指定したセクタに対して、データを書き込みます。
1セクタは256バイトですので、一度に256×セクタ数分のデータを書き込みます。
複数のセクタにまたがって書き込む事は可能ですが、トラックはまたげません。
またドライブ番号を 0x81 にした場合、EEPROMに書き込みが出来ます。
この際、256バイト単位(=セクタ単位)でしか書き込みが出来ません。
トラック番号がアドレス×256相当になります。セクタ番号は無視します。
例:
P6→SD6031 0x01 0x01 0x81 0x00 0x01 data...
0x01(書き込みコマンド) 0x01(セクタ数) 0x81(ドライブ番号)
0x00(トラック番号) 0x01(セクタ番号)
の順なので、AVR内EEPROMのアドレス0x0000〜0x01FFに対して
書き込みを行います。
○コマンド0x05:FORMAT
P6→SD6031 0x05 ドライブ番号
指定のドライブをフォーマットします。具体的には、データの部分を 0xFF で埋めます。このコマンドは通常の1D/1DD(2D)フォーマットのイメージファイルのみに使用してください。
拡張子は、D88、DSK、P31 のみ有効です。それ以外はエラーを返します。
2)読み出しコマンド群
○コマンド0x02:read data
P6→SD6031 0x02 セクタ数 ドライブ番号 トラック番号 セクタ番号
○コマンド0x85:expand read data
P6→SD6031 0x85 セクタ数 ドライブ番号 トラック番号上位 下位 セクタ番号
○コマンド0x03:send data
P6→SD6031 0x03
SD6031→P6 読み出しデータ…読み出しデータ
○コマンド0x12:high speed send data
P6→SD6031 0x12
SD6031→P6 読み出しデータ…読み出しデータ
○コマンド0x88:double high speed send data
P6→SD6031 0x88
SD6031→P6 読み出しデータ…読み出しデータ
書き込みコマンドと同じく、読み出しコマンドも指定方法により複数存在します。
read data系で、ディスクからバッファにデータを読み出し、send data系でそのデータをP6側に転送します。
また書き込みと同じく、ドライブ番号を 0x81 にした場合、EEPROMから読み出しが出来ます。
例:
P6→SD6031 0x02 0x02 0x81 0x00 0x01
P6→SD6031 0x12
SD6031→P6 data受信...
0x02(読み出しコマンド) 0x02(セクタ数) 0x81(ドライブ番号)
0x00(トラック番号) 0x01(セクタ番号)
0x12(高速センド)
の順なので、AVR内EEPROMのアドレス0x0000〜0x01FFの読み出しを行います。読み出しの際は、2バイト転送で行います。
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、send data系を実行した後に0
bit5-1:常に0
bit0:直前のコマンドがエラー時に1、エラーがなければ0
○コマンド0x07:DRIVE STATUS
P6→SD6031:0x07
SD6031→P6:STATUS情報(下記)
STATUS情報は以下の通りです(1バイトのデータ)。
bit7:常に0
bit6:常に0
bit5:常に1(ドライブ#1使用を示す)
bit4:常に1(ドライブ#0使用を示す)
bit3-0-1:常に1
○コマンド0x09:send memory
P6→SD6031 0x09 開始アドレス上位 下位 終了アドレス上位 下位
SD6031→P6 メモリ情報・・・メモリ情報
○コマンド0x0b:send memory 2
P6→SD6031 0x0b アドレス上位 下位 バイト数上位 下位
SD6031→P6 メモリ情報・・・メモリ情報
フロッピードライブのROMの内容を読み出す命令です。
BASIC-ROM から読み出される場合があるため、SD6031/SD6031WIF では、特定のアドレスを読み出した時に特定の値を返すようにしています。
○コマンド0x14:send device status
P6→SD6031 0x14 ドライブ番号
SD6031→P6 ST3
メディアのステータス情報を返します。
返す内容は以下の通り。
bit7:常に0
bit6:ライトプロテクト時1
bit5:常に0
bit4:常に0
bit3:SDカード挿入時1
bit2:常に0
bit1-0:ドライブ番号(00 または 01)
○コマンド0x17:set surface mode
P6→SD6031 0x17 設定情報
1D/1DD(2D) の設定の変更を行います。
bit7-2:未使用
bit1:ドライブ#1の設定(0で1D、1で1DD/2D)
bit0:ドライブ#0の設定(0で1D、1で1DD/2D)
リセット直後は、すべてのドライブで1Dモードです。
○コマンド0x18:send surface mode
P6→SD6031 0x18
SD6031→P6 設定情報
コマンド0x17 で設定した情報を読み出すコマンドです。
4)イメージファイル関連
○コマンド0x82:report disk image length
P6→SD6031 0x82 ドライブ番号
SD6031→P6 イメージファイル長×4(最上位から送信される)
現在選択しているイメージファイルの長さを読み出します。メディアとして使用できる部分ではなく、実際のファイル長を読み出します。
普通のP31フォーマット:0x000a0000
普通のD88フォーマット:0x000552a0
を返します。
○コマンド0xFD:get image file
P6→SD6031 0xFD ドライブ番号
SD6031→P6
0x01、ファイル#1のファイル名1バイト目…8バイト目、
0x01、ファイル#2のファイル名1バイト目…8バイト目、
:
0x01、ファイル#nのファイル名1バイト目…8バイト目、
0x00
SDカードに格納されているイメージファイルで、現在指定している拡張子のファイルの一覧を取得します。イメージファイルの数分だけ、0x01+ファイル名(8バイト)の9バイトを順番に送信してきます。最後に0x00が送信されます。返してくるバイト数は、9×ファイル数+1 になります。P6側では、0x00 が受信されるまで読み出す必要があります。
ファイル名は、拡張子を除いた8文字です。ファイル名が8文字未満の場合は、空白(0x20)で埋められます。
○コマンド0xFE:set image file
P6→SD6031 0xFE ドライブ番号 ファイル名1バイト目…8バイト目
指定したドライブ番号のイメージファイルを指定するファイルにします。ファイル名などは、get image file と同じです。