Страница Ивана Рощина > Статьи >

© Иван Рощин, Москва

ZXNet: 500:95/462.53
E-mail: bestview@mtu-net.ru
WWW: http://www.ivr.da.ru

Усовершенствованный алгоритм определения смены диска

Радиолюбитель. Ваш компьютер» 9/2000)
Дата последнего редактирования: 27.11.2002.

    В этой статье я хочу рассказать об используемом мной способе определения смены диска. На мой взгляд, этот способ наиболее правильный и надёжный среди всех мне известных, и именно он применён в моей широко распространённой программе BestView, начиная с версии 2.8.

    Сначала кратко напомню о том, как вообще программа может определить, что из дисковода был вынут диск. Если вы посмотрите на дискету 5,25", то увидите на её боковой стороне так называемую прорезь защиты записи, которая может быть открытой или закрытой. Когда дискета вставлена в дисковод, напротив этой прорези располагается соответствующий датчик (оптический или механический), с помощью которого можно определить её состояние (рис. 1).

Рис. 1. Дисковод 5,25" с находящейся внутри дискетой (вид сверху).

    В дисководах 3,5" защита записи осуществляется по-другому. Трёхдюймовая дискета вместо прорези защиты записи снабжена отверстием со скользящей пластиковой задвижкой. В отличие от пятидюймовой дискеты, запись разрешена при закрытом отверстии и запрещена при открытом. Это лишь физическое отличие, а на логическом уровне работа с 5,25" и 3,5" дисководами происходит абсолютно одинаково.

    Программа может узнать состояние датчика, выполнив команду чтения из порта #1F в TR-DOS. При этом будет прочитано значение так называемого регистра состояния микроконтроллера ВГ93, а состояние датчика будет отражено в шестом бите этого регистра (табл. 1).

Табл. 1
Ситуация Значение 6-го бита
Прорезь открыта 0
Прорезь закрыта 1

    Помимо основной своей функции (определение защиты записи), датчик защиты записи может быть использован для получения информации о том, что диск был вынут из дисковода. Дело в том, что его состояние изменяется на противоположное при вынимании дискеты (рис. 2, 3).

Рис. 2. Дискета с открытой прорезью. Как только пользователь начинает вынимать её из дисковода, датчик сразу же начинает выдавать 1 вместо 0 (с точки зрения дисковода прорезь стала закрытой).


