
- •Робер Журден. Справочник программиста на персональном компьютере фирмы ibm Оглавление.
- •Раздел 2. Доступ к отдельным клавишам.
- •Раздел 2. Создание драйвера устройства.
- •Раздел 3. Использование специальных устройств ввода/вывода.
- •Глава 1. Системные ресурсы. Раздел 1. Ревизия системных ресурсов.
- •1.1.1 Доступ к микросхеме интерфейса с периферией 8255.
- •1.1.2 Определение типа ibm pc.
- •1.1.3 Определение версии ms dos.
- •1.1.4 Определение числа и типов адаптеров дисплея.
- •1.1.5 Определение числа и типа дисковых накопителей.
- •1.1.6 Определение числа и типа периферийных устройств.
- •1.1.7 Ревизия количества памяти.
- •Раздел 2. Управление прерываниями.
- •1.2.1 Программирование контроллера прерываний 8259.
- •1.2.2 Запрет/разрешение отдельных аппаратных прерываний.
- •1.2.3 Написание собственного прерывания.
- •1.2.4 Дополнение к существующему прерыванию.
- •Раздел 3. Управление программами.
- •1.3.1 Манипуляции с памятью.
- •1.3.2 Запуск одной программы из другой.
- •1.3.3 Использование команд интерфейса с пользователем из программы.
- •1.3.4 Сохранение программы в памяти после завершения.
- •1.3.5 Загрузка и запуск программных оверлеев.
- •1.3.6 Преобразование программ из типа .Exe в тип .Com.
- •Глава 2. Таймеры и звук. Раздел 1. Установка и чтение таймера.
- •2.1.1 Программирование микросхемы таймера 8253/8254.
- •2.1.2 Установка/чтение времени.
- •2.1.3 Установка/чтение даты.
- •2.1.4 Установка/чтение часов реального времени.
- •2.1.5 Задержка программных операций.
- •2.1.6 Операции запрограммированные во времени.
- •2.1.7 Управление работой в реальном времени.
- •2.1.8 Генерация случайных чисел с помощью микросхемы таймера.
- •Раздел 2. Создание звука.
- •2.2.1 Программирование генератора звука 76496 (только pCjr).
- •2.2.2 Генерация тона.
- •2.2.3 Генерация звука одновременно с другими действиями.
- •2.2.4 Гудок динамика.
- •2.2.5 Генерация набора тонов.
- •2.2.6 Генерация строки тонов, одновременно с другими операциями.
- •2.2.7 Создание плавного перехода тонов.
- •2.2.8 Создание звуковых эффектов.
- •2.2.9 Одновременная генерация разных звуков.
- •Глава 3. Клавиатура. Раздел 1. Управление клавиатурой.
- •3.1.1 Очистка буфера клавиатуры.
- •3.1.2 Проверка символов в буфере.
- •3.1.3 Ожидать ввод символа и не выводить его на экран.
- •3.1.4 Ожидание нажатия клавиши и эхо на экран.
- •3.1.5 Прием символа без ожидания.
- •3.1.6 Получение строки символов.
- •3.1.7 Проверка/установка статуса клавиш-переключателей.
- •3.1.8 Написание процедуры ввода с клавиатуры общего назначения.
- •3.1.9 Перепрограммирование прерывания клавиатуры.
- •Раздел 2. Доступ к отдельным клавишам.
- •3.2.3 Использование клавиш-переключателей: NumLock, CapsLock, Ins и ScrollLock.
- •3.2.4 Использование цифровой дополнительной клавиатуры и клавиш перемещения курсора.
- •3.2.5 Использование функциональных клавиш.
- •3.2.6 Перепрограммирование отдельных клавиш.
- •3.2.7 Создание макроопределений для отдельных клавиш.
- •3.2.8 Создание процедуры обработки Ctrl-Break.
- •3.2.9 Перепрограммирование клавиши PrtSc.
- •Раздел 3. Сводка кодов клавиш и применений.
- •3.3.1 Предопределенное использование клавиш.
- •3.3.2 Сводная таблица скан-кодов.
- •3.3.3 Сводная таблица кодов ascii
- •3.3.4 Сводка кодов псевдографики для построения рамок.
- •3.3.5 Сводная таблица расширенных кодов.
- •Глава 4. Вывод на терминал. Раздел 1. Управление выводом на терминал.
- •4.1.1 Программирование контроллера дисплея 6845.
- •4.1.2 Установка/проверка режима дисплея.
- •4.1.3 Установка атрибутов/цветов символов.
- •4.1.4 Установка цвета границы экрана.
- •4.1.5 Очистка части/всего экрана.
- •4.1.6 Переключение между видеоадапторами.
- •Раздел 2. Управление курсором.
- •4.2.1 Установка курсора в абсолютную позицию.
- •4.2.2 Относительное позиционирование курсора
- •4.2.3 Включение и выключение курсора.
- •4.2.4 Изменение формы курсора.
- •4.2.5 Чтение/сохранение/восстановление позиции курсора.
- •4.2.6 Создание альтернативных типов курсора.
- •Раздел 3. Вывод символов на экран.
- •4.3.1 Вывод на экран одного символа.
- •4.3.2 Вывод строки символов на экран.
- •4.3.3 Чтение символа и его атрибутов в данной позиции.
- •4.3.4 Создание специальных символов.
- •4.3.5 Сводка данных для описания символов.
- •Раздел 4. Вывод точечной графики.
- •4.4.1 Установка цветов для точечной графики.
- •4.4.2 Рисование точки на экране (монохромный, цветной и pCjr).
- •4.4.3 Рисование точки на экране (ega).
- •4.4.4 Определение цвета точки экрана.
- •4.4.5 Рисование линий на экране.
- •4.4.6 Заполнение областей экрана.
- •4.4.7 Графический вывод с использованием символов псевдографики.
- •Раздел 5. Сдвиг экрана и страницы.
- •4.5.1 Вертикальный сдвиг текстового экрана.
- •4.5.2 Сдвиг текстового экрана горизонтально.
- •4.5.3 Переключение между текстовыми страницами.
- •4.5.4 Сдвиг между страницами текста.
- •Глава 5. Дисковые накопители. Раздел 1. Управление распределением диска.
- •5.1.1 Чтение таблицы размещения файлов.
- •5.1.2 Определение доступного дискового пространства.
- •5.1.3 Получение/установка размера файла.
- •5.1.4 Восстановление после ошибок, связанных с нехваткой пространства на диске.
- •Раздел 2. Работа с каталогами диска.
- •5.2.1 Чтение/изменение корневого каталога.
- •5.2.2 Создание/удаление подкаталога.
- •5.2.3 Чтение/изменение подкаталога.
- •5.2.4 Получение/установка текущего каталога.
- •5.2.5 Получение/установка времени и даты последнего доступа к файлу.
- •5.2.6 Спрятанные и защищенные от записи файлы.
- •5.2.7 Чтение/изменение метки тома.
- •Раздел 3. Подготовка к работе с файлами.
- •5.3.1 Установка/проверка накопителя по умолчанию.
- •5.3.2 Создание/удаление файла.
- •5.3.3 Открытие/закрытие файла.
- •5.3.4 Переименование файла; изменение позиции файла в каталоге.
- •5.3.5 Подготовка к файловым операциям.
- •5.3.6 Анализ информации командной строки.
- •Раздел 4. Чтение и запись файла.
- •5.4.1 Программирование контроллера нгмд 765 и микросхемы прямого доступа к памяти 8237.
- •5.4.2 Чтение/запись определенных секторов.
- •5.4.3 Запись в последовательные файлы.
- •5.4.4 Чтение из последовательных файлов.
- •5.4.5 Запись в файлы прямого доступа.
- •5.4.6 Чтение из файлов прямого доступа.
- •5.4.7 Проверка данных после операций чтения/записи.
- •5.4.8 Определение дисковых ошибок и восстановление после них.
- •Глава 6. Принтер. Раздел 1. Управление работой принтера.
- •6.1.1 Инициализация порта принтера/повторная инициализация принтера.
- •6.1.2 Проверка того, что принтер связан с машиной.
- •6.1.3 Интерпретация ошибок принтера и восстановление после них.
- •6.1.4 Переключение между двумя или несколькими принтерами.
- •Раздел 2. Установка спецификаций печати.
- •6.2.1 Установка текстового и графического режимов.
- •6.2.2 Управление расстоянием между строками.
- •6.2.3 Управление движением бумаги.
- •6.2.4 Управление положением печатающей головки.
- •6.2.5 Установка позиций табуляции.
- •6.2.6 Изменение шрифта печати.
- •6.2.7 Сравнение возможностей принтеров ibm.
- •Раздел 3. Посылка данных на принтер.
- •6.3.1 Вывод текстовых или графических данных на принтер.
- •6.3.2 Выравнивание правого поля.
- •6.3.3 Пропорциональная печать.
- •6.3.4 Печать специальных символов.
- •6.3.5 Копирование экрана на принтер (дамп экрана).
- •Глава 7. Ввод/вывод. Раздел 1. Доступ к последовательному порту.
- •7.1.1 Программирование микросхемы uart 8250.
- •7.1.2 Инициализация последовательного порта.
- •7.1.3 Установка текущего коммуникационного порта.
- •7.1.4 Определение статуса коммуникационного порта.
- •7.1.5 Инициализация и управление модемом.
- •7.1.6 Передача данных.
- •7.1.7 Получение данных.
- •7.1.8 Посылка/получение данных с помощью коммуникационного прерывания.
- •7.1.9 Сводка управляющих кодов, используемых при коммуникации.
- •Раздел 2. Создание драйвера устройства.
- •7.2.1 Создание заголовка драйвера.
- •7.2.2 Создание стратегии устройства.
- •7.2.3 Создание обработчика прерывания устройства.
- •7.2.4 Доступ к драйверу устройства.
- •7.2.5 Обнаружение и анализ ошибок устройства.
- •Раздел 3. Использование специальных устройств ввода/вывода.
- •7.3.1 Чтение/запись с кассетного магнитофона.
- •7.3.2 Чтение позиции светового пера.
- •7.3.3 Получение аналогового ввода через игровой порт.
- •7.3.4 Получение цифрового ввода из игрового порта.
- •7.3.2 Чтение позиции светового пера.
3.2.5 Использование функциональных клавиш.
10 функциональных клавиш генерируют различные коды в сочетании
с Shift, Ctrl и Alt, что обеспечивает 40 разных вариантов. Во
всех случаях генерируется двухбайтный расширенный код, в котором
первый байт всегда ASCII 0, а второй байт приведен в таблице:
Коды Клавиши
59-68 F1-F10
84-93 Shift + F1-F10
94-103 Ctrl + F1-F10
104-113 Alt + F1-F10
Слишком много комбинаций с использованием функциональных клавиш
могут смущать пользователя, но если Вам потребовалось еще 10
комбинаций, то можно использовать сочетание <ScrollLock> + <Fn>,
как объяснено в [3.2.3].
Клавиатура PCjr имеет только 62 клавиши, по сравнению с 83 для
IBM PC и XT, и 84 для AT. Некоторые комбинации с участием функ-
циональных клавиш эмулируют часть недостающих клавиш, согласно
следующей таблице:
PCjr комбинации PC/XT/AT эквиваленты
Fn + 1-0 F1-F10
Fn + B Break
Fn + E Ctrl + PrtSc
Fn + P Shift + PrtSc
Fn + Q Ctrl + NumLock
Fn + S ScrollLock
Fn + CursorLeft PgUp
Fn + CursorRight PgDn
Fn + CursorUp Home
Fn + CursorDown End
Fn + - (скан-код серого минуса)
Fn + = (скан-код серого плюса)
Комбинации с участием клавиш-переключателей описаны в [3.2.2].
3.2.6 Перепрограммирование отдельных клавиш.
Под перепрограммированием клавиши понимается способ заставить
ее выдавать другой код. Но к тому времени, когда программа полу-
чает код нажатой клавиши, прерывание клавиатуры уже проинтерпре-
тировало входящий скан-код и преобразовало его в некоторый зара-
нее предопределенный код ASCII или расширенный код. К счастью,
начиная с MS DOS версии 2.0, система содержит средства перепрог-
раммирования клавиш. Это средство действует только если ввод
воспринимается через функции DOS ввода с клавиатуры - функции
прерывания BIOS 16H продолжают интерпретировать нажатия клавиш
нормальным образом.
Перепрограммирование доступно за счет Esc-последовательностей.
Короткая строка, которая начинается с символа Esc (ASCII 27),
предназначается для вывода на "стандартное устройство вывода",
т.е. на терминал. Но благодаря наличию кода Esc символы даже не
достигают монитора. Вместо этого такая строка заставляет MS DOS
по другому интерпретировать клавишу, указанную в этой строке.
Каждое изменение клавиши требует собственной строки, при этом
один и тот же код может присваиваться какому угодно количеству
клавиш.
Общий вид такой строки такой: она начинается с кода Esc (ASCII
27), за которым идет [, затем номер кода переопределяемой клави-
ши, затем точка с запятой (;), затем новый номер кода, присваива-
емый клавише и, наконец, символ p. Таким образом, строка
27,'[65;97p' меняет A (ASCII 65) на a (ASCII 97). Расширенные
коды записываются с указанием обоих байтов, причем за первым
нулевым байтом должны стоять точка с запятой. Строка
27,'[0;68;0;83p' присваивает клавише F10 (0;68) тот же код, что и
клавише Delete (0;83). Вы можете присваивать только расширенные
коды, приведенные в таблице расширенных кодов [3.3.5].
Имеется несколько вариантов допустимого вида строки. Во-пер-
вых, символьные клавиши могут обозначаться самим символом, заклю-
ченным в кавычки. Таким образом, строка 27,'["A";"a"p' также
меняет A на a. Во-вторых клавише может быть присвоена целая стро-
ка символов, путем указания символов или их кодовых номеров в
выражении. Строка 27,'["A";"A is for Apple"p' приведет к тому,
что при нажатии на клавишу A в верхнем регистре, будет печататься
вся строчка A is for Apple. На самом деле эти Esc-последователь-
ности - ничего более, чем строки, в которых первый код или символ
указывает какую клавишу нужно переопределить, а оставшаяся часть
строки указывает какое значение Вы хотите ей придать. Помните,
что номера кодов должны быть всегда разделены точкой с запятой, а
символы заключены в кавычки. Коды и символы могут быть перемешаны
в любых сочетаниях. Для того чтобы такие переопределения клавиш
были возможны, необходимо чтобы драйвер ANSI.SYS был загружен при
загрузке операционной системы. В противном случае Esc-последова-
тельности будут игнорироваться. В приложении Д показано как это
делается.
Некоторые аспекты функционирования клавиатуры программируются
на PCjr и AT. Процедуры доступные для AT интересны в основном для
системных программистов; поскольку они нужны весьма немногим и
достаточно сложны, то мы не будем рассматривать их здесь. При
необходимости Вам придется обратиться к Техническому руководству
по AT. В случае PCjr прерывание BIOS 16H имеет две дополнительные
функции (AH = 3 и AH = 4), первая из которых устанавливает часто-
ту автоповтора. "Частота автоповтора" - это та частота, с которой
клавиша посылает свой код, когда она постоянно держится нажатой.
Вторая функция включает и выключает звуковое подтверждение нажа-
тия клавиши. Для функции 3 надо поместить в AL 0, чтобы вернуться
к частоте автоповтора, устанавливаемой по умолчанию, 1 - чтобы
увеличить начальную задержку перед тем, как начинается режим
автоповтора, 2 - чтобы уменьшить частоту автоповтора вдвое, 3 -
чтобы установить свойства 1 и 2 вместе и 4 - выключить автоповтор
вообще. Для функции 4, поместив в AL 1, Вы будете иметь звуковое
подтверждение нажатия клавиши, а 0 - выключите его.
Высокий уровень.
К несчастью, операторы Бейсика PRINT и WRITE не работают с
Esc-последовательностями. Программы на Бейсике должны включать
простые ассемблерные подпрограммы, использующие прерывания вывода
MS DOS, обсуждаемые ниже в части "Средний уровень". В приложении
Г показано, как включить ассемблерные процедуры в программы на
Бейсике. В приведенном примере предполагается, что процедура
находится в памяти, начиная с адреса 2000:0000. Операторы DATA
содержат ассемблерный код. В конце строки переопределения клавиши
должен быть добавлен код $.
100 DATA &H55, &H8B, &HEC, &H8B, &H5E, &H06, &H8B, &H57
110 DATA &H01, &HB4, &H09, &HCD, &H21, &H5D, &HCA, &H02, &H00
120 'помещаем процедуру в память по адресу 2000:0000
130 DEF SEG = &H2000 'определяем сегмент
140 FOR N=0 TO 16 'процедура длиной 17 байт
150 READ Q 'читаем байт
160 POKE N,Q 'помещаем его в память
170 NEXT '
180 ''' меняем A на a
190 Q$ = CHR$(27)+"[65;97p$" 'строка переопределения
200 ROUTINE = 0 'указываем на строку
210 CALL ROUTINE(Q$) 'вызываем процедуру
Средний уровень.
Используйте функцию 9 прерывания 21H для посылки строки на
стандартное устройство вывода. DS:DX должны указывать на первый
символ строки в памяти и строка должна завершаться символом $
(24H). Здесь F2 (0;60) переопределяется таким образом, чтобы она
действовала как Del (0;83).
;---в сегменте данных
CHANGE_KEY DB 27,'[0;60;0;83p$'
;---для изменения определения клавиши
LEA DX,CHANGE_KEY ;DS:DX должны указывать на строку
MOV AH,9 ;номер функции
INT 21H ;переопределение клавиши