Компьютер - электронное устройство, которое не заменит человека до тех пор, пока не научится смеяться шуткам начальника и сваливать свои собственные ошибки на соседний компьютер.




      Отметим, что в фоновом режиме, оператор X = PLAY(0) возвращает число нот (до 32), которое осталось сыграть. В многоканальном режиме на PCjr возвращается число нот в буфере данного канала (0-2), номер которого указан в скобках.

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

      Просто пошлите счетчик в канал 2, как объяснено в [2.1.1]. Микросхема должна быть предварительно разрешена через порт B микросхемы интерфейса с периферией 8255 (адрес 61H). Вычислите требуемое значение счетчика для задвижки, разделив 1.19 миллионов на требуемую частоту в герцах. Звук будет продолжаться до тех пор, пока не будут закрыты ворота канала 2. Поэтому Вы должны сбросить бит 1 порта B в 0, иначе звук будет продолжаться беско- нечно и может быть прекращен только перезагрузкой компьютера. Для точного регулирования длительности звука можно использовать счет- чик времени суток BIOS, как указано в [2.1.6]. В данном примере генерируется частота 440 герц. Звук прекращается после нажатия любой клавиши на клавиатуре.
;---рарешение канала 2 установкой порта B микросхемы 8255 PORT_B EQU 61H ;установка адреса порта B
      IN AL,PORT_B ;чтение его значения
      OR AL,3 ;установка двух младших битов
      OUT PORT_B,AL ;посылаем байт в порт B

;---установка регистров ввода/вывода COMMAND_REG EQU 43H ;адрес командного регистра CHANNEL_2 EQU 42H ;адрес канала 2
      MOV AL,10110110B ;цепочка битов для канала 2
      OUT COMMAND_REG,AL ;засылка в командный регистр ;---засылка счетчика в задвижку
      MOV AX,2705 ;счетчик = 1190000/440
      OUT CHANNEL_2,AL ;посылаем младший байт
      MOV AL,AH ;сдвигаем младший байт в AL
      OUT CHANNEL_2,AL ;посылаем старший байт ;---ждем нажатия клавиши
      MOV AH,1 ;номер функции прерывания 21H
      INT 21H ;вызываем прерывание ;---выключение звука
      IN AL,PORT_B ;получаем байт из порта B
      AND AL,11111100B ;сбрасываем два младших бита
      OUT PORT_B,AL ;посылаем байт обратно


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


2.2.5 Генерация набора тонов.



      В этом подразделе показано как генерировать цепочку звуков, когда компьютер ничем другим не занят; в следующем будет показано как выполнить ту же задачу, когда компьютер занят другой работой. Когда компьютер ничем другим не занят, то можно выводить мелодию или производить специальные звуковые эффекты; когда же компьютер занят другой работой, то нельзя производить звуковые эффекты.
      Создание звуковых строк является одной из мощнейших возможнос- тей, предоставляемых Бейсиком. Построение же строк звуков в ас- семблере требует большой работы. Может быть использован любой из двух методов генерации звука, предложен