Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Функция 00H. Назначение: чтение скэн-кода, ASCII-кода и расширенного ASCII-кода клавиши. Функция 01H может использоваться при обработке данных во время ожидания нажатия клавиши, как показано в следующем примере:




Функция 00H

Назначение: чтение скэн-кода, ASCII кода и расширенного ASCII кода клавиши. Скэн-код – это просто порядковый номер клавиши на клавиатуре. Скэн-код идентифицирует клавишу. У клавиши может быть несколько ASCII кодов (например ‘4’, ‘$’ и ‘; ’ – ASCII коды одной и той же клавиши), но только один скэн-код. ASCII коды определяются из скэн-кодов с учетом нажатий таких клавиш, как Shift, CapsLock, Alt и Ctrl, которые влияют на ASCII код клавиши. После вызова функции 00H в регистр AL заносится ASCII код клавиши, а в регистр AH – скэн-код. Если регистр AL содержит 0, то в регистре AH содержится расширенный код клавиши. Если при вызове функции 00H нет символов для чтения с клавиатуры, функция 00H ждет нажатия клавиши.

Пример использования функции 00H:

MOV AH, 00H

INT 16H

Функция 01H

Назначение: чтение скэн-кода, ASCII-кода и расширенного ASCII-кода клавиши. Функция 01H отличается от функции 00H, тем, что если нет очередного символа для чтения с клавиатуры, функция 01H не ожидает ввода символа, а возвращает управление программе и устанавливает флаг ZF. Если символ для чтения с клавиатуры имеется, флаг ZF сбрасывается.

Функция 01H может использоваться при обработке данных во время ожидания нажатия клавиши, как показано в следующем примере:

M1: MOV AH, 01H

INT 16H

JNZ gotKey               ; переход, если есть символ

CALL DoSomething          ; выполнение обработки

; во время ожидания

JMP M1                              ; дальнейшее ожидание

gotKey:

. . .                            ; символ получен

 

Функция 02H

Назначение: получение состояние клавиш Shift, CapsLock и других. Функция возвращает в регистре AL байт, биты которого характеризуют состояние клавиш (табл. 22). Если какой-либо бит регистра AL установлен, то клавиша нажата (или горит лампочка, например, для клавиши CapsLock), если нет, то отпущена.

 

Таблица 22

Флаги состояния клавиатуры

Номер бита Клавиша
Правый Shift
Левый Shift
Ctrl+Shift
Alt+Shift
ScrollLock
NumLock
CapsLock
Insert

 

Пример использования функции 02H:

MOV AH, 02H

INT 16H

 

Функция 03H

Назначение: установка задержки перед первым нажатием символа и частоты повторения символов для клавиатуры. В регистр BH заносится значение задержки (табл. 23), в регистр BL – частота повторения (табл. 24), а в регистр AL – значение 5. Действие функции 03H аналогично команде DOS «MODE CON RATE= DELAY= ».

 

Таблица 23

Коды задержки

Код задержки Задержка (миллисекунды)
00H
01H
02H
03H

 

Таблица 24

Частоты повторения символов

Код частоты повторения Частота повторения (симв. /сек. )
00H
01H 26. 7
02H
03H 21. 8
. . . . . .
1FH

 

Пример использования функции 03H:

MOV AH, 03H

MOV AL, 05H

MOV BH, 01H                   ; задержка 500 мс

MOV BL, 02H                   ; 24 символа в секунду

INT 16H

 

Функция 05H

Назначение: запись в буфер клавиатуры символа, как если бы он был введен с клавиатуры. В регистр CL записывается ASCII код символа, в регистр CH – скэн-код или расширенный ASCII код, если регистр CL содержит 0. После вызова функции регистр AL содержит 0, если символ успешно записан в буфер клавиатуры или 1, если в буфере клавиатуры нет места для записи очередного символа.

Функцию 05H можно использовать для имитации работы оператора или для различных программ, имитирующих нажатие клавиш на клавиатуре.

Пример использования функции 05H

MOV AH, 05H

MOV CL, ‘A’  ; запись в буфер клавиатуры символа ‘A’

MOV CH, 0

INT 16H

 

В этом примере вместо скэн-кода в регистр CH записывается 0. Большинство программ все же воспримут символ ‘A’ как введенный с клавиатуры.

 

