Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...
Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
Топ:
Эволюция кровеносной системы позвоночных животных: Биологическая эволюция – необратимый процесс исторического развития живой природы...
Проблема типологии научных революций: Глобальные научные революции и типы научной рациональности...
Особенности труда и отдыха в условиях низких температур: К работам при низких температурах на открытом воздухе и в не отапливаемых помещениях допускаются лица не моложе 18 лет, прошедшие...
Интересное:
Национальное богатство страны и его составляющие: для оценки элементов национального богатства используются...
Аура как энергетическое поле: многослойную ауру человека можно представить себе подобным...
Как мы говорим и как мы слушаем: общение можно сравнить с огромным зонтиком, под которым скрыто все...
Дисциплины:
2020-03-31 | 125 |
5.00
из
|
Заказать работу |
|
|
В этом примере задействован обычный DMA-режим работы, в котором звуковая плата проигрывает участок данных, вызывает прерывание и, пока обработчик прерывания подготавливает новый буфер данных, программирует DMA и звуковую плату для продолжения воспроизведения, проходит некоторое время, что может звучать как щелчок. Этого можно избежать, если воспользоваться режимом автоинициалиэации, позволяющим обойтись без остановок во время воспроизведения.
FILESPEC equ 'C:\WINDOWS\MEDIA\TADA.WAV'
SBPORT equ 220h
SBIRQ equ 5 ; только IRQ0-IRQ7
.model tiny
.code
.186
org 100h; COM-программа
start:
call dsp_reset; инициализация DSP
jc no_blaster
mov bl,0D1h ; команда 0D1h
call dsp_write; включить звук
call open_file; прочитать файл в буфер
call hook_sbirq; перехватить прерывание
mov bl,40h ; команда 40h
call dsp_write; установка скорости передачи
mov bl,0B2h ; константа для 11025Hz/Stereo
call dsp_write
call program_dma; начнём DMA-передачу данных
main_loop: ; основной цикл
cmp byte ptr finished_flag,0
je main_loop; выход когда байт finished_flag = 1
call restore_sbirq; восстановить прерывание
no_blaster:
ret
old_sbirq dd?; адрес старого обработчика
finished_flag db 0; флаг окончания работы
filename db FILESPEC,0; имя файла
; обработчик прерывания звуковой карты
; устанавливает флаг finished_flag в 1
sbirq_handler proc far
push ax
mov byte ptr cs:finished_flag,1; установить флаг
mov al,20h ; послать команду EOI
Код исходной программы(продолжение)
out 20h,al ; в контроллер прерываний
pop ax
iret
sbirq_handler endp
; процедура dsp_reset
; сброс и инициализация DSP
dsp _ reset proc near
mov dx,SBPORT+6; порт 226h - регистр сброса DSP
mov al,1; запись в него единицы запускает инициализацию
out dx,al
mov cx,40; небольшая пауза
dsploop:
in al,dx
loop dsploop
mov al,0 ; запись нуля завершает инициализацию
out dx,al; теперь DSP готов к работе
|
add dx,8 ; порт 22Eh - бит 7 при чтении указывает на
занятость
mov cx,100; буфера записи DSP
check_port:
in al,dx; прочитаем состояние буфера записи
and al,80h; если бит 7 ноль
jz port_not_ready; порт ещё не готов
sub dx,4 ; иначе: порт 22Ah - чтение данных из DSP
in al,dx
add dx,4 ; порт снова 22Eh
cmp al,0AAh; проверим, что DSP возвращает 0AAh при
; чтении - это сигнал его готовности к
; работе
je good_reset
port_not_ready:
loop check_port ; повторить проверку на 0AAh 100 раз
bad_reset:
stc ; если Sound Blaster не откликается
ret ; вернуться с CF=1
good_reset:
clc ; если инициализация прошла успешно
ret ; вернуться с CF=0
dsp_reset endp
; процедура dsp_write
; посылает байт из BL в DSP
dsp _ write proc near
mov dx,SBPORT+0Ch; порт 22Ch - ввод данных/команд DSP
write_loop: ; подождём готовности буфера записи DSP
in al,dx; прочитаем порт 22Ch
Код исходной программы(продолжение)
and al,80h; и проверим бит 7
jnz write_loop ; если он не ноль - подождём ещё
mov al,bl; иначе:
out dx,al; пошлём данные
ret
dsp_write endp
; процедура hook_sbirq
; перехватывает прерывание звуковой карты и разрешает его
hook_sbirq proc near
mov ax,3508h+SBIRQ; AH=35h, AL=номер прерывания
int 21h; получим адрес старого обработчика
mov word ptr old_sbirq,bx; и сохраним его
mov word ptr old_sbirq+2,es
mov ax,2508h+SBIRQ; AH=25h, AL=номер прерывания
mov dx,offset sbirq_handler; установим новый обработчик
int 21h
mov cl,1
shl cl,SBIRQ
not cl ; построим битовую маску
in al,21h ; прочитаем OCW1
and al,cl ; разрешим прерывание
out 21h,al ; запишем OCW1
ret
hook_sbirq endp
; процедура restore_sbirq
; восстановим обработчик и запретим прерывание
restore_sbirq proc near
mov ax,3508h+SBIRQ; AH=25h AL=номер прерывания
lds dx,dword ptr old_sbirq
int 21h; восстановим обработчик
mov cl,1
shl cl,SBIRQ; построим битовую маску
in al,21h ; прочитаем OCW1
or al,cl ; запретим прерывание
out 21h,al ; запишем OCW1
ret
restore_sbirq endp
; процедура open_file
; открывает файл filename и копирует звуковые данные из него,;считая что это - tada.wav, в буфер buffer
open_file proc near
mov ax,3D00h; AH=3Dh AL=00
mov dx,offset filename; DS:DX - ASCIZ-строка с именем файла
int 21h; открыть файл для чтения
jc error_exit; если не удалось открыть файл - выйти
|
mov bx,ax ; идентификатор файла в BX
|
|
Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...
Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...
Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...
Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!