- •1. Основы программирования для dos 9
- •1.1.7. Средства bios 21
- •2. Приемы системного программирования 57
- •Введение
- •1.Основы программирования для dos
- •1.1. Структура и выполнение программ в dos
- •Программа типа сом
- •Программа типа ехе
- •1.2.Использование служебных функций dos и bios
- •1.3.Вывод на экран в текстовом режиме
- •Средства dos
- •Средства bios
- •Выбор видеорежима
- •Управление положением курсора
- •Вывод символов на экран
- •Прямая работа с видеопамятью
- •1.4.Ввод с клавиатуры
- •Средства dos
- •Средства bios
- •1.5.Графические видеорежимы
- •Работа со стандартными графическими режимами
- •Работа с svga-режимами
- •(Продолжение таблицы 4)
- •(Окончание таблицы 4)
- •1.6.Работа с мышью
- •1.7.Другие устройства
- •Системный таймер
- •Последовательный порт
- •Параллельный порт
- •1.8.Работа с файлами
- •Создание и открытие файлов
- •Чтение из файла и запись в файл
- •Закрытие и удаление файла
- •Поиск файлов
- •Управление файловой системой
- •1.9.Управление памятью
- •Обычная память
- •Область памяти umв
- •Область памяти нма
- •Интерфейс ems
- •Интерфейс xms
- •1.10.Организация процессов
- •Запуск программ на выполнение
- •Переменные окружения
- •Командные параметры
- •2.Приемы системного программирования
- •2.1.Управляющие структуры
- •Структуры if... Then... Else
- •Структуры case
- •Конечные автоматы
- •2.2.Процедуры и функции
- •Передача параметров
- •Передача параметров по значению
- •Передача параметров по ссылке
- •Передача параметров по возвращаемому значению
- •Передача параметров по результату
- •Передача параметров по имени
- •Передача параметров отложенным вычислением
- •Передача параметров в регистрах
- •Передача параметров в глобальных переменных
- •Передача параметров в стеке
- •Передача параметров в потоке кода
- •Передача параметров в блоке параметров
- •Локальные переменные
- •2.3.Обработка прерываний
- •Обработчики прерываний
- •Прерывания от внешних устройств
- •Взаимодействие прикладных и системных обработчиков прерываний
- •2.4.Резидентные программы
- •Системные средства организации резидентных программ
- •Взаимодействие с резидентной программой
- •2.5.Драйверы устройств в dos
- •Литература
Последовательный порт
Каждый персональный компьютер оборудован коммуникационными портами
, по крайней мере, двумя последовательными портами, которые чаще всего используются для подключения мыши и модема, но также могут использоваться и для подключения других дополнительных устройств или соединения компьютеров между собой. Для работы с устройствами, подключенными к портам, такими как мышь, используются драйверы, которые общаются с последовательным портом непосредственно на уровне портов ввода-вывода и предоставляют программам некоторый набор функций более высокого уровня, так что прямая работа с последовательными портами оказывается необходимой только при написании таких драйверов, работе с нестандартными устройствами или с модемами.
DOS всегда инициализирует первый порт СОМ1 как 2400 бод, 8N1 (8 бит в слове, 1 стоп-бит, четность не проверяется) и связывает с ним устройство STDAUX. В это устройство можно записывать и считывать один байт функциями 3 и 4.
Функция DOS 03h — Считать байт из STDAUX
Ввод: АН = 03h
Вывод: AL = считанный байт
Функция DOS 04h — Записать байт в STDAUX
Ввод: АН = 04h
DL = байт
Или же можно воспользоваться функциями записи в файл (40h) и чтения из файла (3Fh), поместив в ВХ число 3, как это было показано нее для вывода на экран.
Хотя установленную DOS скорость работы порта (2400 бод) и можно изменить командой MODE, все равно отсутствие обработки ошибок, буферизации и гибкого управления состоянием порта делает эти функции DOS практически неприменимыми. BIOS позволяет управлять любым из портов, писать и читать один байт и считывать состояние порта с помощью функций прерывания 14h, но BIOS (так же как и DOS) не позволяет инициализировать порт на скорость выше, чем 9600 бод. Таким разом выясняется, что большинство программ вынуждено программировать порты напрямую, но, если в системе присутствует драйвер, предоставляющий набор сервисов FOSSIL (такие как ХОО или BNU), оказывается возможным пользоваться для полноценного буферированного обмена данными с последовательными портами только функциями прерывания 14h.
INT 14h, АН = 04 — Инициализация FOSSIL-драйвера
Ввод: АН = 04h
DX = номер порта (0 — для СОМ1, 1 — для COM2 и т. д.)
Вывод: АХ = 1954h
BL = максимальный поддерживаемый номер функции
ВН = версия спецификации FOSSIL
INT 14h, АН = 05h — Деинициализация FOSSIL-драйвера
Ввод: АН = 05
DX = номер порта (00h — 03h)
INT 14h, АН = 00 — Инициализация последовательного порта
Ввод: АН = 00h
AL = параметры инициализации:
биты 7-5:
000 — 19 200 бод (110 бод без FOSSIL)
001 — 38 400 бод (150 бод без FOSSIL)
010 — 300 бод
011 — 600 бод
100 — 1200 бод
101 — 2400 бод
110 — 4800 бод
111 — 9600 бод
биты 4 - 3: четность (01 — четная, 11 — нечетная, 00 или 10 — нет)
бит 2: число стон-бит (0 — один, 1 — два)
биты 1 - 0: длина слова (00 — 5, 01 — 6, 10 — 7, 11 — 8)
DX = номер порта (00h - 03h)
Вывод: АН = состояние порта
бит 7: тайм-ауг
бит 6: буфер вывода пуст (без FOSSIL: регистр сдвига передатчика пуст)
бит 5: в буфере вывода есть место (без FOSSIL: регистр хранения передатчика пуст)
бит 4: обнаружено состояние BREAK
бит 3: ошибка синхронизации
бит 2: ошибка четности
бит 1: ошибка переполнения — данные потеряны
бит 0: в буфере ввода есть данные
AL = состояние модема
бит 7: обнаружена несущая (состояние линии DCD)
бит 6: обнаружен звонок (состояние линии RI)
бит 5: запрос для передачи (состояние линии DSR)
бит 4: сброс для передачи (состояние линии CTS)
бит 3: линия DCD изменила состояние
бит 2: линия RI изменила состояние
бит 1: линия DSR изменила состояние
бит 0: линия CTS изменила состояние
INT 14h, АН =01 — Запись символа в последовательный порт
Ввод: АН = 01h
AL = символ
DX = номер порта (00h - 03h)
Вывод: АН = состояние порта
INТ 14h, АН = 02 — Чтение символа из последовательного порта с ожиданием
Ввод: АН = 02h
DX = номер порта
Вывод: АН = состояние порта
AL = считанный символ, если бит 7 АН равен нулю (не было тайм-аута)
INT 14h, АН = 03h — Получить текущее состояние порта
Ввод: АН = 03h
DX = номер порта (00h – 03h)
Вывод: АН = состояние линии
AL = состояние модема