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.




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

Похожие статьи:
Правила выпуска газеты - Пока что правила полностью не приняты, присылайте свои предложения в файлах "FOR_NEXT".
Софт - CUTHIST2 - "вырезатель" history из аварийной отгрузки.
Power of Sound Web Team - Himik рассказывает о своем самом обновляемом спектрумовским ресурсе во всем российской интернете!
Реклама - Реклама и объявления ...
Авторы - "A нeльзя ли было кyпить мeлодии y дрyгих грyпп?"

В этот день...   26 апреля