Рис. 3. Дискета с закрытой прорезью. Когда пользователь заканчивает вынимать её из дисковода, датчик сразу же начинает выдавать 0 вместо 1 (с точки зрения дисковода прорезь стала открытой).

    Как видим, программа должна периодически (например, 50 раз в секунду) опрашивать состояние датчика и при его изменении делать вывод о том, что пользователь вынул дискету.

    Всё это — вещи достаточно известные. А теперь я расскажу собственно об алгоритме определения смены диска в моей программе BestView.

    В BestView используется две различных процедуры для определения смены диска — медленная и быстрая. Как уже было сказано выше, в такой процедуре ключевым моментом является чтение регистра состояния ВГ93, а для выполнения чтения нужно, чтобы двигатель дисковода при этом работал. Таким образом, процедура должна включить двигатель, прочитать регистр состояния и выключить двигатель. Критичным является промежуток между включением и выключением двигателя. Если он мал, то ВГ может оказаться неготовой (тогда ВГ выдаёт вместо значения регистра состояния число #01 или число с установленным 7 битом). Если он велик, то дисковод успеет отреагировать на включение, и будет слышно потрескивание.

    Быстрая процедура включает двигатель, подав команду позиционирования на нулевой трек, а затем, не дожидаясь окончания выполнения этой команды (т.е. реально никакого позиционирования не успевает произойти), читает регистр состояния и выключает двигатель. При этом потрескивания не слышно (на моём Robotron’е), но иногда ВГ оказывается неготовой. Вероятность неготовности ВГ очень сильно зависит от промежутка между включением и выключением двигателя — например, у меня, когда я увеличил этот промежуток на величину порядка 15 тактов, вероятность от 35% снизилась до нуля.

    Если же на компьютере включен турбо-режим, имеется вероятность того, что при быстром способе опроса ВГ всегда будет неготовой (так как с увеличением тактовой частоты Z80 уменьшается промежуток между включением и выключением двигателя), и, соответственно, не будет определяться смена диска. Кстати, именно поэтому некоторые программы не могут определять смену диска в турбо-режиме.

    Медленная процедура включает двигатель, подав команду позиционирования на ту же дорожку, на которой уже находится магнитная головка дисковода, а затем, дождавшись окончания её выполнения, читает регистр состояния и выключает двигатель. При этом ВГ не может оказаться неготовой, но зато дисковод может успеть отреагировать на включение, и будет слышно потрескивание (у меня проявляется на 5,25" Robotron и 3,5" Mitsumi). На некоторых дисководах (5311) и при медленном способе опроса никакого потрескивания не слышно.

    А теперь самое интересное — как же BestView определяет, какую процедуру использовать? Сначала используется быстрая процедура, но если 40 раз подряд при её вызове ВГ оказалась неготовой (например, пользователь включил турбо-режим), оболочка переходит на чередующийся медленный/быстрый способ опроса. И если при этом хоть раз ВГ окажется готовой при быстром способе опроса, то оболочка переходит на быстрый способ опроса. Таким образом, сочетаются достоинства и быстрого, и медленного способа. Кстати, при работе в турбо-режиме даже при медленном способе опроса, скорее всего, не будет слышно потрескивания, так как при этом уменьшается промежуток между включением и выключением двигателя.

    Иногда бывает, что и без турбо-режима быстрый способ не срабатывает, и оболочка переходит на медленный способ. У меня такое бывает (от случая к случаю) на дисководе 3,5" (а на 5,25" всё идеально). В предыдущих версиях BestView, когда ещё не было обратного перехода от медленного способа опроса к быстрому, в таком случае дисковод начинал потрескивать. Ну а в BestView 2.8 исчезло и это неудобство.

    На случай, если вы задумаете писать программу с определением смены диска, расскажу о некоторых проблемах, которые могут при этом возникнуть, и о пути их преодоления.

    1. Помните, что определение смены диска работает только на реальном дисководе, а не на винчестере или RAM-диске. Из этого следует вывод: определение смены диска надо делать отключаемым, желательно отдельно для каждого из устройств A-D. Неплохо предусмотреть и сохранение этих настроек на диске. Ну а когда определение смены диска отключено, у пользователя должна быть возможность перечитывания каталога диска по нажатию какой-либо клавиши.

    2. На некоторых дисководах (ЕС 5323.01 и т.п.) было замечено, что при работе программ, контролирующих смену диска, лампочка постоянно горит и двигатель работает. Понятно, что это не лучшим образом сказывается на сроке службы дисковода. Это ещё один довод в пользу того, что определение смены диска надо делать отключаемым.

    3. На дисководах 3,5" определение смены диска происходит не всегда (по-видимому, это чисто механическая проблема, которая может быть решена несложной доработкой дисковода). А значит, ваша программа не должна целиком и полностью полагаться на то, что она сама сможет определить смену диска. Может случиться, что пользователь заменит диск, а программа «не узнает» об этом и запишет на новый диск каталог от старого диска — надеюсь, не надо пояснять, к чему это приведёт?
    Выводы: во-первых, перед записью на диск (при копировании и т.п.) необходимо проверять, тот ли это диск (например, по контрольной сумме девяти секторов каталога); во-вторых, пользователь должен иметь возможность сообщить программе о том, что диск был заменён.

    4. Как уже было сказано, при быстром способе опроса сначала вызывается подпрограмма, выполняющая позиционирование на нулевой трек (это нужно, чтобы включить двигатель дисковода), а затем, не дожидаясь окончания позиционирования, вызывается другая подпрограмма, которая читает регистр состояния и выключает двигатель. На реальном ZX Spectrum никакого позиционирования не произойдёт, а вот на некоторых эмуляторах…
    Кстати, такой способ опроса используется во многих boot’ах, определяющих смену диска, но там это не критично, так как магнитная головка постоянно находится на нулевом треке.
    Что я могу посоветовать: попробуйте встроить в вашу программу распознаватель эмулятора, и в случае обнаружения эмулятора — работайте с диском только через #3D13.

Другие мои статьи о TR-DOS:

1. 

«Доступ к порту #1F в TR-DOS 5.03». «ZX-Ревю» 1—2/1997.

2. 

«О сокращении времени форматирования». «ZX-Ревю» 1—2/1997.

3. 

«TR-DOS: как не допустить ошибки?». «ZX-Ревю» 5—6/1997.

4. 

«Работа с диском при включённых прерываниях». Adventurer #9, «Чёрная ворона» #3, «Радиолюбитель. Ваш компьютер» 6/2000 (дополненная версия).

5. 

«Вывод трёхсимвольных расширений файлов в операционной системе TR-DOS». «Радиолюбитель. Ваш компьютер» 7/2000.

6. 

«Расширения файлов TR-DOS». «Радиолюбитель. Ваш компьютер» 12/2000, «Радиомир. Ваш компьютер» 9/2001 (под псевдонимом BV_Creator).

7. 

«Обрубаем файлам „хвост“». «Радиомир. Ваш компьютер» 4/2002.

8. 

«Использование избыточной информации для защиты файлов от повреждений». «Радиомир. Ваш компьютер» 11/2002.

9. 

«Проверка корректности файловой структуры дисков TR-DOS». «Радиомир. Ваш компьютер» 6/2004.

Страница Ивана Рощина > Статьи >