tunozemichanの日記 / tunozemichan's diary

SORD社のコンピューターM68やM68MXの解析についての備忘録です。This blog is a memorandum about the analysis of SORD's computers M68 and M68MX.

SORD M68にCP/M80を移植する(その1)

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)を追加するだけで解決しました。

 

f:id:tunozemichan:20220227200549p:plain

モニタプログラムから起動したCP/M80でテキストファイルを出力したところ。正常に表示され、正しい場所を読めていることがわかる。