Справочник программиста на персональном компьютере фирмы IBM. Таймеры и звук - Гудок динамика

ОГЛАВЛЕНИЕ

     2.2.4 Гудок динамика.


   Некоторым  программам требуется набор предостерегающих гудков.
Их легко создавать на Бейсике, но операционная система не обеспе-
чивает  функцию гудка, как таковую, и только  косвенно  позволяет
получать доступ к гудку,  который  Вы слышите при старте системы.
Для  изменения  тона вся процедура генерации  звука  должна  быть
запрограммирована на низком  уровне.   Для того чтобы гудок соот-
ветствовал  подаваемому им сигналу необходимо проявить  воображе-
ние. Для предсказания близкой  опасности  создайте набор понижаю-
щихся  тонов [2.2.7] или, если принтер включен,  чередуйте  гудки
динамика компьютера и принтера (вывод кода ASCII 7 на принтер).

   Высокий уровень.


   В Бейсике просто  напишите  BEEP.   Вот  кусочек кода, который
реагирует на вероятную ошибку гудком и запросом:

100 INPUT "Enter your age",AGE             'запрос возраста
110 IF AGE > 100 THEN BEEP:PRINT"Are you really over 100?"

   Для  гудков  другой  частоты и  продолжительности  используйте
оператор SOUND.  Его  форма:  SOUND  частота,  длительность , где
частота  дается в герцах (3000 - середина диапазона), а  длитель-
ность дается в восемнадцатых  долях  секунды.  SOUND 3000,18 дает
гудок длительностью около одной секунды. В нижеприведенном приме-
ре динамик быстро переходит от высокого тона к низкому и обратно,
распугивая все живое в ближайшей окрестности.

100 FOR N = 1 TO 200   'установка числа повторений
110 SOUND 500,1        'звук низкой частоты на 1 секунду
120 SOUND 5000,1       'звук высокой частоты на 1 секунду
130 NEXT               'повтор

   Средний уровень.


   Операционная система не предоставляет  специальной функции для
генерации звука. Но Вы можете вызвать знакомый гудок просто пода-
вая код ASCII 7 на стандартное устройство вывода (т.е. терминал),
используя  одну из функций DOS или BIOS.  Код ASCII 7 интерпрети-
руется как управляющий символ "звонок"  и он не рисуется на экра-
не. Проще всего использовать функцию 2 прерывания 21H:

   MOV  AH,2     ;функция вывода символа на экран
   MOV  DL,7     ;посылаем код ASCII 7
   INT  21H      ;динамик гудит

   Низкий уровень.


   Для  простого гудка лучше всего подходит метод, основанный  на
использовании микросхемы  интерфейса  с  периферией 8255 [1.1.1].
Ниже приведен пример, который практически повторяет гудок,  кото-
рый Вы слышите при старте системы.

;---гудок динамика
            MOV  DX,800          ;счетчик числа циклов
            IN   AL,61H          ;читаем порт B 8255
            AND  AL,0FEH         ;выключаем бит таймера 8253
NEXTCYCLE:  OR   AL,2            ;включаем бит динамика
            OUT  61H,AL          ;посылаем байт в порт B
            MOV  CX,150          ;длительность первой половины
CYCLEUP:    LOOP CYCLEUP         ;задержка пока сигнал высокий
            AND  AL,0FDH         ;выключаем бит динамика
            OUT  61H,AL          ;посылаем байт в порт B
CYCLEDOWN:  LOOP CYCLEDOWN       ;задержка пока сигнал низкий
            DEC  DX              ;уменьшаем счетчик циклов
            JNZ  NEXTCYCLE       ;повторяем цикл пока DX не 0