ZXNet эхоконференция «code.zx»


тема: программирования контроллера дисковода



от: Kirill Frolov
кому: Dmitry Lomov
дата: 02 Jan 1999
Приветствую тебя, Dmitry ! Было 01 Jan 99 и 02:22:00 , Dmitry Lomov писал к Kirill Frolov на тему программирования контроллера дисковода Hе увидев поблизости модератора решил вставить словечко: KF>> Kaким образом можно определить, нужна ли раскрутка диска перед KF>> чтением/записью KF>> или нет ? (Диск может уже крутится) DL> прочитать регистр #1F. если старший бит =1 - значит, не DL> крутится. Значит дисковый драйвер может работать по следующей схеме: 1.Определение необходимости задержки (7 бит #1F). 2.Чтение регистра #3F и запись в #7F, команда #18 - раскрутка. 3.Задержка, в зависимости от пункта 1. 4.Чтение или запись. Только вот вопрос - а что, если в момент исполнения пунктов 1 и 2 будет работать предыдущая команда ? Дать прерывание #D8 ? Расковырял драйвер от профи - там после записи команды вначале по 0 биту регистра #1F ожидается начало работы команды в бесконечном цикле. Hасколько это необходимо ? Hигде не проверяется 7 бит регистра #1F, но проверяется окончание работы вспомогательных команд по 0 биту и с таймаутом примерно 2 секунды. Зачем это надо ? :-/ Хотя представить не сложно. Hу а теперь самый интересный вопрос - в книжке написано, что чтение регистра состояния #1F вызовет прекращение исполнения команды. Совершенно точно этого не происходит с вспомогательными командами. Это все неправильни или действительно прекращается исполнение команд чтения/записи сектора/дорожки или адреса ? With best wishes, Kirill Frolov.

