Главная » Ассемблер, Железо » Функции VESA BIOS

0

Программистам приходится иметь дело с прерываниями VESA BIOS в тех случаях, когда система функционирует под управлением любой типовой однозадачной (например, MS-DOS) или самодельной многозадачной (например, Linux) операционной системы, так как фирмы-изготовители поставляют драйверы только для Windows.

Стандарт VESA унифицировал некоторые наиболее важные операции при работе с видеоконтроллером — установку видеорежимов и управление видеопамятью. Начиная с версии 2.0, данный стандарт поддерживает работу с линейным буфером видеопамяти. Полное описание стандарта VESA 3.0 на английском языке [96] можно свободно загрузить из Интернета с сервера ассоциации VESA (www.vesa.org).

Обращение к VESA BIOS выполняется по прерыванию 10h с номером функции 4Fh. После выполнения вызова в регистре АХ будет возвращен код результата (статус возврата). В AL будет находиться основной код возврата: если AL = 4Fh — вызов успешно выполнен, если AL ф 4Fh — вызванная функция не поддерживается данной версией BIOS. В АН будет записан код, поясняющий результат:

•           0 — вызов функции успешно выполнен;

•           1 — вызов не выполнен;

•       2 — функция не поддерживается в данной аппаратной конфигурации;

•           3 — вызов функции невозможен в данном видеорежиме. Рассмотрим некоторые наиболее полезные функции VESA BIOS 2.0, которые поддерживаются распространенными в настоящее время моделями видеоконтроллеров (в новой редакции стандарта VESA 3.0 изменения в эти функции не вносились).

Прерывание Int 10h, функция 4Fh, подфункция OOh: получить информацию о версии VESA BIOS

Функция предназначена для считывания информации о версии VESA BIOS (информация представлена в виде структуры, описанной в табл. 4.2).

Перед вызовом прерывания требуется занести в регистры следующие значения:

•       в АХ – код 4F00h;

•       в ES: DI — адрес буфера объемом 512 байт для сохранения информации о версии VESA BIOS (информация сохраняется в виде структуры, описанной в табл. 4.2).

Таблица 4.2. Формат информации VESA BIOS

Смещение

Размер

Описание

OOh

4 байта

Сигнатура ‘VESA’

04h

WORD

Номер версии VESA (0200h или 0300h)

06 h

DWORD

Указатель на строку OEM (с наименованием микросхемы видеоконтроллера)

OAh

4 байта

Возможности графического контроллера:

бит 0: 0 — 6-разрядный ЦАП, 1 — 8-разрядный;

бит 1:0 — контроллер VGA-совместимый,

1 — несовместимый;

бит 2: 0 — обычная работа с RAMDAC,

1 — при программировании больших блоков

информации в RAMDAC использовать бит

очистки функции 09h;

биты 3-31 зарезервированы

OEh

DWORD

Указатель на список видеорежимов, поддерживаемых VESA и OEM

12h ,

WORD

Число 64-килобайтных блоков памяти (объем видеопамяти, деленный на 64 Кбайт)

14h

WORD

Код версии программной реализации VESA

16h

DWORD

Указатель на строку с названием фирмы-изготовителя

1Ah

DWORD

Указатель на строку с названием изделия

1Eh

DWORD

Указатель на строку с кодом версии изделия

22h

222 байта

Зарезервировано для последующих версий

100h

256 байт

Область данных для строк OEM

Подфункцию 00h необходимо вызвать перед началом использования других VESA-функций. Она позволяет определить, имеется ли у видеоконтроллера поддержка команд VESA, и если да — то какой версии. Чтобы имелась возможность использования линейного буфера, версия VESA должна быть не ниже 2.0. Вначале нужно убедиться, что функция была выполнена: после вызова функции в регистре AL должен находиться код 4Fh. Затем следует проверить наличие сигнатуры ‘VESA’ в четырех первых байтах возвращенного функцией блока данных, а также убедиться, что байт со смещением 05h от начала блока (старший байт номера версии) содержит значение не меньше 2.

Прерывание Int 10h, функция 4Fh, подфункция 01 h: получить информацию о параметрах видеорежима

Функция позволяет проверить наличие в данной версии BIOS режима с заданным номером и определить его свойства.

Перед вызовом прерывания требуется занести в регистры следующие значения:

•           в АХ — код 4F01h;

•           в CX — код видеорежима, параметры которого нужно определить;

•       в ES: DI — адрес буфера объемом 256 байт для сохранения информации о видеорежиме (табл. 4.3).

Таблица 4.3. Формат информации о видеорежиме

Смещение Размер

Описание

00 h WORD

Атрибуты режима:

 

бит 0: 0 — режим не поддерживается, 1 — режим

 

поддерживается;

 

бит 1: всегда 1 (зарезервирован);

 

бит 2: 0 — TTY функции не поддерживаются,

 

1 — TTY функции поддерживаются;

 

битЗ: 0 — монохромный режим, 1 — цветной режим;

 

