Маленький бит, динамик и Windows 95
АрхивЯ не программист и даже не юзер, я скорее "чайник", использующий компьютер для управления оптической установкой. В мою машину вставлена интерфейсная плата, содержащая несколько параллельных портов ввода/вывода, через которые можно подавать на установку разные сигналы и проверять правильно ли она на эти сигналы реагирует.
Установка и интерфейсная плата самодельные, то есть изготовлены моими коллегами (чуть было не сказал "по науке"), а мне остается читать из портов и писать в них так, чтобы установка подавала признаки жизни. Для этого мне приходится периодически пролистывать несколько книжек по Turbo Pascal да иметь под рукой томик Джордейна (который до выхода на русском языке в печатном виде значился на дискетах как Журден), купленный мною когда-то, в самом начале экономических преобразований, за четверть месячной зарплаты. Почему я использую Pascal? Он более похож на человеческий язык, чем Си, и обеспечивает доступ к компьютерному железу.
Не считая создания сколько-нибудь удобного пользовательского интерфейса, что, правда, занимает процентов 90 рабочего времени, мне нужно подавать в нужные порты сигналы нужного уровня в нужное время да между этим читать оставшиеся порты и делать кое-какие простейшие расчеты.
Для формирования временных задержек я часто применял паскалевскую процедуру Delay(x), задающую задержку в миллисекундах.
Я пользовался 286-м, 386-м затем 486-м компьютером, - чем мощнее был процессор, тем легче было рассовывать между обращениями к плате пользовательские примочки. Хотя именно набор примочек и определял в конечном счете потребительские свойства программы и самой установки. Наконец на моем столе появился Pentium… Вернее, сначала Pentium появился на столе у заказчика (иногда покупают даже оптические установки), и в самый ответственный момент в присутствии высоких должностных лиц программа не смогла общаться с установкой… В результате лихорадочного копания в программе выяснилось: она стала работать быстрее, в том смысле, что временные интервалы, задаваемые процедурой Delay, укоротились… Уже потом, дома, пришлось залезать в Turbo Debugger и рассматривать, как же устроена эта самая Delay. Оказалось, довольно просто и элегантно: процедура отсчитывает нужное количество некоторых циклов, приходящееся на одну миллисекунду столько раз, сколько задается параметром при входе. Само же число этих циклов определяется при запуске программы, о чем заботится, впрочем, сам Turbo Pascal.
|
Производится этот подсчет следующим образом: запускается цикл, выход из которого возможен либо по истечении одного таймерного тика, равного примерно 54925 мс (это число получается делением частоты таймерного кварца 1,19318 МГц на максимальное 16-битное число 65535), либо по прошествии 65535 циклов (в счетчик циклов - регистр CX - записывается FFFFh). Подразумевается, что таймерный тик закончится раньше: число отработанных периодов делится нацело на 55 - вот оно и число необходимых циклов на одну миллисекунду. Но современный процессор работает быстрее, и, не дождавшись окончания тика, программа покидает цикл и делит 65535 на 55. Миллисекунда получается более быстрая, да еще на каждом процессоре своя. А ведь хочется, чтобы ход времени на оптических установках не зависел от очередных достижений компании Intel.
Дабы удовлетворить это желание, пришлось перечитывать взад и вперед главу "Таймеры и звук" упомянутой книжки Джордайна-Журдена. По рекомендации автора я использовал канал 2 таймера в третьем режиме. Посылаю в счетчик некоторое число. Разрешаю подачу на вход счетчика импульсов частотой 1,19318 МГц и жду, когда счетчик обнулится. Для разрешения/запрета подачи импульсов кварца на счетчик используется port 61h, точнее, его нулевой бит. Пишем 1 - импульсы проходят, пишем 0 - импульсы блокируются. А если еще использовать первый бит, то можно подавать напряжение с выхода счетчика (перепад напряжения) на динамик компьютера, что очень удобно: разрешил выход на динамик - каждая задержка будет сопровождаться щелчком. Послал 01 в два младших бита порта 61h - нет звука, послал 11 - есть звук. Все очень удобно, и заказчик доволен… Пока я не установил Windows 95. Удобная штучка. Запускаешь свою программу, получаешь нужную картинку на экране, и никаких проблем с ее сохранением. Не надо разбираться с форматами графических файлов, вставлять в программу писалки и читалки. Просто нажимаешь Shift+PrintScreen, а потом достаешь картинку из буфера и сохраняешь в стандартном формате. Лепота!
Но… Оказалось, что если заблокировать выход на динамик, то все происходит, как при работе в DOS. А вот если выход на динамик разрешить, то есть изменить только один бит в порте 61h, то в программе начинаются сбои: динамик начинает хрюкать, цвет в окошке сеанса DOS моргает, графический экран дергается… А если сначала из Windows запустить Norton, то работает программа ну прямо как в DOS.
На этом "чайник" начинает потихоньку закипать и испытывать мистический ужас перед четырехцветным стягом. А может, взять опять четверть зарплаты да прикупить каких-нибудь умных книг из серии "Для носорогов". Так ведь Windows 98 уже на подходе, а в программе еще очень много маленьких битов, а в компьютере еще много портов, в которые может сунуть свой носик "чайник"…