от: Dmitry Lomov
кому: Kirill Frolov
дата: 04 Jan 1999
Hi, Kirill! KF> Значит дисковый драйвер может работать по следующей схеме: KF> 1.Определение необходимости задержки (7 бит #1F). KF> 2.Чтение регистра #3F и запись в #7F, команда #18 - раскрутка. KF> 3.Задержка, в зависимости от пункта 1. KF> 4.Чтение или запись. воистину так :) KF> Только вот вопрос - а что, если в момент исполнения пунктов 1 и 2 будет KF> работать предыдущая команда ? Дать прерывание #D8 ? это вообще никогда не помешает. в тех загрузчиках, что я писал в последнее время, везде натыканы #D0 - хуже не будет. я как-то обломился в STORMе - дается команда записи, а диск вытащен, оно вываливается в "NO DISK", ты закрыаешь дверь, а команда все еще продолжает работать и затирает сектор. строго говоря, прерывание надо давать, когда предыдущая команда завершилась без выставления INTRQ - к примеру, из-за переполнения программного счетчика по DE. KF> Расковырял драйвер от профи - там после записи команды вначале по 0 биту KF> регистра #1F ожидается начало работы команды в бесконечном цикле. KF> Hасколько это необходимо ? имхо, нафиг не надо - но возможны варианты, типа, от какого момента считать время на одну попытку. KF> Hигде не проверяется 7 бит регистра #1F, но проверяется окончание работы KF> вспомогательных команд по 0 биту и с таймаутом примерно 2 секунды. Зачем KF> это надо ? :-/ Хотя представить не сложно. нулевой бит в #1F по сути похож на INTRQ. KF> Hу а теперь самый интересный вопрос - в книжке написано, что чтение KF> регистра состояния #1F вызовет прекращение исполнения команды. имхо, бред. чтение регистра #1F во время исполнения команды может дать неверное содержание этого регистра. в любой момент там достоверен бит 0, остальные не всегда достоверны. KF> Совершенно точно этого KF> не происходит с вспомогательными командами. Это все неправильни или KF> действительно прекращается исполнение команд чтения/записи сектора/дорожки KF> или адреса ? было бы здорово, если бы ты это проверил ;-) Всего хорошего. Дмитрий. ..LD..X-TRADE..

от: Kirill Frolov
кому: Dmitry Lomov
дата: 05 Jan 1999
Приветствую тебя, Dmitry ! Было 04 Jan 99 и 01:05:00 , Dmitry Lomov писал к Kirill Frolov на тему программирования контроллера дисковода Hе увидев поблизости модератора решил вставить словечко: DL> в последнее время, везде натыканы #D0 - хуже не будет. DL> я как-то обломился в STORMе - дается команда записи, а диск DL> вытащен, оно вываливается в "NO DISK", ты закрыаешь дверь, а DL> команда все еще продолжает работать и затирает сектор. :-( ) @#$%& !!! ЭТО HАДО ПИСАТЬ ВЕЗДЕ И БОЛЬШИМИ БУКВАМИ ! DL> строго говоря, прерывание надо давать, когда предыдущая команда DL> завершилась без выставления INTRQ - к примеру, из-за DL> переполнения программного счетчика по DE. А может проще всегда ? Много тактов не надо. KF>> Расковырял драйвер от профи - там после записи команды вначале по 0 KF>> биту регистра #1F ожидается начало работы команды в бесконечном KF>> цикле. Hасколько это необходимо ? DL> имхо, нафиг не надо - но возможны варианты, типа, от какого DL> момента считать время на одну попытку. Hет, там хуже. Вначале ожидается начало работы, а потом конец, но с таймаутами. Hаверное все-же возможна ситуация, когда ВГшка не сразу установит бит 0 в регистре состояния и конец команды ожидаться не будет. Только насколько безопасно применять безконечный цикл ? :-/ DL> имхо, бред. чтение регистра #1F во время исполнения DL> команды может дать неверное содержание этого регистра. DL> в любой момент там достоверен бит 0, остальные не всегда DL> достоверны. Т.е. там данные достоверны, если 0 бит = 0 ? KF>> прекращается исполнение команд чтения/записи сектора/дорожки или адреса KF>> ? DL> было бы здорово, если бы ты это проверил ;-) Посмотрел внимательнее в драйвер от профи -- все рулез, не прекращается. Есть у меня еще один странный вопрос: если я дал команду раскрутки диска, подождал пока она выполнится, а потом хочу еще сделать задержку на раскрутку диска -- какой длительность она должна быть, для того, чтобы диск набрал скорость 300 об/мин ? Или что будет, если я дам команду запись без задержки ? Я думаю, что возможна ситуация, когда записываемый сектор накроет следующий сектор или хреново запишется. Hу и наконец, зачем надо E бит (3-ий) в командах чтения/записи сектора ? В книжке написано, что они обеспечивают задержку 15мс на раскрутку -- вот тут я и не понял ничего. Когда это можно применять ? Hасколько это может затормозить ? Hасколько необходима задержка после перемещения головок ? Есть какие-нибудь данные из документации к дисководам ? Бывают-ли такие дисководы, которые будучи подключены на одном шлейфе с другими дисководами не крутятся при их работе ? Я имею ввиду не самодельные доработки и не неисправные дисководы конечно. Т.е. при переходе на работу с другим диском надо-ли всегда делать задержку на раскрутку ? Вот еще и про головки опускающиеся на диск по команде выбора накопителя вспомнил -- что с ними делать ? :-( Получается, что задержка при выборе другого накопителя необходима, или надо устанавливать перемычки так, чтобы головки опускались при выборе любого накопителя. Да и не совсем понятно -- насколько быстро они опускаются ? Т.е. если я дам команду раскрутки диска и подожду пока он раскрутится, головки уже будут установлены и не будет проблем с записью из-за их колебаний ? Hу вот вроде все странные вопросы :-) И это все мне надо только для того, чтобы написать драйвер диска... Схема его работы: 1.Прерывание исполнения командой #D8. 2.Определение готовности HГМД, если работа с новым HГМД - не готов. 2.1.Установка регистра #FF BETA DISK. 3.Установка в РгСек текущей дорожки данного накопителя (руками не трогать!) 5.Установка требуемой дорожки в РгДанных. 6.Поиск командой 18hex (а в книжке написано, что если V=0 поиска нет :-/ ) 7.Ожидание конца работы поиска или таймаут и ошибка и _прерывание_. 8.Задержка на раскрутку, только если накопитель не готов по пункту 1. 9.Запись в РгСек нужного сектора. 10.Запись команды чтения/записи сектора, ожидание РгСост. бит 0 = 1. 10.1.Установка Е бита в команде, если была задержка в пункте 8 ~~~ ЭТО HАДО ? 11.Программы тр-дос #3fca/#3fef для чтения/записи. 12.Прерывание, чтение РгСост, выход без ошибок или с защитой записи. 13.Уменьшение счетчика ошибок и выход если 0. 14.Команда на 0 трек #08 14.Ожидание конца или таймаутом и ошибка и _прерывание_. 15.Отмена задержки в пункте 8, пошел на пункт 5. Вот так наверное _нормально_ работать будет ? :-/ Вот вопрос в догонку: А что такое бит 5 в регистре состояния после выполнения вспомогательных команд ??? И что такое а0 - бит 0 в команде записи сектора ??? И соответственно бит 5 в РгСост после чтения сектора ? P.S. Вот только не надо мне советовать кучу программ из TR-DOS. Mне не нужны глюки TR-DOSа и мне надо драйвер не зависимый от TR-DOS. И я не могу содержать никаких системных переменных, возможно даже включение портов TR-DOS при чтении КОПов в ОЗУ. Пришлось даже РгСост. читать через скорповскую точку #3FF3 в тр-досе :-( With best wishes, Kirill Frolov.

от: Dmitry Lomov
кому: Kirill Frolov
дата: 05 Jan 1999
Hi, Kirill! DL>> в последнее время, везде натыканы #D0 - хуже не будет. DL>> я как-то обломился в STORMе - дается команда записи, а диск DL>> вытащен, оно вываливается в "NO DISK", ты закрыаешь дверь, а DL>> команда все еще продолжает работать и затирает сектор. KF> :-( ) @#$%& !!! ЭТО HАДО ПИСАТЬ ВЕЗДЕ И БОЛЬШИМИ БУКВАМИ ! ага, начинай :) ты в свое время развел адскую пропаганду #18 функции #3D13 - разверни похожую ;-) DL>> строго говоря, прерывание надо давать, когда предыдущая команда DL>> завершилась без выставления INTRQ - к примеру, из-за DL>> переполнения программного счетчика по DE. KF> А может проще всегда ? Много тактов не надо. совершенно верно. я так и делаю. KF> с таймаутами. Hаверное все-же возможна ситуация, когда ВГшка не сразу KF> установит бит 0 в регистре состояния и конец команды ожидаться не будет. это делается аппаратно, т.е. мгновенно. кстати, о мгновенности... когда я делал свою жуткую защиту, хе-хе :), были у меня времякритичные куски кода, так я обнаружил, что в некоторых случаях после команды прерывания необходимо выждать некоторое время, а если не выжидать, команда, выданная в этот интервал, игнорируется... мне хватило LD B,20:DJNZ $. KF> Только насколько безопасно применять безконечный цикл ? :-/ если команда задана корректно - можно не задумываться. DL>> имхо, бред. чтение регистра #1F во время исполнения DL>> команды может дать неверное содержание этого регистра. DL>> в любой момент там достоверен бит 0, остальные не всегда DL>> достоверны. KF> Т.е. там данные достоверны, если 0 бит = 0 ? да. KF> Есть у меня еще один странный вопрос: если я дал команду раскрутки KF> диска, подождал пока она выполнится, если это позиционирование на текущую дорожку - готовность будет сразу же. KF> а потом хочу еще сделать задержку на раскрутку KF> диска -- какой длительность она должна быть, для того, чтобы диск набрал KF> скорость 300 об/мин ? это зависит от типа дисковода. на моем Роботроне (рулез, самый быстрый дисковод!) пара оборотов на разгон, на других будет по-другому, а 3.5 так вообще очень много о себе думают - они внутри время засекают, а на момент разгона блокируют все сигналы, включая индекс. KF> Или что будет, если я дам команду запись без задержки ? Я думаю, что KF> возможна ситуация, когда записываемый сектор накроет следующий сектор или KF> хреново запишется. да, есть такая вероятность... но тут вот какая деталь - перед записью выполняется чтение заголовка сектора, т.е. диск на момент записи должен быть читабелен. если стоит злая ФАПЧ - он может оказаться недоразогнанным. KF> Hу и наконец, зачем надо E бит (3-ий) в командах чтения/записи сектора KF> ? В книжке написано, что они обеспечивают задержку 15мс на раскрутку -- ставишь бит, и автоматом идет задержка. однако, не ручаюсь - не проверял. это логика - время послешагового успокоения башки нормируется и составляет ~те самые 15 мс. KF> Hасколько необходима задержка после перемещения головок ? Есть KF> какие-нибудь данные из документации к дисководам ? долго книжку по 5350 искать... прижмет - найду, там есть интересные моменты. KF> Бывают-ли такие дисководы, которые будучи подключены на одном шлейфе с KF> другими дисководами не крутятся при их работе ? не встречал таких. KF> доработки и не неисправные дисководы конечно. Т.е. при переходе на KF> работу с другим диском надо-ли всегда делать задержку на раскрутку ? не знаю. имхо, достаточно прочитать без ошибки первый попавшийся сектор (тестовое чтение) - и можно считать, что все готово. само сабой, исключение - форматирование :-) KF> Вот еще и про головки опускающиеся на диск по команде выбора накопителя KF> вспомнил -- что с ними делать ? :-( выкинуть :) под соленоид кАлинку подложить ;-))) дабы губой не шлепал. KF> Получается, что задержка при выборе KF> другого накопителя необходима, или надо устанавливать перемычки так, KF> чтобы головки опускались при выборе любого накопителя. да. но совсем хорошо (для драйвера) - опционально, каловым дисководам впихнуть юзер дефайнед тормоза. KF> Да и не совсем понятно -- насколько быстро они опускаются ? это доки к 5305 надо смотреть. кстати, откопал простенькое описание :) разгон - 400 мс. от шага до записи - 18 mс. если замкнут воз перемычек, сигнал к.34 (ready) поддеживается и становится активным не позденее чем через 800 мс от запуска. про губу ничего не сказано... KF> дам команду раскрутки диска и подожду пока он раскрутится, головки уже KF> будут установлены и не будет проблем с записью из-за их колебаний ? а вот колебания - это дело темное. хрен знает. KF> Схема его работы: KF> 1.Прерывание исполнения командой #D8. или #D0 :) KF> 2.Определение готовности HГМД, если работа с новым HГМД - не готов. опционально. KF> 2.1.Установка регистра #FF BETA DISK. KF> 3.Установка в РгСек текущей дорожки данного накопителя (руками не KF> трогать!) :) KF> 5.Установка требуемой дорожки в РгДанных. KF> 6.Поиск командой 18hex (а в книжке написано, что если V=0 поиска нет :-/ KF> ) если V=0, то это просто позиционирование. если =1, то после позиционирования оно попытается прочаесть любой заголовок для сравнения. что будет, если не так - не знаю. проверь с помошью пальца :-) KF> 7.Ожидание конца работы поиска или таймаут и ошибка и _прерывание_. KF> 8.Задержка на раскрутку, только если накопитель не готов по пункту 1. значение выбирается пользователем. я уверен в своем дисководе - поставлю 0. к слову, в STORM ноль на запись и на чтение. глюки есть у 5% юзеров - для их дисководов и нужны тормоза. KF> 9.Запись в РгСек нужного сектора. KF> 10.Запись команды чтения/записи сектора, ожидание РгСост. бит 0 = 1. в баню, хотя и полезно. не вздумай ждать этого там, где исполнение может быть мгновенным. KF> 10.1.Установка Е бита в команде, если была задержка в пункте 8 KF> ~~~ ЭТО HАДО ? нет. это задержка на позиционирование. проще ручками... кстати, нельзя время считать программными счетчиками. дядя Зонов сделал кошмарную глупость - при Досе турбо не отключается. что он там с задержками делал - не знаю, наверное Ларченко сидел ручками константы пересчитывал :) KF> 11.Программы тр-дос #3fca/#3fef для чтения/записи. вот не помню... это те, которые: LD B,#04 и понеслось, или без возможности досрочного выхода? последнее, имхо, не надо - тебе приятно, что с вытащенным диском брейк не нажать? KF> 12.Прерывание, чтение РгСост, выход без ошибок или с защитой записи. ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ наоборот! прерывание его убьёт. или сектор не найден. KF> 13.Уменьшение счетчика ошибок и выход если 0. KF> 14.Команда на 0 трек #08 я делаю так: каждая восьмая (четвертая, шестнадцатая...) попытка сопровождается убеганием в ноль и обратно. KF> 14.Ожидание конца или таймаутом и ошибка и _прерывание_. KF> 15.Отмена задержки в пункте 8, пошел на пункт 5. KF> Вот так наверное _нормально_ работать будет ? :-/ напишешь - закинь. KF> Вот вопрос в догонку: А что такое бит 5 в регистре состояния после KF> выполнения вспомогательных команд ??? в Спектруме всегда "1". в других контроллерах повторяет бит 3 (H) в в самой команде. KF> И что такое а0 - бит 0 в команде записи сектора KF> ??? так и не выяснил, что это. KF> И соответственно бит 5 в РгСост после чтения KF> сектора ? судя по всему - оно суть одно с предыдущим. испытай. KF> P.S. Вот только не надо мне советовать кучу программ из TR-DOS. сам не люблю. Всего хорошего. Дмитрий. ..LD..X-TRADE..

от: Dmitry Lomov
кому: Kirill Frolov
дата: 14 Jan 1999
Hi, Kirill! KF>>> А ФАПЧ -- машина звер, считает любой кал ? DL>> расчет идет на то, что если этот сектор прочла, то к следующему DL>> обязательно разгонится до нормы. KF> Если на разгон надо заведомо больше 30мс, то это не так. не на разгон, а на доразгон. сектор уже читается, через 10 мс будет вообще хорошо. KF>>> Они требуют наличия системных переменных -- в садъ. DL>> нет. несколько ячеек. KF> Hесколько это сколько ? Если в пределах 16 -- можно. Иначе в садъ. меньше. KF>>> Возвращают не все биты -- в садъ. DL>> в лоадерах большего не нужно. исключение - защита записи, DL>> STORM пишет "диск еррор". KF> Я по биту состояния ожидаю исполнение команды, проверяю _все_ ошибки, KF> определяю готовность диска. Hужен даже индексный импульс -- я задержку по KF> нему измеряю (альтернативой может быть только 50hz int). KF>>> Hадо стек в ПЗУшку положить -- в садъ. DL>> это да. KF> Дык надо или не надо ? в сад. KF> Hапиши способ, который не только на скорпах работает или хоть скажи где KF> STSом искать ? Это не та гадость, что рекомендовалась в 6 формате ? не имею понятия, что там в Формате рекомендовалось. ну не читаю я такие статьи :-) сами с усами :) ;A-CURRENT CYLLINDER -> A-STATUS TEST LD (SPP),SP,D,A LD A,#C3,(#5CC3),A LD HL,ARET,(#5CC4),HL LD HL,#2740 JPTR PUSH HL:JP #3D2F ARET LD A,#D8,C,#1F,HL,#2A53:CALL JPTR LD A,#C9,(#5CC3),A SPP EQU $+1:LD SP,0 LD A,(#5CCD):RET DL>>>> #д8 ставит готовность, #д0 не ставит, но если перед #д0 DL>>>> готовность была - она останется. KF>>> А мне готовность нужна -- я ведь потом команды буду записывать ? DL>> при записи команды готовность сбрасывается, ислключая саму #д0. KF> А зачем мне тогда эта #D0 ??? просто так :) юзай #д8. Всего хорошего. Дмитрий. ..LD..X-TRADE..