бит 4: 0 — текстовый режим, 1 — графический

 

режим;

 

бит 5:0 — VGA-совместимый режим,

 

1 – VGA-несовместимый режим;

Смещение

Размер

Описание

 

 

бит 6:0 — режим оконной адресации видеопамяти

 

 

поддерживается, 1 — не поддерживается;

 

 

бит 7: 0 — режим линейной адресации видеопамяти

 

 

не поддерживается, 1 — поддерживается;

 

 

биты 8-15 зарезервированы

02h

BYTE

Атрибуты окна А:

бит 0:0 — окно неперемещаемое,

1 — поддерживается перемещение окна;

бит 1:0 — чтение из окна запрещено, 1 — разрешено;

бит 2:0 — запись в окно запрещена, 1 — разрешена;

биты 3-7 зарезервированы

03h

BYTE

Атрибуты окна В (аналогично байту атрибутов окна А)

04h

WORD

Гранулярность (дробность) окна (наименьшая величина в килобайтах, на которую можно переместить окно)

06h

WORD

Размер окна в килобайтах

08h

WORD

Начальный сегмент окна А в адресном пространстве процессора

OAh

WORD

Начальный сегмент окна В

OCh

DWORD

FAR-адрес функции позиционирования окна (она эквивалентна функции 4Fh с подфункцией 05h)

10h

WORD

Число байтов, которое приходится на одну строку развертки

12h

WORD

Горизонтальное разрешение экрана в пикселах (в графическом режиме) или знакоместах (в текстовом режиме)

14h

WORD

Вертикальное разрешение экрана в пикселах или знакоместах

16h

BYTE

Ширина знакоместа в пикселах

17h

BYTE

Высота знакоместа в пикселах

18h

BYTE

Число плоскостей памяти

19h

BYTE

Число битов на пиксел

1Ah

BYTE

Число банков памяти

1Bh

BYTE

Тип модели памяти:

00h — текстовый режим;

01 h — графический режим CGA;

02h — графический режим Hercules;

03h — пленарный режим;

Таблица 4.3 (продолжение)

Смещение

Размер

Описание

 

 

04h — режим упакованных пикселов;

 

 

05h — нецепочечный режим № 4, 256 цветов;

 

 

06h — режим Direct Color (HiColor или TrueColor);

 

 

07h — режим YUV;

 

 

08h-0Fh — зарезервировано для дополнений

 

 

VESA;

 

 

1Oh-FFh — зарезервировано для дополнений OEM

1Ch

BYTE

Размер банка памяти в килобайтах

1Dh

BYTE

Число полных видеостраниц (экранов),

 

 

помещающихся в видеопамяти, минус единица

1 Eh

BYTE

Зарезервирован

Поля Direct Color

1Fh

BYTE

Размер компоненты красного цвета в битах

20h

BYTE

Начальная битовая позиция компоненты

 

 

красного цвета

21h

BYTE

Размер компоненты зеленого цвета в битах

22h

BYTE

Начальная битовая позиция компоненты

 

 

зеленого цвета

23h

BYTE

Размер компоненты синего цвета в битах

24h

BYTE

Начальная битовая позиция компоненты синего

 

 

цвета

25 h

BYTE

Размер резервной компоненты в битах

26h

BYTE

Начальная битовая позиция резервной

 

 

компоненты

27h

BYTE

Атрибуты режима Direct Color

Поля, присутствующие только в VBE 2.0 и позднейших

реализациях стандарта

 

28h

DWORD

Физический (абсолютный) 32-разрядный адрес

 

 

буфера кадра

2Ch

DWORD

Указатель на начало заэкранной памяти, то есть

 

 

на начало второй видеостраницы (введен

 

 

в версии 2.0, но изъят из версии 3.0; теперь

 

 

данное поле считается зарезервированным

 

 

и содержит значение 0)

30h

WORD

Объем заэкранной памяти в килобайтах (введен

 

 

в версии 2.0, но изъят из версии 3.0; теперь

 

 

данное поле считается зарезервированным

и содержит значение 0)

Смещение

Размер

Описание

Поля, присутствующие только в VBE 3.0 и позднейших

реализациях стандарта

 

32h

WORD

Число байтов, которое приходится на одну строку развертки в линейном режиме

34h

BYTE

Количество видеостраниц в страничном режиме

35 h

BYTE

Количество видеостраниц в линейном режиме

36 h

BYTE

Размер компоненты красного цвета в битах в линейном режиме

37 h

BYTE

Начальная битовая позиция компоненты красного цвета в линейном режиме

38h

BYTE

Размер компоненты зеленого цвета в битах в линейном режиме

39h

BYTE

Начальная битовая позиция компоненты зеленого цвета в линейном режиме

40 h

BYTE

Размер компоненты синего цвета в битах в линейном режиме

41h

BYTE

Начальная битовая позиция компоненты синего цвета в линейном режиме

42h

BYTE

Размер резервной компоненты в битах в линейном режиме

43h

