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