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

UptoLike

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

93
jnz beg1 ; Нет
; Восстановление старого вектора 1с и выход
mov dx,old_int1c_off ; Смещение старого вектора
mov ax,old_int1c_seg ; Сегмент старого вектора
mov ds,ax ; DS:DX – адрес устанавл. вектора
mov ax,251ch ; Установка старого вектора 1ch
int 21h ; Вызов функции DOS
int 20h ; Выход из программы
start endp ; Конец основной процедуры
; Новый обработчик прерывания 1ch
new_int1c proc far ; Дальняя процедура
pusha ; Сохранение всех регистров (для Intel286)
call muz ; Вызов процедура извлечения звука
popa ; Восстановление всех регистров
iret ;
Возврат из программы обработки прерывания
new_int1c endp ; Конец нового обработчика прерывания 1сh
muz proc near ; Процедура генерации звука
test byte ptr cs:iniflag,0ffh ; Проверка флага
jnz muz1 ; Продолжение
in al,61h ; Чтение системного порта В
and al,0fch ; Запрещение звучания (биты 0 и 1)
out 61h,al ; Запись в системный порт В
ret ; Выход, если флаг не взведен
muz1: ; Программирование делителя частоты 2 канала
mov ax,frequency ; Делитель частоты
out 42h,al ; Мл.байт частоты
канал 2 таймера
xchg al,ah ; AH
AL
out 42h,al ; Ст.байт частоты
канал 2 таймера
; Разрешение звучания
in al,61h ; Чтение системного порта В
or al,3 ; Разрешение звучания (биты 0 и 1)
out 61h,al ; Запись в системный порт В
ret ; Нормальный выход
muz endp ; Конец процедуры генерации звука
kbin proc near ; Ввод с клавиатуры и проверка на выбор игры
; Процедура совпадает с одноименной в задаче 2.4.2.1.
kbin endp
code ends ; Конец сегмента (кодового)
END Start ; Указание на точку входа
Задача 3.4.2.4. Написать программу, исполняющую три различные
мелодии при нажатии на клавиши '1', '2'и '3'. Для генерации звука следует
использовать выход канала 2 таймера. Выход из программы должен
осуществляться по нажатию клавиши 'q'. Использовать прерывание от
таймера.
                                   93



      jnz beg1           ; Нет
; Восстановление старого вектора 1с и выход
      mov dx,old_int1c_off ; Смещение старого вектора
      mov ax,old_int1c_seg ; Сегмент старого вектора
      mov ds,ax                 ; DS:DX – адрес устанавл. вектора
      mov ax,251ch              ; Установка старого вектора 1ch
      int  21h                  ; Вызов функции DOS
      int  20h                  ; Выход из программы
start endp       ; Конец основной процедуры
; Новый обработчик прерывания 1ch
new_int1c proc far       ; Дальняя процедура
           pusha         ; Сохранение всех регистров (для Intel286)
           call muz ; Вызов процедура извлечения звука
           popa          ; Восстановление всех регистров
           iret          ; Возврат из программы обработки прерывания
new_int1c endp           ; Конец нового обработчика прерывания 1сh
muz proc near ; Процедура генерации звука
      test byte ptr cs:iniflag,0ffh ; Проверка флага
      jnz muz1           ; Продолжение
      in   al,61h        ; Чтение системного порта В
      and al,0fch        ; Запрещение звучания (биты 0 и 1)
      out 61h,al         ; Запись в системный порт В
      ret                ; Выход, если флаг не взведен
muz1:                    ; Программирование делителя частоты 2 канала
      mov ax,frequency          ; Делитель частоты
      out 42h,al                ; Мл.байт частоты ⇒ канал 2 таймера
      xchg al,ah                ; AH ⇔ AL
      out 42h,al                ; Ст.байт частоты ⇒ канал 2 таймера
; Разрешение звучания
      in   al,61h        ; Чтение системного порта В
      or   al,3          ; Разрешение звучания (биты 0 и 1)
      out 61h,al         ; Запись в системный порт В
      ret                ; Нормальный выход
muz endp                 ; Конец процедуры генерации звука
kbin proc near           ; Ввод с клавиатуры и проверка на выбор игры
; Процедура совпадает с одноименной в задаче 2.4.2.1.
kbin endp
code ends                ; Конец сегмента (кодового)
      END Start          ; Указание на точку входа

     Задача 3.4.2.4. Написать программу, исполняющую три различные
мелодии при нажатии на клавиши '1', '2'и '3'. Для генерации звука следует
использовать выход канала 2 таймера. Выход из программы должен
осуществляться по нажатию клавиши 'q'. Использовать прерывание от
таймера.