BYTE

Начальная битовая позиция резервной компоненты в линейном режиме

44h

DWORD

Максимальная частота вывода пикселов в графических режимах (в Гц)

48h

184 байта

Зарезервировано

Подфункцию Olh обычно вызывают перед установкой нового видеорежима, чтобы удостовериться в его реализации в данном видеоконтроллере и в возможности использования линейной адресации видеопамяти в этом режиме. После вызова функции в регистре AL должен находиться код 4Fh, в АН — код 0. После этого нужно проверить седьмой бит слова атрибутов режима (линейная адресация поддерживается, если он равен 1), а затем прочитать адрес линейного видеобуфера из 32-разрядного (двойного) слова со смещением 28h от начала структуры данных.

Подфункции OOh и Olh необходимо использовать, если нет полной уверенности в том, что видеоконтроллер поддерживает используемый в вашей программе видеорежим. В программе VESA_BIOS_Test, приведенной в листинге 4.1, используются указанные подфункции, чтобы проверить наличие и версию VESA BIOS, а затем поочередно отобразить на экран параметры всех имеющихся видеорежимов.

Основной модуль программы функционирует в текстовом режиме и использует процедуры вывода данных на экран, описанные в главе 1 «Работа с клавиатурой», процедуры перевода чисел, описанные в главе 2 «Недокументированные возможности процессоров Intel 80x86», и вспомогательную процедуру ShowVESAStnng для вывода текстовых строк из области данных VESA BIOS.

Листинг 4.1. Проверка наличия VESA BIOS, а также режима с линейной адресацией, палитрой 256 цветов, разрешением 640×480 и получение его параметров

IDEAL

Р386 LOCALS

MODEL MEDIUM

: Подключить файл мнемонических обозначений

; кодов управляющих клавиш и цветовых кодов

Include "listl_03.inc"

; Подключить файл макросов

Include "listl_04.inc"

DATASEG

; Код исследуемого видеорежима GraphicsMode DW ?

; Место для хранения информации VESA BIOS VESA BIOS

DB 512 DUP(?)

: Место для хранения информации о параметрах видеорежина

VESAJnfo

DB 256 DUP(?)

; Текстовые сообщения

TxtO

DB LIGHTCYAN.0.33,"ТЕСТ VESA BIOS",0

DB YELLOW,24,29,"Нажмите любую клавишу".0 Txtl

DB 2,29,"Обнаружен драйвер VESA",0

DB 4,29,"Сигнатура:",0

DB 5,21,"Номер версии VESA:",0

DB 6,31,"Имя OEM:",0

DB 7,22,"0бьем памяти, Мб:",0

DB 12,25,"Номера поддерживаемых режимов:",0 Txt2

DB 4,27,"Параметры режима № h:",0

DB 6.13,"Атрибуты режима:",О

DB 7,13,"Атрибуты окна А:",О

DB 8,13,"Атрибуты окна В:",О

DB 9,2,"Гранулярность окна (Кбайт):",О

DB 10,9,"Размер окна (Кбайт):",0

DB 11,4,"Начальный сегмент окна А:",О

DB 12,4,"Начальный сегмент окна В:",О

DB 13,5,"Адрес функции поз. окна:",0

DB 14,2,"Байтов на строку развертки:",0

DB 15,3,"Горизонтальное разрешение:",0

DB 16,5,"Вертикальное разрешение:",О

DB 17,11,"Ширина знакоместа:",О

DB 18,11,"Высота знакоместа:",О

DB 19,5,"Число плоскостей памяти:",О

DB 6,46,"Число битов на пиксел:",О

DB 7,49,"Число банков памяти:",О

DB 8,51,"Тип модели памяти:",О

DB 9,44,"Размер банка памяти (Кб):",О

DB 10,43,"Число полных видеостраниц:",0

DB 11,43,"Размер красной компоненты:",0

DB 12,40,"Нач. поз. красной компоненты:",0

DB 13,43,"Размер зеленой компоненты:",0

DB 14,40,"Нач. поз. зеленой компоненты:",0

DB 15,45,"Размер синей компоненты:".0

DB 16,42,"Нач. поз. синей компоненты:",0

DB 17,41."Размер резервной компоненты:",0

DB 18,43,"Нач. поз. рез. компоненты:",0

DB 19,41,"Линейный адрес буфера кадра:",0

Errl

DB 25,0,"Команды VESA не поддерживаются",0

ENDS

SEGMENT sseg para stack ‘STACK’

DB 400h DUP(?)

ENDS

CODESEG

• A A1 A ‘A’ A A A Л A1 A’ A1 ‘A1 A’ A1 ‘A’ A’ A"A’ A *A *A*A A A A A A A A

;* Основной модуль программы *

PROC VESA_BIOS_Test

mov AX.DGROUP

mov DS.AX

mov [CS:MainDataSeg],AX

; Установить текстовый режим

mov АХ.З int lOh

: Скрыть курсор – убрать за нижнюю границу экрана

