© Иван Рощин, Москва
| ZXNet | : 500:95/462.53 |
| : bestview@mtu-net.ru | |
| WWW | : http://www.ivr.da.ru |
В этой статье я хочу рассказать об используемом мной способе определения смены диска. На мой взгляд, этот способ наиболее правильный и надёжный среди всех мне известных, и именно он применён в моей широко распространённой программе BestView, начиная с версии 2.8.
Сначала кратко напомню о том, как вообще программа может определить, что из дисковода был вынут диск. Если вы посмотрите на дискету 5,25", то увидите на её боковой стороне так называемую прорезь защиты записи, которая может быть открытой или закрытой. Когда дискета вставлена в дисковод, напротив этой прорези располагается соответствующий датчик (оптический или механический), с помощью которого можно определить её состояние (рис. 1).
![]() |
В дисководах 3,5" защита записи осуществляется
Программа может узнать состояние датчика, выполнив
команду чтения из порта #1F в
| Ситуация | Значение 6-го бита |
|---|---|
| Прорезь открыта | 0 |
| Прорезь закрыта | 1 |
Помимо основной своей функции (определение защиты записи), датчик защиты записи может быть использован для получения информации о том, что диск был вынут из дисковода. Дело в том, что его состояние изменяется на противоположное при вынимании дискеты (рис. 2, 3).
![]() |
![]() |
Как видим, программа должна периодически (например, 50 раз в секунду) опрашивать состояние датчика и при его изменении делать вывод о том, что пользователь вынул дискету.
Всё это вещи достаточно известные. А теперь я расскажу собственно об алгоритме определения смены диска в моей программе BestView.
В BestView используется две различных процедуры для определения смены диска медленная и быстрая. Как уже было сказано выше, в такой процедуре ключевым моментом является чтение регистра состояния ВГ93, а для выполнения чтения нужно, чтобы двигатель дисковода при этом работал. Таким образом, процедура должна включить двигатель, прочитать регистр состояния и выключить двигатель. Критичным является промежуток между включением и выключением двигателя. Если он мал, то ВГ может оказаться неготовой (тогда ВГ выдаёт вместо значения регистра состояния число #01 или число с установленным 7 битом). Если он велик, то дисковод успеет отреагировать на включение, и будет слышно потрескивание.
Быстрая процедура включает двигатель, подав команду позиционирования на нулевой трек, а затем, не дожидаясь окончания выполнения этой команды (т.е. реально никакого позиционирования не успевает произойти), читает регистр состояния и выключает двигатель. При этом потрескивания не слышно (на моём Robotronе), но иногда ВГ оказывается неготовой. Вероятность неготовности ВГ очень сильно зависит от промежутка между включением и выключением двигателя например, у меня, когда я увеличил этот промежуток на величину порядка 15 тактов, вероятность от 35% снизилась до нуля.
Если же на компьютере включен
Медленная процедура включает двигатель, подав команду позиционирования на ту же дорожку, на которой уже находится магнитная головка дисковода, а затем, дождавшись окончания её выполнения, читает регистр состояния и выключает двигатель. При этом ВГ не может оказаться неготовой, но зато дисковод может успеть отреагировать на включение, и будет слышно потрескивание (у меня проявляется на 5,25" Robotron и 3,5" Mitsumi). На некоторых дисководах (5311) и при медленном способе опроса никакого потрескивания не слышно.
А теперь самое интересное как же
BestView определяет, какую процедуру использовать? Сначала используется
быстрая процедура, но если 40 раз подряд при её вызове ВГ оказалась
неготовой (например, пользователь включил
Иногда бывает, что и без
На случай, если вы задумаете писать программу с определением смены диска, расскажу о некоторых проблемах, которые могут при этом возникнуть, и о пути их преодоления.
1. Помните, что определение смены диска работает
только на реальном дисководе, а не на винчестере или
2. На некоторых дисководах (ЕС 5323.01 и т.п.) было замечено, что при работе программ, контролирующих смену диска, лампочка постоянно горит и двигатель работает. Понятно, что это не лучшим образом сказывается на сроке службы дисковода. Это ещё один довод в пользу того, что определение смены диска надо делать отключаемым.
3. На дисководах 3,5" определение смены диска
происходит не всегда
Выводы:
4. Как уже было сказано, при быстром способе опроса
сначала вызывается подпрограмма, выполняющая позиционирование на нулевой трек
(это нужно, чтобы включить двигатель дисковода), а затем, не дожидаясь
окончания позиционирования, вызывается другая подпрограмма, которая читает
регистр состояния и выключает двигатель. На реальном ZX Spectrum никакого
позиционирования не произойдёт, а вот на некоторых эмуляторах
Кстати, такой способ опроса используется во многих
bootах, определяющих смену диска, но там это не критично, так как
магнитная головка постоянно находится на нулевом треке.
Что я могу посоветовать: попробуйте встроить в вашу
программу распознаватель эмулятора, и в случае обнаружения
эмулятора работайте с диском только через #3D13.
|
Другие мои статьи о
|