Показать сообщение отдельно

  #558  
Старый 23.05.2008, 20:09
ASERVIC
Новичок
Регистрация: 22.05.2008
Сообщений: 4
Провел на форуме:
5579

Репутация: 5
По умолчанию

Вот код : (работает но с небольшим косяком: прри запуске проги пищит со второго раза а потом все становится нормально)
Код:
.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

Последний раз редактировалось De-visible; 24.05.2008 в 01:23.. Причина: Не забываем теги [code]!!!!!!!!
 
Ответить с цитированием