mov [ScreenString],25

mov [ScreenColumn],0 call SetCursorPosition

: Вывести заголовок

MShowColorText 2,TxtO

; ПРОВЕРИТЬ НАЛИЧИЕ VESA BIOS

; Получить информацию о наличии VESA BIOS

mov AX,DS

mov ES.AX

mov AX,4F00h

mov DI, off set VESABIOS int lOh

Листинг 4.1(продолжение)

; Проверить результат выполнения функции cmp AX,4Fh jne

@@Err

; Вывести поясняющий текст

mov [TextColorAndBackground],LIGHTGREEN MShowText 6,Txtl

mov [TextColorAndBackground],WHITE

; Вывести сигнатуру

mov SI.offset VESA_BI0S MShowASCIIField 4.40.0.4 : Вывести номер версии

MShowHexWord 5,40,<[word ptr VESA_BI0S+4]>

; Вывести имя OEM

call ShowVESAString : Вывести объем памяти

mov AX.[word ptr VESA_BI0S+12h] shr AX.4 ;разделить на 16 MShowDecWord 7,40.AX

; Вывести список номеров режимов

mov [ScreenString].14

mov [ScreenCol umn], 0

mov BX,[word ptr VESA_BIOS+OEh]

mov AX,[word ptr VESA_BIOS+10h]

mov ES.AX

mov CX.128 P0jO:

mov AX,[ES:BX] cmp AX.OFFFFh

je P@jl

inc [ScreenColumn] cal1 ShowHexWord

add BX.2 1 oop @<a j0 : Ожидать нажатия любой клавиши @0jl: call GetChar

; ПОКАЗАТЬ ПАРАМТРЫ ДОСТУПНЫХ ВИДЕОРЕЖИМОВ

; Загрузить адрес массива номеров

mov BX.[word ptr VESA_BIOS+OEh] №NextMode:

; Загрузить кодовый номер очередного режииа

mov АХ.[word ptr VESA_BI0S+10h]

mov ES.AX

mov AX,[ES:BX]

mov [GraphicsMode].AX cmp AX.OFFFFh

je

@@End : Очистить экран

call ClearScreen : Вывести заголовок

MShowColorText 2,TxtO

; Получить параметры видеорежима

mov AX.DS

mov ES.AX

mov AX,4F01h

mov CX,[GraphicsMode]

mov DI,offset VESAinfo int lOh

; Установить зеленый цвет символов и черный фон

mov [TextColorAndBackground],LIGHTGREEN

; Вывести текстовые сообщения на экран

MShowText 29,Txt2

; Вывести номер режима

MShowHexWord 4,46,[GraphicsMode]

; Установить белый цвет символов и черный фон

mov [TextColorAndBackground],WHITE

; Вывести значения полей на экран : Атрибуты режима

MShowHexWord 6,30,<[word ptr VESA_info]>

; Атрибуты окна А

MShowHexByte 7.30,[VESA_info+02h]

; Атрибуты окна В

MShowHexByte 8.30,[VESAjnftH-03h]

; Гранулярность окна

MShowDecWord 9,30,<[word ptr VESA_infCH-04h]>

; Размер окна

MShowDecWord 10,30,<[word ptr VESA_infCH-06h]>

; Начальный сегиент окна A

MShowHexWord 11.30,<[word ptr VESA_inftH-08h]>

; Начальный сегмент окна В

MShowHexWord 12,30,<[word ptr VESA_infCH-0Ah]>

; Адрес функции позиционирования окна

MShowHexDWord 13,30,<[dword ptr VESA_infCH-0Ch]>

; Байт на одну строку развертки

MShowDecWord 14,30,<[word ptr VESA_infCH-10h]>

; Горизонтальное разрешение

MShowDecWord 15,30,<[word ptr VESA_infCH-12h]>

; Вертикальное разрешение

MShowDecWord 16,30,<[word ptr VESA_infCH-14h]>

: Ширина знакоместа

MShowDecByte 17,30, [VESAi nftH-16h]

: Высота знакоместа

MShowDecByte 18,30,[VESA_info*17h]

; Число плоскостей памяти

MShowDecByte 19,30, [VESA_i nftH-lBh]

: Число битов на пиксел

MShowDecByte б, 70, [VESA_i nftH-19h]

: Число банков памяти

MShowDecByte 7.70,[VESAi nfo+lAh]

; Тип модели памяти

Листинг 4.1(продолжение)

MShowDecByte 8,70,[VESA_info+lBh]

; Размер банка памяти

MShowDecByte 9.70,[VESAi nfo+lCh]

; Число полных видеостраниц

MShowDecByte 10.70. [VESA_i nf o+-lDh]

; Размер красной компоненты

MShowDecByte 11.70,[VESA_i nfo+lFh]

; Начальная позиция красной компоненты

MShowDecByte 12,70. [VESAi nfcH-20h]

; Размер зеленой компоненты

MShowDecByte 13.70,[VESAi nfo+21h]

