; Процедура beep
; издает звук с частотой 261 Hz (нота "ми" средней октавы)
; длительностью 1/2 секунды на динамике
beep proc near
mov al,10110110b ; канал 2, режим 3
out 43h,al
mov al,0Dh ; младший байт делителя
; частоты 11D0h
out 42h,al
mov al,11h ; старший байт делителя частоты
out 42h,al
in al,61h ; текущее состояние
; порта 61h в AL
or al,00000011b ; установить биты 0 и 1 в 1
out 61h,al ; теперь динамик включен
mov cx,0007h ; старшее слово числа микросекунд паузы
mov dx,0A120h ; младшее слово числа микросекунд паузы
mov ah,86h ; функция 86h
int 15h ; пауза
in al,61h
and al,11111100b ; обнулить младшие два бита
out 61h,al ; теперь динамик выключен
ret
beep endp
and al, 11111110b ;oтключaeм динaмик oт тaймepa
next_cycle:
or al, 00000010b ;включaeм динaмик
. . .
and al, 11111101b ;выключaeм динaмиктипа правильно
mov cx, dlinaдлина =3
inc cxдлина =4
inc si
inc si
loop playдлина=3
цитата из статьи про системный таймер и музыку:"Программа может генерировать звуки и другим способом, не используя таймер. Для этого нужно сбросить младший бит порта 61h и, управляя битом 1 этого порта, формировать импульсы для громкоговорителя. Т.е. программа должна устанавливать этот бит то в 0, то в 1 с некоторым периодом. Высота генерируемого звука будет соответствовать этому периоду. "
вооооот...
странно, что этого вы не знали...ну да ладно
model tiny
.code
.186
org 100h
;
begin:
;программа записывающая бут-сектор
;запускаем привод дисковода
xor ax,ax
int 13h
xor ax,ax
int 13h
xor ax,ax
int 13h
;записываем один сектор
mov ax,0301h;запишем 1 сектор
mov bx,offset bootBegin;смещение на бут-сектор;
mov cx,1;
xor dx,dx;
int 13h
ret;выход в дос
;сам бут-сектор
;- - - - -
;
bootBegin:;
mov al,10110110b ; канал 2, режим 3
out 43h,al
mov al,0Dh ; младший байт делителя
; частоты 11D0h
out 42h,al
mov al,11h ; старший байт делителя частоты
out 42h,al
mov cx,9000h
isJump:
in al,61h ; текущее состояние
; порта 61h в AL
and al,11111100b
or al,00000010b ; установить биты 0 и 1 в 1
out 61h,al ; теперь динамик включен
push cx
isDelay:
mov cx,9000h
loop isDelay
; mov cx,0007h ; старшее слово числа микросекунд паузы
; mov dx,0A120h ; младшее слово числа микросекунд паузы
; mov ah,86h ; функция 86h
; int 15h ; пауза
in al,61h
and al,11111100b ; обнулить младшие два бита
out 61h,al ; теперь динамик выключен
isDelay0:
mov cx,9000h
loop isDelay0
pop cx
loop isJump
xor ax,ax
int 16h
ret
db 446 dup(?)
db 7fh,1,0,41h,0bbh,0,7,60h,66h,6ah,0,0e9h,3bh,0ffh,0,0,55h,0aah
end begin
Звуки можно воспроизводить двумя способами:
- с использованием таймера (канал 2 режим 3);
- без использования таймера (игра с первым битом 61 порта).
model tiny
.code
.186
org 100h
;
begin:
;программа записывающая бут-сектор
;запускаем привод дисковода
xor ax,ax
int 13h
xor ax,ax
int 13h
xor ax,ax
int 13h
;записываем один сектор
mov ax,0301h;запишем 1 сектор
mov bx,offset bootBegin;смещение на бут-сектор;
mov cx,1;
xor dx,dx;
int 13h
ret;выход в дос
;сам бут-сектор
;- - - - -
;
bootBegin:;
xor si,si
mov ss,si
mov sp,7C00h
mov ds,si
mov si,7B00h
;
in al, 61h ;пoлучaeм знaчeниe из пopтa b
and al, 11111100b ;oтключaeм динaмик oт тaймepa
;
cli ;зaпpeт пpepывaний
mov cx,3
play: push cx
mov cx, duration[si] ;длитeльнocть тoнa в dx
next_cycle:
push cx
mov cx, music[si] ;зaдepжкa нa пoл-циклa в cx
call beep
call beep
pop cx
loop next_Cycle
pop cx
inc si
inc si
loop play
sti;paзpeшaeм пpepывaния
xor ax,ax
int 16h
int 19h
beep: xor al,00000010b
out 61h,al
push ax
push cx
xor dx,dx
mov ah,86h
int 15h
pop cx
pop ax
ret
;частоты из учета 1193180/частоту ноты
music dw 63, 25, 35 ;ре = 293,7 ля-диез = 466,2 ре-диез = 311,1
;длительность воспроизведения
duration dw 27, 36, 18 ;ре = 1,5 ля-диез = 2 ре-диез = 1 = > 18.2*время в секундах
db 416 dup(?)
db 7fh,1,0,41h,0bbh,0,7,60h,66h,6ah,0,0e9h,3bh,0ffh,0,0,55h,0aah
;начиная с метки bootBegin всегда должно быть 512 байт
end begin
"мы строили строили..и наконец построили"
Нужно учесть, что Вы задаете полупериод, т.е. задержка будет в два раза больше.
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.