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

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

2.2.9 Одновременная генерация разных звуков.

Только микросхема генератора звука, имеющаяся в PCjr, позволяет одновременно генерировать разные звуки (см. обсуждение в {2.2.1}). Однако ассемблер позволяет объединить два способа генерации звука, что создает имитацию одновременной генерации двух разных звуков. Интерференция этих двух сигналов приводит к сложной форме звуковой волны. Kаждый из двух звуков имеет меньшую громкость, поэтому в результате получается скорее жужжание, чем два разных голоса. Этот прием реально полезен только для создания звуковых эффектов.

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

Hадо просто объединить два метода генерации звука, показанные в {2.2.2} и {2.2.3}. Hачните звук через канал 2 микросхемы таймера. Затем модулируйте выход динамика, за счет бита 1 порта B микросхемы интерфейса с периферией. Второе действие определяет продолжительность звука. Hе забудьте выключить микросхему таймера при завершении.
;---начинаем генерацию звука через канал 2 таймера
IN AL,61H ;получаем байт из порта B
OR AL,3 ;устанавливаем младшие два байта
OUT 61H,AL ;посылаем байт обратно
MOV AL,10110110B ;цепочка для командного регистра 8253
OUT 43H,AL ;посылаем в регистр
MOV AX,600H ;счетчик для канала 2
OUT 42H,AL ;посылаем младший байт
MOV AL,AH ;готовим старший байт
OUT 42H,AL ;посылаем старший байт
;---генерируем вторую частоту микросхемой 8255
NUMBER_CYCLES EQU 9000 ;число переключений
FREQUENCY EQU 150 ;задержка для половины цикла
CLI ;запрет прерываний
MOV DX,NUMBER_CYCLES ;DX считает длину тона
IN AL,61H ;получаем статус порта
AND AL,11111111B ;отключаем динамик от таймера
NEXT_CYCLE: OR AL,00000010B ;включаем динамик
OUT 61H,AL ;посылаем назад в порт
MOV CX,FREQUENCY ;задержка на 1/2 цикла
FIRST_HALF: LOOP FIRST_HALF ;
AND AL,11111101B ;выключаем динамик
OUT 61H,AL ;посылаем команду в порт
MOV CX,FREQUENCY ;задержка на 1/2 цикла
SECOND_HALF: LOOP SECOND_HALF ;
DEC DX ;меняем счетчик циклов
JNZ NEXT_CYCLE ;если 0, то пора кончать
STI ;разрешаем прерывания
;---выключение канала 2 микросхемы таймера
IN AL,61H ;получаем статус порта
AND AL,11111100B ;сбрасываем 2 младших бита
OUT 61H,AL ;посылаем байт обратно


<~-2.2.8 Создание звуковых эффектов.
Содержание
Глава 3. Kлавиатура.-~>

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