■
メモリ管理を実装したので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とする。