; в ax линейный номер сектора
and dx, 7Fh ; dh=0, в dl номер диска в нумерации BIOS
div cl ; в cl число секторов на дорожке (18)
mov ch, al
mov cl, ah
shr ch, 1
adc dh, dh
inc cx
mov ax, 0201h
int 13h
Цилиндры, головки, сектора...
Так вот. К примеру написал я простой первичный загрузчик. Вторичный загрузчик сидит например не во втором секторе, а к примеру в 33.
Как собственно рассчитать головку и цилиндр, если известен только сектор?
И еще.
DL = номер диска (ну это понятно)
DH = (1 головка - 80 цилиндров, 1 цил. - 18 секторов,значит 1440 секторов - 1 дорожка? так я понимаю? : 1-1440с. - 1 головка; 1441-2880с. - 2я головка?)
CH = номер дорожки (здесь, самое главное что я хотел узнать, если у меня загрузчик на 33 секторе, то тут 2 варианта, я так думаю:
1). сектор 33, головка 0, цилиндр 1
2). сектор 15, головка 0, цилиндр 1
Сектор 15, - потому что 33сектор - 18 секторов в цилиндре = 15
Какой вариант правильный? Или оба неправильны? И если первый правильный, то как я помещу его в 8 битный регистр CH ? Или тогда уже надо применять CX, вместо CH ??
Если по содержанию, то сразу хочется сказать: "смотря как ты высчитываешь линейный номер сектора 33". Если по традиционной формуле, связывающей LBA и CHS, то твои предположения насчет того, что все сектора в линейной нумерации сначала полностью занимают одну поверхность, а затем полностью другую, не верны. К тому же в линейной нумерации счет идет начиная с нуля. Формулы обратного пересчета я когда-то выкладывал на этом форуме. Все они вытекают из основной формулы. Если у тебя самостоятельно не получится это сделать, будем освежать память. А пока приведу код пересчета как раз для использования в функциях BIOS.
Код:
Цитата:
Не пробовал использовать поиск по форуму?
Пробовал, самое подходящее нашел только это
http://forum.codenet.ru/showthread.php?t=11874 а форум lowlevel.ru уже умер я так понял
Ну в том то и дело что я хотел узнать как правильно. Извини, Phantom-84 но я не на все вопросы получил ответы, из всего вышесказанного я только понял что все у меня неправильно.
Высчитываю номер сектора я так:
(номер сектора)MOD 18 = треб. сектор. т.е. 33Mod 18 = 15
Я только хотел узнать, правильно ли это.
На счет кода. Код то простой, но незная теории его сложно понять..
К примеру почему мы меняем старшие и младшие части:
mov ch,al
mov cl,ah
Конечно хотелось бы слышать побольше теории, а код потом не сложно будет написать.
S = N mod 18 + 1, т.к. нумерация сектров на дорожке начинается с 1.
T = N / 18
H = T mod 2
C = T / 2
Делители 18 и 2 - это соответственно SectorsPerTrack и HeadsPerCylinder.
Теории здесь немного. Просто нужно знать, как линейная адресация секторов связана с CHS-адресацией, а фактически как растут линейные номера секторов - сначала в пределах дорожки (на одной поверхности), потом в пределах цилиндра от одной дорожки к другой и лишь в самую последнюю очередь по цилиндрам.