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


     2.2.3 Генерация звука одновременно с другими действиями.


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

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


   Оператор SOUND в Бейсике не позволяет генерировать звук однов-
ременно  с другими действиями, но оператор PLAY - позволяет  если
ему это задать. За оператором PLAY должна следовать строка, кото-
рая сообщает какие ноты долны быть сыграны, какой длительности, а
также другие характеристики.  Детали командной строки PLAY обсуж-
даются в [2.2.5]. Если строка содержит буквы MB (фоновая музыка),
то строка помещается в  специальный  буфер и выполняется одновре-
менно с другими программными действиями.  Напротив, MF (музыка на
переднем плане)  останавливает  все  программные  операции до тех
пор,  пока вся строка не будет исполнена.  Вот как исполнить одну
ноту A (ля) в фоновом режиме:

100 PLAY "MB A"    'исполняется нота ля...
110 ......         'и следующие операторы программы

   Отметим, что в фоновом режиме, оператор 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     ;посылаем байт обратно

 
« Предыдущая статья   Следующая статья »