とりあえず、先に進む
64K境界問題は、とりあえず、保留にして、先に進んでみる事にしよう。
MOV AH,BL ; < BXからALの最大値をAHに計算 > CMP BH,0 ; if (BH != 0) { AH = 18; } JE .skip1 MOV AH,18 .skip1: CMP AL,AH ; if (AL > AH) { AL = AH; } JBE .skip2 MOV AL,AH .skip2:
ここでは、読み込みセクタ数を考慮している。
他の条件がクリアでも、そもそも、読み込みセクタ数が1だったら、
まとめて読んじゃダメって事になるわけですね。
で、まずは、BXの下位8ビットをAHレジスタにコピーしている。
8ビットですから、値の範囲は、0〜255 になりますね。
次に、BXの上位8ビットの値と0を比較して、
0じゃなかったら、AHレジスタの内容を18としています。
18というのは、1トラックの最大セクタ数の事だと思います。
BXの上位8ビットが0以外であれば、読み込みセクタ数は、256以上になるわけですから、
最大でも1トラック分しかまとめて読み込みが出来ない事を考慮すると、
18に書き換えるのは納得。
ただ、ここで、BHの値が0だったとしても、BLの値が18を超える事は十分ありそうな気がする。
僕のイメージでは、こんな感じになる。
MOV AH,BL ; < BXからALの最大値をAHに計算 > CMP BX,18 ; if (BX > 18) { AH = 18; } JA .skip1 MOV AH,18 .skip1: CMP AL,AH ; if (AL > AH) { AL = AH; } JBE .skip2 MOV AL,AH .skip2:
まぁ、命令長は少し増える気がするけど、こっちの方が、やりたい事に近い気がする。
MOV AH,19 ; < CLからALの最大値をAHに計算 > SUB AH,CL ; AH = 19 - CL; CMP AL,AH ; if (AL > AH) { AL = AH; } JBE .skip3 MOV AL,AH .skip3:
最後は、読み込み開始セクタからの、最大セクタ数を考慮。
当たり前だけれど、あるトラックの途中のセクタから読み込みを開始して欲しいって事であれば、
そのトラックについては、少なくとも、指定されたセクタから最終セクタまでしかまとめられない。
そういうわけで、19 から開始セクタ分を減算する。
18 じゃなくて 19 なのは、セクタの指定が、1〜18の1オリジンだから。
1セクタからの読み込みであれば、19-1で、最大の18セクタ読み込み可。
18セクタからの読み込みであれば、19-18で、1セクタのみの読み込みしか出来ません。
ここについては、分かり易いですね。
さて、このように、いくつかの条件下で可能な最大セクタ数を求めて、
その中で、最も少ないセクタ数が、それらの条件下でまとめ読みが可能な最大セクタ数となる。
とりあえず、大枠としては、そんな感じで納得出来た。