Глава 2. Таймеры и звук.

Раздел 2. Создание звука.

2.2.2 Генерация тона.

Этот подраздел объясняет как производить звук, когда компьютер не занят ничем другим; в {2.2.3} показано как это сделать, когда производятся другие действия. Забавно, но для программистов на ассемблере последнее проще. Для этого достаточно запрограммировать микросхему таймера 8253, которая работает независимо от процессора. В приведенном здесь методе процессор непосредственно управляет динамиком, поэтому программе приходится выполнять работу, которую может выполнять микросхема таймера. Хотя этот способ более труден, но он допускает существенно больший контроль над динамиком и создание большинства специальных звуковых эффектов {2.2.8} основывается на нем.

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

Генерация звука с помощью адаптера интерфейса с периферией 8255 состоит во включении и выключении с желаемой частотой бита порта B, который связан с динамиком (бит 1). Порт B имеет адрес 61H (хотя AT не имеет микросхемы интерфейса с периферией 8255 как таковой, он использует для этой цели тот же адрес порта и тот же бит). Если программа переключает значение бита с максимально возможной частотой, то частота слишком высокая, чтобы быть полезной. Поэтому между двумя переключениями надо вставлять пустой цикл. Помните, что бит 0 порта B управляет воротами канала 2 микросхемы таймера, который в свою очередь связан с динамиком. Поэтому этот бит должен быть сброшен, отсоединяясь от канала таймера. Hа рис. 2-4 показано как этот метод устанавливает частоту звука.

В следующем примере введены две переменные. Одна, обозначенная "FREQUENCY", используется в качестве счетчика в пустом цикле между действиями включения и выключения. Чем меньше ее значение, тем быстрее происходит изменение бита и тем больше частота. Переменная же "NUMBER_CYCLES" устанавливает продолжительность тона. Она говорит сколько раз должен быть повторен процесс включения и выключения. Чем больше это число, тем дольше звучит данный звук.

Отметим, что для этой процедуры аппаратные прерывания должны быть запрещены. Причина этого в том, что прерывание таймера происходит с такой частотой и регулярностью (18.2 раза в секунду), что оно будет существенно влиять на частоту. Имейте ввиду, что пока прерывания запрещены, счетчик времени суток BIOS не будет работать. Если затем прочитать его значение, то оно будет отличаться на некоторую величину от реального, до тех пор, пока не будет сделано соответствующее изменение.
NUMBER_CYCLES EQU 1000
FREQUENCY EQU 300
PORT_B EQU 61H
CLI ;запрет прерываний
MOV DX,NUMBER_CYCLES ;длительность тона в DX
IN AL,PORT_B ;получаем значение из порта B
AND AL,11111110B ;отключаем динамик от таймера
NEXT_CYCLE: OR AL,00000010B ;включаем динамик
OUT PORT_B,AL ;посылаем команду в порт B
MOV CX,FREQUENCY ;задержка на пол-цикла в CX
FIRST_HALF: LOOP FIRST_HALF ;делаем задержку
AND AL,11111101B ;выключаем динамик
OUT PORT_B,AL ;посылаем команду в порт B
MOV CX,FREQUENCY ;задержка на пол-цикла в CX
SECOND_HALF: LOOP SECOND_HALF ;делаем задержку
DEC DX ;вычитаем единицу из счетчика
JNZ NEXT_CYCLE ;если 0, то надо кончать
STI ;разрешаем прерывания


<~-2.2.1. Генерация звука на PCjr (вырезано)
Содержание
2.2.3 Генерация звука одновременно с другими действиями.-~>

Сайт управляется системой uCoz