Чтение большего количества секторов, чем есть на треке с int 13h

В каком порядке int 13h с ah=02h будут читать 19 сектора, начиная с (C, H, S) = (0, 0, 1), при условии, что геометрия (гибкого) диска состоит из 2 головок, 18 секторов на дорожку и 80 дорожек на сторону.

Или, в более общем плане, что происходит, когда он достигает конца дорожки 0, заголовка 0? Он идет на трек 1 или на голову 1? Он вообще работает нормально в этом случае?

РЕДАКТИРОВАТЬ: Подождите ... это на самом деле часы, минуты, секунды? Если мы дойдем до конца дорожки (S больше 18), то H увеличивается?


person PhantomR    schedule 22.01.2019    source источник
comment
Современные BIOS поддерживают многодорожечное чтение / запись, что означает, что если вы читаете или записываете данные после конца дорожки, они автоматически продолжаются на следующей дорожке. Так было не всегда в очень старых BIOS. С геометрией вашего привода после CHS (0,0,18) будет CHS (0,1,1). После того, как вы достигнете CHS (0,1,18), следующим будет CHS (1,0,1)   -  person Michael Petch    schedule 22.01.2019
comment
Для лучшей совместимости нельзя читать / писать за границу дорожки.   -  person Michael Petch    schedule 22.01.2019
comment
Большое тебе спасибо :). Это подтверждает мою правку - что она работает как система часов, минут, секунд.   -  person PhantomR    schedule 22.01.2019
comment
@MichaelPetch Это звучит как ответ, и его следует опубликовать как ответ ниже, чтобы его можно было проголосовать, отредактировать и принять.   -  person IMSoP    schedule 22.01.2019
comment
@IMSoP Действительно, он действительно ответил на мой вопрос.   -  person PhantomR    schedule 22.01.2019


Ответы (1)


Современные BIOS поддерживают концепцию многодорожечного 1 чтения и записи. Если вы читаете или пишете после конца дорожки, она продолжится со следующей дорожки. Для максимальной совместимости с широким спектром BIOS (старых и новых) вы можете не читать и не писать через границу дорожки.

При геометрии накопителя 18 секторов на дорожку / 2 головки / 80 цилиндров (3,5-дюймовая дискета 1,44 МБ), сектор после 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 в этом другом ответе на Stackoverflow в разделе Перевод LBA в CHS. Если вы создали таблицу, используя эти вычисления, нумерация будет выглядеть так:

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 Поддержка нескольких дорожек не означает, что доступ к диску может осуществляться через цилиндры. Доступ к многодорожечному диску должен начинаться и заканчиваться на одном и том же цилиндре.

person Michael Petch    schedule 22.01.2019