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


Контроллер DMA - часть 5


; процедура 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 ; идентификатор файла в ВХ mov ax,4200h ; АН = 42h, AL = 0 mov cx,0 ; CX:DX - новое значение указателя mov dx,38h ; по этому адресу начинаются данные ; в tada.wav int 21h ; переместить файловый указатель mov ah,3Fh ; АН = 3Fh mov cx,27459 ; это - длина данных в файле tada.wav push ds mov dx,ds and dx,0F000h ; выровнять буфер на границу ; 4-килобайтной страницы add dx,1000h ; для DMA mov ds,dx mov dx,0 ; DS:DX - адрес буфера int 21h ; чтение файла pop ds ret error_exit: ; если не удалось открыть файл, mov ah,9 ; АН = 09h mov dx,offset notopenmsg ; DS:DX = адрес сообщения об ошибке int 21h ; вывод строки на экран int 20h ; конец программы




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