導入という与太話
倍密度記録のセクタを読めるようになったので、CP/Mなど大きなプログラムをロードできる可能性が出てきました。しかし、その為にはディスクの裏側(Side1)も読めなくてはなりません。
FDDのシステムは、前回も触れましたがFDD、FDC、VFOです。FDCはあくまでフロッピーディスクのデータを扱うことに集中しているため、その他の主にメカニカルなFDDの制御はCPU(厳密にはそこにつながったPIO)に任せています。
CPUは、ドライブセレクト、モーターON、単密度/倍密度切り替え、そして、記録面読み取り切り替えを行います。これに加えて、高密度記録(2HD)があるマシンではこの切り替えも行う場合があるようです。
SORD M68のFDDは両面ディスク用です。とは言え、FDCからすれば表面(Side0)だろうが、裏面(Side1)だろうがデータという観点では関係ありません。なので、FDCにはこれを識別する信号はありません(MB8877Aの場合、ユーザーが自発的に裏面を読んでいることを知らせる必要はあります。)一方、両面ドライブは表と裏は重要で、読み取りヘッドが二つあり、切り替えは「Side one select」信号(32ピン)で行います。
ローダーを読む
今回は、BOOT ROMを読んでも分かりません。なぜなら、SORD M68のBOOT ROMはトラック1、Side0の1~8セクタを読むだけだからです。裏面(Side1)を読む必要がないので切り替えるコードはありません。
そこで、FDOSのトラック1サイド0セクタ1~8、CP/M-68Kのトラック1サイド0セクタ1~8を読みました。両者でコードが違うため、片方で行き詰っても、他方を見ると解決することが多く、両方読むのは二度手間に見えますが、実際には最適、最短の方法です。
結論から言うと、I/Oアドレス0xcdの第5ビットがSide切り替えです。Highにすると裏面(Side1)が指定されます。
結果
I/Oアドレス0xcdを便宜上、FDCコントロールポートと呼ぶと、3つのことが分かりました。
・第6ビット:記録密度切り替え(単密度は1、倍密度は0)
・第5ビット:読込面(Side)切り替え(Side0は0、Side1は1)
・第3ビット:Not Readyへの遷移。In USE?
最後の情報はこれまで触れませんでしたが、0xcdに0x8を書くと、FDD(エミュレータ)のランプが消えて、FDCのステータスがNot Readyになり、何の操作も受け付けなくなる為、判明しました。
これでフロッピーディスクの全てのデータにアクセスできるようになりました。
が、テストコードがうまく動きません。現在原因を究明中です。