SORD M68にCP/M80を移植しました。Z80SIOのI/OアドレスとFDC(MB8877A)の各処理コードも動作したので、BIOSを書くことができます。ハマった点をメモ的に記載します。
CP/M80は、1セクタの容量を128バイトに設定していますが、SORD M68の倍密度記録は256バイト/セクタですので、ブロッキング/デブロッキングという処理が必要です。これはCP/M2.2のときにすでに問題だったらしく、オフィシャルに変換コードがあります(axg.asm)。しかし、このコードは8080風に書いてあり、私が使っているZASMではアセンブルできないので、TOZ.EXEというコンバーターを使って変換します。マクロが動かなくなりますが、secshf=log2(hstblk)を計算するだけなので、簡単です。今回の場合は1になります。これでアセンブルできますので、あとは、readhstとwritehstのルーチンを書くだけです。
例えば、readhstには設定されたトラック番号を目標にSEEKコマンドを発行して、その後、やはり設定されたセクタ番号をトラックレジスタにセットしてREADコマンドを発行するだけです。このリードコマンドは、DMAを利用したコマンドにしておきます。
writehstはコマンド番号が違うだけで、readhstと同じです。
SIDE0と1の処理
CP/M80では、両面記録用に特別な処理はありません。ここでハマりました。サイドを区別しないので、論理上は全て同じサイドでトラックだけが増えていきます。よって、論理トラックと物理トラックは以下のような関係にあります。
論理トラック 物理トラック サイド
2 2 0
3 2 1
4 3 0
5 3 1
6 4 0
7 4 1
従って、論理トラック数を右に1ビットシフトして、+1したものが物理トラックになります。この操作でキャリフラグが立っていれば、論理トラックが奇数だったことがわかり、サイド1を読み書きするよう指定するコードを書けばよいことになります。
あとは、SORD M68のCP/M68Kのフォーマットの問題かもしれませんが、セクタが1ずれる問題がありましたが、writehstとreadhstのセクタ設定コードにADD A,01H(INC A)を追加するだけで解決しました。