
- •Аннотация
- •Введение
- •Благодарности
- •Авторский компакт-диск
- •Как связаться с авторами
- •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
Модель Intel 80286
В процессоре Intel 80286, когда он работает в реальном режиме адресации, биты 12-15 регистраFLAGS всегда сброшены в нуль, что можно использовать для обнаружения этой модели процессора.
Следующий фрагмент кода пытается записать в эти биты единичное значение:
mov ax, 0f000h
push ax
popf
Затем новое содержимое регистра FLAGS переписывается в регистр AX:
pushf
pop ax
Если содержимое битов 12-15 равно нулю, программа работает на процессоре Intel 80286:
and ax, 0f000h
jz is_80286
В противном случае необходимо продолжить проверку модели процессора.
МодельIntel 80386
Для того чтобы отличить процессорIntel 80386 от процессоров старших моделей, можно попробовать установить в регистреEFLAGS бит 18. Этот бит был впервые определен в процессореIntel 80486 для сигнализации ошибки выравнивания. Его невозможно установить в процессореIntel 80386.
В процессе проверки программа вначале получает исходное содержимое регистра EFLAGS, записывая его в регистры EAX и ECX:
pushfd
pop eax
mov ecx, eax
Далее программа инвертирует значение бита 18 и записывает полученный результат в регистр EFLAGS:
xor eax, 40000h
push eax
popfd
На последнем шаге идентификации новое содержимое регистра EFLAGS извлекается и сравнивается со старым:
pushfd
pop eax
xor eax, ecx
jz is_80386
Если бит 18 не изменил своего значения, мы имеем дело с процессором Intel 80386.
МодельIntel 80486
Отличительная особенность процессора Intel 80486 – невозможность изменения состояния бита 21 регистраEFLAGS. Этот бит используется процессорами Intel Pentium и более старшими моделями процессоров Intel для определения возможности вызова команды идентификации процессораCPUID, о которой мы скоро расскажем.
Фрагмент кода, который нужно использовать для обнаружения процессора Intel 80486, аналогичен фрагменту для процессораIntel 80386. Отличие заключается в том, что вместо бита 18 проверяется бит 21:
pushfd
pop eax
mov ecx, eax
xor eax, 200000h
push eax
popfd
pushfd
pop eax
xor eax, ecx
je is_80486
Если же выяснилось, что содержимое бита 21 регистра EFLAGS можно изменять, дальнейшую идентификацию модели процессора следует выполнять с использованием командыCPUID, к описанию которой мы и переходим.
Команда cpuid
В новых процессорах фирмы Intel появилась командаCPUID, специально предназначенная для определения модели процессора. В своей программе, составленной на языке ассемблера, вы можете определить эту команду следующим образом:
CPU_ID MACRO
db 0fh
db 0a2h
ENDM
Как работает команда CPUID?
Перед вызовом этой команды необходимо загрузить в регистр EAX значение, которое определяет выполняемые действия. В первый раз вы должны вызвать команду CPUID, загрузив предварительно в регистрEAX нулевое значение:
mov eax, 00h
CPU_ID
Команда вернет в регистре EAX максимальное значение, которое можно передавать командеCPUID для определения выполняемых действий. Кроме того, в регистрахEBX, ECX иEDX будут находиться байты текстовой строки описания фирмы-изготовителя процессора. Для процессоровIntel это будет строкаGenuineIntel.
Следующая последовательность команд перепишет эти байты в буфер _vendor_id_msg в формате, пригодном для вывода на консоль средствами BIOS:
_vendor_id_msg db "............", 0dh, 0ah, "$"
. . .
mov dword ptr _vendor_id_msg, ebx
mov dword ptr _vendor_id_msg[+4], edx
mov dword ptr _vendor_id_msg[+8], ecx
Для определения модели процессора следует вызвать команду CPUID, загрузив предварительно в регистрEAX значение 1:
mov eax, 1
CPU_ID
При этом в регистр EAX будет загружено слово сигнатуры, по которому можно определить модель процессора, а в регистрEDX – слово, состоящее из отдельных флагов, характеризующих возможности процессора (feature flags). РегистрыEBX иECX зарезервированы для моделей процессоров, которые будут разработаны в будущем.
Ниже приведен фрагмент кода, в котором слово сигнатуры и слово возможностей записываются в переменные _cpu_signature и _features_edx для дальнейшего анализа:
_cpu_signature dd 0
_features_edx dd 0
. . .
mov _cpu_signature, eax
mov _features_edx, edx
Рассмотрим формат слова сигнатуры, возвращаемое командой CPUID в регистреEAX:
Биты |
Описание |
0-3 |
Код модификации модели (stepping) |
4-7 |
Код модели |
8-11 |
Код семейства моделей |
12-13 |
Тип процессора |
14-31 |
Зарезервировано |
Слово сигнатуры состоит из отдельных полей, назначение которых будет описано ниже.
Биты 12 и 13 определяют тип процессора:
Значение битов 12 и 13 |
Тип процессора |
00 |
Процессор, изготовленный производителем OEM |
01 |
Процессор OverDrive |
10 |
Процессор типа Dual, который можно использовать в двухпроцессорных системах |
11 |
Зарезервировано |
Заметим, что многопроцессорные системы могут быть построены не только на базе процессоров типа Dual, но и на обычных процессорах.
Ниже мы привели таблицу, с помощью которой по содержимому трех полей слова сигнатуры (тип процессора, код семейства и код модели) можно распознать процессор:
Тип процессора |
Код семейства |
Код модели |
Описание процессора |
00 |
0100 |
0100 |
Intel 486 SL |
00 |
0100 |
0111 |
Intel DX2 |
00 |
0100 |
1000 |
Intel DX4 |
00, 01 |
0100 |
1000 |
Intel DX4 OverDrive |
00 |
0101 |
0001 |
Pentium 60, 66; Pentium OverDrive для процессоровPentium 60, 66 |
00 |
0101 |
0010 |
Pentium 75, 90, 100, 120, 133, 150, 166, 200 |
01 |
0101 |
0010 |
Pentium OverDrive для процессоров Pentium 75, 90, 100, 120, 133 |
01 |
0101 |
0011 |
Pentium OverDrive для систем на базе процессораIntel 486 |
00 |
0101 |
0100 |
Pentium 166, 200 с командамиMMX |
01 |
0101 |
0100 |
Зарезервировано. Будет использоваться процессорами Pentium OverDrive для процессоров Pentium 75, 90, 100, 120, 133 |
00 |
0110 |
0001 |
Pentium Pro |
00 |
0110 |
0011 |
Pentium II |
00 |
0110 |
0101 |
Зарезервировано для новых процессоров P6 |
01 |
0110 |
0011 |
Зарезервировано для процессоров Pentium OverDrive для процессоров Pentium Pro |
Что же касается кода модификации модели (stepping), то он определяет изменения в процессоре. Вы найдете описания этих кодов для процессораPentium в руководствеPentium Processor Specification Update, который можно приобрести в фирмеIntel.
Приведем описание битов, возвращаемых командой CPUIDв регистреEDX. Напомним, что это слово состоит из отдельных флагов, характеризующих возможности процессора (feature flags).
Бит |
Описание |
0 |
На кристалле процессора имеется арифметический сопроцессор, совместимый по командам с сопроцессором Intel 387 |
1 |
Процессор может работать в режиме виртуального процессора 8086 |
2 |
Процессор может работать с прерываниями ввода/вывода, а также с битом DE регистраCR4 |
3 |
Возможно использование страниц памяти размером 4 Мбайт |
4 |
В процессоре есть команда RDTSC, которая может работать с битомTSD регистраCR4 |
5 |
Набор регистров процессора, специфический для модели, доступен с помощью команд RDMSR, WRMSR |
6 |
Возможна физическая адресация памяти с использованием шины с шириной, большей чем 32 разряда |
7 |
В процессоре реализовано исключение Machine Check(исключение с номером 18). Возможно использование битаMCE регистраCR4 |
8 |
В процессоре реализована команда сравнения и обмена 8 байт данных CMPXCHG8 |
9 |
В процессоре есть локальный APIC |
10 |
Зарезервировано |
11 |
В процессоре реализованы команды быстрого вызова системы SYSENTER иSYSEXIT |
12 |
В процессоре есть регистры Memory Type Range |
13 |
Доступен глобальный бит в PDE иPTE, а также битPGE в регистреCR4 |
14 |
Применена архитектура Machine Check Architecture |
15 |
В процессоре реализованы команды условного перемещения данных CMOVCC и (при установленном бите 0)FCMOVCC иFCOMI |
16-22 |
Зарезервировано |
23 |
Применена технология MMX |
24-31 |
Зарезервировано |
Еще одно применение для команды CPUID – определение характеристик кэша, установленного в процессоре. Для этого перед вызовом командыCPUID в регистрEAX необходимо загрузить значение 2. Подробное изучение этой возможности выходит за рамки нашей книги. При необходимости вы узнать все подробности о командеCPUID на сервереIntel в сетиInternet по указанному нами ранее адресу.