; Начальная позиция зеленой компоненты

MShowDecByte 14.70. [VESA_inftH-22h]

; Размер синей компоненты

MShowDecByte 15.70,[VESA_infc*23h]

; Начальная позиция синей компоненты

MShowDecByte 16,70,[VESAinfcH-24h]

; Размер резервной компоненты

MShowDecByte 17.70, [VESA _i nfCH-25h]

: Начальная позиция резервной компоненты

MShowDecByte 18,70.[VESA_i nfo+26h]

: Линейный адрес буфера кадра

MShowHexDWord 19,70,<[dword ptr VESA__infcH-28h]>

call GetChar

add BX.2

jmp

@@NextMode

; КОНЕЦ ПРОГРАММЫ

@@End:

; Установить текстовый режим

mov АХ.З int 10h

; Выход в DOS

mov AH,4Ch int 21h

; СООБЩЕНИЯ ОБ ОШИБКАХ

@@Err: MFatalError Errl

ENDP VESA BIOS Test

• 4 A1 A A A"A AAA k’k’kick’k’k’k’k’ieirk’ie’k k’k A A’A^nfcA1 A AA JcA kickkkkk А к A A A

;* ВЫВОД СТРОКИ ИЗ ОБЛАСТИ ДАННЫХ VESA НА ЭКРАН *

PROC ShowVESAString near pusha

push ES

; Настраить регистр ES на видеопамять

mov AX.0B800h

mov ES.AX eld

; Вычислить адрес строки в видеопамяти

mov DI.6*160+40*2

; Загрузить атрибут цвета в АН

mov АН,[TextColorAndBackground]

; Установить указатель на строку push DS

mov ВХ, offset VESA BIOS + 06h

mov SI,[BX]

mov ВХ,[BX+2]

mov DS.BX

; Вывести строку @0L1: lodsb

and AL.AL jz

@@L2 stosw

jmp @G>L1

@@L2: pop DS pop ES popa ret

ENDP ShowVESAString ENDS

; Подключить процедуры вывода данных на экран

Include "listl_02.inc"

; Подключить "математические" процедуры для перевода

; чисел из двоичного кода в десятичный

Include "list2_05.inc"

END

ВНИМАНИЕ

Поскольку программа из листинга 4.1 не переключает видеоконтроллер в заданный режим, а только проверяет его наличие, запускать тест можно на компьютере любой конфигурации. Однако для получения информации о свойствах VESA-режимов нужно, чтобы видеоконтроллер имел встроенную или программную (в виде специальной программы-драйвера) поддержку VESA BIOS.

Прерывание Int 10h, функция 4Fh, подфункция 02h: установить видеорежим с заданным номером

Функция устанавливает видеорежим с заданным номером и режим адресации видеопамяти (чтобы использовать линейную адресацию, необходимо установить бит 14 в коде режима).

Перед вызовом прерывания требуется занести в регистры следующие значения:

•     в АХ – код 4F02h;

•     в BX — код видеорежима.

Код режима имеет следующий формат:

•     биты 0-8 — номер режима (если бит 8 равен 0, то это режим производителя видеоконтроллера, если 1 — VESA-режим);

•     биты 9-13— зарезервированы для дальнейших расширений и равны 0;

•     бит 14 — тип режима адресации видеопамяти: 0 — страничный режим (память адресуется участками по 64 Кбайт), 1 — линейный режим;

•     бит 15 — признак очистки видеопамяти при переключении режимов (0 — очищать память, 1 — не очищать).

Стандартизированные номера режимов приведены в табл. 4.4. Обозначения «К» и «М» в графе «Число цветов» представляют собой множители: К = 210 = 1024, М = 220 = 1 048 576. При работе с функцией установки видеорежима нужно учитывать следующее.

•     Режимы с номерами меньше 100h определяются изготовителем видеоконтроллера и не обрабатываются VESA-функциями. Если функции установки видеорежима будет послан код со значением меньше 100h, то она передаст его на обработку прерыванию BIOS 10h.

•     Видеоконтроллеры различных производителей могут интерпретировать режимы TrueColor с номерами lOFh, 112h, 115h, 118h, llBh как 24- или как 32-битовые, то есть данные режимы определены неоднозначно. Для уточнения числа байтов, выделенных на одну точку, нужно вызвать функцию Olh, получить информацию о видеорежиме и проверить размер резервной компоненты (байт со смещением 25h): если 0 — 24-битовый режим, если 8 — 32-битовый.

•     Коды режимов с разрешением более 1280×1024 не стандартизированы, и их приходится определять по таблице доступных режимов, заданной изготовителем видеоконтроллера.

•     Режим 81FFh служит для обеспечения доступа ко всей имеющейся видеопамяти без изменения ее содержимого.

Таблица 4.4. Стандартизированные коды VESA-видеорежимов

Номер режима

Тип

Разрешение

Число цветов

Бит

на точку

100h

Графический

640×400

256

8

101 h

Графический

640×480

256

8

102h

Графический

