Dos7book
.pdfПриложение А.01: Основные системные структуры данных
Продолжение таблицы А.01-1
3Eh |
7 |
Статус флоппи-дисководов, подробнее в A.08-1 |
49h |
22 |
Данные видеорежима, подробнее в A.10-6 |
67h |
4 |
Адрес рестарта (примечание 4 к A.12-1) |
6Ch |
4 |
Счет времени в тактах, начиная с полуночи |
70h |
1 |
Счет суток, сбрасываемый от INT 1A\AH=00h |
71h |
1 |
Бит 7 установлен после нажатия Ctrl-Break |
72h |
2 |
Предписываемые действия POST (примечание 1) |
74h |
1 |
Код завершения последней операции (A.06-1) |
75h |
1 |
Число дисководов на жестких магнитных дисках |
77h |
1 |
Адрес порта для жестких магнитных дисков |
78h |
1 |
Счетчик времени ожидания для порта LPT 1 |
7Ch |
1 |
Счетчик времени ожидания для порта COM 1 |
7Dh |
1 |
Счетчик времени ожидания для порта COM 2 |
80h |
4 |
Адреса буфера клавиатуры (A.02-3) |
84h |
8 |
Регистры видеорежима, подробнее в A.10-6 |
8Ch |
3 |
Статус контроллера жестких магнитных дисков |
8Fh |
7 |
Данные флоппи-контроллера, подробнее в A.08-1 |
96h |
2 |
Статус клавиатуры, подробнее в A.02-3 |
98h |
4 |
Указатель на флаг ожидания INT 15\AX=8300h |
9Ch |
4 |
Заданное время ожидания в микросекундах |
A0h |
1 |
Флаги системного таймера: |
|
|
бит 0: произведен вызов INT 15\AH=86h |
|
|
бит 7: время ожидания истекло |
CEh |
2 |
Счет дней с последнего включения компьютера |
F0h |
16 |
Область обмена данными для программ. |
Примечание 1: при перезагрузке путем перехода на адрес F000:FFF0h (примечание 4 к A.12-1) компьютер может выполнять тест POST по-разному в зависимости от слова, заранее записанного по адресу 0040:0072h:
0000h – "холодная" перезагрузка (с проверкой памяти) 1234h – "теплая" перезагрузка (без проверки памяти)
Примечание 2: поскольку размещение сведений в области данных BIOS может зависеть от версии BIOS, постольку Вам предстоит решать, являются ли данные, считанные по определенному адресу, в действительности теми данными, которые Вы ожидаете там найти.
A.01-2 Избранные данные из Списка Списков MS-DOS
Список Списков представляет собой одну из базовых системных структур, создаваемую загрузчиком IO.SYS в момент начала загрузки MS-DOS. Указатель на начало Списка Списков можно получить с помощью INT 21\AH=52h (8.02-59). Рис. 10 (в разделе A.03-3) иллюстрирует процесс доступа к Списку Списков.
– 589 –
Приложение А.01: Основные системные структуры данных
Сведения о назначении отдельных данных в Списке Списков показаны в приведенной ниже таблице.
Смещение |
Длина |
Содержание |
– 02h |
2 |
Сегмент дескриптора (A.12-7) 1-го блока памяти |
00h |
4 |
Указатель на первый блок DPB (примечание 1). |
04h |
4 |
Указатель на SFT (System File Table, A.01-4) |
0Ch |
4 |
Указатель на драйвер устройства CON (Console) |
10h |
2 |
Предельный размер сектора на любом диске |
16h |
4 |
Адрес первой записи в таблице CDS (A.03-3) |
20h |
1 |
Число зарегистрированных дисководов |
21h |
1 |
Число записей в таблице CDS (A.03-3) |
22h |
18 |
Заголовок драйвера NUL (примечание 2) |
34h |
1 |
Число виртуальных дисков программы Join.exe |
37h |
4 |
Указатель на таблицу драйвера SETVER.EXE |
3Dh |
2 |
Сегмент PSP последней исполненной программы |
43h |
1 |
Загрузочный диск (01h = A:, 03h = C:, и т.д.) |
45h |
2 |
Размер расширенной памяти в килобайтах. |
Примечание 1: блоки DPB (Drive Parameter Blocks, A.03-1) организованы в цепочку, так что указатель на каждый следующий блок DPB находится в ячейке со смещением 19h в предыдущем блоке DPB.
Примечание 2: заголовок устройства NUL – первый в цепи заголовков драйверов. Первые 4 байта в заголовке каждого драйвера заняты указателем на заголовок следующего драйвера. Указатель на заголовок второго драйвера также можно получить с помощью INT 2F\AX=122Ch. У последнего драйвера заголовок начинается со слова FFFFh.
A.01-3. Избранные записи в области SDA
Адрес области SDA (Swappable Data Area) и ее размер можно узнать с помощью INT 21\AX=5D06h (8.02-70). В этой области MS-DOS содержит текущие данные, характеризующие ее состояние в каждый конкретный момент, в том числе основные системные стеки. В зависимости от размера стеков область SDA может занимать до нескольких килобайт.
Сохранение и последующее восстановление всей области SDA представляют собой основной механизм обеспечения реентерабельности DOS, то есть возможности вызова функций DOS обработчиками прерываний, вызванными во время исполнения функции DOS. Если в момент вызова обработчик прерывания обнаруживает, что флаг критической ошибки и флаг InDOS (в байтах области SDA со смещениями 00h и 01h) не сброшены в нуль, значит, данный вызов прервал
– 590 –
Приложение А.01: Основные системные структуры данных
исполнение функции DOS, и тогда следующий вызов функции DOS может изменить данные в области SDA так, что возврат к продолжению исполнения прерванной программы станет невозможен. Хотя иногда возврат все же возможен (8.02-28, 8.02-87), тем не менее наиболее универсальный выход состоит в том, чтобы перед вызовом функций DOS записать состояние области SDA, о после окончания их исполнения восстановить состояние области SDA по сохраненной записи. Еще нужно иметь ввиду, что функция INT 21\AX=5D06h (8.02-70) тоже не-реентерабельна, и потому определить адрес области SDA надо заранее, в процессе инициализации обработчика прерывания, а в момент прерывания следует лишь пользоваться заранее подготовленным адресом.
Приводимая ниже таблица показывает размещение избранных данных в области SDA.
Смещение |
Длина |
Содержание |
00h |
1 |
Флаг критической ошибки ("ErrorMode") |
01h |
1 |
Флаг InDOS (INT 21\AH=34h, 8.02-28) |
02h |
1 |
Диск, вызвавший ошибку (FFh - ошибки нет) |
03h |
1 |
Место возникновения ошибки (A.06-4) |
04h |
2 |
Код завершения последней операции (A.06-1) |
06h |
1 |
Способ исправления ошибки (A.06-3) |
07h |
1 |
Класс последней ошибки (A.06-2) |
08h |
4 |
Состояние ES:DI в момент последней ошибки |
0Ch |
4 |
Адрес области DTA (8.02-16) |
10h |
2 |
Сегмент PSP - идентификатор текущего процесса |
14h |
2 |
Уровень ошибки (errorlevel) последнего процесса |
16h |
1 |
Номер текущего логического диска |
17h |
1 |
Флаг BREAK (3.01, 4.02, 8.02-25) |
2Ah |
1 |
Флаг ответа Fail при вызове INT 24 (8.02-84) |
2Bh |
1 |
Разрешенные действия INT 24 (8.02-84) |
30h |
1 |
День месяца |
31h |
1 |
Месяц |
32h |
2 |
Год, отсчитываемый от 1980 года |
34h |
2 |
Число дней с 1 января 1980 года |
36h |
1 |
День недели (0 = воскресенье) |
A.01-4 Структура блоков описания в таблицах SFT
Взаимное соответствие между номерными ссылками и теми "открытыми" объектами, на которые они ссылаются, задается последовательностью системных файловых таблиц SFT (System File Tables). Название SFT не вполне корректно,
– 591 –
Приложение А.01: Основные системные структуры данных
потому что объектами ссылок могут быть не только файлы, но также области памяти, каналы посылки данных и т.п.
Указатель на первую таблицу SFT помещается в ячейку со смещением 04h в "Списке Списков" (A.01-2). Таблицы SFT образуют цепь: первые 4 байта в каждой таблице содержат указатель на начало следующей таблицы SFT, за исключением последней таблицы, которая начинается со слова FFFFh. Слово со смещением 04h в каждой таблице SFT объявляет число блоков описания, содержащихся в данной таблице. Каждый блок описания соответствует одному "открытому" объекту. Общее число блоков описания во всех таблицах SFT ограничено спецификацией команды
FILES (4.12) в конфигурационном файле CONFIG.SYS.
Номера блоков описания, "открытых" для конкретной программы, записываются в таблицу JFT, которая размещена начиная со смещения 18h в префиксе сегмента (PSP, A.07-1) этой программы. Соответствующие "открытые" объекты адресуются посредством номерных ссылок (INT 21\AH=3Dh, 8.02-33), которые идентифицируют блоки описания в таблицах SFT по порядку размещения их номеров в таблице JFT. Номер блока описания в таблице SFT, соответствующий определенной ссылке, можно найти с помощью INT 2F\AX=1220h (8.03-11). Затем по найденному номеру блока описания с помощью INT 2F\AX=1216h (8.03-09) можно получить адрес этого блока описания в таблице SFT. Некоторые сведения о блоках описания в таблицах SFT и соответствующих им объектах можно получить с помощью INT 21\AX=4400h (8.02-40).
Первые три блока описания в таблице SFT по умолчанию связаны с определенными объектами: 00h – с каналом AUX в порт COM1, 01h – с каналами драйвера устройства CON (консоли), 02h – с каналом PRN в порт LPT1. Эти три номера автоматически записываются в таблицу JFT каждой программы, причем порядок их размещения в JFT (01h, 01h, 01h, 00h, 02h) определяет соответствующие им номерные ссылки: 0000h – для канала STDIN, 0001h – для канала STDOUT, 0002h – для канала STDERR, 0003h – для порта COM1, 0004h – для порта LPT1.
Блоки описания в таблицах SFT, которым соответствуют номерные ссылки от 0005h и далее, создаются по запросу обработчиками прерываний INT 21\AH=3Dh (8.02-33) и INT 21\AX=6C00h (8.02-78).
Первый блок описания в каждой таблице SFT начинается со смещения 06h. Начальные смещения всех следующих блоков описания несложно рассчитать, так как каждый из них имеет постоянную длину 3Bh. Приведенная ниже таблица
показывает размещение данных в любом отдельном блоке описания с отсчетом смещений от его начала, причем первая колонка "CDE" (= character device entries) показывает размещение данных в блоках описания не-файловых объектов, а вторая колонка "OFE" (= ordinary file's entries) показывает размещение данных в блоках описания обычных файлов.
– 592 –
Приложение А.01: Основные системные структуры данных
CDE |
OFE |
Длина |
Содержание |
00h |
00h |
2 |
Число ссылок на объект (FFFFh - нет ссылок) |
02h |
02h |
1 |
Условия доступа (A.09-4) |
|
03h |
1 |
Флаги (примечание 1) |
|
04h |
1 |
Атрибуты файла (A.09-2) |
05h |
05h |
2 |
Информационное слово объекта (A.04-2 для |
|
|
|
файлов, A.05-2 для не-файлов) |
07h |
07h |
4 |
Адрес блока DPB (A.03-1) для файлов или адрес |
|
|
|
заголовка драйвера (A.05-1) для не-файлов |
|
0Bh |
2 |
Номер 1-го кластера (для локальных файлов) |
|
0Dh |
2 |
Время последнего изменения (8.02-63) |
|
0Fh |
2 |
Дата последнего изменения (8.02-63) |
|
11h |
4 |
Размер файла |
|
15h |
4 |
Положение указателя в файле (8.02-38) |
|
19h |
2 |
Относительный номер кластера, к которому |
|
|
|
производилось предыдущее обращение |
19h |
|
4 |
Адрес блока данных IFS |
|
1Bh |
4 |
Сектор каталога с записью о данном файле |
|
1Fh |
1 |
Номер записи о файле в секторе каталога |
20h |
20h |
11 |
Имя объекта в FCB-формате (A.09-5) |
|
31h |
2 |
Сегмент PSP программы, открывшей объект |
|
35h |
2 |
Абсолютный номер кластера, к которому |
|
|
|
производилось предыдущее обращение |
37h |
|
4 |
Адрес IFS-драйвера (или 0000:0000h без IFS) |
Примечание 1: байт флагов в ячейке со смещением 03h включает все, что задается в регистре BH при вызове INT 21\AX=6C00h (8.02-78) и, кроме того, бит 7, устанавливаемый для тех файлов, которые открыты посредством блоков FCB (File Control Blocks).
A.02 Коды клавиатуры и национальная адаптация
A.02-1 Коды клавишей
Задача достижения совместимости компьютера с разными типами клавиатур возложена на аппаратные средства материнской платы и на систему BIOS, потому что управление с клавиатуры должно быть обеспечено всегда, даже когда операционная система не загружена. С этой целью сразу после включения компьютера система BIOS загружает обработчики прерываний INT 09 и INT 16, обслуживающие операции, связанные с клавиатурой.
– 593 –
Приложение А.02: Коды клавиатуры и национальная адаптация
При каждом нажатии на клавишу и при каждом отпускании клавиши контроллер клавиатуры принимает и преобразует поступающие от клавиатуры сигналы, а затем выставляет код в порт 60h и посылает запрос по линии IRQ 01, вызывающий на исполнение обработчик прерывания INT 09. Некоторые клавиши заставляют контроллер передавать последовательность кодов, вызывая обработчика INT 09 несколько раз подряд. Код, считываемый обработчиком из порта 60h, обычно является скэн-кодом конкретной клавиши, но может оказаться служебным кодом. К служебным кодам относятся 00h, AAh, а также все коды от E0h до FFh.
Для идентификации нажатия клавишей особое значение имеют два служебных кода, называемые префиксами:
E0h – префикс для различения клавиш, которым ради сохранения совместимости со старыми 84-клавишными клавиатурами дан одинаковый скэн-код.
E1h – префикс для клавиш с двухбайтовым скэн-кодом. Обычно такая клавиша только одна: Pause/Break (примечание 6 к A.02-1).
Считывание префикса подготавливает обработчик прерывания INT 09 к особой интерпретации того скэн-кода, который будет передан ему при следующем вызове. Во 2-м столбце (INT 09) приводимой ниже таблицы показаны шестнадцатеричные скэн-коды нажатия клавиш, считываемые в момент вызова обработчиком прерывания INT 09. Коды отпускания отличаются от кодов нажатия только установленным в единицу старшим (седьмым) битом, и в таблице не показаны, так как их легко вывести из кодов нажатия (например, 1Eh – нажатие клавиши "A", а 9Eh – ее отпускание). Но те скэн-коды, которым предшествует передача префикса E0h или E1h, приведены во втором столбце таблицы совместно с этим префиксом, причем тот же префикс обычно предшествует и коду отпускания тех же клавишей.
Обработчики прерываний INT 09 и INT 16 преобразуют считанный из порта скэн-код в унифицированный скэн-код и в значение кода ASCII, соответствующие нажатой клавише. Именно эта пара значений предоставляется любой программе,
которая пошлет запрос на ввод данных с клавиатуры посредством прерывания INT 16. Унифицированный скэн-код, как правило, повторяет скэн-код нажатия, но может быть изменен, если одновременно удерживалась нажатой какая-либо из "функциональных" клавишей: Shift, Ctrl или Alt. Каждая "функциональная" клавиша имеет свой скэн-код, все они показаны во второй колонке таблицы и принимаются во внимание обработчиком прерывания INT 09, но в буфер клавиатуры не заносятся. Состояние "функциональных" клавишей отображается иначе – через слово статуса, возвращаемое при вызове INT 16\AH=12h (8.01-85).
По номенклатуре клавишей приведенная ниже таблица соответствует широко распространенной 104-клавишной "улучшенной" клавиатуре. Слово "num" перед
названием клавиши в первом столбце таблицы является отличительным признаком клавишей из цифровой группы в правой части клавиатуры, причем значения кодов
для таких клавишей указаны при выключенном состоянии переключателя
– 594 –
Приложение А.02: Коды клавиатуры и национальная адаптация
NumLock. Клавиши упоминаются в порядке возрастания исходного скэн-кода (во второй колонке).
Шестнадцатеричные числа в 3-й – 6-й колонках таблицы представляют данные, которые обработчик прерывания INT 16\AH=10h (8.01-83) возвращает в регистре AX. Левые две цифры в каждом четырехзначном числе – это унифицированный скэн-код, возвращаемый в AH, а правые две цифры – это код ASCII соответствующего знака, возвращаемый в AL. Данные третьей колонки (AX) представляют одиночное нажатие, не сопровождаемое удержанием какой-либо "функциональной" клавиши. Данные в четвертой колонке (SHIFT) соответствуют случаю, когда удерживается нажатой "функциональная" клавиша SHIFT, данные в пятой колонке (CTRL) – случаю удержания "функциональной" клавиши CTRL, данные в шестой колонке (ALT) – случаю удержания "функциональной" клавиши ALT. Если в ячейке таблицы число не указано, значит, соответствующая
клавишная комбинация не отображается обработчиком прерывания
INT 16\AH=10h.
Клавиша |
INT09 |
AX |
SHIFT |
CTRL |
ALT |
Примечания |
|
Esc |
|
01 |
011B |
011B |
011B |
0100 |
1 |
1 |
! |
02 |
0231 |
0221 |
|
7800 |
|
2 |
@ |
03 |
0332 |
0340 |
0300 |
7900 |
|
3 |
# |
04 |
0433 |
0423 |
|
7A00 |
|
4 |
$ |
05 |
0534 |
0524 |
|
7B00 |
|
5 |
% |
06 |
0635 |
0625 |
|
7C00 |
|
6 |
^ |
07 |
0736 |
075E |
071E |
7D00 |
|
7 |
& |
08 |
0837 |
0826 |
|
7E00 |
|
8 |
* |
09 |
0938 |
092A |
|
7F00 |
|
9 |
( |
0A |
0A39 |
0A28 |
|
8000 |
|
0 |
) |
0B |
0B30 |
0B29 |
|
8100 |
|
– |
_ |
0C |
0C2D |
0C5F |
0C1F |
8200 |
|
= |
+ |
0D |
0D3D |
0D2B |
|
8300 |
|
Backspace |
0E |
0E08 |
0E08 |
0E7F |
0E00 |
1 |
|
Tab |
|
0F |
0F09 |
0F00 |
9400 |
A500 |
1, 2 |
Q |
|
10 |
1071 |
1051 |
1011 |
1000 |
|
W |
|
11 |
1177 |
1157 |
1117 |
1100 |
|
E |
|
12 |
1265 |
1245 |
1205 |
1200 |
|
R |
|
13 |
1372 |
1352 |
1312 |
1300 |
|
T |
|
14 |
1474 |
1454 |
1414 |
1400 |
|
Y |
|
15 |
1579 |
1559 |
1519 |
1500 |
|
U |
|
16 |
1675 |
1655 |
1615 |
1600 |
|
I |
|
17 |
1769 |
1749 |
1709 |
1700 |
|
O |
|
18 |
186F |
184F |
180F |
1800 |
|
– 595 –
Приложение А.02: Коды клавиатуры и национальная адаптация
Продолжение таблицы А.02-1 |
|
|
|
|
|
||||
|
P |
|
19 |
|
1970 |
1950 |
1910 |
1900 |
|
|
[ |
{ |
1A |
|
1A5B |
1A7B |
1A1B |
1A00 |
1 |
|
] |
} |
1B |
|
1B5D |
1B7D |
1B1D |
1B00 |
1 |
|
Enter |
|
1C |
|
1C0D |
1C0D |
1C0A |
1C00 |
1 |
|
num Enter |
E0 1C |
|
E00D |
E00D |
E00A |
A600 |
1, 3 |
|
|
Left Ctrl |
1D |
|
|
|
|
|
4 |
|
|
Right Ctrl |
E0 1D |
|
|
|
|
|
4 |
|
|
A |
|
1E |
|
1E61 |
1E41 |
1E01 |
1E00 |
|
|
S |
|
1F |
|
1F73 |
1F53 |
1F13 |
1F00 |
|
|
D |
|
20 |
|
2064 |
2044 |
2004 |
2000 |
|
|
F |
|
21 |
|
2166 |
2146 |
2106 |
2100 |
|
|
G |
|
22 |
|
2267 |
2247 |
2207 |
2200 |
|
|
H |
|
23 |
|
2368 |
2348 |
2308 |
2300 |
|
|
J |
|
24 |
|
246A |
244A |
240A |
2400 |
|
|
K |
|
25 |
|
256B |
254B |
250B |
2500 |
|
|
L |
|
26 |
|
266C |
264C |
260C |
2600 |
|
|
; |
: |
27 |
|
273B |
273A |
|
2700 |
1 |
|
' |
" |
28 |
|
2827 |
2822 |
|
2800 |
1 |
|
` |
~ |
29 |
|
2960 |
297E |
|
2900 |
1 |
|
Left Shift |
2A |
|
|
|
|
|
4 |
|
|
SysRq |
|
E0 2A |
|
|
|
7200 |
|
5 |
|
\ |
| |
2B |
|
2B5C |
2B7C |
2B1C |
2B00 |
1 |
|
Z |
|
2C |
|
2C7A |
2C5A |
2C1A |
2C00 |
|
|
X |
|
2D |
|
2D78 |
2D58 |
2D18 |
2D00 |
|
|
C |
|
2E |
|
2E63 |
2E43 |
2E03 |
2E00 |
|
|
V |
|
2F |
|
2F76 |
2F56 |
2F16 |
2F00 |
|
|
B |
|
30 |
|
3062 |
3042 |
3002 |
3000 |
|
|
N |
|
31 |
|
316E |
314E |
310E |
3100 |
|
|
M |
|
32 |
|
326D |
324D |
320D |
3200 |
|
|
, |
< |
33 |
|
332C |
333C |
|
3300 |
1 |
|
. |
> |
34 |
|
342E |
343E |
|
3400 |
1 |
|
/ |
? |
35 |
|
352F |
353F |
|
3500 |
1 |
|
num / |
|
E0 35 |
|
E02F |
E02F |
9500 |
A400 |
1, 2 ,3 |
|
Right Shift |
36 |
|
|
|
|
|
4 |
|
|
num * |
|
37 |
|
372A |
372A |
9600 |
3700 |
1, 2 |
|
Left Alt |
|
38 |
|
|
|
|
|
4 |
|
Right Alt |
E0 38 |
|
|
|
|
|
4 |
|
|
Spacebar |
39 |
|
3920 |
3920 |
3920 |
3920 |
|
|
|
Caps Lock |
3A |
|
|
|
|
|
4 |
|
|
F1 |
|
3B |
|
3B00 |
5400 |
5E00 |
6800 |
|
|
F2 |
|
3C |
|
3C00 |
5500 |
5F00 |
6900 |
|
|
F3 |
|
3D |
|
3D00 |
5600 |
6000 |
6A00 |
|
– 596 –
Приложение А.02: Коды клавиатуры и национальная адаптация
Продолжение таблицы А.02-1 |
|
|
|
|
|
||||
|
F4 |
|
3E |
|
3E00 |
5700 |
6100 |
6B00 |
|
|
F5 |
|
3F |
|
3F00 |
5800 |
6200 |
6C00 |
|
|
F6 |
|
40 |
|
4000 |
5900 |
6300 |
6D00 |
|
|
F7 |
|
41 |
|
4100 |
5A00 |
6400 |
6E00 |
|
|
F8 |
|
42 |
|
4200 |
5B00 |
6500 |
6F00 |
|
|
F9 |
|
43 |
|
4300 |
5C00 |
6600 |
7000 |
|
|
F10 |
|
44 |
|
4400 |
5D00 |
6700 |
7100 |
|
|
NumLock |
|
45 |
|
|
|
|
|
4 |
|
Pause |
E1 1D |
45 |
|
|
|
|
|
4, 6 |
|
ScrollLock |
|
46 |
|
|
|
|
|
4 |
|
num 7 |
|
47 |
|
4700 |
4737 |
7700 |
0007 |
7 |
|
Home |
E0 |
47 |
|
47E0 |
47E0 |
77E0 |
9700 |
1, 3 |
|
num 8 |
|
48 |
|
4800 |
4838 |
8D00 |
0008 |
2, 7 |
|
Arrow Up |
E0 |
48 |
|
48E0 |
48E0 |
8DE0 |
9800 |
1, 2, 3 |
|
num 9 |
|
49 |
|
4900 |
4939 |
8400 |
0009 |
7 |
|
PgUp |
E0 |
49 |
|
49E0 |
49E0 |
84E0 |
9900 |
1, 3 |
|
num – |
|
4A |
|
4A2D |
4A2D |
8E00 |
4A00 |
1, 2 |
|
num 4 |
|
4B |
|
4B00 |
4B34 |
7300 |
0004 |
7 |
|
LeftArrow |
E0 |
4B |
|
4BE0 |
4BE0 |
73E0 |
9B00 |
1, 3 |
|
num 5 |
|
4C |
|
4C00 |
4C35 |
8F00 |
0005 |
2, 7 |
|
num 6 |
|
4D |
|
4D00 |
4D36 |
7400 |
0006 |
7 |
|
RightArrow |
E0 |
4D |
|
4DE0 |
4DE0 |
74E0 |
9D00 |
1, 3 |
|
num + |
|
4E |
|
4E2B |
4E2B |
9000 |
4E00 |
1, 2 |
|
num 1 |
|
4F |
|
4F00 |
4F31 |
7500 |
0001 |
7 |
|
End |
E0 |
4F |
|
4FE0 |
4FE0 |
75E0 |
9F00 |
1, 3 |
|
num 2 |
|
50 |
|
5000 |
5032 |
9100 |
0002 |
2, 7 |
|
ArrowDown |
E0 |
50 |
|
50E0 |
50E0 |
91E0 |
A000 |
1, 2, 3 |
|
num 3 |
|
51 |
|
5100 |
5133 |
7600 |
0003 |
7 |
|
PgDn |
E0 |
51 |
|
51E0 |
51E0 |
76E0 |
A100 |
1, 3 |
|
num 0 |
|
52 |
|
5200 |
5230 |
9200 |
|
2, 7 |
|
Ins |
E0 |
52 |
|
52E0 |
52E0 |
92E0 |
A200 |
1, 2, 3 |
|
num . |
|
53 |
|
5300 |
532E |
9300 |
|
2, 7 |
|
Del |
E0 |
53 |
|
53E0 |
53E0 |
93E0 |
A300 |
1, 2, 3 |
|
F11 |
|
57 |
|
8500 |
8700 |
8900 |
8B00 |
8 |
|
F12 |
|
58 |
|
8600 |
8800 |
8A00 |
8C00 |
8 |
|
LeftWin |
E0 |
5B |
|
B6E0 |
C2E0 |
CEE0 |
DAE0 |
8 |
|
RightWin |
E0 |
5C |
|
B7E0 |
C3E0 |
CFE0 |
DBE0 |
8 |
|
Menu |
E0 |
5D |
|
B8E0 |
C4E0 |
D0E0 |
DCE0 |
8 |
Примечание 1: обработчик прерывания INT 16\AH=00h не отвечает на комбинацию нажатий этой клавиши и "функциональной" клавиши ALT.
– 597 –
Приложение А.02: Коды клавиатуры и национальная адаптация
Примечание 2: обработчик прерывания INT 16\AH=00h не отвечает на комбинацию нажатий этой клавиши и "функциональной" клавиши CTRL.
Примечание 3: обработчик прерывания INT 16\AH=00h вместо значения E0h кода ASCII возвращает 00h, за исключением нажатий клавиш "num /" и "num Enter": для них вместо скэн-кода E0h он выдает коды 35h, и 1Ch соответственно.
Примечание 4: собственный код этой клавиши в буфер клавиатуры не заносится, но влияет на действия обработчика прерывания INT 09, например, изменяет формирование кодов других клавишей.
Примечание 5: контроллер клавиатуры отвечает на нажатие клавиши SysRq выдачей кодовой последовательности "E0 2A E0 37", а на отпускание – выдачей обратной кодовой последовательности "E0 B7 E0 AA". Не все версии BIOS выдают один и тот же код в ответ на клавишную комбинацию CTRL-SysRq.
Примечание 6: клавиша Pause/Break уникальна тем, что ее отпускание отдельно не фиксируется, код отпускания следует сразу после кода нажатия, образуя последовательность E1 1D 45 E1 9D C5. Прием такой последовательности обработчиком прерывания INT 09 влечет сброс (обнуление) буфера клавиатуры и вызов INT 1B.
Примечание 7: показанные коды данной клавиши соответствуют выключенному состоянию переключателя NumLock, а когда он включен, коды из третьей и четвертой колонок таблицы меняются местами.
Примечание 8: обработчик прерывания INT 16\AH=00h вообще не реагирует на нажатие этой клавиши.
Примечание 9: в некоторых моделях клавиатур имеются три клавиши управления электропитанием компьютера: POWER, SLEEP и WAKE UP. Этим клавишам соответствуют скэн-коды E0 5E, E0 5F, E0 63.
A.02-2 Раскладки клавиатуры и национальные кодовые страницы
В этом разделе представлены избранные сведения для осуществления национальной адаптации клавиатуры и шрифтов с помощью средств, имеющихся в поставке операционной системы Windows-95 фирмы Microsoft. Поставляемые средства включают файл данных Country.sys, три файла с раскладками клавиатур
(Keyboard.sys, Keybrd2.sys и Keybrd3.sys), и четыре файла со шрифтами (Ega.cpi, Ega2.cpi, Ega3.cpi и Iso.cpi) для различных кодовых страниц.
Первая колонка (Abbr) приведенной ниже таблицы содержит сокращенные буквенные обозначения стран мира, а третья колонка (ID) – идентификаторы раскладки клавиатуры для тех же стран. Сведения из первой и третьей колонок нужны для составления командной строки запуска драйвера Keyb.com (5.02-04). Идентификатор раскладки клавиатуры необходимо указывать только тогда, когда в
– 598 –