Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
Топ:
Комплексной системы оценки состояния охраны труда на производственном объекте (КСОТ-П): Цели и задачи Комплексной системы оценки состояния охраны труда и определению факторов рисков по охране труда...
Интересное:
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Национальное богатство страны и его составляющие: для оценки элементов национального богатства используются...
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Дисциплины:
|
из
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
|
|
|
Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...
Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...
Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...
Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...
© cyberpediasu.com 2017-2026 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!