800×600

16

4

103h

Графический

800×600

256

8

104h

Графический

1024×768

16

4

105h

Графический

1024×768

256

8

106h

Графический

1280×1024

16

4

107h

Графический

1280×1024

256

8

108h

Текстовый

80×60

16

109h

Текстовый

132×25

16

10Ah

Текстовый

132×43

16

10Bh

Текстовый

132×50

16

10Ch

Текстовый

132×60

16

 

10Dh

Графический

320×200

32 К

1:5:5:5

10Eh

Графический

320×200

64 К

5:6:5

10Fh

Графический

320×200

16М

8:8:8

или 8:8:8:8

110h

Графический

640×480

32 К

1:5:5:5

111h

Графический

640х4В0

64 К

5:6:5

112h

Графический

640×480

16М

8:8:8

или 8:8:8:8

113h

Графический

800×600

32 К

1:5:5:5

114h

Графический

800×600

64 К

5:6:5

115h

Графический

800×600

16М

8:8:8

или 8:8:8:8

116h

Графический

1024×768

32 К

1:5:5:5

117h

Графический

1024×768

64 К

5:6:5

118h

Графический

1024×768

16М

8:8:8

или 8:8:8:8

119h

Графический

1280×1024

32 К

1:5:5:5

11Ah

Графический

1280×1024

64 К

5:6:5

11Bh

Графический

1280×1024

16 М

8:8:8

или 8:8:8:8

81 FFh

Специальный

 

Прерывание Int 10h, функция 4Fh, подфункция 03h: определить код текущего видеорежима

Функция возвращает код текущего видеорежима.

Перед вызовом прерывания требуется занести в регистр АХ код 4F03h.

После выполнения функции в регистрах будут размещены следующие значения:

•           в АХ — код результата выполнения функции (код возврата);

•           в ВХ — код текущего видеорежима (см. табл. 4.4).

Прерывание Int 10h, функция 4Fh, подфункция 04h: сохранить или восстановить состояние видеоконтроллера

Функция сохраняет или восстанавливает режим работы видеоконтроллера. Сохранение состояния заключается том, что функция записывает в выделенный буфер оперативной памяти содержимое всех регистров видеоконтроллера. Содержимое видеопамяти функция не записывает — эту операцию необходимо выполнять отдельно. Перед вызовом прерывания требуется занести в регистры следующие значения:

•           в АХ – код 4F04h;

•       в DL — код подфункции (0 — получить размер буфера, необходимого для сохранения состояния, 1 — сохранить состояние, 2 — восстановить состояние);

•       в СХ — флаги, уточняющие, состояние каких именно блоков видеоконтроллера нужно сохранить или восстановить (бит 0 — состояние аппаратуры, бит 1 — состояние данных BIOS, бит 2 — состояние DAC, бит 3 — состояние регистров, биты 4-15 зарезервированы);

•       в ES: ВХ — указатель на буфер (нужен только в том случае, когда в DL не 0).

После выполнения функции в регистр АХ будет помещен код возврата, в ВХ — число блоков по 64 байта, необходимых для хранения состояния (если в DL 0).

Подфункция 04h позволяет запомнить состояние видеоконтроллера перед переходом в какой-либо другой режим, чтобы потом можно было с ее помощью вернуться в исходное состояние.

Прерывание Int 10h, функция 4Fh, подфункция 05h: управление окнами видеопамяти

Функция предназначена для управления отображением видеопамяти на адресное пространство процессора при использовании страничного доступа (через окно 64 Кбайт).

Перед вызовом прерывания требуется занести в регистры следующие значения:

•           в АХ – код 4F05h;

•       в ВН — код выполняемой операции (0 — установить окно видеопамяти, 1 — получить номер текущего окна видеопамяти);

•           в BL — номер окна (0 — окно А, 1 — окно В);

•       в DX — номер окна в видеопамяти (в единицах дробности); задается только при ВН = 0.

После выполнения функции в регистр АХ будет помещен код возврата, в DX — адрес окна в видеопамяти в единицах дробности (выдается только при ВН = 1).

Подфункция 05h применяется в оконном режиме адресации, когда в каждый момент времени процессору доступен только один участок (сегмент) видеопамяти размером в 64 Кбайт. Ее необходимо вызывать каждый раз, когда требуется перейти к работе с другим участком.

Прерывание Int 10h, функция 4Fh, подфункция 06h: получить или установить длину логической строки развертки

Функция читает текущую длину логической строки либо устанавливает ее новое значение.

Перед вызовом прерывания требуется занести в регистры следующие значения:

•           в АХ – код 4F06h;

