- •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
- •Литература
1.5.Графические видеорежимы
Работа со стандартными графическими режимами
Функция 0 прерывания BIOS 10h позволяет переключаться не только в текстовые режимы, описанные ранее, но и в некоторые графические. В этом разделе рассматриваются стандартные видеорежимы, т. е. поддерживаемые всеми современными видеоадаптерами (см. табл. 3).
Старые видеоадаптеры CGA поддерживают графические режимы с номерами от 4 до 6, адаптеры EGA дополнительно могут работать с режимами 0Dh - 10h. Видеорежимы 11h, 12h и 13h поддерживаются адаптерами, начиная с VGA. Дальнейшее развитие видеоадаптеров (Super VGA) не ограничивалось жесткими рамками стандартов, поэтому каждый производитель мог по-своему улучшать стандартный VGA-режим.
Кроме возможности переключения видеорежимов BIOS также предоставляет видеофункции чтения и записи точки на экране в графических режимах. Эти функции, однако, довольно медленно исполняются и редко используются в реальных программах.
INT 10h, АН = 0Ch — Вывести точку на экран
Ввод: АН = 0Сh
ВН = номер видеостраницы (игнорируется для режима 13h, поддерживающего только одну страницу)
DX = номер строки (координата точки по оси Y)
СХ = номер столбца (координата точки по оси X)
AL = номер цвета (для режимов 10h и 11h, если старший бит 1, номер цвета точки на экране будет результатом операции «исключающее ИЛИ»)
Вывод: Никакого
Так называемые строки и столбцы в графическом режиме представляют собой наборы точек, имеющих одинаковое значение координаты по оси Y и Х соответственно. Строки нумеруются сверху вниз, столбцы — слева направо, что соответствует координатным осям следующего вида (см. рис. 2):
Рис. 2. Координатные оси адресуемой плоскости экрана
Таблица 3. Основные графические режимы
-
Номер режима
Разрешение
Число цветов
Адаптер
Сегментный адрес видеопамяти
4h
320х200
4
CGA
0B800h
5h
320х200
4
CGA
0B800h
6h
640х200
2
CGA
0B800h
0Dh
320х200
16
EGA
0A000h
0Eh
640х200
16
EGA
0A000h
0Fh
640х350
3
EGA
0A000h
10h
640х350
4 или 16
EGA
0A000h
11h
640х480
2
VGA
0A000h
12h
640х480
16
VGA
0A000h
13h
320х200
256
VGA
0A000h
INT 10h, АН = 0Dh — Считать точку с экрана
Ввод: АН = 0Dh
ВН = номер видеостраницы (игнорируется для режима 13h, поддерживающего только одну видеостраницу)
DX = номер строки
СХ = номер столбца
Вывод: AL = номер цвета
Рассмотрим пример вывода на экран горизонтального отрезка:
mov ax, 0013h ; переведем экран в графический режим
int 10h
; подготовимся к выводу точки
mov al, 0Eh ; желтым цветом
mov bh, 0 ; (видеостраница - 0)
mov cx, 100 ; Х-координата начала отрезка
mov dx, 100 ; Y-координата
next: mov ah, 0Ch ; функция вывода
int 10h ; вывод
inc cx ; увеличим Х-координату очередной точки
cmp cx, 220 ; сравним с максимальным значением
jbe next ; пока меньше либо равно, повторять цикл
По окончании работы с графическим режимом обычно требуется вернуть исходный режим (обычно текстовый режим 3). Определить номер текущего видеорежима можно, прочитав значение байтовой ячейки по адресу 0040h:0049h.
Вывод цветного изображения на экран в режиме 13h также можно выполнять простым копированием соответствующих данных в видеопамять. В этом видеорежиме каждый байт области памяти, начинающейся с адреса A000h:0000h, соответствует одной точке на экране, а значение, которое может принимать этот байт (0 - 255), соответствует номеру цвета этой точки (цвета, которые соответствуют этим номерам, могут быть перепрограммированы с помощью видеофункции 10h BIOS).
В видеорежимах 11h и 12h каждый бит соответствует одной точке на экране, так что простым копированием в видеопамять можно получить только черно-белое изображение (для вывода цветного изображения в режиме 12h необходимо перепрограммировать видеоадаптер).