使用 int 13h 读取比轨道上更多的扇区
Reading more sectors than there are on a track with int 13h
顺序是什么 int 13h
和 ah=02h
将读取从 (C, H, S) = (0, 0, 1)
开始的 19
个扇区提供一个(软盘)磁盘几何结构,2 个磁头,每磁道 18 个扇区每边 80 条轨道。
或者,更一般地说,当它到达磁道 0 的末尾,磁头 0 时会发生什么?它会进入 track 1 还是 head 1?在这种情况下它还能正常工作吗?
编辑:等等……这实际上是小时、分钟、秒吗?如果我们到达轨道的尽头(S大于18),那么H增加?
现代 BIOS 支持多轨概念1 读写。如果您读或写超过轨道的末尾,它将继续跟随下一个轨道。为了与最广泛的 BIOS(旧的和新的)阵列最兼容,您可能希望考虑不跨磁道边界读取或写入。
每 track/2 heads/80 柱面 18 个扇区的驱动器几何结构(3.5" 1.44MB 软盘),CHS(0,0,18) 之后的扇区是 CHS(0,1, 1). 在你到达 CHS(0,1,18) 的扇区后,下一个是 CHS(1,0,1)。在某种程度上,这类似于 HH:MM:SS.
根据您的驱动器几何结构,共有 2880(80*2*18) 个扇区。如果将扇区编号为 0 到 2879(含),则它们称为逻辑块地址 (LBA)。
Int 13h/ah=2 采用 CHS 值。您可以使用以下公式(或等效公式)将 LBA 转换为 CHS 值:
C = (LBA ÷ SPT) ÷ HPC
H = (LBA ÷ SPT) mod HPC
S = (LBA mod SPT) + 1
HPC = Heads per cylinder (aka Number of Heads)
SPT = Sectors per Track,
LBA = logical block address
"mod" is the modulo operator (to get the remainder of a division)
我在 部分的另一个 中写了更多关于 LBA 到 CHS 计算的内容]将 LBA 翻译成 CHS 。如果您使用这些计算创建了 table,则编号将如下所示:
LBA = 0: CHS = ( 0, 0, 1)
LBA = 1: CHS = ( 0, 0, 2)
LBA = 2: CHS = ( 0, 0, 3)
LBA = 3: CHS = ( 0, 0, 4)
LBA = 4: CHS = ( 0, 0, 5)
LBA = 5: CHS = ( 0, 0, 6)
LBA = 6: CHS = ( 0, 0, 7)
LBA = 7: CHS = ( 0, 0, 8)
LBA = 8: CHS = ( 0, 0, 9)
LBA = 9: CHS = ( 0, 0, 10)
LBA = 10: CHS = ( 0, 0, 11)
LBA = 11: CHS = ( 0, 0, 12)
LBA = 12: CHS = ( 0, 0, 13)
LBA = 13: CHS = ( 0, 0, 14)
LBA = 14: CHS = ( 0, 0, 15)
LBA = 15: CHS = ( 0, 0, 16)
LBA = 16: CHS = ( 0, 0, 17)
LBA = 17: CHS = ( 0, 0, 18)
LBA = 18: CHS = ( 0, 1, 1)
LBA = 19: CHS = ( 0, 1, 2)
LBA = 20: CHS = ( 0, 1, 3)
LBA = 21: CHS = ( 0, 1, 4)
LBA = 22: CHS = ( 0, 1, 5)
LBA = 23: CHS = ( 0, 1, 6)
LBA = 24: CHS = ( 0, 1, 7)
LBA = 25: CHS = ( 0, 1, 8)
LBA = 26: CHS = ( 0, 1, 9)
LBA = 27: CHS = ( 0, 1, 10)
LBA = 28: CHS = ( 0, 1, 11)
LBA = 29: CHS = ( 0, 1, 12)
LBA = 30: CHS = ( 0, 1, 13)
LBA = 31: CHS = ( 0, 1, 14)
LBA = 32: CHS = ( 0, 1, 15)
LBA = 33: CHS = ( 0, 1, 16)
LBA = 34: CHS = ( 0, 1, 17)
LBA = 35: CHS = ( 0, 1, 18)
LBA = 36: CHS = ( 1, 0, 1)
LBA = 37: CHS = ( 1, 0, 2)
LBA = 38: CHS = ( 1, 0, 3)
LBA = 39: CHS = ( 1, 0, 4)
LBA = 40: CHS = ( 1, 0, 5)
LBA = 41: CHS = ( 1, 0, 6)
... [snip] ...
LBA = 2859: CHS = (79, 0, 16)
LBA = 2860: CHS = (79, 0, 17)
LBA = 2861: CHS = (79, 0, 18)
LBA = 2862: CHS = (79, 1, 1)
LBA = 2863: CHS = (79, 1, 2)
LBA = 2864: CHS = (79, 1, 3)
LBA = 2865: CHS = (79, 1, 4)
LBA = 2866: CHS = (79, 1, 5)
LBA = 2867: CHS = (79, 1, 6)
LBA = 2868: CHS = (79, 1, 7)
LBA = 2869: CHS = (79, 1, 8)
LBA = 2870: CHS = (79, 1, 9)
LBA = 2871: CHS = (79, 1, 10)
LBA = 2872: CHS = (79, 1, 11)
LBA = 2873: CHS = (79, 1, 12)
LBA = 2874: CHS = (79, 1, 13)
LBA = 2875: CHS = (79, 1, 14)
LBA = 2876: CHS = (79, 1, 15)
LBA = 2877: CHS = (79, 1, 16)
LBA = 2878: CHS = (79, 1, 17)
LBA = 2879: CHS = (79, 1, 18)
脚注:
1多轨支持并不意味着磁盘访问可以跨柱面。多轨磁盘访问必须在同一柱面上开始和结束。
顺序是什么 int 13h
和 ah=02h
将读取从 (C, H, S) = (0, 0, 1)
开始的 19
个扇区提供一个(软盘)磁盘几何结构,2 个磁头,每磁道 18 个扇区每边 80 条轨道。
或者,更一般地说,当它到达磁道 0 的末尾,磁头 0 时会发生什么?它会进入 track 1 还是 head 1?在这种情况下它还能正常工作吗?
编辑:等等……这实际上是小时、分钟、秒吗?如果我们到达轨道的尽头(S大于18),那么H增加?
现代 BIOS 支持多轨概念1 读写。如果您读或写超过轨道的末尾,它将继续跟随下一个轨道。为了与最广泛的 BIOS(旧的和新的)阵列最兼容,您可能希望考虑不跨磁道边界读取或写入。
每 track/2 heads/80 柱面 18 个扇区的驱动器几何结构(3.5" 1.44MB 软盘),CHS(0,0,18) 之后的扇区是 CHS(0,1, 1). 在你到达 CHS(0,1,18) 的扇区后,下一个是 CHS(1,0,1)。在某种程度上,这类似于 HH:MM:SS.
根据您的驱动器几何结构,共有 2880(80*2*18) 个扇区。如果将扇区编号为 0 到 2879(含),则它们称为逻辑块地址 (LBA)。
Int 13h/ah=2 采用 CHS 值。您可以使用以下公式(或等效公式)将 LBA 转换为 CHS 值:
C = (LBA ÷ SPT) ÷ HPC H = (LBA ÷ SPT) mod HPC S = (LBA mod SPT) + 1 HPC = Heads per cylinder (aka Number of Heads) SPT = Sectors per Track, LBA = logical block address "mod" is the modulo operator (to get the remainder of a division)
我在 部分的另一个
LBA = 0: CHS = ( 0, 0, 1) LBA = 1: CHS = ( 0, 0, 2) LBA = 2: CHS = ( 0, 0, 3) LBA = 3: CHS = ( 0, 0, 4) LBA = 4: CHS = ( 0, 0, 5) LBA = 5: CHS = ( 0, 0, 6) LBA = 6: CHS = ( 0, 0, 7) LBA = 7: CHS = ( 0, 0, 8) LBA = 8: CHS = ( 0, 0, 9) LBA = 9: CHS = ( 0, 0, 10) LBA = 10: CHS = ( 0, 0, 11) LBA = 11: CHS = ( 0, 0, 12) LBA = 12: CHS = ( 0, 0, 13) LBA = 13: CHS = ( 0, 0, 14) LBA = 14: CHS = ( 0, 0, 15) LBA = 15: CHS = ( 0, 0, 16) LBA = 16: CHS = ( 0, 0, 17) LBA = 17: CHS = ( 0, 0, 18) LBA = 18: CHS = ( 0, 1, 1) LBA = 19: CHS = ( 0, 1, 2) LBA = 20: CHS = ( 0, 1, 3) LBA = 21: CHS = ( 0, 1, 4) LBA = 22: CHS = ( 0, 1, 5) LBA = 23: CHS = ( 0, 1, 6) LBA = 24: CHS = ( 0, 1, 7) LBA = 25: CHS = ( 0, 1, 8) LBA = 26: CHS = ( 0, 1, 9) LBA = 27: CHS = ( 0, 1, 10) LBA = 28: CHS = ( 0, 1, 11) LBA = 29: CHS = ( 0, 1, 12) LBA = 30: CHS = ( 0, 1, 13) LBA = 31: CHS = ( 0, 1, 14) LBA = 32: CHS = ( 0, 1, 15) LBA = 33: CHS = ( 0, 1, 16) LBA = 34: CHS = ( 0, 1, 17) LBA = 35: CHS = ( 0, 1, 18) LBA = 36: CHS = ( 1, 0, 1) LBA = 37: CHS = ( 1, 0, 2) LBA = 38: CHS = ( 1, 0, 3) LBA = 39: CHS = ( 1, 0, 4) LBA = 40: CHS = ( 1, 0, 5) LBA = 41: CHS = ( 1, 0, 6) ... [snip] ... LBA = 2859: CHS = (79, 0, 16) LBA = 2860: CHS = (79, 0, 17) LBA = 2861: CHS = (79, 0, 18) LBA = 2862: CHS = (79, 1, 1) LBA = 2863: CHS = (79, 1, 2) LBA = 2864: CHS = (79, 1, 3) LBA = 2865: CHS = (79, 1, 4) LBA = 2866: CHS = (79, 1, 5) LBA = 2867: CHS = (79, 1, 6) LBA = 2868: CHS = (79, 1, 7) LBA = 2869: CHS = (79, 1, 8) LBA = 2870: CHS = (79, 1, 9) LBA = 2871: CHS = (79, 1, 10) LBA = 2872: CHS = (79, 1, 11) LBA = 2873: CHS = (79, 1, 12) LBA = 2874: CHS = (79, 1, 13) LBA = 2875: CHS = (79, 1, 14) LBA = 2876: CHS = (79, 1, 15) LBA = 2877: CHS = (79, 1, 16) LBA = 2878: CHS = (79, 1, 17) LBA = 2879: CHS = (79, 1, 18)
脚注:
1多轨支持并不意味着磁盘访问可以跨柱面。多轨磁盘访问必须在同一柱面上开始和结束。