ウォンツテック

そでやまのーと

メモリ管理を実装したのでkernelが増えbootacient.SでFDからのkernel読み込みセクタ数を負やした所問題が発生。突き詰めてみると

 FDから読み込んだ物はes:bxへ格納されるが、例えば
 es = 0x0DD0
 bx = 0x2400
 である場合実際に読み込まれる物理アドレスは
 0x0DD0 << 4 + 0x2400 = 0xDD00 + 0x2400 = 0x11000
 となりここに転送されるはずであるがFDのエラーになる(ah=0x09:data boundary error)。
 もっと細かく見ると
 es = 0x0DC0 だと OK
 es = 0x0DC1 だと エラー
となるので要するに足した物が0x10000を越えるとエラーとなる

当然 es<<4 + bxが0x10000を越えてもCPU上はなんら問題ないはずなのでFDCもしくはBIOSの問題だろうか。。?

FD読み込み

上記のうまい解決策が無さそうなので、FD読み込みをもっと汎用的に書くことにした。具体的には論理セクタ番号をdiにセットして以下のような処理をする。

1. メモリ上から
 ・セクタ番号
 ・トラック番号
 ・ヘッダ番号
 をチェックし、読み込めるセクタ数(<=18)を算出する。
2. 読み込めるセクタ数をnとしたとき
 2-1 読み込めるセクタ数が残りのセクタ数より小さい場合
  nはそのまま
 2-2 読み込めるセクタ数が残りのセクタ数より大きい場合
    nに残りセクタ数をセットする。
 2-3 以下のチェックを行う
  es <<4 + bx + n
  が0x10000を超えているかチェックし、超えているならば
 超えないようにnを調整する。
 2-4 読み込む

3.
 3-1. 2で超えていた場合、
  es = es & 0xf000 + 0x1000
  bx = 0
  とする。
 3-2. 論理セクタ番号di+nから
 ・セクタ番号
 ・トラック番号
 ・ヘッダ番号
 を算出し、メモリ上に格納する。また di = di+nとする。