Архивы: по дате | по разделам | по авторам

Маленький бит, динамик и Windows 95

Архив
автор : Алексей Бондарев   29.06.1998

Я не программист и даже не юзер, я скорее "чайник", использующий компьютер для управления оптической установкой. В мою машину вставлена интерфейсная плата, содержащая несколько параллельных портов ввода/вывода, через которые можно подавать на установку разные сигналы и проверять правильно ли она на эти сигналы реагирует.

Установка и интерфейсная плата самодельные, то есть изготовлены моими коллегами (чуть было не сказал "по науке"), а мне остается читать из портов и писать в них так, чтобы установка подавала признаки жизни. Для этого мне приходится периодически пролистывать несколько книжек по Turbo Pascal да иметь под рукой томик Джордейна (который до выхода на русском языке в печатном виде значился на дискетах как Журден), купленный мною когда-то, в самом начале экономических преобразований, за четверть месячной зарплаты. Почему я использую Pascal? Он более похож на человеческий язык, чем Си, и обеспечивает доступ к компьютерному железу.

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

Для формирования временных задержек я часто применял паскалевскую процедуру Delay(x), задающую задержку в миллисекундах.

Я пользовался 286-м, 386-м затем 486-м компьютером, - чем мощнее был процессор, тем легче было рассовывать между обращениями к плате пользовательские примочки. Хотя именно набор примочек и определял в конечном счете потребительские свойства программы и самой установки. Наконец на моем столе появился Pentium… Вернее, сначала Pentium появился на столе у заказчика (иногда покупают даже оптические установки), и в самый ответственный момент в присутствии высоких должностных лиц программа не смогла общаться с установкой… В результате лихорадочного копания в программе выяснилось: она стала работать быстрее, в том смысле, что временные интервалы, задаваемые процедурой Delay, укоротились… Уже потом, дома, пришлось залезать в Turbo Debugger и рассматривать, как же устроена эта самая Delay. Оказалось, довольно просто и элегантно: процедура отсчитывает нужное количество некоторых циклов, приходящееся на одну миллисекунду столько раз, сколько задается параметром при входе. Само же число этих циклов определяется при запуске программы, о чем заботится, впрочем, сам Turbo Pascal.

 

PC имеет трехканальный таймер. На вход каждого канала подаются импульсы частотой 1,19318 МГц. Нулевой канал используется для системного таймера. Входная частота делится на 65535 (FFFFh), и получаются импульсы частотой примерно 18,2 Гц - тики таймера, они-то и вызывают прерывание Int8 (Irq0) и формируют приращение счетчика времени суток по адресу 0040:006C. Первый канал используется для управления памятью. Выход второго канала может подсоединяться к динамику компьютера.


Производится этот подсчет следующим образом: запускается цикл, выход из которого возможен либо по истечении одного таймерного тика, равного примерно 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 уже на подходе, а в программе еще очень много маленьких битов, а в компьютере еще много портов, в которые может сунуть свой носик "чайник"…

© ООО "Компьютерра-Онлайн", 1997-2021
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.