- •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
- •Литература
(Продолжение таблицы 4)
стандарт |
15-битные (32 К цветов) |
16-битные (64 К цветов) |
||||
номер |
разре-шение |
объем памяти |
номер |
разре-шение |
объем памяти |
|
VBE 1 |
10Dh |
320200 |
128 Кб |
10Eh |
320200 |
128 Кб |
110h |
640480 |
768 Кб |
111h |
640480 |
768 Кб |
|
113h |
800600 |
512 Кб |
114h |
800600 |
1 Mб |
|
116h |
1024768 |
1,5 Mб |
117h |
1024768 |
1,5 Mб |
|
119h |
12801024 |
2,5 Mб |
11Ah |
12801024 |
2,5 Mб |
|
VBE 2 |
121h |
16001200 |
3,8 Мб |
121h |
16001200 |
3,8 Мб |
(Окончание таблицы 4)
стандарт |
24- и 32-битные (16 М цветов) |
||
номер |
разре-шение |
объем памяти |
|
VBE 1 |
10Fh |
320200 |
192 Кб |
112h |
640480 |
1 Mб |
|
115h |
800600 |
1,4 Mб |
|
118h |
1024768 |
2,3 Mб |
|
119h |
12801024 |
3,7 Mб |
|
VBE 2 |
122h |
16001200 |
7,7 Мб |
Видеоадаптер может поддерживать и собственные нестандартные видеорежимы. Список их номеров можно получить, вызвав подфункцию 00h, а получить информацию о режиме по его номеру — вызвав подфункцию 0lh видеофункции 4Fh. Более того, для стандартных режимов также следует вызывать подфункцию 0lh, чтобы проверить реальную доступность режима (например, режим может быть в списке, но не поддерживаться из-за нехватки памяти). VBE 2.0 разрешает видеоадаптерам не поддерживать никаких стандартных режимов вообще.
INT 10h АН = 4Fh, AL = 0 — Получить общую SVGA-информацию
Ввод: AX = 4F00h
ES:DI = адрес буфера (512 байт)
Вывод: AL = 4Fh, если функция поддерживается
АН = 01, если произошла ошибка
АН = 00, если данные получены и записаны в буфер
Буфер для общей SVGA-информации:
+00h: 4 байта — будет содержать «VESA» после вызова прерывания, чтобы получить поля, начиная с 14h, здесь надо предварительно записать строку «VBE2»
+04h: слово — номер версии VBE в двоично-десятичном формате (0102h — для 1.2, 0200h — для 2.0)
+06h: 4 байта — адрес строки-идентификатора производителя
+0Ah: 4 байта — служебные флаги
+0Eh: 4 байта — адрес списка номеров поддерживаемых видеорежимов (массив слов, последнее слово = FFFFh, после которого обычно следует список нестандартных режимов, также заканчивающийся словом FFFFh)
+12h: слово — объем видеопамяти в 64-килобайтных блоках
+14h: слово — внутренняя версия данной реализации VBE
+16h: 4 байта — адрес строки с названием производителя
+1Ah: 4 байта — адрес строки с названием видеоадаптера
+lEh: 4 байта — адрес строки с версией видеоадаптера
+22h: слово — версия VBE/AF (BCD, то есть 0100h для 1.0)
+24h: 4 6aйтa — адрес списка номеров режимов, поддерживающих аппаратное ускорение (если бит поддержки VBE/AF установлен в 1)
+28h: 216 байт — зарезервировано VESA
+100h: 256 байт — зарезервировано для внутренних данных VBE. Так, например, в эту область копируются строки с названиями производителя, видеоадаптера, версии и т. д.
INT 10h АН = 4Fh, AL = 01 — Получить информацию о режиме
Ввод: AX = 4F01h
СХ = номер SVGA-режима (бит 14 соответствует использованию LFB, бит 13 — аппаратному ускорению)
ES:DI = адрес буфера для информации о режиме (256 байт)
Вывод: AL = 4Fh, если функция поддерживается
АН = 01h, если произошла ошибка
АН = 00h, если данные получены и записаны в буфер
Несмотря на то, что только первые 50 байт буфера заполняются содержательной информацией о режиме, этого также слишком много, чтобы описывать здесь ее всю. Укажем лишь, что младший бит первого слова буфера установлен, если режим поддерживается.
INT 10h АН = 4Fh, AL = 02 — Установить режим
Ввод: AX = 4F02h
ВХ = номер режима:
биты 0 - 6 — собственно номер режима
бит 7 — видеопамять не очищается при установке режима, если все следующие биты — нули
бит 8 — стандартный VBE SVGA-режим
бит 9 — нестандартный SVGA-режим
биты 10 - 12 — зарезервированы
бит 13 — режим использует аппаратное ускорение
бит 14 — режим использует LFB
бит 15 — видеопамять не очищается при установке режима
Кроме того, специальный номер режима 81FFh соответствует доступу ко всей видеопамяти и может использоваться для сохранения ее содержимого.
Вывод: AL = 4Fh, если функция поддерживается
АН = 00, если режим установлен
АН = 01 или 02, если произошла ошибка
INT 10h АН = 4Fh, AL = 03 — Узнать номер текущего видеорежима
Ввод: AX = 4F03h
Вывод: AL = 4Fh, если функция поддерживается
ВХ = номер режима
INT 10h АН = 4Fh AL = 05 — Перемещение окна (переключение банка видеопамяти)
Ввод: AX = 4F05h
ВН = 00 — установить окно
ВН = 01 — считать окно
BL = 00 — окно А
BL = 01 — окно В
DX = адрес окна в видеопамяти в единицах гранулярности (номер банка), если ВН = 0
Вывод: AL = 4Fh, если функция поддерживается
DX = адрес окна в единицах гранулярности (номер банка), если ВН = 1
АН = 03, если функция была вызвана в режиме, использующем LFB
Всегда предпочтительнее переключать банки прямым дальним вызовом процедуры, адрес которой возвращается подфункцией 0lh в блоке информации о видеорежиме. Все параметры передаются в процедуру точно так же, как и в подфункцию 05h, но содержимое регистров АХ и DX по возвращении не определено.
INT 10h, АН = 4Fh, AL = 07 — Установка начала изображения
Ввод: АХ = 4F07h
ВН = 00
BL = 00 — считать начало изображения
BL = 80h — установить начало изображения (в VBE 2.0 автоматически выполняется при следующем обратном ходе луча)
CX = первый изображаемый пиксель в строке (для BL = 80h)
DX = первая изображаемая строка (для BL = 80h)
Вывод: AL = 4Fh, если функция поддерживается
АН = 01, если произошла ошибка
АН = 00, если функция выполнилась успешно
ВН = 00 (для BL — 00)
СХ = первый изображаемый пиксель в строке (для BL = 00)
DX = первая изображаемая строка (для BL = 00)
С помощью этой функции можно выполнять как плавный сдвиг экрана, перемещая начало изображения на одну строку за один раз, так и быстро отображать на экране два разных изображения, изменяя одно, пока на экране показано другое, и, таким образом, создавать эффект плавной анимации.
Переключение банков всегда отнимает значительное время, так что по возможности программированием для SVGA-режимов лучше всего заниматься в 32-битном режиме с линейным кадровым буфером, например используя DOS-расширители.