Аппаратное обеспечение IBM PC



         

Таймер и музыка - часть 4


// Загружаем количество циклов - периодов // генерируемых импульсов

mov dx, CYCLES

// Отключаем громкоговоритель от таймера

in al, 61h and al, 0feh

// Цикл формирования периода

sound_cycle:

// Формируем первый полупериод, подаем // на громкоговоритель уровень 1

or al, 2 out 61h, al

// Формируем задержку

mov cx, FREQUENCY

first: loop first

// Формируем второй полупериод, подаем // на громкоговоритель уровень 0

and al, 0fdh out 61h, al

// Формируем задержку

mov cx, FREQUENCY

second: loop second

// Если сформированы не все периоды, переходим // к формированию следующего периода.

dec dx jnz sound_cycle

}

// Разрешаем прерывания.

_enable();

// Выключаем громкоговоритель.

outp(0x61, inp(0x61) & 0xfc);

}

Так как в этой программе для формирования полупериодов используется задержка с помощью команды LOOP, высота генерируемого тона будет зависеть от производительности системы. Такой зависимости можно избежать, если перед началом работы измерять производительность и соответствующим образом корректировать константу, загружаемую в регистр CX перед вызовом команды LOOP.

Измерение производительности лучше всего выполнять с помощью таймера, определяя время выполнения команды LOOP.




Содержание  Назад  Вперед