- •Аннотация
 - •Введение
 - •Благодарности
 - •Авторский компакт-диск
 - •Как связаться с авторами
 - •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
 
Современные компьютеры
Современные компьютеры позволяют управлять скоростными характеристиками клавиатуры, а также зажигать или гасить светодиоды Scroll Lock, Num Lock и Caps Lock, расположенные на лицевой панели клавиатуры.
Для расширенного управления клавиатурой применяется порт 60h в режиме записи. Этот порт служит для управления подчиненным процессором Intel 8042, ответственным за обмен данными с клавиатурным компьютером, или его аналогом, установленным на системной плате компьютера.
При использовании порта 60h на запись программа дополнительно получает следующие возможности:
установка времени ожидания перед переходом клавиатуры в режим автоповтора;
установка периода генерации скан-кода в режиме автоповтора;
управление светодиодами, расположенными на лицевой панели клавиатуры.
Процессор 8042 обслуживает не только клавиатуру, но и другие системы компьютера. Через порт 64h, например, выполняется сброс (отключение) процессора 80286 для возврата из защищенного режима работы в реальный. Подробности об этом вы можете узнать из 6 тома «Библиотеки системного программиста», который называется «Защищенный режим процессоров Intel 80286/80386/80486».
Перед тем как посылать команду процессору 8042, необходимо убедиться в том, что его внутренняя очередь команд пуста. Это можно сделать, прочитав слово состояния 8042 из порта с адресом 64h. Бит с номером 1 должен быть равен нулю.
Приведем фрагмент программы, составленной на языке ассемблера, проверяющий состояние очереди команд процессора 8042:
. . .
; Счетчик для ограничения времени ожидания готовности 8042
mov cx,0
wait_loop:
; Читаем порт состояния процессора 8042
in al, 64h
and al, 00000010b ; флаг готовности
; Ожидаем готовность процессора 8042 к приему команды
loopnz wait_loop
. . .
После того, как программа дождется готовности процессора 8042, она может послать ему команду, записав ее в порт с адресом 60h:
mov al, cmd ; команда для 8042
out 60h, al ; вывод команды в 8042
Некоторые команды состоят более чем из одного байта. Второй и следующие байты таких команд необходимо записывать в порт 60h, предварительно убедившись в готовности процессора 8042 с помощью приведенной выше последовательности команд. В большинстве случаев можно также использовать простую временную задержку:
mov al, cmd_byte1
out 60h, al
mov cx, 2000h
wait_loop: loop wait_loop
mov al, cmd_byte2
out 60h, al
Мы приведем формат двух команд процессора 8042, имеющих отношение к работе с клавиатурой - команду установки задержки и периода автоповтора и команду управления светодиодами, расположенными на клавиатуре.
Для установки характеристик режима автоповтора в порт 60h необходимо записать код команды 0F3h, затем байт, определяющий характеристики режима. Ниже вы найдете описание полей байта режима автоповтора:
| 
				 Биты  | 
				 Описание  | 
| 
				 0-4  | 
				 Период автоповтора, который определяет количество посылок скан-кода, генерируемых процессором клавиатуры в одну секунду. Можно использовать не только те значения, которые приведены ниже, но и промежуточные, например, 9 или 15h. 0 30.0 1 26.7 2 24.0 4 20.0 8 15.0 0Ah 10.0 0Dh 9.2 10h 7.5 14h 5.0 1Fh 2.0  | 
| 
				 5-6  | 
				 Задержка включения режима автоповтора, mc: 00 250 01 500 10 750 11 1000  | 
| 
				 7  | 
				 Зарезервировано и должно быть равно нулю  | 
Первоначально при инициализации системы BIOS устанавливает период задержки для включения режима автоповтора равным 500 мс при периоде автоповтора, равным 10 повторам в секунду. Если это слишком медленно для вас, вы можете установить другие значения.
Для управления светодиодами, расположенными на лицевой панели клавиатуры, используйте команду 0EDh. Вслед за этой командой в порт 60h необходимо записать байт, имеющий следующий формат:
| 
				 Биты  | 
				 Описание  | 
| 
				 0  | 
				 1 – включить светодиод Scroll Lock; 0 – выключить светдиод Scroll Lock  | 
| 
				 1  | 
				 1 – включить светодиод Num Lock; 0 – выключить светодиод Num Lock  | 
| 
				 2  | 
				 1 – включить светодиод Caps Lock; 0 – включить светодиод Caps Lock  | 
| 
				 
  | 
				 
  | 
