Страница 13 из 19
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 ;посылаем байт обратно
|