
- •Робер Журден. Справочник программиста на персональном компьютере фирмы 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 Чтение позиции светового пера.
6.1.3 Интерпретация ошибок принтера и восстановление после них.
Проверка ошибок не должна прекращаться на том, что Вы убеди-
лись, что принтер связан с машиной. Ошибки принтера могут проис-
ходить в любой момент печати и программа должна быть готова восс-
тановить ситуацию при сбоях. Хотя на принтере могут происходить
самые разнообразные ошибки, только три типа ошибок возвращают
информацию о себе в компьютер. Это ошибка "отсутствия бумаги",
ошибка "отсутствия связи с машиной" и общее сообщение "произошла
ошибка". Как уже говорилось в [6.1.2], не все принтеры сообщают
об этих ошибках одинаковым образом, но теоретически регистр ста-
туса ввода использует следующие биты:
бит 3 = 0 когда произошла ошибка на принтере
бит 4 = 0 когда принтер не связан с машиной (off-line)
бит 5 = 1 когда кончилась бумага на принтере
В частности, бит 4 может не использоваться указанным образом.
Регистр статуса ввода имеет адрес порта, который на 1 больше, чем
базовый адрес принтера. Базовый адрес для LPT1 хранится по адресу
0040:0008, для LPT2 - по адресу 0040:000A и т.д.
На низком уровне, когда программа посылает данные на принтер,
то она постоянно обращается к биту 7 этого регистра, чтобы прове-
рить готов ли принтер принять очередной символ. Несложно при этом
проверить при этом и бит 3, чтобы узнать о произошедшей ошибке.
Если происходит ошибка, индицируемая битами 4 и 5, то по крайней
мере бит 3 будет равен 0. Программа должна постараться проанали-
зировать ошибку, а затем может попросить пользователя исправить
ситуацию. Отметим, что функцию DOS, которая выводит символы на
принтер (функция номер 5 прерывания 21H - см. [6.3.1]), можно
заставить непрерывно проверять принтер на ошибку таймаута пос-
редством команды MODE. Перед загрузкой программы, использующей
функцию 5, надо ввести команду MODE LPT1: ,,P (еще лучше помес-
тить эту команду в файл AUTOEXEC.BAT, с тем чтобы она всегда
выполнялась при загрузке системы).
Все эти ошибки приводят к тому, что печать останавливается и
должны быть предприняты какие-то действия прежде чем она будет
продолжена. Слишком огорчительно для пользователя программы, если
большая порция документа должна будет печататься заново при воз-
никновении ошибки на принтере. Тщательное продумывание процедуры
восстановления по ошибке позволит программе возобновить печать с
начала той страницы, на которой произошла ошибка. Необходимо
всегда запоминать указатель выводимых данных при начале печати
новой страницы. При начале работы процедуры восстановления она
может попросить пользователя вставить новый лист бумаги, а затем
продолжить печать с начала той страницы, на которой произошла
ошибка.
Высокий уровень.
В Бейсике распознаются два ошибочных условия для принтера. Код
ошибки 24 возвращается когда был отменен выбор принтера, а код 27
- когда принтер выключен или в нем отсутствует бумага. Эти коды
можно получить с помощью техники обнаружения ошибок, приведенной
в [7.2.5]. К сожалению эффективно отлавливается только код 27.
Чтобы зарегистрировать код 24 требуется примерно полминуты, в
течение которых программа заморожена. Не слишком полезно прямо
читать регистр статуса перед каждой операцией печати. Этот метод
сработает перед началом печати, но ничем не поможет, если во
время печати произойдет отмена выбора принтера. Приводим процеду-
ру обработки ошибок принтера:
100 ON ERROR GOTO 1000 'устанавливаем обработку ошибок
.
.
1000 '''проверяем произошла ли ошибка на принтере
1010 IF ERR = 24 OR IF ERR = 27 THEN GOSUB 2000: RESUME
.
.
2000 BEEP: LOCATE 1,1: PRINT"Printer not ready"
2010 PRINT "Strike any key when ready"
2020 IF INKEY$ = "" THEN 2020 'ожидаем ввода
2030 RETURN
Средний уровень.
Когда функция 0 прерывания 17H выводит символ на принтер, то
она возвращает байт статуса принтера в AH. Проверяйте значение
этого байта после посылки каждого символа. BIOS слегка модифици-
рует байт статуса. Обычно бит 0 не имеет значения, но в данном
случае он устанавливается, когда происходит ошибка таймаута
(принтер не связан с машиной). В следующем примере проверяются
два типа ошибок: общая ошибка "принтер не готов" и ошибка "от-
сутствия бумаги". В примере предполагается, что в начале каждой
страницы (т.е. после каждого перевода формата) программа запоми-
нает указатель на начало выводимых данных, помещая его в перемен-
ную STARTING_PTR. Это позволяет программе при возникновении ошиб-
ки повторить печать с начала страницы, а не с начала всего доку-
мента. Конечно принтер должен быть повторно инициализирован перед
повторной печатью и должны быть восстановлены все его параметры.
(Данный пример просто иллюстрирует проверку ошибок - он ни в коей
мере не является рабочей процедурой.)
;---в сегменте данных
MESSAGE1 DB 'Printer off-line - strike any key when ready$'
MESSAGE2 DB 'Printer out of paper - strike any key when ready$'
;---посылаем символ и проверяем на ошибку
NEXT_CHAR: MOV AH,0 ;номер функции
MOV DX,0 ;выбираем LPT1
MOV AL,[BX] ;BX указывает на данные
INC BX ;увеличиваем указатель
INT 17H ;посылаем символ на принтер
TEST AH,00001000B ;выделяем бит 3 (флаг ошибки)
JZ NEXT_CHAR ;если нет ошибки, то печатаем дальше
TEST AH,00100000B ;выделяем бит 5 (отсутствие бумаги)
JZ OFF_LINE ;переход если с бумагой все в порядке
MOV AH,9 ;готовим печать сообщения
LEA DX,MESSAGE2 ;DS:DX указывает на строку
INT 21H ;выводим строку
JMP SHORT RECOVER ;уходим на восстановление
OFF_LINE: MOV AH,9 ;готовим печать сообщения
LEA DX,MESSAGE1 ;DS:DX указывают на строку
INT 21H ;выводим строку
RECOVER: MOV BX,STARTING_PTR ;восстанавливаем указатель
MOV AH,0 ;функция ожидания ввода
INT 16H ;ждем
CALL PRTR_INIT ;инициализация принтера
JMP NEXT_CHAR ;начинаем печать с начала страницы