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


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



от: Kirill Frolov
кому: All
дата: 23 Oct 2000
=============================================================================
* Forwarded by Kirill Frolov (500:812/23.25)
* Area : ZX.SPECTRUM (Эмулятоpщики тусуются)
* From : Alex Letaev, 2:5020/689.53 (21 Oct 00 06:32)
* To : All
* Subj : Усовершенствованный алгоритм определения смены диска
=============================================================================
Hi, All!

(c) Иван Pощин, Москва

Fido : 2:5020/689.53
ZXNet : 500:95/462.53
E-mail: asder_ffc@softhome.net
WWW : http://www.zx.ru/echo/roschin

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

(Pадиолюбитель. Ваш компьютер 9/2000)

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

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

╔═══════════════════════════╗
║ ║──── дисковод
║ ║
║ ║
║ ║
║ ┌───────────────────────┐ ║
║ │ ┌─┐ │────── дискета
║ │ │ │ │ ║
║ │ │ │ │ ║
║ │ └─┘ │ ║
║ │ о / ^ │ ║
║ │ ( ) │ ║
║ │ _ / │ ║
║ │ │ ║
║ │ ┌────────────┐ │ ║
║~~~┐ │ │ │ ║
датчик ───║~~~┘<┐ │ │ │ ║
║ │ │ └────────────┘ │ ║
╚═╧═══│═══════════════════╧═╝
└─ прорезь защиты записи

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

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

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

┌───────────────────┬────────────────────┐
│ ситуация │ значение 6-го бита │
├───────────────────┼────────────────────┤
│прорезь открыта │ 0 │
├───────────────────┼────────────────────┤
│прорезь закрыта │ 1 │
└───────────────────┴────────────────────┘

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

╔═══════════════════════════╗
║ ║──── дисковод
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ┌───────────────────────┐ ║
║ │ ┌─┐ │────── дискета
║ │ │ │ │ ║
║ │ │ │ │ ║
║ │ └─┘ │ ║
║ │ о / ^ │ ║
║~~~ ( ) │ ║
датчик ───║~~~ _ / │ ║
║ │ │ ║
╚═╧═══════════════════════╧═╝
└─┐ │ │ │
прорезь защиты ->┌─┘ │ │ │
записи │ └────────────┘ │
└───────────────────────┘

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

╔═══════════════════════════╗
║ ║──── дисковод
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║~~~ ║
датчик ───║~~~ ║
║ ┌───────────────────────┐ ║
╚═══════════════════════════╝
│ │ │ │────── дискета
│ │ │ │
│ └─┘ │
│ о / ^ │
│ ( ) │
│ _ / │
│ │
│ ┌────────────┐ │
прорезь защиты ->▓▓▓ │ │ │
записи ▓▓▓ │ │ │
│ └────────────┘ │
└───────────────────────┘

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

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

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

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

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

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

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

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

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

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

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

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

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

4. Как уже было сказано, при быстром способе опроса сначала
вызывается подпрограмма, выполняющая позиционирование на нулевой
трек (это нужно, чтобы включить двигатель дисковода), а затем,
не дожидаясь окончания позиционирования, вызывается другая
подпрограмма, которая читает регистр состояния и выключает
двигатель. Hа реальном Спектруме никакого позиционирования не
произойдет, а вот на некоторых эмуляторах...
Кстати, такой способ опроса используется во многих boot'ах,
определяющих смену диска, но там это не критично, т.к. магнитная
головка постоянно находится на нулевом треке.
Что я могу посоветовать: попробуйте встроить в вашу
программу распознаватель эмулятора, и в случае обнаружения
эмулятора - работайте с диском только через #3D13.


С уважением, Alex from FFC COMPUTERS.

>E-MAIL: asder_ffc@softhome.net ICQ: #13064553

-+- Spot 1.3b Unregistered
+ Origin: AOL = Amiga On Line. (2:5020/689.53)
=============================================================================

Hемедленно нажми на RESET, All!




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

Похожие статьи:
Обзор игр - Обзор игровых программ: Puffy's Saga, B.A.D. demo version, Chainik: Horror in Flat, Rex Collection, Mega Tetris 2000.
Обратная связь - контакты редакции.
Внимание - Памятка пользователю сети SPbZXNet (продолжение).
Bogie Goes Walk-A-Bouts
Содержание - содержание газеты

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