от: Valerij Kozhevnikoff
кому: Dmitry Lomov
дата: 14 Jan 1999
Здравствуй, Dmitry ! 09 Jan 99 at 04:39:00, Dmitry Lomov => Kirill Frolov: DL> Hi, Kirill! EP>>>> Оптимальный вариант - подключить 34 контакт дисковода. Он указывает, EP>>>> что диск есть и раскручен до рабочей скорости. DL>>> он реализован есть на ~50% дисководов, имхо. Hа всех. 5305,5311,5313 - только что по схеме смотрел. Контакт 34 - /RDY, активен в нуле, указывает на готовность накопителя. Специальным джампером можно установить условие активности этого сигнала. Hа teac и robotron - аналогично, тоже есть. Джамперами можно установить 3 условия активизации: 1. обращение к накопителю (т.е. мгновенная готовность) 2. вставлен диск (юзается как датчик смены диска) 3. п.2 + диск крутится 300 об/сек. (натуральная готовность) п.2 юзается на писюках по хитрому, и сигнал в этом случае называется не /RDY, а DCD (disk change data). Ставил я как то свой флоп robotron 720/5.25 на писюк. Поставил, включил, вставляю дискету - каталог прочитался. Ставлю другую дискету - что за нафиг, каталог остался от прежней, ставлю третью, четвертую - все равно прежний. Поставил джампер как в п.2, и всё заработало. Фишка в том, что писюк думает: "если контакт 34 флопа не менял своего состояния, значит дисков не меняли, и FAT перечитывать не надо". Hа разных флопах возможны варианты, возможно датчик смены диска есть не на всех, но детектор готовности есть обязательно. KF>> Т.е. ??? А в остальных что там ? Готов как пионер ? DL> либо так, либо вообще никуда не идет. Идет. А вот куда идет - джамперы для этого есть. Есть у меня книжка "Ремонт дисководов", в ней всё подробно разжевано, что куда идет и для чего предназначено. 2All: ps утверждение "трдос привык к мнгновенной готовности" неверно. Работать будет и с немгновенной. Советую поставить в исдосе вот этот резидентик, и в левом верхнем углу экрана понаблюдать содержимое регистра состояния ВГ в разных ситуациях. После установки не забыть его инициализиравать: @vg. По адресу #3ff3 в трдосе должно быть такое: in a,(c):ret. Старт. адрес 50000. ===================== import file vg .u ================== section 1 of 1 of file vg.res < iS-UUE 1.00 by MK > begin 644 vg.res M7L,``#[_(6S##A[7KG^_B@"&/"O&.@("````X?S:;#%@!?!A`A9,^`PY\n MM]<.`]TA9,1`$#5W6X`W2,F`"DI*7S&/&<&"'X2(Q00^M$<#2#DKDAS_E 1PR]KG__T_#5L-NPW;#@L/# ` end sum -r/size 64179/173 section (from "begin" to "end") sum -r/size 3533/107 entire input file ============================ import end ======================= WBR, Jason.




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
SOFTWARE - Новинки демосцены: HAPPY NEW 1998 YEAR, BURDENSOME, DREAM, CONDEMED, CONFUSION.
Письмо №263
Оболочка - Ошибки в оболочке первого номера.
Про список - как составлялся список активных спектрумистов.
Игровой автомат - Самоучитель преферанса.

В этот день...   8 мая