Глава 2. Таймеры и звук.
Раздел 2. Создание звука.
2.2.3 Генерация звука одновременно с другими действиями.
Для программистов на Бейсике различие между этим и предыдущим разделом совершенно несущественно. Hо программисты на ассемблере должны использовать совершенно другой метод. Поскольку микросхема таймера 8253 работает независимо от процессора, то очень просто генерировать звук, который издается одновременно с выполнением других операций. Вы должны просто запрограммировать канал 2 этой микросхемы для генерации определенной частоты, а затем перепрограммировать микросхему для выключения звука.
Hизкий уровень.
Просто пошлите счетчик в канал 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.2 Генерация тона.
Содержание
2.2.4 Гудок динамика.-~>