Assembler - язык неограниченных возможностей


Команды DSP - часть 3


Чтобы вывести оцифрованные данные с нужной частотой в DSP, придется перепрограммировать канал 0 системного таймера на требуемую частоту и установить собственный обработчик прерывания 08h. При этом будет нарушена работа системных часов, хотя можно не выключать совсем старый обработчик, а передавать ему управление примерно 18,2 раза в секунду, то есть, в частности, при каждом 604-м вызове нашего обработчика на частоте 11 025 Hz. Покажем, как это сделать на примере простой программы, которая именно таким способом воспроизведет файл c:\windows\media\tada.wav (или c:\windows\tada.wav, если вы измените соответствующую директиву EQU в начале программы).

; wavdir.asm ; воспроизводит файл c:\windows\media\tada.wav, не используя DMA, ; нормально работает только под DOS в реальном режиме ; (то есть не в окне DOS (Windows) и не под EMM386, QEMM или другими ; подобными программами)

FILESPEC equ "c:\windows\media\tada.wav" ; имя файла tada.wav с ; полным путем (замените на c:\windows\tada.wav для ; старых версий Windows) SBPORT equ 220h ; базовый порт звуковой платы (замените, если у вас он ; отличается) .model tiny .code .186 ; для pusha/popa org 100h ; СОМ-программа start: call dsp_reset ; сброс и инициализация DSP jc no_blaster mov bl,0D1h ; команда DSP D1h call dsp_write ; включить звук call open_file ; открыть и прочитать tada.wav call hook_int8 ; перехватить прерывание таймера mov bx,5 ; делитель таймера для частоты 22 050 Hz ; (на самом деле соответствует 23 867 Hz) call reprogram_pit ; перепрограммировать таймер

main_loop: ; основной цикл cmp byte ptr finished_flag,0 je main_loop ; выполняется, пока finished_flag ; равен нулю mov bx,0FFFFh ; делитель таймера для частоты 18,2 Hz call reprogram_pit ; перепрограммировать таймер call restore_int8 ; восстановить IRQ0 no_blaster: ret

buffer_addr dw offset buffer ; адрес текущего играемого байта old_int08h dd ? ; старый обработчик INT 08h (IRQ0) finished_flag db 0 ; флаг завершения filename db FILESPEC,0 ; имя файла tada.wav с полным путем




Начало  Назад  Вперед