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

UptoLike

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

92
ton2 endp ; Конец процедуры генерации звука 2
kbin proc near ; Ввод с клавиатуры и проверка на выбор игры
; Процедура совпадает с одноименной в задаче 2.4.2.1.
kbin endp
code ends ; Конец сегмента (кодового)
END Start ; Указание на точку входа
Задача 3.4.2.3. Написать программу, издающую различные звуки при
нажатии на клавиши '1' и '2'. Для генерации звука следует выход канала 2
таймера. Выход из программы должен осуществляться по нажатию
клавиши 'q'. Использовать прерывание от таймера.
Assume CS: Code, DS: Code
Code SEGMENT
org 100h
.286
Start proc near ; Основная процедура
mov ax,cs
mov ds,ax ; DS = CS
jmp beg ; "Перескок" через переменные
frequency equ 0500h ; Коэффициент деления
iniflag db 0 ; Флаг звучания
old_int1c_off dw 0 ; Смещение старого вектора
old_int1c_seg dw 0 ; Сегмент старого вектора
beg: ; Сохранение старого вектора прерывания 1Сh
mov ax,35h ; Функция взятия вектора
mov al,1ch ; Вектор 1Сh
int 21h ; Вызов функции DOS
mov cs:old_int1c_off,bx ; Запись смещения
mov cs:old_int1c_seg,es ; Запись сегмента
; Установка в вектор прерывания адреса новой
; программы обработки прерывания
lea dx,new_int1c ; Запись нового вектора
1c
mov ah,25h ; Функция установки вектора прерыв.
mov al,1ch ; Номер вектора прерывания
int 21h ; DS:DX – адрес новой программы обр.
beg1: call kbin ; Опрос клавиатуры
cmp al,'1' ; = '1' ?
jnz beg2 ; Нет
mov byte ptr iniflag,1 ; Взведение флага звуч.
jmp beg1 ; Переход на начало цикла
beg2: cmp al,'2' ; = '2' ?
jnz beg3 ; Нет
mov byte ptr iniflag,0 ; Сброс флага звуч.
jmp beg1 ; Переход на начало цикла
beg3: cmp al,'q' ; = 'q' ?
                                      92



ton2 endp       ; Конец процедуры генерации звука 2
kbin proc near ; Ввод с клавиатуры и проверка на выбор игры
; Процедура совпадает с одноименной в задаче 2.4.2.1.
kbin endp
code ends       ; Конец сегмента (кодового)
      END Start ; Указание на точку входа

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

Assume CS: Code, DS: Code
Code SEGMENT
        org 100h
        .286
Start proc near ; Основная процедура
        mov ax,cs
        mov ds,ax ; DS = CS
        jmp beg ; "Перескок" через переменные
frequency equ 0500h                ; Коэффициент деления
iniflag      db    0               ; Флаг звучания
old_int1c_off dw 0                 ; Смещение старого вектора
old_int1c_seg dw 0                 ; Сегмент старого вектора
beg:         ; Сохранение старого вектора прерывания 1Сh
        mov ax,35h         ; Функция взятия вектора
        mov al,1ch         ; Вектор 1Сh
        int  21h           ; Вызов функции DOS
        mov cs:old_int1c_off,bx          ; Запись смещения
        mov cs:old_int1c_seg,es          ; Запись сегмента
; Установка в вектор прерывания адреса новой
; программы обработки прерывания
        lea dx,new_int1c           ; Запись нового вектора 1c
        mov ah,25h                 ; Функция установки вектора прерыв.
        mov al,1ch                 ; Номер вектора прерывания
        int  21h           ; DS:DX – адрес новой программы обр.
beg1: call kbin            ; Опрос клавиатуры
        cmp al,'1'         ; = '1' ?
        jnz beg2           ; Нет
        mov byte ptr iniflag,1 ; Взведение флага звуч.
        jmp beg1           ; Переход на начало цикла
beg2: cmp al,'2'           ; = '2' ?
        jnz beg3           ; Нет
        mov byte ptr iniflag,0 ; Сброс флага звуч.
        jmp beg1           ; Переход на начало цикла
beg3: cmp al,'q'           ; = 'q' ?