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.
|