-
Notifications
You must be signed in to change notification settings - Fork 0
/
Sound.asm
66 lines (61 loc) · 3.43 KB
/
Sound.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
;----------------------------------------------------------------------------
; Функции генерации звука через PC Speaker
;
; Прототипы:
; void __fastcall Sound(int Frequency);
; void __fastcall NoSound(void);
;
; Для подключения к модулю C++ функции нужно объявить как 'extern "C"'
;----------------------------------------------------------------------------
;
; Для компиляции используйте следующую команду:
; tasm32 /z /ml Sound.asm
; Полученный OBJ файл можно подсоединять к программе.
;
; Примечание: можно также просто добавить этот файл к проекту, если
; Ваш компилятор разрешает это сделать.
;
;----------------------------------------------------------------------------
.386 ; Требуется для 32 битных сегментов
MODEL FLAT ; Модель памяти 32 битных программ
PUBLIC @Sound@4, @NoSound@0 ; Внешние символы (экпортируемые)
.CODE ; Начало сегмента кода
@Sound@4 PROC
;
; Включает PC Speaker на вывод выбранной частоты
; На входе ECX содержит частоту (используется только младшее слово)
;
; Вычисляем делитель частоты таймера, чтобы звук был с
; заданной частотой
mov ax, 34DDh ; DX:AX - маскимальный делитель частоты
mov dx, 0012h
cmp dx, cx ; Проверяем, чтобы не было ошибки при делении
jnb @@S20 ; Выход (при делении возникнет ошибка)
div cx ; AX := DX:AX div CX
mov cx, ax ; AX - нужный делитель
in al, 61h ; Получяем состояние порта динамика
test al, 03h ; Проверяем, включен ли динамик
jnz @@S10 ; Если да, то переходим к @@S10
or al , 03h ; Включяем динамик
out 61h, al ; Выводим новое значение в порт
@@S10:
mov al , 0B6h ; Выбираем перепрограммируемый генератор частоты
; и устанавливаем его параметры
out 43h, al ; Помещаем значение в управляющий порт
mov al , cl ; Теперь заносим в порт данных делитель частоты
out 42h, al
mov al , ch
out 42h, al
@@S20:
ret
ENDP ; Конец @Sound
@NoSound@0 PROC
;
; Выключает PC Speaker
;
in al,61h ; Получяем состояние порта
and al,0FCh ; Сбрасываем биты динамика
out 61h,al ; Помещаем новое значение в порт
ret
ENDP ; Конец @NoSound
END ; Конец файла