•       в BL — код выполняемой операции (0 — установить длину строки развертки в пикселах, 1 — получить текущую длину строки

развертки в пикселах, 2 — установить длину строки развертки в байтах, 3 — получить максимально возможную длину строки развертки в пикселах;

•     в СХ — требуемую ширину строки (задается только для операций О и 2: при BL = 0 — в пикселах, при BL = 2 — в байтах).

После выполнения функции в регистрах будут размещены следующие значения:

•     в АХ — код возврата;

•     в ВХ — число байт на строку развертки;

•     в СХ — число пикселов на строку развертки (округленное до ближайшего целого пиксела);

•     в DX — максимальное число строк развертки.

Рис. 4.1. Реорганизация видеопамяти после изменения логической длины строки

Подфункция 06h используется для изменения организации видеопамяти с целью упрощения адресации (путем выравнивания длины строки на величину, равную 2N —1024 или 2048). Видеоконтроллеры позволяют делать длину строки в видеопамяти (логическую) больше реальной (физической) длины строки экрана за счет реорганизации неиспользуемых областей памяти. Обычно невидимая область располагается под видимой (рис. 4.1, слева), однако после увеличения логической длины строки происходит перераспределение памяти — появляется невидимый участок справа, а высота нижнего неотображаемого участка уменьшается (рис. 4.1, справа).

Выравнивание логической длины строки на 2N позволяет:

•     упростить вычисление адресов памяти (используя сдвиги и логические операции вместо умножения и сложения);

•     реализовать (при необходимости) плавную прокрутку изображения по вертикали аппаратными средствами видеоконтроллера;

•     существенно упростить контроль границ сегментов при оконном режиме адресации видеопамяти.

Для пояснения последнего пункта рассмотрим обычную организацию видеопамяти в режиме оконной адресации. Если длина строки в пикселах не кратна 2N, то сегмент будет содержать нецелое число экранных строк, и границы сегментов не будут совпадать с границами экрана (рис. 4.2, слева). В результате при выводе изображения на экран необходимо контролировать не только нижнюю, но и правую границу сегмента (вывод выполняется по точкам, слева направо и сверху вниз). Такую операцию контроля приходится включать внутрь всех циклов вывода изображения, что сильно тормозит работу: вывод точки на экран выполняется одной простой командой пересылки данных M0V, и включение любых других команд (в том числе для проверки границ) в цикл вывода точек замедляет его выполнение в несколько раз. Замедление особенно заметно на современных быстрых видеоконтроллерах, у которых скорость записи в память измеряется десятками мегабайтов в секунду.

Рис. 4.2. Выравнивание границ сегментов после изменения логической длины строки

Если выровнять длину строки в пикселах на 2N, то сегмент будет состоять из целого числа экранных строк, а начало каждого сегмента будет совпадать с началом строки экрана (рис. 4.2, справа). Операция контроля пересечения границы очередного сегмента при этом проводится во внешнем цикле вывода строки изображения, а не во внутреннем цикле рисования точек. Объем памяти при низких разрешениях (при длине строки 640 или 800 точек) обычно не является препятствием для операции выравнивания даже для видеоконтроллеров нижнего ценового уровня, так как самые примитивные современные карты имеют память емкостью 4-8 Мбайт.

Прерывание Int 10h, функция 4Fh, подфункция 07h: получить или установить координаты левого верхнего угла экрана

Функция читает или устанавливает номер пиксела, отображаемого в левом верхнем углу экрана.

Перед вызовом прерывания требуется занести в регистры следующие значения:

•           в АХ — код 4F07h;

•           в ВН — 0 (регистр зарезервирован для последующих расширений);

•       в BL — код выполняемой операции (OOh — установить начало экрана, Olh — получить начало экрана, 80h — установить начало экрана в процессе обратного хода луча по кадру);

•       СХ — первый отображаемый пиксел на строке развертки (задается только при BL = OOh или 80h);

•       DX — первая отображаемая строка развертки (задается только при BL = OOh или 80h).

После выполнения функции в регистрах будут размещены следующие значения:

•           в АХ — код возврата;

•       в СХ — первый отображаемый пиксел на строке развертки (только при BL = Olh);

•       в DX — первая отображаемая строка развертки (только при BL = Olh).

Подфункция 07h имеет две основные области применения: прокрутка экрана и переключение экранов. В обоих случаях происходит перемещение по видеопамяти области, отображаемой на экран, но в первом случае — плавно, во втором — скачкообразно. Такое перемещение возможно благодаря тому, что система управления памятью видеоконтроллера позволяет произвольно выбирать точку, с которой начинается вывод на экран (позицию левого верхнего угла экрана относительно видеопамяти).

Для реализации прокрутки изображения влево необходимо перед выводом очередного кадра прибавлять единицу к номеру начальной точки, а для реализации прокрутки вправо — вычитать единицу. Для реализации прокрутки вверх необходимо к номеру начальной точки прибавлять число точек в строке, для реализации прокрутки вниз — вычитать его.

Для выполнения переключения экранов (окон) необходимо вычислить смещение второго окна относительно начала видеопамяти. Оно равно числу точек в строке изображения, помноженному на число строк на экране и на число байтов, приходящихся на одну точку. Далее для каждого нового кадра происходит поочередная установка номера первого выводимого пиксела (0 или величина смещения второго окна). Пока одно окно выводится на экран, происходит перезапись информации в другом окне. Таким образом можно исключить эффекты типа «снега» и разрезания изображения, возникающие при одновременной записи в участок видеопамяти и выводе на экран информации из этого же участка.

Прерывание Int 10h, функция 4Fh, подфункция 08h: получить или изменить формат регистров палитры

Функция читает или устанавливает разрядность регистров палитры (6 или 8 бит) Основное назначение функции — расширение цветовой палитры в режиме 256 цветов с 218 до 224 оттенков В настоящий момент функция устарела, так как для работы с широкой цветовой палитрой гораздо эффективнее использовать режим TrueColor. Единственной областью ее применения, вероятно, являются графические редакторы, работающие с форматом файлов PCX.

Перед вызовом прерывания требуется занести в регистры следующие значения:

•           в АХ – код 4F08h;

•       в BL — код выполняемой операции (0 — установить формат регистров палитры, 1 — получить формат регистров палитры);

•       в ВН (при BL = 0) — требуемая разрядность регистров ЦАП в битах (допустимы только значения 6 и 8).

ПРИМЕЧАНИЕ

Функция выдает код ошибки 3 при вызове в режимах DirectColor или YUV.

После выполнения функции в регистрах будут размещены следую- ‘ щие значения:

•           в АХ — код возврата;

•           в ВН — текущая разрядность регистров ЦАП в битах.

Прерывание Int 10h, функция 4Fh, подфункция 09h: сохранить или изменить содержимое регистров ЦАП

Функция считывает или устанавливает содержимое таблицы регистров цифро-аналогового преобразователя (DAC), которая ставит в соответствие кодам цвета реальные значения по красному, зеленому и синему компонентам (в 16- и 256-цветных режимах). Это доработанный вариант подфункций 12h и 17h функции 10h прерывания Int 10h VGA BIOS. Функция 09h позволяет перепрограммировать таблицу палитры (в режиме 256 цветов) с целью получения набора оттенков, более подходящего для решения стоящих перед программистом задач, чем стандартный набор. Например, можно организовать плавные цветовые переходы.

Перед вызовом прерывания требуется занести в регистры следующие значения:

•           в АХ – код 4F09h;

•       в BL — код выполняемой операции (OOh — установить палитру, Olh — прочитать (сохранить) палитру, 02h — установить дополнительную (вторичную) палитру, 03h — прочитать дополнительную (вторичную) палитру, 80h — установить палитру в процессе обратного хода луча по кадру);

•       в СХ — число загружаемых (или сохраняемых) регистров палитры (максимум 256);

•           в DX — номер первого из загружаемых (сохраняемых) регистров;

•       в ES: DI — указатель на таблицу, из которой загружается или в которой сохраняется содержимое регистров палитры.

Формат строки таблицы палитры следующий: байт выравнивания (нулевой), байт интенсивности красного цвета, байт интенсивности зеленого цвета, байт интенсивности синего цвета.

Прерывание Int 10h, функция 4Fh, подфункция OAh: получить таблицу доступа к интерфейсу защищенного режима

Функция возвращает указатель на таблицу доступа к интерфейсу 32-разрядного защищенного режима. Перед вызовом прерывания требуется занести в регистры следующие значения:

•          в АХ – код 4F0Ah;

•           в ВХ — значение OOh.

После выполнения функции в регистрах будут размещены следующие значения:

•           в АХ — код возврата;

•       в ES. DI — указатель на таблицу доступа к интерфейсу защищенного режима;

•       в СХ — размер таблицы доступа в байтах, включая размер кода для работы в защищенном режиме.

Таблица доступа к интерфейсу защищенного режима содержит четыре слова-указателя, вслед за которыми располагается программный код для работы в защищенном режиме. Указатели размещены в таблице доступа в следующем порядке:

•       слово со смещением OOh содержит смещение кода функции 05h (для защищенного режима) от начала таблицы доступа;

•       слово со смещением 02h содержит смещение кода функции 07h (для защищенного режима) от начала таблицы доступа;

•       слово со смещением 04h содержит смещение кода функции 09h (для защищенного режима) от начала таблицы доступа;

•       слово со смещением 06h содержит смещение таблицы портов и описателей области памяти, для доступа к которым нужно устанавливать соответствующий уровень привилегий, от начала таблицы доступа (значение OOOOh в данном слове указывает на отсутствие таблицы).

Таблица портов и областей памяти устроена следующим образом: в начале находится список 16-разрядных адресов портов ввода вывода, который заканчивается терминатором FFFFh. За терминатором списка портов следуют 32-разрядный базовый адрес области памяти, 16-разрядный лимит сегмента и терминатор описателя области памяти FFFFh.

Для обеспечения доступа к программному коду в защищенном режиме нужно либо скопировать все содержимое таблицы доступа в 32-разрядный сегмент, либо настроить селекторы и права ввода- вывода прямо на соответствующую область ПЗУ.

Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.

По теме:

  • Комментарии