Звук через спикер - Assembler

Узнай цену своей работы

Формулировка задачи:

Подскажите пожалуйста, как сделать, чтобы нажимая на 3 разные клавиши, были разные звуки.
dosseg
.model tiny
.stack 100h
.data
durtion dw 10, 120, 311
tone dw 8000h, 430h, 647h
.code
 
in al, 61h 
and  al, 11111100b
cli
 
mov cx, 3
 
a:
push cx
mov cx, durtion[si]
mov dx, tone[si]
 
b:
push cx
call beep
 
pop cx
loop b
 
pop cx
inc si
inc si
 
loop a
sti
 
xor ax,ax
int 16h
ret
 
beep:
xor al, 00000010b
out 61h, al
push ax
push dx
xor cx, cx
 
mov ah, 86h
int 15h
pop dx
pop ax
ret
 
mov ah,4ch
int 21h
End

Решение задачи: «Звук через спикер»

textual
Листинг программы
.model tiny
.code
.startup
 
repeat:
mov ah,0
int 16h
 
dec ah
jz exit     ; esc
dec ah
cmp ah,3
jae repeat
 
call Sound
 
mov ax,8600h    ; если al <> 0, в DOSBox могут быть глюки
cwd
mov cx,1
int 15h
 
call NoSound
jmp repeat
 
exit:
int 20h
 
; Процедура Sound: генерация звука
; Вход: AX = частота звука (Гц)
Sound   proc    near
        xchg    bx,ax        ; Частота
        mov     dx,12h       ; (DX,AX)=1193181
        cmp     bx,dx        ; Если Bx <= 18Гц, то выход
        jbe     Done         ; Чтобы избежать переполнения
        in      al,61h       ; Порт РВ
        or      al,3         ; Установить биты 0-1
        out     61h,al
        mov     al,10110110b ; Управляющее слово таймера: канал 2, режим 3, двоичное слово
        out     43h,al       ; Вывод в регистр режима
        mov     ax,34DDh
        div     bx           ; AX=(DX:AX)/BX
        out     42h,al       ; Младший байт счетчика
        mov     al,ah
        out     42h,al       ; Старший байт счетчика
Done:   ret
Sound   endp
 
; Процедура NoSound: выключение звука
NoSound proc    near
        in      al,61h    ; Порт РВ
        and     al,not 3  ; Сброс битов 0-1
        out     61h,al
        ret
NoSound endp
 
end

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы