Gleb, к вопросу о перехвате int 13h, вот что я нашел в исходниках DOS 6
; there is a bug in some versions of ibm's at rom bios.
; interrupts are not disabled during read operations.
;
; use: this program should be chained in line with the disk
; interupt 13h, it intercepts read calls to the hard disk
; and handles them appropriately. for other functions it
; passes controll to old13, which should contain the
; address of the at rom disk routine. the entry point for
; this program is ibm_disk_io.
Там же есть указание
cli ;disable interrupts (bug was forgetting this)
; M062 -- some of these old machines have intermittent failures
; when the read is done at full speed. Instead of using
; a string rep instruction, we'll use a loop. There is
; a slight performance hit, but it only affects these
; very old machines with an exact date code match, and
; it makes said machines more reliable
;
;M062 repz insw ;read in sector
rsct_loop: ; M062
insw ; M062 read in sector
loop rsct_loop ; M062
sti
Во многих старых BIOS REP не используют, но в том что я дорабатывал (D286)
уже REP.
И возвращаясь к тому, что Вы упоминали (извините за настырность, просто хочется разобраться).
Gleb писал(а): ↑29.07.2020,13:52
Как минимум для буферизации на старых системах, где установлены диски с низким числом секторов на дорожку, и для чтения большого количества секторов за один вызов int13h, нужно переключать не только головки, но и цилиндры. БИОС этого не делал.
А после подмены вектоа ДОСом становится возможным считывать большее количество секторов за раз (до 127 [7Fh]).
И если при написании собственного обработчика int13h исключить из цепочки этот обработчик DOS, а передавать прямо в оригинальный БИОС-овский int13h, то можно столкнуться с ситуацией, когда маленькие файлы читаются, а большие нет.
Столкнулся с этим на XT с классическим 17-ти секторным MFM диском.
В более современных системах это возможно иррелевантно, не проверял.
Вообще говоря, BIOS не должен заниматься переключением цилиндров, головок, он только подает ATA
команду, и сколько секторов должно быть записано/прочитано, это просто часть операции
подготовки task_file, регистр 1F2. Может быть Ваш MFM контроллер имел баг (или особенность такую,
типа как у FDC)? Я когда делал поддержку MFM для FreeBSD (с 16-битным контроллером WD) ничего
такого не заметил. Или может такая особенность у старых 8-битных контроллеров?