Вряд ли в этом есть необходимость, похоже этот фрагмент работает правильно
Вид для печати
Блин, опять поднял волну зазря :)
- - - Добавлено - - -
Вот не хотел я в вашем мдосе копаться, но раз уж назвался груздем...
Проблема тут:
Задаём диск 2В. Исходный номер сектора 0101E6h, делим на 120h (18*16 секторов на дорожке). Процедура L_D8F3 делит 16-битное на 16-битное с остатком. Потом двигаем остаток на 8-бит и берём младшие 8 бит, и снова делим на 16-бит.Код:MOV H, A ; (HL,E) = (A,HL)
POP B ; для подчистки стека, загружаем временно в BC
CALL L_D9D9 ; проверка готовности НЖМД, получение кода ошибки и RET
PUSH B ; возвращаем BC в стек
ANI 0C0h ; 1110 0000
CPI 040h ; 0100 0000 устройство готово к операции
RNZ ; выход, если не готово
DI ; запрет прерываний на время установки параметров
PUSH D
CALL L_D8F3 ; расчёт номера цилиндра = 00h
OUT 055h ; Цилиндр, младшие биты номера цилиндра
POP D
MOV H, L
MOV L, E
CALL L_D8F3 ; расчёт номера цилиндра = 00h
OUT 054h ; Цилиндр, старшие биты номера цилиндра
Проблема только в том, что остаток 16-битный.
О способе деления я умолчу, он тут работает как задумывалось. Но это тоже мрак.
- - - Добавлено - - -
Получается, выражение "секторов*головок" должно быть <256
Не успел. Только я все же хотел впихнуть нормальную процедуру деления 24/16 (быстро нашлась 32/16, поэтому ее), т.к. сейчас эта комбинация делит неправильно. Просто так впихнуть не получается, надо разбираться, где свободное место, уверен, что Improver легко поправит, он знает где там запас.
Я думаю, если выкинуть все эти "патчи" для старой процедуры деления, то место появится.
- - - Добавлено - - -
По-моему, можно даже обойтись процедурой 24/8, первый раз делим на кол-во секторов (остаток - номер сектора-1), второй раз на количество головок (остаток номер головки). Частное (16-битное) - номер цилиндра.
- - - Добавлено - - -
Тогда будет ограничение "цилиндров*головок"<65536 (это если частное 16-битное).
- - - Добавлено - - -
Деление 24/8
По-моему - оптимально.Код:MVI C,16 ; HL=AHL/B, A=AHL%B
L1: DAD H
ADC A
JC L2
CMP B
JC L3
L2: SUB B
INR L
L3: DCR C
JNZ L1
RET
Сегодня котелок уже не варит, сделал тупо (с делением 24/16 через процедуру 32/16), ну и там еще потупил. Исходник этого сна разума не выкладываю, но бинарник вроде заработал правильно, пусть будет.
ivagor поскромничал выложить исходники... ;) Попробую сам поправить в Т-72 драйвер на основе кода 24/8 от b2m. Но, с другой стороны, общественный разум опять победил! На этот раз многолетнюю проблему глюка с жёсткими дисками.
P.S. Кстати, появилась идея перевести обращение к диску на LBA, для этого, по сути, будет достаточно дополнить номер сектора с 24 до 28 бит нулями. Это избавит от всех вычислений, привязки к количеству цилиндров/головок/секторов диска и т.п., но только пока не известно, как поведут себя разнообразные CF-карты, комбодевайсы и поддерживают ли эмуляторы Вектора режим LBA для жёстких дисков...
Сделал по заветам b2ma, убрал много лишнего. К этому варианту уже не стыдно приложить исходники, вернее только измененные файлы. Improver, b2m, спасибо!
- - - Добавлено - - -
Забыл спросить один момент. Регистры 55h и 54h - в досах в 54h пишут младший байт, в 55 - старший, в памятке Tim0xи написано наоборот. Если бы оба были по 8 бит, то без разницы, но разрядность старшего меньше, или это только для старых hdd важно а в новых и старший 8 бит?
Я сначала опирался на инфу с базиса из HDD.TXT, и свои комментарии в исходниках ставил по ней, но там скорее всего опечатка, в порт 055h пишутся старшие биты, а в 054h -- младшие.
Можно я поворчу. Процедуру деления я бы на место старой поместил (у тебя лишний jmp), столь короткие метки не стал бы использовать.
А так - да, всё как я и полагал.
- - - Добавлено - - -
И да, цикл чтения/записи сектора я бы разделил. Какой смысл каждые 2 байта анализировать чтение нужно или запись? Ускорение будет 5-10%.
jmp несомненно лишний, я даже убирал оттуда процедуру, но в процессе поиска ошибки (надо было раскомментить mvi d,0) грешил на размещение процедуры, вернул ее под jmp и забыл вернуть обратно. Метки короткие, да нехорошо. Можно даже внутри процедуры все сделать без меток, c $+-. Больше я трогать не буду, лучше Improver доработает (если захочет). Но если еще есть загадки/ошибки, то я всегда готов (если только не очень сложные :) ).
Насчет 55 и 54 похоже действительно опечатка в описании. C ВУ приходит инверсный адрес, они его инвертируют и подают на IDE.