Вот код : (работает но с небольшим косяком: прри запуске проги пищит со второго раза а потом все становится нормально)
Код:
.model tiny
locals
.386
.code
.startup
;ввод частоты и длительности звука
beep MACRO fr,ms
pusha
;расчёт коэффициента деления: c = 1193180 Гц / f
mov ax,34DCh ;dx:ax = 1193180
mov dx,12h
div fr
;запись коэффициента деления в 3-й канал таймера
mov dx,ax
mov al,0B6h
out 43h,al
mov al,dl
out 42h,al
mov al,dh
out 42h,al
;включить динамик
in al,61h
or al,3
out 61h,al
;задержка
xor ax,ax
mov es,ax
mov ax,es:[46Ch]
add ax,ms
delay:
mov dx,es:[46Ch]
cmp dx,ax
ja exit_delay
jmp delay
exit_delay:
;выключить динамик
in al,61h
and al,2
out 61h,al
popa
endm
;приглашение ко вводу
start:
lea dx,msg1
call read_int
jc exit
mov freq,ax
lea dx,msg2
call read_int
jc exit
mov len,ax
beep freq,len
jmp start
exit:
mov ax,4C00h
int 21h
;--- Ввод целого числа ---
read_int proc
n= word ptr [bp-2]
push bp
mov bp,sp
sub sp,2
mov n,0
mov ah,9 ;вывод промпта
int 21h
@@read_char:
mov ah,8 ;ввод символа
int 21h
cmp al,27 ;ESC -> выход с CF = 1
je @@cancel
cmp al,13 ;CR -> завершение ввода
je @@done
cmp al,'0' ;является ли введённый символ цифрой?
jb @@read_char
cmp al,'9'
ja @@read_char
push ax ;эхопечать
mov dx,ax
mov ah,2
int 21h
pop bx
sub bl,'0' ;добавление цифры в результат
xor bh,bh
mov ax,10
mul n
add ax,bx
mov n,ax
jmp @@read_char
;выход с CF = 1
@@cancel:
stc
jmp @@exit
@@done:
;переход на новую строку
mov dl,13
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h
;выход с результатом в AX и CF = 0
mov ax,n
clc
@@exit:
mov sp,bp
pop bp
ret
read_int endp
.data?
freq dw ?
len dw ?
.const
msg1 db 'Chastota [Gtc]> $'
msg2 db 'Dlitelnost [1/18 c]> $'
end