PC−80S31 ミニ ディスク ユニット
直接FDCをコントロールするのではなく
ディスクユニットの中にZ80Aと8255を使って
ハンドシェークの通信を行うインテリジェント・タイプの5インチ2Dドライブになります
PC−8031は5インチ1Dドライブ、
PC−8031−2Wは5インチ2Dドライブで
PC−80S31はPC−8031−2Wをコンパクトにしたタイプで若干タイミングが違うようです。
FDCはμPD765Aを使用
PC−80S31のスペック
CPU | μPD780C−1(Z80A) 4MHz |
ROM | 2KB |
RAM | 16K |
PC−8001、PC−8801シリーズの5インチ2Dドライブモデルの基本となり
PC−8801mkIISR以降でもROM内容は同じになります
ただし2HDドライブのMxシリーズはROMとRAM容量が違います
メモリマップ
00000H〜007FFH:ROM
04000H〜04FFFH:RAM ライトバッファ
05000H〜05FFFH:RAM リードバッファ
06000H〜07EFFH:RAM ユーザエリア
07F00H〜07FFFH:RAM ワークエリア
割り込み
モード0でFDCのμPD765AのExecution Phaseが
終了した時に発生されます
サブCPUに割り込み(/INT)が発生すると
バスドライバの8216によって000Hが出力され
サブCPUにはNOP(000H)が実行されるようです
NOPが実行されるだけなのでFDCのコマンドを実行した後は
EI
HALT
DI
:
としてHALTで割り込みが発生するのを待ちます。
ディスクの起動
本体PCとPC−80S31に電源を入れるとドライブ1からディスクを読みます
そのディスクのトラック00、セクタ01を
本体PCの0C000H〜0C1FFHに転送して実行します。
アクセスランプ
スタンバイ状態の時には20%の明るさで点灯します
ドライブのアクセスをしている時には 100%の明るさで点灯します
ただしドライブ4まで拡張している場合
ドライブ4はスタンバイ状態でも 100%近い明るさで点灯します
ドライブ1〜3のアクセスランプが消えているときが
ドライブ4のアクセス中となります。
PC−8001との通信方法
本体側とPC−80S31はお互いに8255のモード0の3線ハンドシェークで接続されています
DAV(Data Valia) :受信側のデータが有効
RFD(Ready For Data):受信側のデータが有効
DAC(Data Accepted) :受信側がデータデータを受け取り終了
ATN(Attention) :1=次に送るものがコマンド、0=次に送るものがデータ (本体からディスクのみ)
*ATN=1にしてすぐ0にしてもデータを送った場合はコマンドになるようです
電源を入れると、本体側の8255はCWに091Hを書き込まれ
モード0、PA7−0は入力、PB7−PB0は出力、PC7−PC4は出力、PC3−0は入力に設定されます。
ポート0FCH(データ入力) PA7〜PA0
ポート0FDH(データ出力) PB7〜PB0
ポート0FEH(制御入力) PC3〜PC0
ポート0FFH(制御出力) PC7〜PC4
*ポート0FFH(CW)のビットセット/リセットを使用してPC7−PC4の各ビットを出力します
1バイトデータ出力例
FD側RFDが1(PC1=1)になるまで待ちます
出力データを本体側PBに出力
本体側DAVを1(PC4=1)にする
FD側DACが1(PC2=1)になるまで待ちます
本体側DAVを0(PC4=0)にする
FD側DACが0(PC2=0)になるまで待ちます
終了
1バイトデータ入力例
本体側RFDを1(PC5=1)にする
FD側DAVが1(PC0=1)になるまで待ちます
本体側RFDを0(PC5=0)にする
本体側PAから入力データを読む
本体側DACを1(PC6=1)にする
FD側DAVが0(PC0=0)になるまで待ちます
本体側DACを0(PC6=0)にする
終了
使用ポート
コントロール
0F6H:未使用(PC−8031/8031−2Wでプリンタ コントロール)
0F7H:プリンタ データ(出力)またはマージンコントロール 下位4Bitがカウンタのセット(出力)
0F8H:ドライブモータ制御(出力)
d7:未使用
d6:未使用
d5:未使用
d4:未使用
d3:ドライブ4のモータ 1=オン、0=オフ
d2:ドライブ3のモータ 1=オン、0=オフ
d1:ドライブ2のモータ 1=オン、0=オフ
d0:ドライブ1のモータ 1=オン、0=オフ
TCへの出力(入力)
ポート0F8Hを入力(アクセス)するだけでデータは何でも良い
FDC μPD765A
0FAH:μPD765A ステータスレジスタ
0FBH:μPD765A データレジスタ
PPI 8255
0FCH:8255 PA
0FDH:8255 PB
0FEH:8255 PC
0FFH:8255 CW
ワーク エリア
07F00H−07F07H:マージンデータ格納アドレス(4デバイス)
07F08H :セクタ数
07F09H :ポート0F8H用 出力データ
07F0AH :エラーカウンタ
07F0BH :ポート0F7H用 出力データ
07F0CH :レザルトステータス FDCへ送ったコマンド
07F0DH :レザルトステータス ST0
07F0EH :レザルトステータス ST1
07F0FH :レザルトステータス ST2
07F10H :レザルトステータス C:シリンダ・ナンバ
07F11H :レザルトステータス H:ヘッド・ナンバ
07F12H :レザルトステータス R:セクタ・ナンバ
07F13H :レザルトステータス N:1セクタの長さ
07F14H :エラー・ステ−タス d7:1=I/O動作終了(常に1にセットされている)
d6:1=リードバッファにデータが有り、0=リードバッファにデータが無し
d5:0
d4:0
d3:0
d2:0
d1:0
d0:1=エラー有り、0=エラー無し
07F15H :ドライブ・ステ−タス
07F16H :コマンド受信中フラグ
07F17H :パラメータセットフラグ 000H=セットしない、001H−0FFH=セットする
07F18H :ドライブNo.nn
07F19H :トラックNo.nn
07F1AH :セクタ No.nn
07F1BH :モード設定 d7:−
d6:−
d5:−
d4:−
d3:ドライブ3 1=両面、0=片面
d2:ドライブ2 1=両面、0=片面
d1:ドライブ1 1=両面、0=片面
d0:ドライブ0 1=両面、0=片面
07F1CH :ドライブ1のモード 0FFH=両面、000H=片面
07F1DH :ドライブ2のモード 0FFH=両面、000H=片面
07F1EH :ドライブ3のモード 0FFH=両面、000H=片面
07F1FH :ドライブ4のモード 0FFH=両面、000H=片面
07F20H :リードアフターモード設定フラグ
07F21H :FDCのリード/ライトモード
07F22H〜07F24H:ブレークポイント処理用フック 通常は0C9H(RET)で何もしない
07F25H〜07F27H:ブレークポイント処理用ジャンプテーブル
07F28H〜07F29H:ブレークポイント退避用 SP
07F2AH〜07F2BH:ブレークポイント退避用 PC
07F2CH〜07F2DH:ブレークポイント退避用 I(下位の07F2CHが有効)
07F2EH〜07F2FH:ブレークポイント退避用 IY
07F30H〜07F31H:ブレークポイント退避用 IX
07F32H〜07F33H:ブレークポイント退避用 HL’
07F34H〜07F35H:ブレークポイント退避用 DE’
07F36H〜07F37H:ブレークポイント退避用 BC’
07F38H〜07F39H:ブレークポイント退避用 AF’
07F3AH〜07F3BH:ブレークポイント退避用 HL
07F3CH〜07F3DH:ブレークポイント退避用 DE
07F3EH〜07F3FH:ブレークポイント退避用 BC
07F40H〜07F41H:ブレークポイント退避用 AF
07F42H :ブレークポイント設定フラグ
07F43H〜07F44H:ブレークポイントアドレス ブレークポイントが発生したアドレス
07F45H :ブレークポイントデータ退避用 0CFHを書き換える前のプログラム1バイトが保存される
07F46H〜07FFFH:スタック ポインタ
ブレークポイント
PC−80S31のRAM内にブレークポイントを設ける事が出来ます
コマンド 28(ブレークポイント・セット)と指定したアドレスで
指定したサブCPU内アドレスのアドレスを1バイト読み、07F45Hに保存
指定したサブCPU内アドレスのアドレスを0CFH(RST 008H)を書き込みます
サブCPUがそのアドレスを実行されるとRST 008Hが実行されます
RST 008Hでは、まずCALL 07F22Hを実行(通常はRETですぐ戻ります)
07F28Hから07F41に各レジスタの内容を書き込み
ブレークポイントを指定したアドレスを元に戻してから
ブレークポイントのアドレスが上位、下位の順に本体PCへ転送され
000C1Hのディスクコマンド待ちへジャンプします。
また、ブレークポイントは1箇所だけなので新しく設定すると、
以前に書き込んだデータ(RST 008H)は
元のデータに直され、新しい設定が有効になります。
コマンド
00 000H:イニシャライズ・コマンド
送信データ:コマンド000H
受信データ:無し
ディスクドライブのモータをオン、ディスクユニットのイニシャライズを行います
SRT=13ms、HUT=160ms、HLT=24msに設定して
ヘッドをシリンダ10に移動
01 001H:ライトディスク・コマンド
送信データ:コマンド001H
セクタ数
ドライブ(0から)
トラック
セクタ
データ(セクタ数×256バイト)
受信データ:無し
データ群を直接ディスクに書き込みます。
ただし2つのトラックをまたがって書き込む事が出来ません。
02 002H:リードディスク・コマンド
送信データ:コマンド002H
セクタ数
ドライブ(0から)
トラック
セクタ
受信データ:無し
ディスクのデータを一旦ディスクユニットのリードバッファに読み込みます。
コマンド003Hとよく併用されます。
ただし2つのトラックをまたがって読み込む事が出来ません。
03 003H:センドデータ・コマンド
送信データ:コマンド003H
受信データ:データ(読み込むセクタ×256バイト)
ディスクユニットのリードバッファからデータをPCへ転送させます。
コマンド002Hとよく併用されます。
データの長さはコマンド002Hでリードバッファに読み込んだデータと同じです。
04 004H:コピー・コマンド
送信データ:コマンド004H
転送するセクタ数
転送元ドライブ(0から)
転送元トラック
転送元セクタ
転送先ドライブ(0から)
転送先トラック
転送先セクタ
受信データ:無し
セクタ間のコピーを行うコマンドです。
ただし2つのトラックをまたがって指定する事が出来ません。
05 005H:フォーマット・コマンド
送信データ:コマンド005H
ドライブ(0から)
受信データ:無し
指定したドライブのディスクのフォーマットを行います。
06 006H:レザルト・ステータス・コマンド
送信データ:コマンド006H
受信データ:レザルト・ステータス
d7:I/O動作終了フラグ
d6:1=リードバッファにデータ有り、0=リードバッファにデータ無し
d5:−
d4:−
d3:−
d2:−
d1:−
d0:1=エラー有り、0=エラー無し
各コマンドの実行結果を得るコマンドです(07F14Hのエラー・ステータスを転送)
d6=0のときにセンドデータ・コマンドを実行すると無限ループに入ります。
07 007H:ドライブ・ステータス・コマンド
送信データ:コマンド007H
受信データ:ドライブ・ステータス
d7:ドライブ3接続
d6:ドライブ2接続
d5:ドライブ1接続
d4:ドライブ0接続
d3:ドライブ3ディスクセットフラグ (常に1)
d2:ドライブ2ディスクセットフラグ (常に1)
d1:ドライブ1ディスクセットフラグ (常に1)
d0:ドライブ0ディスクセットフラグ (常に1)
接続されているドライブ数を本体へ送信するコマンドです(07F15Hのドライブ・ステータスを転送)
ディスクセットフラグは常に1になっていますので意味はありません。
08 008H:テストメモリ・コマンド
送信データ:コマンド008H
受信データ:エラー有りの場合
081H(ヘッダ)
エラーアドレス上位
エラーアドレス下位
書き込まれたデータ
読み込んだデータ
|
エラー無しの場合
080H(ヘッダ)
ディスクユニット内のメモリ04000H−07F00Hのテストメモリを行います
エラーが発生した数だけアドレスとデータの部分が増えます。
09 009H:センド・メモリデータ・コマンド
送信データ:コマンド009H
転送アドレス上位
転送アドレス下位
転送バイト数上位
転送バイト数下位
受信データ:転送データ
ディスクユニット内のメモリのデータをPCに転送します。
10 00AH:ポート・アウトプット・コマンド
送信データ:コマンド00AH
出力データ
受信データ:無し
ディスクユニットのポート0F7Hに1バイト出力を行います。
PC−8031、PC−8031−2WにあるI/Oポートのデータ出力になり
プリンタおよびVFOの出力になります。
11 00BH:センド・メモリデータ・コマンド
送信データ:コマンド00BH
転送アドレス上位
転送アドレス下位
転送バイト数上位
転送バイト数下位
受信データ:転送データ
ディスクユニット内のメモリのデータをPCに転送します。
コマンド009Hと同じです。
12 00CH:レシーブ・メモリデータ・コマンド
送信データ:コマンド00CH
転送アドレス上位
転送アドレス下位
転送バイト数上位
転送バイト数下位
転送するデータ
受信データ:無し
ディスクユニット内のメモリに指定したデータを埋めます。
13 00DH:エグゼキュート・コマンド
送信データ:コマンド00DH
実行アドレス上位
実行アドレス下位
受信データ:無し
ディスクユニット内のメモリのアドレスの実行を行います。
14 00EH:ロードデータ・コマンド
送信データ:コマンド00EH
セクタ数
ドライブ(0から)
トラック
セクタ
ロードアドレス上位
ロードアドレス下位
受信データ:無し
ディスクのデータをディスクユニット内のメモリに書き込みます。
15 00FH:セーブデータ・コマンド
送信データ:コマンド00FH
セクタ数
ドライブ(0から)
トラック
セクタ
セーブアドレス上位
セーブアドレス下位
受信データ:無し
ディスクユニット内の指定されたデータをディスクに書き込みます。
16 010H:ロード アンド ゴー・コマンド
送信データ:コマンド010H
受信データ:無し
ドライブ0,トラック0,セクタ1をディスクユニット内の
リードバッファ05000Hにロードして05000Hから実行を行います。
17 011H:ライトディスク・コマンド(高速転送)
送信データ:コマンド011H
セクタ数
ドライブ(0から)
トラック
セクタ
データ(セクタ数×256バイト)
受信データ:無し
データ群を直接ディスクに書き込みます。
ただし2つのトラックをまたがって書き込む事が出来ません。
コマンド01Hと同じ様な動作ですが2バイトのデータを送信します。
18 012H:センドデータ・コマンド(高速転送)
送信データ:コマンド012H
受信データ:データ(読み込むセクタ×256バイト)
ディスクユニットのリードバッファからデータをPCへ転送させます。
コマンド03Hと同じ様な動作ですが2バイトのデータを受信します。
19 013H:エラーステータス・コマンド
送信データ:コマンド013H
受信データ:エラーデータ0:FDCへ送ったコマンド
エラーデータ1:FDC ST0
エラーデータ2:FDC ST1
エラーデータ3:FDC ST2
エラーデータ4:C シリンダナンバ
エラーデータ5:H ヘッドナンバ
エラーデータ6:R セクタナンバ
エラーデータ7:N 1セクタの長さ
ディスクユニットのFDCのレザルトステータスをPCへ転送させます。
20 014H:デバイスステータス・コマンド
送信データ:コマンド014H
ドライブ(0から)
受信データ:デバイスステータス
ディスクユニットのFDCのST3の内容をPCへ転送させます。
ライトプロテクトのチェックに使用します。
21 015H:センド・メモリデータ・コマンド(高速転送)
送信データ:コマンド015H
転送アドレス上位
転送アドレス下位
転送バイト数上位
転送バイト数下位
受信データ:転送データ
ディスクユニット内のメモリのデータをPCに転送します。
コマンド0BHと同じ様な動作ですが2バイトのデータを受信します。
22 016H:レシーブ・メモリデータ・コマンド(高速転送)
送信データ:コマンド016H
転送アドレス上位
転送アドレス下位
転送バイト数上位
転送バイト数下位
転送するデータ
受信データ:無し
ディスクユニット内のメモリにデータをに転送します。
コマンド0CHと同じ様な動作ですが2バイトのデータを受信します。
23 017H:モードチェンジ・コマンド
送信データ:コマンド017H
切り替えデータ
d7:−
d6:−
d5:−
d4:−
d3:ドライブ3 1=両面、0=片面
d2:ドライブ2 1=両面、0=片面
d1:ドライブ1 1=両面、0=片面
d0:ドライブ0 1=両面、0=片面
受信データ:無し
ディスクユニットの各ドライブを両面か片面のどちらかに設定します。
24 018H:センド・モードデータ・コマンド
送信データ:コマンド018H
受信データ:モードデータ
d7:−
d6:−
d5:−
d4:−
d3:ドライブ3 1=両面、0=片面
d2:ドライブ2 1=両面、0=片面
d1:ドライブ1 1=両面、0=片面
d0:ドライブ0 1=両面、0=片面
ディスクユニットの各ドライブが両面か片面のどちらかに設定されているか見ます。
25 019H:リード アフタライトモードセット・コマンド
送信データ:コマンド019H
受信データ:無し
リード アフタライトモードをセットします。
26 01AH:リード アフタライトモードリセット・コマンド
送信データ:コマンド01AH
受信データ:無し
リード アフタライトモードをリセットします。
27 01BH:リスタート・コマンド
送信データ:コマンド01BH
受信データ:無し
コマンド01CHで設定したブレークポイントにより中断したプログラムを再開させます。
28 01CH:ブレークポイント・セット・コマンド
送信データ:コマンド01CH
アドレス上位
アドレス下位
受信データ:無し
ユーザープログラムにブレークポイントを設定します。
以前に設定したブレークポイントがあれば以前のブレークポイントは無効になります。
29 01DH:レジスタセット・コマンド
送信データ:コマンド01DH
レジスタ・ナンバ
レジスタデータ上位
レジスタデータ下位
受信データ:無し
ディスクユニットのCPUのレジスタにデータをセットするコマンドです。
レジスタナンバ
000H=AF 001H=BC 002H=DE 003H=HL
004H=AF’005H=BC’006H=DE’007H=HL’
008H=IX 009H=IY 00AH=I 00BH=BC
00CH=SP
(注)Iレジスタはレジスタデータ下位のみ有効
30 01EH:リードレジスタ・コマンド
送信データ:コマンド01EH
レジスタ・ナンバ
送信データ:レジスタデータ上位
レジスタデータ下位
ディスクユニットのCPUのレジスタの値を読むです。
レジスタナンバ
000H=AF 001H=BC 002H=DE 003H=HL
004H=AF’005H=BC’006H=DE’007H=HL’
008H=IX 009H=IY 00AH=I 00BH=BC
00CH=SP
(注)Iレジスタはレジスタデータ下位のみ有効
PC−8001のコーナへ
Home へ戻る