Приложение А.02: Коды клавиатуры и национальная адаптация
одной стране используются несколько раскладок клавиатуры. Четвертая колонка (Keyb) таблицы показывает, какой файл с раскладками клавиатуры следует загружать: цифра 1 означает файл Keyboard.sys, цифра 2 – файл Keybrd2.sys, цифра 3 – Keybrd3.sys, а слово "Any" – любой из упомянутых трех файлов.
В пятой колонке приведенной ниже таблицы показан численный код страны, используемый при загрузке файла данных Country.sys (5.02-01) с помощью команды COUNTRY (4.05).
Последняя седьмая колонка таблицы содержит номера кодовых страниц для разных стран. Эти номера необходимы программе MODE.COM (6.18), которой предстоит выбрать нужную кодовую страницу из группы страниц, содержащихся в каждом файле *.CPI (пример показан в разделе 9.01-02). В файле Iso.cpi для всех кодовых страниц содержатся шрифты, рекомендуемые международной организацией по стандартизации (ISO). Шрифты, разработанные фирмой Microsoft, поставляются в файлах Ega*.cpi, каждый из которых содержит шрифты примерно для пяти кодовых страниц. В связи с этим в шестой колонке (Ega*) таблицы указано, какой из файлов Ega*.cpi следует загружать: цифра 1 означает файл
Ega.cpi, цифра 2 – файл Ega2.cpi, цифра 3 – файл Ega3.cpi, а слово "Any" – любой из упомянутых здесь шрифтовых файлов.
|
Abbr |
Страна |
ID |
Keyb |
Код |
Ega* |
Кодовая |
|
страница |
|
|
|
|
|
|
|
|
GR |
Австрия |
|
Any |
043 |
Any |
CP850 |
|
BE |
Бельгия |
|
1,2 |
032 |
Any |
CP850 |
|
BG |
Болгария |
442 |
2 |
359 |
3 |
CP855 |
|
BR |
Бразилия |
274, 275 |
1,2 |
055 |
Any |
CP850 |
|
CF |
Канада |
058 |
1,2 |
002 |
1 |
CP863 |
|
CZ |
Чехия |
243 |
Any |
042 |
Any |
CP852 |
|
DK |
Дания |
|
1,3 |
045 |
1 |
CP865 |
|
SU |
Финляндия |
|
Any |
358 |
Any |
CP850 |
|
FR |
Франция |
120, 189 |
1,3 |
033 |
Any |
CP850 |
|
GR |
Германия |
|
Any |
049 |
Any |
CP850 |
|
GK |
Греция |
319 |
2 |
030 |
2 |
CP737, |
|
|
|
|
|
|
|
CP869 |
|
HU |
Венгрия |
|
Any |
036 |
Any |
CP852 |
|
IS |
Исландия |
161 |
2 |
354 |
2 |
CP861 |
|
IT |
Италия |
141, 142 |
Any |
039 |
Any |
CP850 |
|
LA |
Латинская Америка |
|
1 |
003 |
Any |
CP850 |
|
NL |
Нидерланды |
|
1,3 |
031 |
Any |
CP850 |
|
NO |
Норвегия |
|
1,2 |
047 |
1 |
CP865 |
|
PL |
Польша |
|
Any |
048 |
Any |
CP852 |
|
PO |
Португалия |
|
1 |
351 |
1 |
CP860 |
Приложение А.02: Коды клавиатуры и национальная адаптация
Продолжение таблицы А.02-2 |
|
|
|
|
|
|
RO |
Румыния |
333 |
2 |
040 |
Any |
CP852 |
|
RU |
Россия |
441 |
2,3 |
007 |
3 |
CP866 |
|
SL |
Словакия |
245 |
Any |
421 |
Any |
CP852 |
|
SP |
Испания |
|
1,3 |
034 |
Any |
CP850 |
|
SV |
Швеция |
|
Any |
046 |
Any |
CP850 |
|
SF |
Швейцария |
|
1,3 |
041 |
Any |
CP850 |
|
TR |
Турция |
440, 179 |
2 |
090 |
2 |
CP857 |
|
UK |
Великобритания |
166, 168 |
Any |
044 |
Any |
CP850 |
|
US |
США и Австралия |
|
Any |
001 |
1,3 |
CP437 |
|
YC |
Югославия |
118 |
2 |
038 |
3 |
CP855 |
|
|
(кириллица) |
|
|
|
|
|
|
YU |
Югославия (латынь) |
234 |
Any |
038 |
Any |
CP852 |
Примечание 1: из всех файлов с раскладками клавиатуры только Keyboard.sys содержит раскладки, используемые в пишущих машинках.
Примечание 2: файлы, поставляемые фирмой Microsoft, несовместимы с драйвером Keyrus.com (5.02-05): последний использует встроенные кодовые таблицы и раскладки клавиатуры.
Примечание 3: шрифты для некоторых других стран (в частности, для Китая, Израиля, Японии) поставляются фирмой Microsoft только в составе специальных национальных версий операционных систем.
A.02-3 Сведения о клавиатуре в области данных BIOS
В приведенной ниже таблице показано размещение сведений о клавиатуре в области данных BIOS, причем все смещения указаны относительно сегментного адреса 0040h, то есть от начала области данных BIOS.
Смещение |
Длина |
Содержание |
17h |
2 |
Флаги, возвращаемые INT 16\AH=12h в AX |
19h |
1 |
Обслуживание ввода по номеру знака ASCII |
1Ah |
2 |
Адрес следующего знака в буфере клавиатуры |
1Ch |
2 |
Адрес 1-й свободной ячейки буфера клавиатуры |
1Eh |
32 |
Кольцевой буфер клавиатуры |
71h |
1 |
Бит 7: флаг нажатия Ctrl-Break |
80h |
2 |
Адрес начала буфера клавиатуры (обычно 1Eh) |
82h |
2 |
Адрес байта за буфером клавиатуры (обычно 3Eh) |
96h |
1 |
Бит 0: последний принятый код – префикс E1h; |
|
|
бит 1: последний принятый код – префикс E0h; |
|
|
бит 2: была нажата правая клавиша Ctrl; |
|
|
бит 3: была нажата правая клавиша ALT; |
|
|
бит 4: установлена "улучшенная" клавиатура; |
|
|
– 600 – |
Приложение А.02: Коды клавиатуры и национальная адаптация
Продолжение таблицы А.02-3
бит 6: принятый скэн-код – 1-й байт из двух. 97h 1 Бит 0: включен светодиод Scroll Lock;
бит 1: включен светодиод Num Lock; бит 2: включен светодиод Caps Lock;
бит 7: от клавиатуры принят флаг ошибки.
Примечание 1: представленное здесь размещение данных может зависеть от версии BIOS в Вашем компьютере.
A.02-4 Блок параметров национальной адаптации
Здесь представлена структура блока данных, возвращаемого обработчиком прерывания INT 21\AX=6501h (8.02-74). Блок данных такой же структуры принимает обработчик прерывания INT 21\AX=7002h, задающий параметры национальной адаптации (примечание 3 к 8.02-74).
Смещение |
Длина |
Содержание |
00h |
1 |
= 01h при возврате (примечание 1) |
01h |
2 |
Длина таблицы при возврате (примечание 1) |
03h |
2 |
Шестнадцатеричный код страны (A.02-2) |
05h |
2 |
Номер кодовой страницы (A.02-2) |
07h |
2 |
Формат даты: |
|
|
= 0000h – американский (mm dd yy) |
|
|
= 0001h – европейский (dd mm yy) |
|
|
= 0002h – японский (yy mm dd) |
09h |
5 |
Название валюты, оканчивающееся байтом 00h |
0Eh |
2 |
Знак отделения тысяч в числах |
10h |
2 |
Знак отделения целой и дробной частей числа |
12h |
2 |
Знак отделения даты |
14h |
2 |
Знак отделения времени |
16h |
1 |
Бит 0: ставить символ валюты после суммы; |
|
|
бит 1: пробел между суммой и символом валюты; |
|
|
бит 2: символ валюты на месте десятичной точки. |
17h |
1 |
Число знаков правее точки в денежных расчетах |
18h |
1 |
Бит 1: 24-часовой счет времени, иначе 12-часовой |
19h |
4 |
Адрес вызова программы перевода (примечание 2) |
2Dh |
2 |
Знак разделения списков данных |
Примечание 1: этот элемент данных при вызове INT 21\AX=7002h игнорируется. Примечание 2: здесь имеется ввиду программа перевода национальных строчных
букв (имеющих номер ASCII больше 80h) в заглавные. Программу следует вызывать переходом по указанному адресу командой CALL
Приложение А.02: Коды клавиатуры и национальная адаптация
FAR (7.03-08) с номером ASCII переводимой буквы в регистре AL. Возврат результата предполагается также через регистр AL.
A.02-5 Национальные ограничения для имен
Указатель на эту таблицу национальных ограничений возвращает обработчик прерывания INT 21\AX=6505h (примечание 1 к 8.02-74).
Смещение |
Длина |
Содержание |
00h |
2 |
Длина таблицы (без данного слова) |
03h |
1 |
Наименьший номер знака для имен |
04h |
1 |
Наибольший номер знака для имен |
06h |
1 |
Первый номер знака из недопустимого интервала |
07h |
1 |
Последний номер знака недопустимого интервала |
09h |
1 |
Число N знаков, отмечающих конец имен |
0Ah |
N |
Номера ASCII знаков, отмечающих конец имен |
A.02-6 Сведения о загруженных кодовых страницах
В этой таблице показан блок данных, адрес которого возвращает драйвер
DISPLAY.SYS (5.02-02) в ответ на вызов функции INT 2F\AX=AD03h (8.03-27).
Смещение |
Длина |
Содержание |
00h |
2 |
Число M страниц, заданных конфигурацией |
04h |
2 |
Число N страниц, загруженных по умолчанию |
06h |
2N |
Номера страниц, загруженных по умолчанию |
06h+2N |
2M |
Номера страниц, заданных конфигурацией, или |
|
|
FFFFh, если эти страницы еще не загружены |
A.02-7 Описание "горячих" клавишей в спецификации AMIS.
Программы часто задействуют определенные клавиши для вызова своих функций, но обычно это делается без учета функций, которые уже возложены на те же клавиши загруженными ранее резидентными программами или драйверами.
Такие действия в лучшем случае приводят к потере возможности вызова функций резидентных модулей. Реальный шанс избежать перехвата "горячих" клавишей открывает спецификация AMIS (A.07-6), согласно которой резидентные модули в ответ на обращение к ним через прерывание INT 2D с кодом операции AL=05h возвращают в регистрах DX:BX указатель на перечень установленных ими
Приложение А.02: Коды клавиатуры и национальная адаптация
"горячих" клавишей. Предоставляемые сведения доступны любой программе, которая "пожелает" ими воспользоваться.
Первый байт, имеющий смещение 00h относительно начала перечня "горячих" клавишей, определяет способ перехвата вызовов (примечание 1). Второй байт, имеющий смещение 01h относительно начала перечня, определяет число "горячих" клавишей, которые установлены данным резидентным модулем и в момент вызова не дезактивированы. Тот же второй байт определяет общую длину возвращаемого перечня, потому что после него, начиная со смещения 02h, располагаются дескрипторы по 6 байт на каждую клавишу. Состав данных в дескрипторах "горячих" клавишей показан в приведенной ниже таблице. Смещения в таблице указаны относительно начала каждого дескриптора.
Смещение |
Длина |
Содержание |
Примечания |
00h |
1 |
Скэн-код "горячей" клавиши |
*2 |
01h |
2 |
Требуемые состояния флагов |
*3 |
03h |
2 |
Недопустимые состояния флагов |
*4 |
05h |
1 |
Дополнительные флаги клавиши |
*5 |
Примечание 1: значения битов в байте со смещением 00h в перечне "горячих" клавишей дешифрируются следующим образом:
бит 0 – перехват до обработчика INT 09 бит 1 – перехват после обработчика INT 09
бит 2 – перехват до обработчика INT 15\AH=4Fh бит 3 – перехват после обработчика INT 15\AH=4Fh
бит 4 – перехват вызовов INT 16\AH=00h,01h,02h бит 5 – перехват вызовов INT 16\AH=10h,11h,12h бит 6 – перехват вызовов INT 16\AH=20h,21h,22h
бит 7 – резервирован, должен быть сброшен в нуль Примечание 2: если старший бит скэн-кода обнулен, то срабатывание клавиши
регистрируется по ее нажатию, а если старший бит установлен, то срабатывание регистрируется по отпусканию клавиши. Когда
срабатывание регистрируется только по комбинации состояний "функциональных" клавишей (Shift, Ctrl и т.п.), тогда вместо скэн-кода следует указывать 00h или 80h соответственно.
Примечание 3: используемое здесь слово флагов почти идентично слову флагов клавиатуры, возвращаемому обработчиком прерывания INT 16\AH=12h (8.01-85). Изменено лишь значение бита 7: здесь оно выражает активизацию любой (левой или правой) клавиши Shift. Установление в единицу любого бита в слове требуемого
состояния флагов фиксирует необходимое условие срабатывания "горячей" клавиши.
Приложение А.02: Коды клавиатуры и национальная адаптация
Примечание 4: битам в слове недопустимых флагов клавиатуры приписан тот же смысл, что и в слове требуемых состояний (примечание 3), но здесь
установление любого бита в единицу выражает условие предотвращения срабатывания данной "горячей" клавиши.
Комбинирование требуемых и недопустимых условий существенно снижает вероятность ошибочных срабатываний.
Примечание 5: последний байт каждого дескриптора клавиши содержит биты дополнительных флагов, состояния которых означают следующее:
бит 0 – активизация до исполнения миссии модуля; бит 1 – активизация после исполнения миссии модуля; бит 2 – допустим перехват для мониторинга клавиши; бит 3 – срабатывание блокируется другими клавишами; бит 4 – роль данной клавиши переопределена; бит 5 – активизация зависит от условий исполнения;
Биты 6 и 7 зарезервированы и должны быть сброшены в нуль.
A.02-8. Служебные коды стандарта ASCII.
Позиции 0 – 31 в стандартном американском коде для обмена информацией (ASCII) выделены служебным меткам и командам. Все кодовые страницы DOS унаследовали эти 32 служебных кода стандарта ASCII. Большинство служебных кодов в среде MS-DOS7 игнорируется, но некоторые из них тем не менее принимаются к исполнению.
Часть служебных кодов может быть введена посредством клавишных комбинаций, показанных в разделе 1.05. Любой служебный код можно ввести, если набрать десятичный номер кода ( 0 – 31 ) цифровыми клавишами в правой части клавиатуры, придерживая нажатой клавишу ALT.
На ввод исполняемого служебного кода может реагировать модуль ввода в
составе драйвера консоли (устройства CON). Следующим обычно является командный интерпретатор. Функции BIOS предоставляют как возможность исполнения некоторых выводимых служебных кодов (8.01-21, 8.01-33), так и возможность избежать их исполнения (8.01-17). Модуль вывода в составе драйвера консоли по умолчанию не пытается избежать исполнения служебных кодов. На него можно повлиять посредством посылки ему строки параметров (8.02-41), но поводов для этого обычно нет, так как в среде DOS любая программа "вправе" обращаться не к драйверу консоли, а напрямую к функциям BIOS.
Иногда использование служебных кодов может быть полезно, но при этом надо знать, где и каким образом вводимый код будет интерпретирован. С этой целью ниже приведен перечень служебных кодов, действующих в среде MS-DOS7, с кратким описанием связанных с ними ассоциаций.
Приложение А.02: Коды клавиатуры и национальная адаптация
Код |
Номер |
Значение |
00h |
0 |
Маркер конца строк ASCIIZ, в том числе строк с записями |
|
|
имен и значений переменных окружения. |
03h |
3 |
Маркер "Конец текста", вызывает прерывание исполнения |
|
|
командных файлов (пример – в разделе 3.21). |
07h |
7 |
"Звуковой сигнал", при посылке его для воспроизведения на |
|
|
экране раздается короткий звуковой сигнал ( beep ). |
08h |
8 |
Смещает курсор на одно знакоместо влево. При посылке |
|
|
через драйвер консоли ( CON ) стирает последний знак. |
09h |
9 |
Код горизонтальной табуляции, при индикации на экране |
|
|
он автоматически заменяется на 8 пробелов. |
0Ah |
10 |
"Перевод строки" вызывает переход на следующую строку |
|
|
без возврата позиции курсора к началу строки. |
0Ch |
12 |
Команда принтерам "Вытолкнуть лист". BIOS и драйвер |
|
|
консоли на нее, как правило, не реагируют. |
0Dh |
13 |
"Возврат каретки" возвращает курсор к началу строки. |
|
|
Служит маркером конца строки в области DTA (8.02-16). |
1Ah |
26 |
Необязательная метка конца текстовых файлов, на этой |
|
|
метке может быть прекращено копирование файла (3.06). |
1Bh |
27 |
"Выйти" ("Escape") – маркер команд, адресуемых драйверу |
|
|
ANSI.SYS (если он установлен). |
Примечание 1: вместе байты 0Dh 0Ah служат маркером конца строки во всех текстовых файлах, формируемых в среде DOS.
Примечание 2: нельзя исключать вероятность загрузки таких резидентных модулей, для которых будут являться командами не показанные здесь служебные коды стандарта ASCII, обычно игнорируемые в среде MS-DOS7.
A.03 Системные данные для доступа к дискам
A.03-1. Структура блока параметров дисковода (DPB)
MS-DOS хранит параметры логических дисков в блоках DPB (Drive Parameter Blocks), по одному такому блоку на каждый диск. С помощью INT 21\AX=7302h (8.02-79) можно скопировать любой блок DPB в заранее подготовленный буфер. Адреса блоков DPB предоставляются пользовательским программам обработчиками прерываний INT 21\AH=1Fh и INT 21\AH=32h (8.02-24),
документированных в предшествующих версиях DOS. Ниже на рис. 8 показан весь процесс доступа к блоку DPB диска C:, включающий вызов INT 21\AH=32h, считывание адреса блока DPB из регистров DS:BX и вывод на экран дампа по
– 605 –
Приложение А.03: Системные данные для доступа к дискам
найденному адресу 00C9:13C0h. Там же на рис. 8 показан еще вывод на экран дампа блока DPB для следующего диска D: по адресу 00C9:13FDh, считанному начиная со смещения 19h из блока DPB предыдущего диска C:.
Рис. 8
Упомянутые процедуры доступа к блокам DPB автоматически вызывают обращение к запрошенному диску с целью обновления данных в блоке DPB. Это
замедляет исполнение программы и не всегда приемлемо по отношению к сменным дискам, которые могут отсутствовать в дисководе. Альтернатива состоит в получении адреса блока DPB из ячейки со смещением 45h в таблице CDS (A.03-3) того же диска.
Все блоки DPB имеют одинаковую структуру, показанную в приведенной ниже таблице, причем байты до 20h содержат те же данные, как и в предыдущих версиях DOS, а данные в ячейках со смещением больше 20h специфичны для расширенных блоков DPB в MS-DOS7.
Смещение |
Длина |
Содержание |
00h |
1 |
Номер логического диска (00h = A:, 02h = C:, . . .) |
01h |
1 |
Номер диска в списке дисков данного драйвера |
02h |
2 |
Размер сектора в байтах |
04h |
1 |
Наибольший номер сектора в кластере |
05h |
1 |
Число сдвигов для пересчета кластеров в секторы |
06h |
2 |
Число резервированных секторов в начале диска |
08h |
1 |
Число таблиц FAT |
09h |
2 |
Предельное число записей в корневом каталоге |
Приложение А.03: Системные данные для доступа к дискам
Продолжение таблицы А.03-1
0Bh |
2 |
Номер начального сектора записи данных |
0Dh |
2 |
Наибольший кластер (= число кластеров + 1) |
0Fh |
2 |
Число секторов в каждой таблице FAT |
11h |
2 |
Номер первого сектора каталога |
13h |
4 |
Адрес заголовка драйвера данного диска (A.05-1) |
17h |
1 |
Байт-идентификатор носителя (INT 21\AH=1Ch) |
18h |
1 |
= FFh до 1-го обращения к диску, = 00h - после. |
19h |
4 |
Адрес DPB следующего логического диска |
1Dh |
2 |
Начальный кластер для поиска свободного места |
1Fh |
2 |
Число свободных кластеров (FFFFh = неизвестно) |
21h |
2 |
Старшие 16 разрядов числа свободных секторов |
23h |
2 |
– Биты 0 – 3: номер активной таблицы FAT; |
|
|
– бит 7: не копировать FAT в неактивные FAT. |
25h |
2 |
Номер сектора с данными о FAT (примечание 2). |
27h |
2 |
Номер сектора с резервной копией boot-сектора |
29h |
4 |
Номер начального сектора первого кластера |
2Dh |
4 |
Номер последнего кластера данного диска |
31h |
4 |
Число секторов, занятых таблицами FAT |
35h |
4 |
Номер начального кластера корневого каталога |
Примечание 1: таблица DPB создается путем преобразования данных блоков BPB (A.03-4) с помощью INT 21\AH=53h.
Примечание 2: значение FFFFh в ячейке со смещением 25h означает, что на данном диске нет отдельного сектора с информацией о FAT. Но если такой сектор имеется, то в нем начиная со смещения 00h записывается 4-байтовая сигнатура 61417272h, затем со смещения 04h – число свободных кластеров (или FFFFFFFFh, если число свободных кластеров неизвестно), и со смещения 08h записывается 4-байтовый номер последнего выделенного кластера.
A.03-2 Таблицы дисковых данных (DDT)
Таблицы DDT (Disk Data Tables) представляют собой базу данных, но не для пользовательских программ, а для драйверов, входящих в состав ядра DOS. Таблицы DDT создаются для локальных дисков, доступных посредством функций BIOS, включая те виртуальные диски, которые эмулированы системой BIOS с образа диска на загрузочных оптических дисках CD-ROM. Однако таблицы DDT не создаются для RAM-дисков, IFS-дисков и вообще всех дисков, доступ к которым обеспечен драйверами, устанавливаемыми из конфигурационных файлов DOS.
Совокупность таблиц DDT организована в виде цепи, в которой первым 4-байтовым словом в каждой таблице является указатель на следующую таблицу. В последнюю таблицу DDT вместо указателя первым словом вписывается маркер
– 607 –
Приложение А.03: Системные данные для доступа к дискам
FFFFh. Каждая таблица DDT имеет фиксированную длину 96h байт. Указатель на начало первой таблицы DDT можно получить с помощью INT 2F\AX=0803h (8.03-04). Этого достаточно, чтобы проследить цепочку таблиц DDT до конца.
Рис. 9
На рис. 9 показан процесс доступа к таблицам DDT для дисков A:, B: и C:, включая вызов INT 2F\AX=0803h, считывание возвращаемого адреса (0B52:0000h) 1-й таблицы DDT из регистров DS:DI, выведение дампа части таблицы DDT для диска A:, считывание из первых 4 байт этого дампа адреса (0B52:0096h) таблицы DDT для следующего диска B:, выведение дампа части таблицы DDT диска B: и повторение двух последних операций по отношению к таблице DDT диска C:.
Приведенная ниже таблица A.03-2 показывает структуру данных в одной таблице DDT. Такой же формат данных используется обработчиком прерывания INT 2F\AX=0801 (8.03-02), добавляющим еще одну таблицу для нового диска к совокупности таблиц DDT.
Смещение |
Длина |
Содержание |
00h |
4 |
Адрес следующей DDT (или FFFFh, если ее нет) |
04h |
1 |
Номер дисковода (примечание 1 к 8.01-44) |
05h |
1 |
Номер диска (00h = A:, 02h = C:, и т.д.) |
06h |
25 |
Блок BPB используемого диска (A.03-4, до 19h) |
3Bh |
1 |
– Бит 6: файловая система FAT-16; |
|
|
– бит 7: на все запросы отвечать "Not Ready". |
3Ch |
2 |
Счетчик открытых файлов данного диска |
3Eh |
1 |
Тип диска (как в байте 01h таблицы A.04-3) |
3Fh |
2 |
– Бит 0: несменный жесткий магнитный диск; |
|
|
– 608 – |