Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CdDt GROUP Code, Data, InCode
- ASSUME CS: CdDt, DS: CdDt
- CODE SEGMENT PUBLIC
- ORG 2Ch
- BlOkr DW ?
- ORG 100h
- Main:
- JMP InitP ; Переход на инициализацию
- Begin:
- PUSHF ; Сохранение содержимого
- PUSH AX ; регистров в стеке
- IN AL, 60h ; считываем код клавиши
- MOV AH, AL ; и пересылаем в AH
- CMP AL, 1 ; проверка на <ESC>
- JE ExitDrv ; выход из драйвера
- AND AH, 7Fh ; сброс старшего бита
- CMP AH, 58h ; проверка на нажатие/отпускание <F12>
- JNE OldEx ; передача управления старому обработчику
- ; если не равно
- PUSH AX ; Помещаем AX в стек
- CALL KeyInt ; аппаратная обработка
- POP AX ; Извлекаем AX из стека (AL <- код клавиши)
- AND AL, AL ; Установка флагов
- JS F12_Up ; переход, если флаг знака SF = 1 (кнопка отпущена)
- ; иначе, клавиша нажата
- MOV AX, 725 ; загрузка коэффициента
- OUT 42h, AL ; выводим мл. байт
- MOV AL, AH
- OUT 42h, AL ; выводим старший байт
- IN AL, 61h
- OR AL, 03h
- OUT 61h, AL ; разрешаем звучание
- JMP Exit ; К выходу
- F12_Up:
- IN AL, 61h
- AND AL, 0FCh
- OUT 61h, AL ; запрет звучания
- Exit:
- POP AX ; Восстановление содержимого
- POPF ; регистров из стека
- IRET ; Возврат из прерывания
- OldEx:
- POP AX ; Восстановление содержимого
- POPF ; регистров из стека
- JMP DWORD PTR CS:OldV9 ; передача управления старому обработчику
- ExitDrv:
- CALL KeyInt ; аппаратная обработка
- PUSH DX
- PUSH DS
- PUSH ES
- MOV AX, 2509h ; восстанавливаем адрес
- MOV DX, CS:OldV9
- MOV DS, CS:OldV9+2
- INT 21h ; значения вектора 09
- MOV AH, 49h ; Освобождение области памяти,
- MOV AX, CS ; занимаемой
- MOV ES, AX
- INT 21h ; драйвером
- POP ES ; Восстановление содержимого
- POP DS ; регистров из стека
- POP DX
- POP AX
- POPF
- IRET ; Возврат из прерывания
- KeyInt:
- IN AL, 61h ; взять значениe порта управления клавиатурой
- MOV AH, AL ; сохранить его
- OR AL, 80h ; установить бит разрешения для клавиатуры
- OUT 61h, AL ; и вывести его в управляющий порт
- XCHG AH, AL ; извлечь исходное значение порта
- OUT 61h, AL ; и записать его обратно
- MOV AL, 20h ; послать сигнал "конец прерывания"
- OUT 20h, AL ; контроллеру прерываний
- RET
- CODE ENDS
- DATA SEGMENT
- ; Данные программы
- Txt DB 13
- DB 218, 8 DUP(196), 191, 13, 10
- DB 179, '00/00/00', 179, 13, 10
- DB 192, 8 DUP(196), 217, 13, 10, 0
- OldV9 DW 0, 0
- DATA ENDS
- ; Инициализационная часть программы
- InCode SEGMENT
- InitP:
- MOV AX, 3509h
- INT 21h ; чтение вектора 09
- MOV OldV9, BX ; сохраняем значение вектора
- MOV OldV9+2, ES ; в ОЗУ
- MOV AX, 2509h
- LEA DX, Begin ; установка нового
- INT 21h ; значения вектора 09
- MOV AH, 49h ; Освобождение области памяти,
- MOV ES, BlOkr ; занимаемой
- INT 21h ; блоком окружения
- LEA DX, InitP ; Возврат в DOS, оставшись
- INT 27h ; резидентным
- InCode ENDS
- END Main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement