Системное программное обеспечение. Рощин А.В. - 91 стр.

UptoLike

Составители: 

91
beg1: call kbin ; Опрос клавиатуры
cmp al,'1' ; = '1' ?
jnz beg2 ; Нет
call ton1 ; Звук высоты 1
jmp beg1 ; Переход на начало цикла
beg2: cmp al,'2' ; = '2' ?
jnz beg3 ; Нет
call ton2 ; Звук высоты 2
jmp beg1 ; Переход на начало цикла
beg3: cmp al,'q' ; = 'q' ?
jnz beg1 ; Нет
int 20h ; Выход из программы
start endp ; Конец основной процедуры
ton2 proc near ; Процедура генерации звука 2
mov dx,duration ; Длительность
mov di,frequency2 ; Коэффициент деления 2
jmp ton0 ; Переход на универсальную процедуру
ton1 proc near ; Процедура генерации звука 1
mov dx,duration ; Длительность
mov di,frequency1 ; Коэффициент деления 2
; Универсальная процедура генерации
звука
; DX – длительность, DI – коэффиц. деления
ton0 proc near
cli ; Запрещение прерываний
; Включение динамика и таймера
in al,61h ; Чтение состояния системного порта В
or al,3 ; Разрешение звучания (биты 0 и 1)
out 61h,al ; Запись в системный порт В
; Программирование делителя частоты 2 канала
mov ax,di ; Делитель частоты
out 42h,al ; Мл.байт частоты
канал 2 таймера
xchg al,ah ; AH
AL
out 42h,al ; Ст.байт частоты
канал 2 таймера
; Формирование задержки
mov cx,dx ; Счетчик цикла задержки
ton01: push cx ; Команды, используемые только для
pop cx ; увеличения длит. цикла задержки
loop ton01 ; Задержка
; Выключение звука
in al,61h ; Чтение состояния системного порта В
and al,0fch ; Запрещение звучания (биты 0 и 1)
out 61h,al ; Запись в системный порт В
sti ; Разрешение прерываний
ret ; Выход из процедуры
ton0 endp ; Конец универсальной процедуры
ton1 endp ; Конец процедуры генерации звука
1
                                   91



beg1: call kbin ;       Опрос клавиатуры
      cmp al,'1'        ; = '1' ?
      jnz beg2          ; Нет
      call ton1         ; Звук высоты 1
      jmp beg1          ; Переход на начало цикла
beg2: cmp al,'2'        ; = '2' ?
      jnz beg3          ; Нет
      call ton2         ; Звук высоты 2
      jmp beg1          ; Переход на начало цикла
beg3: cmp al,'q'        ; = 'q' ?
      jnz beg1          ; Нет
      int   20h         ; Выход из программы
start endp        ; Конец основной процедуры
ton2 proc near ; Процедура генерации звука 2
      mov dx,duration ; Длительность
      mov di,frequency2 ; Коэффициент деления 2
      jmp ton0          ; Переход на универсальную процедуру
ton1 proc near          ; Процедура генерации звука 1
      mov dx,duration ; Длительность
      mov di,frequency1 ; Коэффициент деления 2
; Универсальная процедура генерации звука
; DX – длительность, DI – коэффиц. деления
ton0 proc near
      cli         ; Запрещение прерываний
; Включение динамика и таймера
      in    al,61h      ; Чтение состояния системного порта В
      or    al,3        ; Разрешение звучания (биты 0 и 1)
      out 61h,al        ; Запись в системный порт В
; Программирование делителя частоты 2 канала
      mov ax,di         ; Делитель частоты
      out 42h,al        ; Мл.байт частоты ⇒ канал 2 таймера
      xchg al,ah        ; AH ⇔ AL
      out 42h,al        ; Ст.байт частоты ⇒ канал 2 таймера
; Формирование задержки
      mov cx,dx         ; Счетчик цикла задержки
ton01: push cx    ; Команды, используемые только для
      pop cx      ; увеличения длит. цикла задержки
      loop ton01 ; Задержка
; Выключение звука
      in    al,61h ; Чтение состояния системного порта В
      and al,0fch ; Запрещение звучания (биты 0 и 1)
      out 61h,al ; Запись в системный порт В
      sti         ; Разрешение прерываний
      ret         ; Выход из процедуры
ton0 endp         ; Конец универсальной процедуры
ton1 endp         ; Конец процедуры генерации звука 1