Коды ошибок BIOS

В табл. 25 приведены значения кодов ошибок BIOS для дисковых операций ввода-вывода.

 

Таблица 25

Коды ошибок BIOS

Код ошибки Значение
00H Успешное выполнение операции
01H Неверный запрос к контроллеру
02H Неверный маркер адреса
03H Попытка записи на защищенную от записи дискету
04H Идентификатор сектора поврежден или не найден
08H Ошибка контроллера прямого доступа к памяти (КПДП)
09H Ошибка КПДП: попытка записи за пределами 64 Кб
0BH Обнаружена сбойная дорожка
10H Неверный циклический избыточный код данных
11H Ошибка в данных исправлена
20H Ошибка контроллера дисковода
40H Запрошенная дорожка не найдена
80H Исчерпано ограничение по времени
BBH Неизвестная ошибка
FFH Сбой операции опроса

 

 

Чтобы избежать обработки ключей командной строки, программу можно выполнить в виде двух частей. Первая часть должна содержать код резидентной части, процедуру загрузки программы в память и процедуру проверки на повторную загрузку. Вторая часть программы должна содержать процедуру, передающую резидентной части программы команду на выгрузку из памяти только в том случае, если резидентная часть уже загружена в память. При этом сама процедура выгрузки программы из памяти должна располагаться в ее резидентной части.

Выгрузка программы из памяти должна включать в себя освобождение блока памяти, отведенного под переменные среды и блока памяти, отведенного под саму резидентную часть. После выгрузки программы из памяти должны быть восстановлены все используемые вектора прерываний, включая вектор мультиплексного прерывания 2Fh.

Установка векторов прерываний должна выполняться вручную (т. е. без использования функций DOS 25h и 35h).

Программа должна быть выполнена в виде EXE-модуля с пятью программными сегментами: сегмент команд резидентной части, сегмент команд нерезидентной части, общий сегмент данных, сегмент стека резидентной части, сегмент стека нерезидентной части. При входе в основной обработчик прерывания (не 2Fh) должно выполняться переключение на стек резидентной части и обратное переключение стеков в конце обработчика.

Вторая часть программы, посылающая команду на выгрузку резидентной части из памяти, может быть оформлена как в виде COM-, так и в виде EXE-модуля.

Написание и отладку резидентной программы можно производить в несколько этапов:

1. Написание базовой резидентной части, которая не выполняет никаких действий кроме вызова старого (системного) обработчика прерывания.

2. Написание базовой нерезидентной части, которая не выполняет никаких действий кроме загрузки резидентной части (отсутствуют процедура проверки на повторную загрузку, процедура передачи команд резидентной части и другие).

3. Отладка базовых резидентной и нерезидентной частей.

4. Написание законченной нерезидентной части.

5. Отладка законченной нерезидентной и базовой резидентной частей.

6. Написание законченной резидентной части.

7. Заключительная отладка всей программы.

При обращении резидентной части к данным, находящимся в другом сегменте, следует инициализировать сегментный регистр, при помощи которого резидентная часть будет обращаться к другому сегменту.

Резидентная часть обязательно должна вызывать старый обработчик прерывания, если он есть. Обычно все системные устройства, такие как клавиатура, таймер и другие, имеют свои системные обработчики. При этом все регистры (кроме CS и IP) должны иметь то же значение, что и при входе в обработчик прерывания резидентной части. Стек также должен иметь исходное состояние.

Из процедур обработки аппаратных прерываний нельзя вызывать прерывания DOS и не рекомендуется вызывать другие прерывания. Это связано с тем, что во время возникновения аппаратного прерывания может выполняться какая-либо функция DOS, а вложенные вызовы функций DOS запрещены.

При обработке аппаратных прерываний следует обращать внимание на необходимость посылки сигнала EOI в конце процедуры обработки прерывания, если не вызывается старый обработчик. Если старый обработчик вызывается, то он выполняет всю необходимую работу с аппаратурой.

Следует обращать внимание на правильность вычисления размера резидентной части перед вызовом функции DOS 31H. Неверное вычисление размера резидентной части может привести к тому, что часть кода резидентной части не останется в памяти и это может привести к некорректной работе программы.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...