Код исходной программы(начало) — КиберПедия 

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Код исходной программы(начало)

2020-03-31 124
Код исходной программы(начало) 0.00 из 5.00 0 оценок
Заказать работу

 

В этом примере задействован обычный 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


Поделиться с друзьями:

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.012 с.