Звук через спикер - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д