2019年07月21日

SD6031ファームウエアコマンド一覧(2)

  SD6031/SD6031WIFで扱う事が出来るコマンド一覧です(その2)。


  本来のドライブ(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 と同じです。


posted by えすび at 22:58| Comment(0) | HW:SD6031 | このブログの読者になる | 更新情報をチェックする

SD6031ファームウエアコマンド一覧(1)

  SD6031/SD6031WIFで扱う事が出来るコマンド一覧です(その1)。


  本来のドライブ(PC-6031/PC-80S31等)のコマンドは 0x00〜0x7f で、SD6031/SD6031WIF で新たに追加したコマンドは0x80〜0xfe になります。


今回のver1.00で削除したコマンドは以下の通り。

○コマンド0x80:SET SECTOR DATA(開始/終了セクタ番号のセット)
 P6→SD6031:0x80 ドライブ番号 開始セクタ番号 終了セクタ番号

○コマンド0x81:ASK SECTOR DATA(開始/終了セクタ番号の読み出し)
 P6→SD6031:0x81 ドライブ番号
 SD6031→P6:開始セクタ番号 終了セクタ番号



今回のver1.00から追加されたコマンドは以下の通り。

1)バージョン関連
○コマンド0xf0:read version number
 P6→SD6031 0xF0

 次の send version number を使う前に、実行します。


○コマンド0xf1:send version number
 P6→SD6031 0xF1
 SD6031→P6 バージョン番号1バイト目 2バイト目 3バイト目 機種コード1バイト目 2バイト目

  現在のバージョン番号、機種コードを返します。
  SD6031/SD6031WIF ver1.00 では、アスキーコードの "100SD" が返ってきます。

  このコマンドに先立って、前の read version number を実行する必要があります。実行していない場合はエラーになり、値を返しません。


 バージョンの読み出し手順は以下の通りです。

 コマンド 0xf1 を送信する
  ↓
 コマンド 0x06 を送信する
  ↓
 データを受信し、エラービットを確認する
  ↓
 エラーなしの場合、ver1.00 以前のバージョン。
  ↓
 コマンド 0xf0 を送信する
  ↓
 コマンド 0xf1 を送信する
  ↓
 データを受信する(5バイト)


2)イメージファイル関連

○コマンド0xf2:set file extention
 P6→SD6031 0xF2 ドライブ番号 拡張子1バイト目 2バイト目 3バイト目

  拡張子は3バイト固定で、アスキーコードで与えます。
  リセット直後は、"P31" です。

○コマンド0xf3:send file extention
 P6→SD6031 0xF3 ドライブ番号
 SD6031→P6 拡張子1バイト目 2バイト目 3バイト目

  今の拡張子を返します。


  SD6031は、設定した拡張子のファイルのみを扱います。

  拡張子を変更した時は、SDカードを新たに挿した場合と同様に扱います。
  つまり、拡張子を D88 に変更した場合は、INIT.D88 がある場合は、INIT.D88 を設定し、ない場合は 〜.D88 の中で一番新しいファイルを設定します。


  以下の拡張子を設定した場合は、特殊な動きをします。

  P31:ファイルを P31 フォーマットとして扱います(今までと同じ動きです)。

  D88:ファイルを D88 フォーマットとして扱います。
   次の条件を満たすもののみ正常に動作します。
   トラック 1D:#0〜#39(もしくは#0〜#34)/1DD:#0〜#79 が順番に抜けなく格納されている。
   セクタ#1〜#16が順番に抜けなく格納されている。
   1セクタ=256バイト。

   途中のセクタが抜けているとかセクタサイズが違うものは、正常に動作しません。


  DSK:ファイルを DSK フォーマットとして扱います。
    いわゆるディスクのベタファイルです。
    ファイルサイズが0x28000バイトの時、1D フォーマットとして扱います。
    (ドライブとディスクが食い違う時、トラック番号の調整が入ります)


  その他の拡張子の場合(例えば BIN)は、1セクタ=256バイト、1トラック=16セクタ、とした、ディスクのベタファイルとして扱います。HDDモード対応ですので、トラック数の最大は 65535 になります。


○コマンド0xfc:send image file
 P6→SD6031 0xFE ドライブ番号
 SD6031→P6 ファイル名1バイト目…ファイル名8バイト目

  現在指定されているイメージファイル名を返します。ファイル名などは、set image file と同じです。



3)EEPROM関連

○コマンド0xe0:receive EEPROM memory
 P6→SD6031 0xE0 EEPROM番号 アドレス上位 下位 サイズ上位 下位 データ、・・・


○コマンド0xe1:send EEPROM memory
 P6→SD6031 0xE0 EEPROM番号 アドレス上位 下位 サイズ上位 下位
 SD6031→P6 データ、・・・


  EEPROM番号は、0x81=AVR内EEPROMです。
  アドレスは 0x0000〜0x01FF が有効で、1バイトごとに書き込み/読み出しが可能です。


  EEPROMに対する読み書きは、ドライブ番号を 0x81 に指定する事により、通常のフロッピーへの読み書きのコマンドを使う事も可能です(後述)。


posted by えすび at 22:57| Comment(0) | HW:SD6031 | このブログの読者になる | 更新情報をチェックする