
- •Аннотация
- •Введение
- •Благодарности
- •Авторский компакт-диск
- •Как связаться с авторами
- •1 Определение конфигурации компьютера
- •Определение конфигурации с помощьюBios
- •Наличие нмд
- •Наличие арифметического сопроцессора
- •Начальный режим работы видеоадаптера
- •Стандартная оперативная память
- •Расширенная оперативная память
- •ПрограммаHdwcfg
- •Код модели компьютера и версияBios
- •ПрограммаBiosinfo
- •Конфигурация в памяти cmos
- •00H - 0Dh - область часов реального времени
- •0Eh - байт диагностики
- •0Fh - байт отключения
- •10H - тип накопителей нгмд
- •11H - зарезервировано дляIbm pc/at, тип нмд дляIbm ps/2
- •12H - тип первого и второго нмд
- •13H - зарезервировано
- •14H - конфигурация оборудования
- •15H-16h - объем стандартной оперативной памяти
- •ПрограммаCmosshow
- •Определение типа центрального процессора
- •МоделиIntel 8086/8088
- •Модель Intel 80286
- •МодельIntel 80386
- •МодельIntel 80486
- •Команда cpuid
- •ПрограммаCpuinfo
- •2 Клавиатура
- •Как работает клавиатура
- •Клавиатурная матрица
- •Скан-код клавиши
- •КодAscii нажатой клавиши
- •Режим автоповтора
- •Типы клавиатур
- •Порты для работы с клавиатурой
- •КомпьютерIbm pc/xt
- •Современные компьютеры
- •ПрограммаKbdled
- •Аппаратное прерывание клавиатуры
- •Стандартный обработчик прерывания int 09h
- •Буфер клавиатуры
- •Переключающие клавиши
- •Средства bios для работы с клавиатурой
- •Чтение символа с ожиданием
- •ПрограммаKbdscan
- •Проверка буфера на наличие в нем символов
- •ПрограммаChkbuf
- •Получение состояния переключающих клавиш
- •Установка временных характеристик клавиатуры
- •Запись символов в буфер клавиатуры
- •Чтение символа с ожиданием для 101-клавишной клавиатуры
- •Проверка буфера на наличие в нем символов для 101-клавишной клавиатуры
- •Получение состояния переключающих клавиш для 101-клавишной клавиатуры
- •Режимы работы клавиатуры
- •Сравнение режимов
- •Изменение режима
- •Средства ms-dos для работы с клавиатурой
- •Буферизованный ввод с эхо-выводом
- •Буферизованный ввод без эхо-вывода
- •Нефильтрованный ввод без эхо-вывода
- •Вводс консоли и вывод на консоль
- •Ввод строки символов
- •Проверка состояния стандартного ввода
- •Сброс буфера клавиатуры
- •Клавиатурные функции стандартной библиотеки c
- •Функции getch и getche
- •ПрограммаKbdascii
- •Функцияkbhit
- •ПрограммаKbdhit
- •Функция cgets
- •Функция gets
- •Функция scanf
- •Как устроена мышь?
- •Драйверы мыши в ms-dos
- •Прерывание для обслуживания мыши
- •Инициализация мыши
- •Включить курсор мыши
- •Выключить курсор мыши
- •ПрограммаMscursor
- •Определить положение курсора
- •ПрограммаMsgcurs
- •Установить курсор
- •Определить положение курсора при нажатии клавиши
- •Определить положение курсора при отпускании клавиши
- •Задать диапазон движения курсора по горизонтали
- •Задать диапазон движения курсора по вертикали
- •Задать форму курсора в графическом режиме
- •ПрограммаMsgform
- •Задать форму курсора в текстовом режиме
- •ПрограммаMstform
- •Определить содержимое счетчиков перемещения
- •Установить драйвер событий
- •ПрограммаMsdriver
- •Включить эмуляцию светового пера
- •Выключить эмуляцию светового пера
- •Задать скорость перемещения курсора мыши
- •Установить область исключения для курсора
- •Задать увеличенный графический курсор
- •Определить порог удвоения скорости
- •Заменить драйвер событий
- •Определить размер буфера состояния драйвера
- •Сохранить состояние драйвера
- •Восстановить состояние драйвера
- •Установить альтернативный драйвер событий
- •Получить адрес альтернативного драйвера событий
- •Установить чувствительность мыши
- •Определить чувствительность мыши
- •Установить частоту прерываний для Inport Mouse
- •Установить номер страницы видеопамяти
- •Определить номер страницы видеопамяти
- •Отключить драйвер мыши
- •Восстановить драйвер мыши
- •Сбросить драйвер мыши
- •Определить тип мыши
- •МышьMicrosoft IntelliMouse
- •Проверка наличия мыши Microsoft IntelliMouse
- •Проверка в среде Microsoft Windows 95 и Microsoft Windows nt версии 3.51
- •Проверка в среде Microsoft Windows nt версии 4.0
- •Определение величины свертки
- •Определение величины свертки в среде Microsoft Windows 95 и Microsoft Windows nt версии 3.51
- •Определение величины свертки в среде Microsoft Windows nt версии 4.0
- •Сообщение msh_mousewheel
- •Сообщение wm_mousewheel
- •Другие сообщения от мыши Microsoft IntelliMouse
- •ПриложениеRtfpad
- •4 Часы реального времени
- •Регистры часов реального времени
- •Регистры счетчиков
- •Регистр состоянияA
- •Регистр состояния b
- •Регистр состояния c
- •Регистр состояния d
- •Прерывание от часов реального времени
- •Функции прерыванияInt 1Ah
- •Сброс будильника
- •ПрограммаRtcalarm
- •5 Системный таймер
- •Обработка прерываний таймера
- •Микросхемы таймера 8253 и 8254
- •Режимы работы таймера
- •Режим однократного выполнения функций
- •Работа с перезапуском
- •Формат управляющего регистра
- •Формат команды чтения слова состояния канала
- •Формат слова состояния канала
- •Последовательность действий
- •ПрограммаTimerst
- •Средства bios для работы с таймером
- •Чтение счетчика таймера
- •Установка счетчика таймера
- •Установка таймера с сигнализацией
- •Формирование задержки
- •Второй способ проигрывания музыки
- •Проигрывание музыки в фоновом режиме
- •ПрограммаTmsound
- •ПрограммаIosound
- •ПрограммаRandom
- •6 Асинхронный последовательный адаптер
- •Основные понятия и термины
- •Аппаратная реализация
- •МикросхемаUart
- •Разъемы адаптера
- •Порты асинхронного адаптера
- •Порт 3f8h
- •Порт 3f9h
- •Порт 3fAh
- •Порт 3fBh
- •Порт 3fCh
- •Порт 3fDh
- •Порт 3fEh
- •Функции bios для работы с последовательным асинхронным адаптером
- •Инииализация портов асинхронного адаптера
- •Передача байта
- •Прием байта
- •Определение состояния асинхронного адаптера
- •Программирование асинхронного адаптера
- •Инициализация асинхронного адаптера
- •Передача данных
- •Прием данных
- •ПрограммаComtest
- •Использование прерываний
- •7 Параллельный адаптер
- •Порты параллельного адаптера
- •Порт 378h
- •Порт 37Ah
- •Порт 379h
- •Разъем параллельного адаптера
- •Вывод байта на принтер через параллельный адаптер
- •Функции bios для работы с принтером
- •Печать символа
- •Инициализация принтера
- •Определение состояния принтера
- •ПрограммаPrintfl
- •Функции ms-dos для работы с принтером
- •ФункцияMs-dos для вывода на принтер
- •Система буферизованной печати
- •Проверка установки системы буферизованной печати
- •Запуск процесса печати файла
- •Отмена печати файла
- •Отмена печати всех файлов
- •Определение состояния и блокировка системы буферизованной печати
- •Разблокирование системы буферизованной печати
- •Коды ошибок
- •Программирование принтера
- •Подключение принтера к компьютеру
- •Установка переключателей конфигурации
- •Программирование режимов работы принтера
- •Инициализация принтера
- •Контроллер прямого доступа ibm pc/xt
- •Регистры каналов dma
- •Порты 00h - 07h
- •Порт 08h
- •Порт 09h
- •Порт 0Ah
- •Порт 0Bh
- •Порт 0Ch
- •Порт 0Dh
- •Порт 0Eh
- •Порт 0Fh
- •Порты 81h-8Fh
- •Инициализация канала dma
- •Контроллер прямого доступа ibm at
- •Регистры каналовDma
- •Регистры страниц
- •Порты 0c0h - 0dFh
- •Порты 0d0h-0dFh
- •9 Устройство чтения cd-rom
- •Драйвер устройства чтенияCd-rom
- •РасширениеMscdex
- •ФункцииMscdex
- •Определение количества устройствCd-rom
- •Получение списка устройств cd-rom
- •Получение имени файла прав собственности
- •Получение имени файла резюме
- •Получение имени файла библиографической документации
- •Чтение сектора оглавления компакт-диска
- •Чтение сектора по абсолютному адресу
- •Проверка устройства чтения cd-rom
- •Определение версии mscdex
- •Определение обозначения устройств чтения cd-rom
- •Вызов драйвера cd-rom
- •Работа через драйверCd-rom
- •Заголовок запроса
- •Команды драйвера cd-rom
- •Инициализация
- •ЧтениеIoctl Input
- •Определение адреса заголовка драйвера cd-rom
- •Определение положения головки
- •Получение информации о звуковых каналах
- •Чтение данных из устройства
- •Определение состояния устройства
- •Определение размера сектора
- •Определение размера тома
- •Проверка замены носителя данных
- •Получение информации о компакт-диске
- •Получение информации о дорожкекомпакт-диска
- •Получение информации о канале q
- •Получение информации о подканале
- •Получение штрих-кода изготовителя компакт-диска
- •Сброс входных буферов
- •ЗаписьIoctl Output
- •Извлечение компакт-диска
- •Блокирование и разблокирование компакт-диска в устройстве
- •Сброс устройства чтения cd-rom
- •Управление звуковыми каналами
- •Запись в устройство управляющей строки
- •Чтение длинное с предварительной выборкой
- •Проигрывание звуковой дорожки
- •Остановка проигрывания звуковой дорожки
- •Возобновление проигрывания звуковой дорожки
- •ПрограммаCdinfo
- •ПрограммаCdplay
- •10 Арифметический сопроцессор
- •Вещественные числа
- •Целые числа
- •Регистры сопроцессора
- •Численные регистры
- •Регистр тегов
- •Регистр управления
- •Регистр состояния
- •Регистры указателя команды и указателя операнда
- •Система команд сопроцессора
- •Команды пересылки данных
- •Запись в стек
- •Извлечение из стека
- •Копирование данных
- •Загрузка констант
- •Арифметические команды
- •Команды сравнений чисел
- •Трансцендентные команды
- •Управляющие команды
- •Программирование сопроцессора
- •ПрограммаNpu1
- •Обработка особых случаев
- •Неточный результат
- •Переполнение
- •Антипереполнение
- •Деление на нуль
- •Недействительная операция
- •Денормализованный операнд
- •Ошибка в процессореPentium
- •11 Расширенная память
- •Основные понятия
- •Установка драйвера himem.Sys
- •Спецификация xms
- •Проверка подключения драйвера
- •Получение адреса управляющей программы
- •Описание функций драйвера himem.Sys
- •Получить версию xms
- •Запросить область hma
- •Освободить область hma
- •Глобальное открывание линии a20
- •Глобальное закрывание линии a20
- •Освободить блок emb
- •Копирование блоков emb
- •Блокирование emb
- •Разблокирование emb
- •Получить информацию об идентификаторе блока emb
- •Изменить размер emb
- •Запросить область umb
- •Освободить область umb
- •Коды ошибок
- •Ограничения при использовании области hma
- •Примеры программ
- •ПрограммаTesthma
- •ПрограммаCallhma
- •Предметный указатель
- •Литература
- •Оглавление
- •1 Определение конфигурации компьютера 7
- •2 Клавиатура 38
- •3 Мышь 64
- •4 Часы реального времени 102
- •5 Системный таймер 113
- •6 Асинхронный последовательный адаптер 132
- •7 Параллельный адаптер 149
- •8 Контроллер прямого доступа к памяти 162
- •9 Устройство чтения cd-rom 170
- •10 Арифметический сопроцессор 216
- •11 Расширенная память 243
Чтение символа с ожиданием
Функция 00h выполняет чтение кода символа из буфера клавиатуры, если он там есть. Если буфер клавиатуры пуст, программа переводится в состояние ожидания до тех пор, пока не будет нажата какая-нибудь клавиша. Скан-код и код ASCII нажатой клавиши передаются программе.
Приведем формат вызова функции:
Регистры на входе: |
AH = 00h |
Регистры на выходе: |
AL = код ASCII символа или 0, если AH содержит расширенный код ASCII символа; AH = скан-код или расширенный код ASCII символа, если AL=0 |
Приведем таблицу скан-кодов:
01 |
Esc |
12 |
E |
23 |
H |
34 |
. > |
45 |
NumLock |
02 |
1 ! |
13 |
R |
24 |
J |
35 |
/ ? |
46 |
ScrLock |
03 |
2 @ |
14 |
T |
25 |
K |
36 |
Shift прав. |
47 |
Home [7] |
04 |
3 # |
15 |
Y |
26 |
L |
37 |
PrtSc |
48 |
Up [8] |
05 |
4 $ |
16 |
U |
27 |
; : |
38 |
Alt |
49 |
PgUp [9] |
06 |
5 % |
17 |
I |
28 |
‘ “ |
39 |
Пробел |
4A |
[-] |
07 |
6 ^ |
18 |
O |
29 |
` ~ |
3A |
CapsLock |
4B |
<- [4] |
08 |
7 & |
19 |
P |
2A |
Shift лев. |
3B |
F1 |
4C |
[5] |
09 |
8 * |
1A |
[ { |
2B |
\ | |
3C |
F2 |
4D |
-> [6] |
0A |
9 ( |
1B |
] } |
2C |
Z |
3D |
F3 |
4E |
[+] |
0B |
0 ) |
1C |
Enter |
2D |
X |
3E |
F4 |
4F |
End [1] |
0C |
- _ |
1D |
Ctrl |
2E |
C |
3F |
F5 |
50 |
Dn [2] |
0D |
= + |
1E |
A |
2F |
V |
40 |
F6 |
51 |
PgDn [3] |
0E |
Bksp |
1F |
S |
30 |
B |
41 |
F7 |
52 |
Ins [0] |
0F |
Tab |
20 |
D |
31 |
N |
42 |
F8 |
53 |
Del [.] |
10 |
Q |
21 |
F |
32 |
M |
43 |
F9 |
|
|
11 |
W |
22 |
G |
33 |
, < |
44 |
F10 |
|
|
Для остальных клавиш функция 00h прерывания INT 16h возвращает расширенный код ASCII:
F1 |
3b |
Shift+F1 |
54 |
Ctrl+F1 |
5e |
Alt+F1 |
68 |
F2 |
3c |
Shift+F2 |
55 |
Ctrl+F2 |
5f |
Alt+F2 |
69 |
F3 |
3d |
Shift+F3 |
56 |
Ctrl+F3 |
60 |
Alt+F3 |
6a |
F4 |
3e |
Shift+F4 |
57 |
Ctrl+F4 |
61 |
Alt+F4 |
6b |
F5 |
3f |
Shift+F5 |
58 |
Ctrl+F5 |
62 |
Alt+F5 |
6c |
F6 |
40 |
Shift+F6 |
59 |
Ctrl+F6 |
63 |
Alt+F6 |
6d |
F7 |
41 |
Shift+F7 |
5a |
Ctrl+F7 |
64 |
Alt+F7 |
6e |
F8 |
42 |
Shift+F8 |
5b |
Ctrl+F8 |
65 |
Alt+F8 |
6f |
F9 |
43 |
Shift+F9 |
5c |
Ctrl+F9 |
66 |
Alt+F9 |
70 |
F10 |
44 |
Shift+F10 |
5d |
Ctrl+F10 |
67 |
Alt+F10 |
71 |
Alt+A |
1E |
Alt+P |
19 |
Alt+3 |
7A |
Down |
50 |
Alt+B |
30 |
Alt+Q |
10 |
Alt+4 |
7B |
Left |
4B |
Alt+C |
2E |
Alt+R |
13 |
Alt+5 |
7C |
Right |
4D |
Alt+D |
20 |
Alt+S |
1F |
Alt+6 |
7D |
Up |
48 |
Alt+E |
12 |
Alt+T |
14 |
Alt+7 |
7E |
End |
4F |
Alt+S |
21 |
Alt+U |
16 |
Alt+8 |
7F |
Home |
47 |
Alt+G |
22 |
Alt+V |
2F |
Alt+9 |
80 |
PgDn |
51 |
Alt+H |
23 |
Alt+W |
11 |
Alt+- |
82 |
PdUp |
49 |
Alt+I |
17 |
Alt+X |
2D |
Alt+= |
83 |
|
|
Alt+J |
24 |
Alt+Y |
15 |
|
|
Ctrl+Left |
73 |
Alt+K |
25 |
Alt+Z |
2C |
|
|
Ctrl+Right |
74 |
Alt+L |
26 |
|
|
Shift+Tab |
0F |
Ctrl+End |
75 |
Alt+M |
32 |
Alt+0 |
81 |
Insert |
52 |
Ctrl+Home |
77 |
Alt+N |
31 |
Alt+1 |
78 |
Delete |
53 |
Ctrl+PgDn |
76 |
Alt+O |
18 |
Alt+2 |
79 |
PrintScr |
72 |
Ctrl+PgUp |
84 |
В следующей таблице приведены скан-коды клавиш, имеющихся только на 101-клавишной клавиатуре:
F11 |
85 |
Alt-Bksp |
0e |
Alt- Д / |
a4 |
F12 |
86 |
Alt-Enter |
1c |
Alt- Д * |
37 |
Shft-F11 |
87 |
Alt-Esc |
01 |
Alt- Д - |
4a |
Shft-F12 |
88 |
Alt-Tab |
a5 |
Alt- Д + |
4e |
Ctrl-F11 |
89 |
Ctrl-Tab |
94 |
Alt- Д Enter |
a6 |
Ctrl-F12 |
8a |
|
|
|
|
Alt-F11 |
8b |
Alt-up Up |
98 |
Ctrl- Д / |
95 |
Alt-F12 |
8c |
Alt-down Dn |
a0 |
Ctrl- Д * |
96 |
Alt-[ |
1a |
Alt-left <- |
9b |
Ctrl- Д - |
8e |
Alt-] |
1b |
Alt-right -> |
9d |
Ctrl- Д + |
90 |
Alt-; |
27 |
|
|
|
|
Alt-' |
28 |
Alt-Delete |
a3 |
Ctrl- Д Up [8] |
8d |
Alt-` |
29 |
Alt-End |
9f |
Ctrl- Д 5 [5] |
8f |
Alt-\ |
2b |
Alt-Home |
97 |
Ctrl- Д Dn [2] |
91 |
Alt-, |
33 |
Alt-Insert |
a2 |
Ctrl- Д Ins[0] |
92 |
Alt-. |
34 |
Alt-PageUp |
99 |
Ctrl- Д Del[.] |
93 |
Буква "Д" здесь обозначает дополнительную клавиатуру.