
- •Робер Журден. Справочник программиста на персональном компьютере фирмы 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 Чтение позиции светового пера.
1.1.2 Определение типа ibm pc.
Имеются проблемы совместимости между различными типами IBM PC.
Для того чтобы программа могла работать на любом из IBM PC, ис-
пользуя все его возможности, необходимо чтобы она могла опреде-
лить тип машины, в которую она загружена. Эта информация содер-
жится во втором с конца байте памяти по адресу FFFFE в ROM-BIOS,
с использованием следующих ключевых чисел.
Компьютер Код
PC FF
XT FE
PCjr FD
AT FC
Высокий уровень.
В Бейсике надо просто использовать PEEK для чтения значения:
100 DEF SEG = &HF000 'указываем на верхние 64K памяти
110 X = PEEK(&HFFFE) 'читаем второй с конца байт
120 IF X = &HFD THEN ... '... тогда это PCjr
Низкий уровень.
В языке ассемблера:
;--- Определение типа компьютера:
MOV AX,0F000H ;указывает ES на ПЗУ
MOV ES,AX ;
MOV AL,ES:[0FFFEH] ;получаем байт
CMP AL,0FDH ;это PCjr?
JE INITIALIZE_JR ;переходим на инициализацию
1.1.3 Определение версии ms dos.
По мере развития MS DOS к ней добавлялись новые возможности,
многие из которых существенно облегчают написание определенных
частей программы по сравнению с предыдущими версиями. Чтобы иметь
гарантию что программа будет работать с любой версией MS DOS она
должна использовать только функции, доступные в MS DOS 1.0. В
системе предусмотрено прерывание, возвращающее номер версии MS
DOS. Это число может использоваться для проверки выполнимости
Вашей программы. Минимально, программа может при старте выдавать
сообщение об ошибке, сообщая что ей нужна другая версия MS DOS.
Средний уровень.
Функция 30H прерывания 21H возвращает номер версии MS DOS.
Старший номер версии (2 из 2.10) возвращается в AL, а младший
номер версии (10 из 2.10) возвращается в AH (обратите внимание,
что младший номер .1 возвращает значение AH, а не 1H). AL может
содержать 0, что указывает на версию MS DOS меньшую чем 2.0. Это
прерывание меняет содержимое регистров BX и CX, в которых возв-
ращается значение 0.
;--- Определение версии MS DOS:
MOV AH,30H ;номер функции получения версии
INT 21H ;получить номер версии
CMP AL,2 ;проверка на версию 2.х
JL WRONG_DOS ;если меньше 2, то выдать сообщение
1.1.4 Определение числа и типов адаптеров дисплея.
Программе может оказаться необходима информация о том, будет
ли она работать в системе с монохромным адаптером, с цветной
графической картой или с EGA, а также о наличии второго адаптера.
В пункте [4.1.6] объяснено как передать управление от одного
адаптера к другому. Байт статуса оборудования, хранящийся в об-
ласти данных ROM-BIOS по адресу 0040:0010 сообщает установку
переключателя 1, который показывает какая из карт активна. В
принципе должны иметь значение 11 для монохромной карты, 10 - для
цветной карты 80*25, 01 - для цветной карты 40*25 и 00 для EGA.
Однако при наличии EGA он может установить биты отличными от 00,
в зависимости от установки его собственных переключателей. Поэто-
му Вы должны сначала другими средствами установить наличие EGA, а
затем, если его нет, то по данным BIOS определить является ли
активным цветной или монохромный адаптер. Для проверки наличия
EGA надо прочитать байт по адресу 0040:0087. Если он равен 0, то
EGA отсутствует. Если этот байт ненулевой, то когда бит 3=0, EGA
является активным адаптером, а когда он равен 1, то активен вто-
рой адаптер.
Когда присутствует EGA, то проверка наличия монохромного или
цветного адаптера осуществляется записью значения в регистр адре-
са курсора микросхемы 6845 [4.1.1] и последующего чтения значения
и проверки их на совпадение. Для монохромной карты пошлите 0FH в
порт 3B4H, чтобы указать на регистр курсора, а затем прочитать и
записать адрес курсора через порт 3B5H. Соответствующие порты для
цветной карты 3D4H и 3D5H. Когда карта отсутствует, то порт возв-
ращает значение 0FFH; но поскольку это значение может содержаться
в регистре, то недостаточно простой проверки на это значение.
Имеются два добавочных вопроса, на которые могут потребоваться
ответы при наличии EGA: сколько имеется памяти на его карте и
какой тип монитора подсоединен? Для определения типа дисплея
проверьте бит 1 по адресу 0040:0087; когда он установлен, то
подсоединен ммонохромный дисплей, а когда он равен нулю - цвет-
ной. Если Ваша программа использует цветной графический режим с
350 строками, то надо также определить присоединен ли дисплей
IRGB или R'G'B'RGB, где последняя аббревиатура соответствует
улучшеному цветному дисплею IBM. Это определяется установкой
четырех переключателей на карте EGA. Установка этих переключате-
лей возвращается в CL при обращении к функции 12H прерывания 10H.
Цепочка четырех младших битов должна быть 0110 для улучшенного
цветного дисплея. Та же самая функция сообщает и наличие памяти
на карте EGA. Она возвращает BL, содержащий 0 для 64K, 1 - для
128, 2 - для 192 и 3 - для полных 256K памяти дисплея.
Высокий уровень.
Приведенные фрагменты кода определяют тип текущего монитора и
режим его работы, а также определяют какие типы видеоадаптеров
имеются в машине:
100 '''определение активного адаптера
110 DEF SEG = &H40 'указываем на область данных BIOS
120 X = PEEK(&H87) 'проверка на наличие EGA
130 IF X = 0 THEN 200 'EGA отсутствует, идем дальше
140 IF X AND 8 = 0 THEN... 'активный монитор EGA
.
.
200 X = PEEK(&H10) 'читаем байт статуса оборудования
210 Y = X AND 48 'выделяем биты 4 и 5
220 IF Y = 48 THEN ... '... тогда монохромный (00110000)
230 IF Y = 32 THEN ... '... тогда цветной 80*25 (00100000)
240 IF Y = 16 THEN ... '... тогда цветной 40*25 (00010000)
Следующий пример проверяет наличие монохромной карты, когда
активной является карта EGA или цветная. Тот же пример можно
использовать для проверки наличия цветной карты если использовать
адреса портов &H3D4 и &H3D5.
100 '''проверка наличия монохромной карты
110 OUT &H3B4,&HF 'адрес регистра курсора
120 X = INP(&H3B5) 'чтение и сохранение значения
130 OUT &H3B5,100 'посылаем в регистр любое значение
140 IF INP(&H3B5)<>100 THEN... 'если карта есть - вернется то же
150 OUT &H3B5,X 'восстанавливаем значение регистра
Низкий уровень.
Приведенные примеры соответствуют примерам на Бейсике.
;--- Определение активного адаптера:
MOV AX,40H ;указываем ES на область данных BIOS
MOV ES,AX ;
MOV AL,ES:[87H] ;проверяем наличие EGA
CMP AL,0 ;
JE NO_EGA ;если 0040:0087 = 0, то EGA нет
TEST AL,00001000B ;EGA есть, проверяем бит 3
JNZ EGA_NOT_ACTIVE;если бит 3=1, то EGA неактивен
.
.
EGA_NOT_ACTIVE:
MOV AL,ES:[10H] ;проверяем байт статуса дисплея
AND AL,00110000B ;выделяем биты 4 и 5
CMP AL,48 ;это монохромная карта?
JE MONOCHROME ;переход если да
Предполагая наличие монохромной карты проверим установлена ли
цветная карта (неактивная):
;--- Установлена ли неактивная цветная карта?
MOV DX,3D4H ;указываем на регистр адреса 6845
MOV AL,0FH ;запрашиваем регистр курсора
OUT DX,AL ;указываем на регистр
INC DX ;указываем на регистр данных
IN AL,DX ;получаем текущее значение
XCNG AH,AL ;сохраняем значение
MOV AL,100 ;тестовое значение 100
OUT DX,AL ;посылаем его
IN AL,DX ;считываем его снова
CMP AL,100 ;сравниваем значения
JNE NO_CARD ;переход если нет карты
XCNG AH,AL ;иначе есть цветная карта
OUT DX,AL ;тогда восстанавливаем значение