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

UptoLike

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

98
int 21h ; DS:DX – адрес новой программы обр.
beg1: call kbin ; Опрос клавиатуры
mov byte ptr duration,1
cmp al,'1' ; = '1' ?
jnz beg2 ; Нет
mov byte ptr iniflag,1 ; Взведение флага звуч.
lea ax,mel1
mov tek_mel,ax
jmp beg1 ; Переход на начало цикла
beg2: cmp al,'2' ; = '2' ?
jnz beg3 ; Нет
mov byte ptr iniflag,1 ; Сброс флага звуч.
lea ax,mel2
mov tek_mel,ax
jmp beg1 ; Переход на начало цикла
beg3: cmp al,'q' ; = 'q' ?
jnz beg1 ; Нет
; Восстановление старого вектора 1с и выход
mov dx,old_int1c_off ; Смещение старого вектора
mov ax,old_int1c_seg ; Сегмент старого вектора
mov ds,ax ; DS:DX – адрес устанавл. вектора
mov ax,251ch ; Установка старого вектора 1ch
int 21h
int 20h
start endp
; Новый обработчик
прерывания 1ch
new_int1c proc far
pusha
dec byte ptr cs:duration
jnz ex
call muz ; Вызов процедуры извлечения звука
ex: popa
iret
new_int1c endp
muz proc near
test byte ptr cs:iniflag,0ffh ; Проверка флага
jnz muz1 ; Продолжение
muze: in al,61h ; Чтение состояния системного порта В
and al,0fch ; Запрещение звучания (биты 0 и 1)
out 61h,al ; Запись в системный порт В
ret ; Выход, если флаг не взведен
muz1: mov si,cs:tek_mel ; Адрес текущей ноты
mov bx,word ptr cs:[si] ; BL -текущая нота, BH – длительность
mov cs:duration,bh ; Длит. в системную переменную
cmp bl,255 ; Пауза ?
jnz muz2
; Выключение звука
                                   98



      int  21h           ; DS:DX – адрес новой программы обр.
beg1: call kbin          ; Опрос клавиатуры
      mov byte ptr duration,1
      cmp al,'1'         ; = '1' ?
      jnz beg2           ; Нет
      mov byte ptr iniflag,1 ; Взведение флага звуч.
      lea ax,mel1
      mov tek_mel,ax
      jmp beg1                   ; Переход на начало цикла
beg2: cmp al,'2'         ; = '2' ?
      jnz beg3           ; Нет
      mov byte ptr iniflag,1 ; Сброс флага звуч.
      lea ax,mel2
      mov tek_mel,ax
      jmp beg1           ; Переход на начало цикла
beg3: cmp al,'q'         ; = 'q' ?
      jnz beg1           ; Нет
; Восстановление старого вектора 1с и выход
      mov dx,old_int1c_off ; Смещение старого вектора
      mov ax,old_int1c_seg ; Сегмент старого вектора
      mov ds,ax                  ; DS:DX – адрес устанавл. вектора
      mov ax,251ch               ; Установка старого вектора 1ch
      int  21h
      int  20h
start endp
; Новый обработчик прерывания 1ch
new_int1c proc far
           pusha
           dec byte ptr cs:duration
           jnz    ex
           call muz ; Вызов процедуры извлечения звука
ex:        popa
           iret
new_int1c endp
muz proc near
      test byte ptr cs:iniflag,0ffh ; Проверка флага
      jnz muz1                         ; Продолжение
muze: in   al,61h        ; Чтение состояния системного порта В
      and al,0fch        ; Запрещение звучания (биты 0 и 1)
      out 61h,al         ; Запись в системный порт В
      ret                ; Выход, если флаг не взведен
muz1: mov si,cs:tek_mel          ; Адрес текущей ноты
      mov bx,word ptr cs:[si] ; BL -текущая нота, BH – длительность
      mov cs:duration,bh         ; Длит. в системную переменную
      cmp bl,255         ; Пауза ?
      jnz muz2
; Выключение звука