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

UptoLike

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

95
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,'3' ; = '3' ?
jnz beg4 ; Нет
mov byte ptr iniflag,1 ; Сброс флага звуч.
lea ax,mel3
mov tek_mel,ax
jmp beg1 ; Переход на начало цикла
beg4: 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 ; Сохранение всех регистров
call muz ; Вызов процедура извлечения звука
popa ; Восстановление всех регистров
iret ; Возврат из программы обработки прерывания
new_int1c endp
; Процедура извлечения очередного звука
; tek_mel – адрес текущей ноты выбранной мелодии
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 bl,cs:[si] ; Текущая нота
cmp bl,255 ; Пауза ?
jnz muz2
; Выключение звука
                                   95



      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,'3' ; = '3' ?
      jnz beg4 ; Нет
      mov byte ptr iniflag,1 ; Сброс флага звуч.
      lea ax,mel3
      mov tek_mel,ax
      jmp beg1           ; Переход на начало цикла
beg4: 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        ; Сохранение всех регистров
            call muz ; Вызов процедура извлечения звука
            popa         ; Восстановление всех регистров
            iret         ; Возврат из программы обработки прерывания
new_int1c endp
; Процедура извлечения очередного звука
; tek_mel – адрес текущей ноты выбранной мелодии
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 bl,cs:[si]     ; Текущая нота
      cmp bl,255         ; Пауза ?
      jnz muz2
; Выключение звука