Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Dos7book

.pdf
Скачиваний:
76
Добавлен:
09.02.2015
Размер:
5.1 Mб
Скачать

Приложение А.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

– 599 –

Приложение А.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

– 601 –

Приложение А.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 указатель на перечень установленных ими

– 602 –

Приложение А.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. Установление в единицу любого бита в слове требуемого

состояния флагов фиксирует необходимое условие срабатывания "горячей" клавиши.

– 603 –

Приложение А.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, с кратким описанием связанных с ними ассоциаций.

– 604 –

Приложение А.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

Предельное число записей в корневом каталоге

– 606 –

Приложение А.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 –

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]