b2m(06.04.2020)
Блин, опять поднял волну зазря
- - - Добавлено - - -
Вот не хотел я в вашем мдосе копаться, но раз уж назвался груздем...
Проблема тут:
Задаём диск 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
Последний раз редактировалось b2m; 06.04.2020 в 18:54.
Improver(07.04.2020)
Не успел. Только я все же хотел впихнуть нормальную процедуру деления 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
Последний раз редактировалось b2m; 06.04.2020 в 20:11.
Сегодня котелок уже не варит, сделал тупо (с делением 24/16 через процедуру 32/16), ну и там еще потупил. Исходник этого сна разума не выкладываю, но бинарник вроде заработал правильно, пусть будет.
electroscat(08.04.2020), Improver(07.04.2020)
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%.
Improver(07.04.2020)
jmp несомненно лишний, я даже убирал оттуда процедуру, но в процессе поиска ошибки (надо было раскомментить mvi d,0) грешил на размещение процедуры, вернул ее под jmp и забыл вернуть обратно. Метки короткие, да нехорошо. Можно даже внутри процедуры все сделать без меток, c $+-. Больше я трогать не буду, лучше Improver доработает (если захочет). Но если еще есть загадки/ошибки, то я всегда готов (если только не очень сложные).
Насчет 55 и 54 похоже действительно опечатка в описании. C ВУ приходит инверсный адрес, они его инвертируют и подают на IDE.
Improver(07.04.2020)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)