После просмотра вашего кода выясняется, что проблема заключается в использовании правильной формулы для получения значений дорожки (цилиндра), головки и сектора для заданного смещения в файле образа диска. Вы хотите использовать правильные значения для Int 13h / ah = 2 (чтение с диска).
Из моего предыдущего ответа я дал формулу:
CHS tuples can be mapped to LBA address with the following formula:
LBA = (C × HPC + H) × SPT + (S - 1)
where C, H and S are the cylinder number, the head number, and the sector number
LBA is the logical block address
HPC is the maximum number of heads per cylinder (reported by
disk drive, typically 16 for 28-bit LBA)
SPT is the maximum number of sectors per track (reported by
disk drive, typically 63 for 28-bit LBA)
LBA addresses can be mapped to CHS tuples with the following formula
("mod" is the modulo operation, i.e. the remainder, and "÷" is
integer division, i.e. the quotient of the division where any
fractional part is discarded):
C = LBA ÷ (HPC × SPT)
H = (LBA ÷ SPT) mod HPC
S = (LBA mod SPT) + 1
Дополнительную информацию об адресации дисков можно найти в этой википедии статья .
Для дискеты объемом 1,44 МБ всего 2880 секторов, HPC (головки на цилиндр) - 2, а SPT (секторов на дорожку - 18), а каждый сектор - 512 байт. Что вам нужно, так это LBA. LBA - это просто смещение, где вы записываете ядро (в байтах), деленное на 512. В вашей программе Appender
вы размещаете копию ядра со смещением 738304. LBA = 738304/512 = 1442.
Вам просто нужно преобразовать LBA 1442 в CHS и вставить эти цифры в код.
Formula:
C = LBA ÷ (HPC × SPT)
H = (LBA ÷ SPT) mod HPC
S = (LBA mod SPT) + 1
We know:
LBA = 1442
HPC = 2
SPT = 18
Делая подстановку мы получаем:
C = 1442 ÷ (2 × 18)
H = (1442 ÷ 18) mod 2
S = (1442 mod 18) + 1
÷
означает целочисленное деление и выбрасывание остатка (дроби). mod
означает деление и сохранение остатка, и выбросить всю часть.
C = 1442 ÷ (2 × 18) = 40.0555556 = 40
H = (1442 ÷ 18) mod 2 = 80 mod 2 = 0 (80 mod 2 = 40 remainder 0)
S = (1442 mod 18) + 1 = (2) + 1 = 3 (1442 mod 18 = 80 remainder 2)
Теперь для LBA 1442 мы знаем, что Cylinder (Track) = 40, Head = 0, Sector = 3. Ваш код будет использовать эти значения при вызове BIOS Int 13h / AH = 2. Вы бы поместили 40 в DH , 0 в CH и 3 в CL .
Вы также, похоже, поместили копию ядра со смещением 2048 в образ диска. Смещение 2048 - это LBA, равное 4 (2048/512). Используя приведенную выше формулу и значения, вы получите Cylinder (Track) = 0, Head = 0, Sector = 5. Вы бы поместили 0 в DH, 0 в CH и 5 в CL .
Специальное примечание: Только номера секторов начинаются с 1. Цилиндры (гусеницы) и головки начинаются с 0.
Если вам дан Цилиндр (Трек), Голова и Сектор, и вам необходимо знать, какой LBA соответствует диску, формула будет:
LBA = (C × HPC + H) × SPT + (S − 1)
Если у вас CHS (40, 0, 3) с геометрией диска 1,44 МБ (HPC = 2 и SPT = 18), LBA = (40 * 2 + 0) * 18 + (3-1) = 1442. 1442 * 512 = 738304 будет дисковым смещением этого сектора.
Если у вас CHS (0, 0, 5) с геометрией диска 1,44 МБ (HPC = 2 и SPT = 18), LBA = (0 * 2 + 0) * 18 + (5-1) = 4. 4 * 512 = 2048 будет смещение диска этого сектора.
Эти 2 вычисления являются противоположностью результатов, вычисленных в первом разделе этого ответа.