Сохранить состояние драйвера
Функция 16h позволяет записать состояние драйвера в буфер, размер которого должен быть определен с помощью функции 15h.
Регистры на входе: | AX = 0016h
ES:DX = адрес буфера для записи состояния драйвера | ||
Регистры на выходе: | Регистры не используются |
Сообщение MSH_MOUSEWHEEL
Работа мыши Microsoft IntelliMouse в среде операционных систем Microsoft Windows 95 и Microsoft Windows NT версии 3.51 обеспечивается приложением MSWheel, которое устанавливается с дискеты, входящей в комплект мыши. При повороте колеса приложение MSWheel посылает сообщение MSH_MOUSEWHEEL в функцию главного окна приложения, над которым находится курсор мыши.
Перед тем как использовать это сообщение, его необходимо зарегистрировать функцией RegisterWindowMessage:
UINT uMSH_MOUSEEHEEL = 0;
uMSH_MOUSEEHEEL = RegisterWindowMessage(MSH_MOUSEWHEEL);
Ниже мы привели парамтеры сообщения MSH_MOUSEWHEEL:
Параметр | Описание | ||
(short)wParam | Угол поворота | ||
LOWORD(lParam) | Координата X курсора мыши относительно левого верхнего угла окна | ||
HIWORD(lParam) | Координата Y курсора мыши относительно левого верхнего угла окна |
Значение угла поворота изменяется дискретно с шагом 120. Если это значение положительно, колесо поворачивается в сторону пользователя, если отрицательно – в сторону монитора компьютера (это правило может быть изменено пользователем соответствующей настройкой параметров драйвера мыши).
Получив сообщение MSH_MOUSEWHEEL, функция главного окна приложения может обработать его самостоятельно или передать дочерним окнам.
Сообщение WM_MOUSEWHEEL
Сообщение WM_MOUSEWHEEL определено в операционной системе Microsoft Windows NT версии 4.0 и будет влкючено в новую версию операционной системы Microsoft Windows 95. По своему назначению оно аналогично сообщению MSH_MOUSEWHEEL, но имеет немного другие параметры:
Параметр | Описание | ||
LOWORD(wParam) | Код виртуальной клавиши, нажатой в момент прихода сообщения | ||
(short)HIWORD(wParam) | Угол поворота | ||
(short)LOWORD(lParam) | Координата X курсора мыши относительно левого верхнего угла окна | ||
(short)HIWORD(lParam) | Координата Y курсора мыши относительно левого верхнего угла окна |
Код виртуальной клавиши может иметь следующие значения:
Код | Нажатая клавиша | ||
MK_CONTROL | <Control> | ||
MK_LBUTTON | Левая клавиша мыши | ||
MK_MBUTTON | Средняя клавиша мыши | ||
MK_RBUTTON | Правая клавиша мыши | ||
MK_SHIFT | <Shift> |
Современные компьютеры
Современные компьютеры позволяют управлять скоростными характеристиками клавиатуры, а также зажигать или гасить светодиоды 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 |
Зарезервировано и должно быть равно нулю |
Для управления светодиодами, расположенными на лицевой панели клавиатуры, используйте команду 0EDh. Вслед за этой командой в порт 60h необходимо записать байт, имеющий следующий формат:
Биты |
Описание |
0 |
1 – включить светодиод Scroll Lock; 0 – выключить светдиод Scroll Lock |
1 |
1 – включить светодиод Num Lock; 0 – выключить светодиод Num Lock |
2 |
1 – включить светодиод Caps Lock; 0 – включить светодиод Caps Lock |
/Span>1 расширенная память
Современные компьютеры всегда оснащены расширенной памятью, располагающейся в диапазоне адресов свыше одного мегабайта. Однако операционная система MS-DOS, которая была создана для реального режима работы процессоров, не имеет полноценного доступа к этой памяти. То же относится и программам, предназначенным для выполнения в среде MS-DOS. Единственное, что MS-DOS старых версий (более ранних, чем 4.0), могла сделать с расширенной памятью - это разместить там быстродействующий электронный диск или кэш накопителя на магнитном диске.
Однако в составе MS-DOS версии 4.0 и более поздних версий появился драйвер расширенной памяти HIMEM.SYS, который в некоторой степени облегчает жизнь программистам, составляющим программы для MS-DOS. Этот драйвер расширяет основное адресное пространство 640 Kбайт еще примерно на 64 Кбайт и предоставляет относительно удобное средство для хранения в расширенной памяти массивов данных.
Будучи установлен в операционной системе, драйвер HIMEM.SYS обеспечивает программный интерфейс в соответствии со спецификацией XMS (eXtended Memory Specification), разработанный корпорациями Lotus, Intel, Microsoft и AST Research.
/Span>Асинхронный последовательный адаптер
Эта глава посвящена асинхронному последовательному адаптеру. Его называют еще портом RS232-C, или асинхронным адаптером RS232-C. Компьютер IBM PC поддерживает интерфейс RS232-C не в полной мере, скорее разъем, обозначенный на корпусе компьютера как асинхронный последовательный адаптер, содержит некоторые из сигналов, входящих в интерфейс RS232-C и имеющих соответствующие этому стандарту уровни напряжения.
В настоящее время порт последовательной передачи данных используется очень широко. Вот далеко не полный список применений:
подключение мыши;
подключение графопостроителей (плотеров), сканеров, принтеров;
связь двух компьютеров через асинхронные последовательные адаптеры с использованием специального кабеля и таких программ, как FastLinx или Norton Commander;
подключение модемов для передачи данных по телефонным линиям;
подключение к сети персональных компьютеров
Практически любой современный компьютер оборудован хотя бы одним асинхронным последовательным адаптером.
/Span>Клавиатура
В этом разделе мы подробно рассмотрим одно из важнейших устройств персонального компьютера - клавиатуру. Практически ни одна программа не обходится без обращения к клавиатуре.
Программа может использовать клавиатуру по-разному. Она может задерживать свое выполнение до тех пор, пока пользователь не введет какое-нибудь число или пока не нажмет какую-нибудь клавишу. Выполняя некоторую работу, программа может периодически проверять, была ли нажата клавиша, изменяющая режим работы программы. Резидентные программы могут активизироваться, когда пользователь нажимает заранее определенную комбинацию. Можно использовать прерывание, вырабатываемое клавиатурой, например, для завершения работы программы.
Мы расскажем о работе с клавиатурой в среде MS-DOS на разных уровнях - от использования клавиатурных портов ввода/вывода до средств, предоставляемых стандартными библиотеками трансляторов C. Какой уровень вам следует выбрать, зависит от решаемой задачи. Единственное, что можно порекомендовать - это использовать по возможности средства высокого уровня. Если ваша программа обращается к клавиатуре через порты ввода/вывода, ее работоспособность может оказаться зависимой от типа клавиатуры и от модели компьютера.
Что же касается методики работы с клавиатурой в операционных системах Microsoft Windows, то она была описана в 11 томе «Библиотеки системного программиста», который называется «Операционная система Microsoft Windows для программиста».
/Span>параллельный адаптер
Следующее очень распространенное периферийное устройстов, которое мы рассмотрим в нашей книге, это параллельный адаптер. Такой адаптер есть практически в любом компьютере и обычно применяется для подключения принтера. Только в некоторых моделях блокнотных компьютеров, где принтер подключается через асинхронный последовательный адаптер, отсутствует параллельный адаптер.
Базовая система ввода/вывода BIOS может работать с тремя параллельными адапетрами. В процессе тестирования и инициализации системы BIOS находит работоспособные адаптеры и записывает их базовые адреса в таблицу. Таблица базовых адресов располагается в области данных BIOS по адресу 0000:0408h и может содержать следующие значения:
378h – параллельный адаптер LPT1;
278h – параллельный адаптер LPT2;
3BCh – параллельный адаптер на плате адаптера монохромного дисплея (сейчас это уже редкость).
Параллельные адаптеры могут вырабатывать запросы на прерывание:
LPT1 - IRQ7, INT 0Fh;
LPT2 - IRQ5, INT 0Dh
Спецификация XMS
Спецификация XMS содержит описание программного интерфейса драйвера HIMEM.SYS и рекомендации по использованию области памяти HMA.
Сравнение режимов
Первый режим – это режим совместимости с IBM PC/XT. В этом режиме скан-коды, посылаемые клавиатурой при нажатии клавиш, соответствуют приведенным нами в разделе «Средства BIOS для работы с клавиатурой». Когда пользователь нажимает клавишу, в компьютер посылается однобайтовый скан-код этой клавиши. Когда же пользователь отжимает клавишу, в компьютер посылается скан-код этой клавиши с установленным в единицу старшим битом.
Второй режим устанавливается по умолчанию после включения питания. От первого режима он отличается тем, что когда пользователь отжимает клавишу, в компьютер посылается вначале код 0F0h, а затем скан-код отжатой клавиши.
В третьем режиме каждой клавише присваивается собственный 8-разрядный код нажатия. Код, который передается при отжатии клавиши, состоит из двух байтов – байта 0Fh и байта кода нажатия. Другая особенность этого режима заключается в том, что коды, посылаемые любыми клавишами, не зависят от состояния других клавиш.
Средства BIOS для работы с клавиатурой
Набор функций для работы с клавиатурой, предоставляемый в распоряжение программиста прерыванием BIOS INT16h, включает в себя функции для выборки кода нажатого символа из буфера с ожиданием нажатия, функции для проверки содержимого буфера и для управления содержимым буфера, функции для изменения скоростных характеристик клавиатуры.
Средства BIOS для работы с таймером
Для работы с таймером (точнее говоря, для работы с каналом 0 таймера) BIOS содержит две функции прерывания INT1Ah и две функции прерывания INT 15h. Они позволяют прочитать текущее содержимое счетчика и изменить его, установить таймер с сигнализацией и сформировать программную задержку.
Средства MS-DOS для работы с клавиатурой
К сожалению, MS-DOS не предоставляет программам каких-либо существенных дополнительных возможностей по сравнению с функциями прерывания BIOS INT 16h. Поэтому многие программы работают с клавиатурой через BIOS.
Однако если ваша программа пользуется клавиатурными функциями MS-DOS, то ей доступно средство переназначения ввода операционной системы. Это возможно благодаря тому, что клавиатурные функции MS-DOS являются функциями, работающими со стандартным вводом MS-DOS, а стандартный ввод может быть переназначен.
Кроме того, некоторые клавиатурные функции автоматически посылают введенные символы на устройство стандартного вывода. По умолчанию это дисплей, но устройство стандартного вывода может быть переназначено для вывода в файл, на принтер или другое устройство.
Вообще говоря, клавиатурные функции MS-DOS больше всего подходят для тех программ, которые ведут с оператором построчный диалог. Для таких программ при использовании средств переназначения ввода/вывода возможна организация автоматического пакетного выполнения, когда все сообщения выводятся в файл, а все данные, которые обычно вводятся с клавиатуры, считываются из заранее подготовленного файла "ответов".
Некоторые клавиатурные функции MS-DOS отслеживают комбинации клавиш <Control+C> и <Control+Break>. Если оператор ввел такую комбинацию клавиш, вызывается прерывание INT 23h, завершающее работу текущей программы. Если ваша программа не должна завершаться при нажатии этих комбинаций клавиш, можно либо создать и подключить собственный обработчик для INT 23h, либо использовать те клавиатурные функции MS-DOS, которые не выполняют проверку указанных выше комбинаций клавиш.
Приведем подробное описание клавиатурных функций прерывания MS-DOS INT 21h.
Средства MS-DOS для работы с таймером
MS-DOS использует четыре функции прерывания INT 21h для работы с системным таймером. Эти функции позволяют узнать и установить текущие дату и время. MS-DOS версии 3.30 и более поздних версий при установке времени и даты изменяет также показания часов реального времени.
Стандартная оперативная память
Прерывание INT 12h возвращает в регистре AX размер стандартной оперативной памяти в килобайтах. Заметим, что это значение, хранящееся в области данных BIOS с адресом 0040h:0013h, не превышает 640 Кбайт, даже если в компьютере установлено более 64 Мбайт оперативной памяти.
Стандартный обработчик прерывания INT 09h
Как работает стандартный обработчик клавиатурного прерывания, входящий в состав BIOS?
Этот обработчик выполняет следующие действия:
читает из порта 60h скан-код нажатой клавиши;
записывает вычисленное по скан-коду значение кода ASCII нажатой клавиши в специальный буфер клавиатуры, расположенный в области данных BIOS;
устанавливает в единицу бит 7 порта 61h, разрешая дальнейшую работу клавиатуры;
возвращает этот бит в исходное состояние;
записывает в порт 20h значение 20h для правильного завершения обработки аппаратного прерывания.
Обработчик прерывания INT 09h не просто записывает значение кода ASCII в буфер клавиатуры, но также выполняет и другие действия. Например, он дополнительно отслеживает нажатие пользователем таких комбинаций клавиш, как <Ctrl+Alt+Delete>, обрабатывает специальные клавиши <PrintScreen> и <SysReq>. При вычислении кода ASCII нажатой клавиши учитывается состояние клавиш <Shift> и <CapsLock>.
Таймер и музыка
Одно из наиболее распространенных применений таймера - генерация звуковых сигналов и проигрывание музыки. Таймер позволяет проигрывать музыку в фоновом режиме, то есть во время работы программы может звучать музыка.
Текущее столетие
В компьютерах IBM PC/AT этот байт содержит текущее столетие в двоично-десятичном коде, то есть 19 столетие записано как 19h.
Компьютеры модели IBM PS/2 используют эту ячейку вместе с ячейкой 33h для хранения контрольной суммы ячеек с адресами от 10h до 31h. При этом старший байт контрольной суммы хранится в ячейке 32h, а младший - 33h.
- Тип накопителей НГМД
Младшая и старшая тетрады этого байта описывают, соответственно, второй и первый НГМД:
Значение | Емкость НГМД | ||
0000 | НГМД не установлен | ||
0001 | 360 Кбайт | ||
0010 | 1,2 Мбайт | ||
0011 | 720 Кбайт | ||
0100 | 1.44 Мбайт |
- Тип первого и второго НМД
Этот байт разделен на две тетрады аналогично байту, описывающему НГМД. Однако в тетраде можно закодировать только 16 различных значений, а типов НМД значительно больше. Поэтому тип 15 используется специальным образом - если тип НМД в младшей тетраде (первый физический НМД) равен 15, то правильное значение типа находится в памяти CMOS по адресу 19h. Аналогично для второго физического НМД этот тип можно взять из байта по адресу 1Ah (если старшая тетрада байта с адресом 12h равна 15).
Таблица стандартных типов НМД была приведена в третьей книге первого тома, в разделе, посвященном конфигурации дисковой подсистемы. Кроме того, сведения о типах дисков, задаваемых программой BIOS Setup, обычно есть в документации, поставляемой вместе с компьютером.
В современных компьютерах установлены НМД с интерфейсом IDE или SCSI.
В первом случае тип диска устанавливается равным 47. Это означает. Что фактические параметры диска хранятся в старших ячейках памяти CMOS, номера которых зависят от изготовителя и версии BIOS.
Тип НМД с интерфейсом SCSI задается как 1 или 0. Фактические параметры НМД определяются BIOS, расположенной в контроллере SCSI.
Типы клавиатур
До недавнего времени существовали три различных типа клавиатуры. Это клавиатура для компьютеров IBM PC/XT, 84-клавишная клавиатура для IBM PC/AT и 101-клавишная (расширенная) клавиатура для IBM PC/AT. Некоторые клавиатуры имеют переключатель режима работы (XT/AT), расположенный на нижней крышке. Он должен быть установлен в правильное положение.
После того как операционная система Microsoft Windows получила широкое распространение, специально для нее был создан новый тип клавиатуры. К обычной клавиатуре типа IBM PC/AT были добавлены две кнопки, первая из которых дублирует вызов меню Start, выполняемый при помощи левой клавиши мыши, а вторая – вызов того же меню при помощи правой клавиши мыши.
Трансцендентные команды
Трансцендентные команды предназначены для вычисления таких функций, как тригонометрические (sin, cos, tg,...), обратные тригонометрические (arcsin, arccos,...), показательные (xy, 2x, 10x, ex), гиперболические (sh, ch, th,...), обратные гиперболические (arsh, arch, arcth,...).
В следующей таблице приведены все трансцендентные команды сопроцессора:
Команда | Описание | ||
FPTAN | Вычисление частичного тангенса | ||
FPATAN | Вычисление частичного арктангенса | ||
FYL2X | Вычисление y*log2(x) | ||
FYL2XP1 | Вычисление y*log2(x+1) | ||
F2XM1 | Вычисление 2x-1 | ||
FCOS | Вычисление cos(x) | ||
FSIN | Вычисление sin(x) | ||
FSINCOS | Вычисление sin(x) и cos(x) одновременно |
Команда FPTAN вычисляет частичный тангенс ST(0), размещая в стеке такие два числа x и y, что y/x = tg(ST(0)).
После выполнения команды число y располагается в ST(0), а число x включается в стек сверху (то есть записывается в ST(1)). Аргумент команды FPTAN должен находится в пределах:
0 <= ST(0) <= pi/4
Пользуясь полученным значением частичного тангенса, можно вычислить другие тригонометрические функции по следующим формулам:
sin(z) = 2*(y/x) / (1 + (y/x)2)
cos(z) = (1 - (y/x)2) / (1 + (y/x)2)
tg(z/2) = y/x;
ctg(z/2) = x/y;
cosec(z) = (1 + (y/x)2) / 2*(y/x)
sec(z) = (1 + (y/x)2) / (1 - (y/x)2)
В этой таблице z - значение, находившееся в ST(0) до выполнения команды FPTAN, x и y - значения в регистрах ST(0) и ST(1), соответственно.
Команда FPATAN вычисляет частичный арктангенс:
z=arctg(ST(0)/ST(1))=arctg(x/y).
Перед выполнением команды числа x и y располагаются в ST(0) и ST(1), сответственно. Аргументы команды FPATAN должен находится в пределах:
0 < y < x
Результат записывается в ST(0).
Команда FYL2X вычисляет выражение y*log2(x), операнды x и y размещаются, соответственно, в ST(0) и ST(1). Операнды извлекаются из стека, а результат записывается в стек. параметр x должен быть положительным числом.
Пользуясь результатом выполнения этой команды, можно вычислить следующим образом логарифмические функции:
log2(x) = FYL2(x)
loge(x) = loge(2) * log2(x) = FYL2X(loge(2), x) =
= FYL2X(FLDLN2, x)
log2(x) = log10(2) * log2(x) = FYL2X (log10(2), x) =
= FYL2X(FLDLG2, x)
Функция FYL2XP1 вычисляет выражение y*log2(x+1), где x соответствует ST(0), а y - ST(1). Результат записывается в ST(0), оба операнда выталкиваются из стека и теряются.
На операнд x накладывается ограничение:
0 < x < 1 - 1/sqrt(2)
Команда F2XM1 вычисляет выражение 2x-1, где x - ST(0). Результат записывается в ST(0), параметр должен находится в следующих пределах:
0 <= x <= 0,5
Команда FCOS вычисляет cos(x). Параметр x должен находится в ST(0), туда же записывается результат выполнения команды.
Команда FSIN аналогична команде FCOS, но вычисляет значение косинуса ST(0).
Команда FSINCOS вычисляет одновременно значения синуса и косинуса параметра ST(0). Значение синуса записывается в ST(1), косинуса - в ST(0).
На этом мы закончим описание трансцендентных команд сопроцессора и перейдем к управляющим командам.
Управление звуковыми каналами
// ---------------
// Код функции 3
// ---------------
#pragma pack(1)
typedef struct _ChanControl
{
BYTE bFunctionCode;
BYTE bInpChannel0;
BYTE bVolControl0;
BYTE bInpChannel1;
BYTE bVolControl1;
BYTE bInpChannel2;
BYTE bVolControl2;
BYTE bInpChannel3;
BYTE bVolControl3;
} ChanControl;
Поле | Описание | ||
bFunctionCode | Код функции | ||
bInpChannel0 | Номер входного канала, присвоенного выходному каналу 0 | ||
bVolControl0 | Уровень громкости для канала 0 | ||
bInpChannel1 | Номер входного канала, присвоенного выходному каналу 1 | ||
bVolControl1 | Уровень громкости для канала 1 | ||
bInpChannel2 | Номер входного канала, присвоенного выходному каналу 2 | ||
bVolControl2 | Уровень громкости для канала 2 | ||
bInpChannel3 | Номер входного канала, присвоенного выходному каналу 3 | ||
bVolControl3 | Уровень громкости для канала 3 |
Управляющие команды
Управляющие команды предназначены для работы с нечисловыми регистрами сопроцессора. Некоторые команды имеют альтернативные варианты. Мнемоники этих команд могут начинаться с FN или с F. Первый вариант соответствует командам "без ожидания". Для таких команд процессор не проверяет, занят ли сопроцессор выполнением команды, то есть бит занятости B не проверяется. Численные особые случаи также игнорируются.
Варианты команд "с ожиданием" действуют также, как и обычные команды сопроцессора.
Приведем список управляющих команд сопроцессора:
FNSTCW (FSTCW) Записать управляющее слово
FLDCW Загрузить управляющее слово
FNSTSW (FSTSW) Записать слово состояния
FNSTSW AX (FSTSW AX) Записать слово состояния в AX,
нет в сопроцессоре 8087
FNCLEX (FCLEX) Сбросить особые случаи
FNINIT (FINIT) Инициализировать сопроцессор
FNSTENV (FSTENV) Записать среду
FLDENV Загрузить среду
FNSAVE (FSAVE) Записать полное состояние
FRSTOR Восстановить полное состояние
FINCSTP Увеличить указатель стека на 1
FDECSTP Уменьшить указатель стека на 1
FFREE Освободить регистр
FNOP Холостая команда, нет операции
FSETPM Установить защищенный режим работы
Команда FNSTCW записывает содержимое управляющего регистра в оперативную память.
Команда FLDCW загружает управляющий регистр данными из оперативной памяти и обычно используется для изменения режима работы сопроцессора.
Команда FNSTSW записывает содержимое регистра состояния в оперативную память. Команда FNSTSW AX записывает содержимое этого регистра в регистр AX центрального процессора для его последующего анализа командами условных переходов.
Сопроцессор 8087 не имеет варианта команды FSTSW AX, поэтому приходится вначале записывать регистр состояния в память, а затем в регистр флагов процессора 8086.
Команда FNCLEX сбрасывает флаги особых случаев в регистре состояния сопроцессора.
Кроме того, сбрасываются биты ES и B.
Команда FNINIT инициализирует регистр состояния, управляющий регистр и регистр тегов в соответствии со следующей таблицей:
Регистр |
Режим работы |
Управляющий |
Проективная бесконечность, округление к ближайшему, расширенная точность, все особые случаи замаскированы |
Состояния |
B=0 (бит занятости сброшен), код условия не определен, ST=ES=0, флаги особых случаев установлены в нуль |
Тегов |
Все поля регистра тегов содержат значение 11 (пустой регистр) |
Рис. 10.18. Формат записи в память содержимого всех регистров командой FNSTENV
Команда FLDENV предназначена для загрузки регистров, сохраненных ранее командой FNSTENV. Обе эти команды полезны в программах обработки особых случаев.
Команды FNSAVE и FRSTOR действуют аналогично командам FNSTENV и FLDENV, но они дополнительно сохраняют и восстанавливают содержимое численных регистров. Формат области сохранения регистров, занимающей 94 байта, приведен на рис. 10.19.
Рис. 10.19. Формат записи в память содержимого всех регистров командами FNSAVE и FRSTOR
Команды FINCSTP и FDECSTP увеличивают и уменьшают на 1 указатель стека SP, соответственно.
Команда FFREE ST(i) помечает численный регистр ST(i) как пустой, записывая в соответствующее поле регистра тегов значение 11.
Команда FNOP не производит никаких действий.
Команда FSETPM переводит сопроцессор в защищенный режим работы.
Установить альтернативный драйвер событий
Функция 18h предназначена для установки альтернативного драйвера событий:
Регистры на входе: | AX = 0018h
CX = маска вызова; ES:DX = адрес подключаемого драйвера событий | ||
Регистры на выходе: | AX = результат установки:
0018h - драйвер успешно установлен; FFFFh - ошибка при установке драйвера |
По сравнению с функцией 0Ch эта функция обеспечивает дополнительные возможности:
проверка состояния клавиш <Shift>, <Control>, <Alt> во время нажатия на клавиши мыши;
возможность одновременной установки до трех драйверов событий, каждый из которых использует свою маску событий, задаваемых в регистре CX.
При попытке установить два драйвера с одной и той же маской событий функция возвращает в регистре AX код ошибки FFFFh. В этом случае вы можете использовать функцию 19h для получения адреса предыдущего установленного драйвера событий, отключить его и повторить попытку подключения своего драйвера.
Функция 18h может применяться для отключения драйвера событий, если в регистрах ES:DX указать его адрес и при этом задать в регистре CX значение маски, равное 0.
Установить будильник
Регистры на входе: | AH = 06h
CH = часы в BCD-формате; CL = минуты в BCD-формате; DH = секунды в BCD-формате | ||
Регистры на выходе: | CF = CY = 1, если часы реального времени не установлены |
Эта функция позволяет установить будильник на заданное время. Когда будильник “зазвенит”, будет вызвано прерывание INT 4Ah (его вызывает BIOS после прихода аппаратного прерывания от часов реального времени IRQ8, то есть прерывания с номером 70h). Программа, использующая функцию будильника, должна подготовить обработчик прерывания INT 4Ah, завершающий свою работу выполнением команды IRET.
Заметим, что можно установить только один будильник.
Установить частоту прерываний для Inport Mouse
Мышь периодически вырабатывает сигнал прерывания, по которому драйвер считывает текущее состояние мыши. С помощью функции 1Ch вы можете изменять частоту появления прерываний, но только для мыши системы Inport Mouse (тип мыши нетрудно определить с помощью функции 24h).
Регистры на входе: | AX = 001Сh
BX = код скорости прерываний: 1 - нет прерываний; 2 - 30 прерываний в секунду; 4 - 50 прерываний в секунду; 8 - 100 прерываний в секунду; 16 - 200 прерываний в секунду | ||
Регистры на выходе: | Регистры не используются |
Чем больше частота прерываний, тем больше точность определения состояния мыши.
Установить часы реального времени
Регистры на входе: | AH = 03h
CH = часы в BCD-формате (например, 13h означает 13 часов); CL = минуты в BCD-формате; DH = секунды в BCD-формате; DL = 1, если необходимо использовать летнее время | ||
Регистры на выходе: | Регистры не используются |
Установить чувствительность мыши
Функция 1Ah является комбинацией функций 0Fh и 13h. Она позволяет одновременно устанавливать чувствительность мыши и порог удвоения скорости.
Регистры на входе: | AX = 001Ah
BX = горизонтальная чувствительность в миках на пиксел; CX = вертикальная чувствительность в миках на пиксел; DX = значение порога удвоения, мики в секунду | ||
Регистры на выходе: | Регистры не используются |
Установить дату в часах реального времени
Регистры на входе: | AH = 05h
CH = столетие в BCD-формате; CL = год в BCD-формате (например, CX=1997h означает 1997 год); DH = месяц в BCD-формате; DL = число в BCD-формате; | ||
Регистры на выходе: | Регистры не используются |
Установить драйвер событий
Функция 0Ch позволяет программе создать свой собственный драйвер (обработчик) событий, связанных с перемещением мыши, а также с нажатием или отпусканием клавиш мыши.
Регистры на входе: | AX = 000Ch
CX = маска вызова; ES:DX = адрес подключаемого драйвера событий | ||
Регистры на выходе: | Регистры не используются |
Биты маски вызова, передаваемой функции в регистре CX, определяют условие вызова драйвера событий:
Бит маски вызова | Когда выполняется вызов | ||
0 | Перемещение мыши | ||
1 | Нажатие левой клавиши | ||
2 | Отпускание левой клавиши | ||
3 | Нажатие правой клавиши | ||
4 | Отпускание правой клавиши | ||
5 | Нажатие средней клавиши | ||
6 | Отпускание средней клавиши |
Если записать в регистр CX значение 7Fh, драйвер будет вызываться при возникновении любого события, а если 00h – драйвер будет отключен.
Адрес процедуры драйвера передается при вызове функции в регистровой паре ES:DX. Драйвер должен быть оформлен в виде процедуры типа FAR, завершающейся командой дальнего возврата RETF.
Когда драйвер получает управление, в регистрах процессора содержатся следующие значения:
Регистр | Описание | ||
AX | Маска вызова, такая же, как и при вызове функции 0Ch | ||
BX | Состояние клавиш мыши:
бит 0 - левая клавиша; бит 1 - правая клавиша; бит 2 - средняя клавиша | ||
CX | Координата X курсора мыши | ||
DX | Координата Y курсора мыши | ||
SI | Относительное перемещение мыши по горизонтали в миках | ||
DI | Относительное перемещение мыши по вертикалив миках | ||
DS | Сегмент данных драйвера мыши |
Так как регистр DS при вызове драйвера событий содержит сегмент данных драйвера мыши, ваш драйвер событий должен позаботиться о правильной установке этого регистра. Однако драйвер событий не обязан сохранять и восстанавливать содержимое регистра DS и других регистров процессора.
Отметим, что если вам необходимо отключить драйвер, выполните повторный вызов функции 0Ch, записав в регистр CX нулевое значение. Если ваша программа, устанавливающая собственный драйвер событий, завершает свою работу и передает управление MS-DOS, предварительно она обязательно должна отключить драйвер событий.
Составление программы драйвера событий имеет некоторые особенности. Драйвер событий вызывается не из программы пользователя, а из драйвера мыши. При этом сегментный регистр DS будет указывать на сегмент данных драйвера мыши, а не на сегмент данных вашей программы.
Драйвер событий может также организовать очередь событий, записывая в эту очередь состояние мыши на момент появления события и время появления события. Прикладная программа будет затем извлекать события из очереди и анализировать их.
Установить курсор
Обычно курсор мыши устанавливает не программа, а пользователь. Однако с помощью функции 04h программа тоже может установить курсор в заданную позицию.
Регистры на входе: | AX = 0004h
CX = новая координата X курсора; DX = новая координата Y курсора | ||
Регистры на выходе: | Регистры не используются |
Для текстового режима устанавливаемые номера строки и столбца должны быть умножены на 8.
В том случае, когда программа пытается установить курсор в область, где курсор невидим (эта область задается функцией 10h), то она сможет это сделать. Курсор при этом исчезнет с экрана, что не всегда желательно.
Если область для перемещения курсора была ограничена при помощи функций 07h или 08h, то курсор будет вести себя следущим образом. При попытке установить курсор за границу области ограничения, он будет установлен в точку, которая находится внутри границы на минимальном расстоянии от точки, заданной при вызове функции.
Установить номер страницы видеопамяти
Функция 1Dh задает номер страницы видеопамяти, на которой будет отображаться курсор мыши. По умолчанию для отображения используется страница 0.
Регистры на входе: | AX = 001Dh
BX = номер страницы видеопамяти | ||
Регистры на выходе: | Регистры не используются |
Установить область исключения для курсора
Функция позволяет задать на экране прямоугольную область, в которой автоматически выключается изображение курсора мыши - область исключения. Эта область отменяется функциями 01h (включить курсор мыши) и 00h (инициализация).
Регистры на входе: | AX = 0010h
CX, DX = координаты (X, Y) верхнего левого угла области исключения; SI, DI = координаты (X, Y) нижнего правого угла области исключения | ||
Регистры на выходе: | Регистры не используются |
Оператор может поместить курсор мыши в область исключения, при этом изображение курсора пропадет.
Основное назначение этой функции - предоставить программе возможность изменять содержимое области экрана, не выключая изображение курсора. Недостаток наличия области исключения – пользователь может потерять курсор мыши, если он случайно окажется в такой области.
Установка даты
Для установки даты используйте функцию 2Bh:
Регистры на входе: | AH = 2Bh
DL = день (0...31); DH = месяц (1...12); CX = год (1980...2099) | ||
Регистры на выходе: | AL = 0, если установка выполнена правильно;
AL = FFh, если при установке были заданы неправильные параметры |
Установка драйвера HIMEM.SYS
Для установки драйвера файл CONFIG.SYS должен содержать строку:
device=[d:][путь]himem.sys [/HMAMIN=h] [/NUMHANDLES=n]
Параметр /HMAMIN= (необязательный) задает минимальный размер памяти, который могут использовать программы в области HMA. Размер задается в килобайтах. Смысл использования этого параметра заключается в том, чтобы позволять использовать область HMA только тем программам, которые затребуют из этой области не меньше h Кбайт. Это нужно для того чтобы более эффективно использовать область HMA.
Если параметр не задан, используется по умолчанию значение 0. Это означает, что первая же программа, запросившая область HMA, получит к ней доступ. Программа, запущенная следом и, возможно, использующая эту память эффективнее, уже не сможет воспользоваться областью HMA.
Максимальное значение параметра h равно 63.
Параметр /NUMHANDLES= задает максимальное количество областей расширенной памяти (блоков EMB), которое может быть запрошено программами. Диапазон задаваемых значений от 1 до 128, значение по умолчанию - 32. Задавая большие значения n, помните, что на управление каждым блоком EMB тратится 6 байт резидентной памяти.
При установке драйвер HIMEM.SYS может выдавать сообщения об ошибках в следующих случаях:
используется MS-DOS более старой версии, чем 3.00;
в компьютере установлен процессор 8086 или 8088;
при использовании компьютеров с нестандартными схемами управления расширенной памятью и линией A20
Установка переключателей конфигурации
Как правило, матричные принтеры позволяют устанавливать режим своей работы с помощью переключателей режима. Для доступа к этим переключателям вам не надо разбирать принтер или снимать крышку корпуса - эти переключатели располагаются в легкодоступном месте.
Некоторые принтеры, например, струйные и лазерные, не имеют переключателей режимов. Для задания режимов используется клавиатура и небольшой дисплей на корпусе принтера. Режим такого принтера хранится в памяти CMOS, которая установлена в принтере и питается от аккумулятора. Поэтому установленный режим не сбрасывается при выключении питания принтера.
Установка счетчика таймера
Изменить содержимое счетчика таймера можно с помощью следующей функции:
Регистры на входе: | AH = 01h
CX = старший байт счетчика; DX = младший байт счетчика | ||
Регистры на выходе: | Регистры не используются |
Функцию чтения таймера можно использовать для организации программной задержки. Так как работа таймера не зависит от производительности процессора, быстродействие системы не будет влиять на формируемую задержку.
Однако следует учитывать, что точность формирования задержки определяется частотой обновления счетчика таймера (18.2 Гц), и может оказаться недостаточной для некоторых приложений.