Vesa 1.2
6.3 Функция 01h - Вернуть информацию о режиме Super-VGA
Эта функция возвращает информацию об указанном видеорежиме Super VGA, который был возвращен функцией 0. Функция заполняет структуру информационного блока о режиме по адресу, указанному вызывающей программой. Размер информационного блока о режиме - до 256 байтов.
Некоторая информация, возвращаемая этой функцией, явно определяется номером режима VESA. Однако, некоторые реализации Super VGA могут поддерживать некоторые другие видеорежимы, которые отличны от тех, что определены VESA. Чтобы обеспечить доступ к этим режимам, данная функция также возвращает различную дополнительную информацию о режиме.
Вход: AH = 4Fh Поддержка Super VGA AL = 01h Возврат информации о режиме Super VGA CX = номер режима SuperVGA, он должен равняться одному из тех, что были возвращены функцией 0 ES:DI = Указатель на 256-байтовый буфер Выход : AX = Состояние Все другие регистры сохраняются
Блок информации о режиме имеет следующую структуру:
ModeInfoBlock struc ; обязательная информация ModeAttributes dw ? ; атрибуты режима WinAAttributes db ? ; атрибуты окна A WinBAttributes db ? ; атрибуты окна B WinGranularity dw ? ; зернистость окна WinSize dw ? ; размер окна WinASegment dw ? ; начальный сегмент окна A WinBSegment dw ? ; начальный сегмент окна B WinFuncPtr dd ? ; указатель на функцию окна BytesPerScanLine dw ? ; число байтов на строку ; информация, которая раньше была необязательна (теперь обязательна) XResolution dw ? ; горизонтальное разрешение YResolution dw ? ; вертикальное разрешение XCharSize db ? ; ширина матрицы символа YCharSize db ? ; высота матрицы символа NumberOfPlanes db ? ; число слоев памяти BitsPerPixel db ? ; количество бит на пиксел NumberOfBanks db ? ; количество банков памяти MemoryModel db ? ; тип модели памяти BankSize db ? ; размер банка в kb NumberOfImagePages db ? ; число страниц Reserved db 1 ; зарезервировано для функции ; страниц ; Новые поля непосредственных (direct) цветов RedMaskSize db ? ; размер красной маски в битах RedFieldPosition db ? ; битовая позиция красной маски GreenMaskSize db ? ; размер зеленой маски в битах GreenFieldPosition db ? ; битовая позиция зеленой маски BlueMaskSize db ? ; размер синей маски в битах BlueFieldPosition db ? ; битовая позиция синей маски RsvdMaskSize db ? ; размер зарезервир. маски в битах RsvdFieldPosition db ? ; битовая позиция зарезерв. маски DirectColorModeInfo db ? ; атрибуты режима непоср. цветов Reserved db 216 dup (?) ; остаток ModeInfoBlock ends
Поле ModeAttributes описывает некоторые важные характеристики видеорежима. Бит D0 определяет может ли данный режим быть инициализирован в текущей видео конфигурации. Этот бит может использоваться блоком доступа к видеорежиму, если для этого режима требуется монитор определенного типа и этот монитор не был подключен. До версии 1.2 VESA BIOS Extension не требовалось, чтобы BIOS возвращал верную информацию о полях после BytesPerScanLine. Бит D1 использовался, чтобы обозначить присутствие этой информации. Версия 1.2 требует, чтобы все поля ModeInfoBlock содержали верные данные, за исключением полей непосредственных цветов, которые верны только при значении поля MemoryModel равного 6 (непосредственные цвета) или 7 (YUV). Бит 1 в настоящее время зарезервирован и должен устанавливаться равным 1. Бит D2 указывает поддерживает ли BIOS функции типа текстового вывода, скроллинга, пиксельного вывода и т.д. в указанном режиме (рекомендуется, но не обязательно, чтобы BIOS поддерживал такие функции вывода). Если бит D2 равен 1, то BIOS должен поддерживать все стандартные функции вывода.
Формат поля:
D0 = Аппаратная поддержка режима 0 = Режим не поддерживается аппаратурой 1 = Режим поддерживается аппаратурой D1 = 1 (Зарезервировано) D2 = Поддержка BIOS'ом функций вывода 0 = Функции вывода не поддерживаются BIOS'ом 1 = Функции вывода поддерживаются BIOS'ом D3 = Монохромный/цветной режим (см. ниже замечание) 0 = Монохромный режим 1 = Цветной режим D4 = Тип режима 0 = Текстовой режим 1 = Графический режим D5-15 = Зарезервировано
Замечание: Монохромные режимы имеют адрес CRTC, равный 3B4h. Адрес CRTC в цветных режимах 3D4h. Монохромные режимы имеют атрибуты, в которых, для контроллера атрибутов имеют значения только биты 3 (видео) и 4 (интенсивность). Следовательно, монохромные текстовые режимы имеют атрибуты "пусто", видео, высокая интенсивность, мерцание и т.д. Монохромные графические режимы являются двухслойными графическими режимами и имеют атрибуты "пусто", видео, высокая интенсивность, мерцание и т.д. Расширенные двухцветные режимы, когда адрес CRTC равен 3D4h, являются цветными режимами с одним битом на пиксел и одним слоем. Поэтому стандартные режимы VGA 06h и 11h следует классифицировать, как цветные, в то время, как стандартные VGA режимы 07h и 0Fh - как монохромные.
Поле BytesPerScanLine указывает из скольких байтов состоит каждая логическая строка. Логическая строка может больше или равна высвечиваемой строке.
Поля WinAAttributes и WinBAttributes описывают характеристики схемы окон для CPU: наличие окна и доступность на чтение/запись. Их формат:
D0 = Поддержка окна 0 = Окно не поддерживается 1 = Окно поддерживается D1 = Доступность для чтения 0 = Окно недоступно для чтения 1 = Окно доступно для чтения D2 = Доступность для записи 0 = Окно недоступно для записи 1 = Окно доступно для записи D3-D7 = Зарезервировано
Если окна не поддерживаются (бит D0 = 0 для окна A и окна B), то прикладная программа должна считать, что буфер высвечиваемой памяти расположен в адресном пространстве CPU в соответствии с полем MemoryModel режима.
Поле WinGranularity указывает наименьший размер в KB, с точностью до которого, окно может быть размещено в видеопамяти. Значение этого поля не определено, если бит D0 соответствующего поля WinAttributes не установлен.
WinSize указывает размер окна в KB.
Адреса WinASegment и WinBSegment указывают сегментный адрес, начиная с которого окно расположено в адресном пространстве CPU.
Поле WinFuncAddr указывает адрес функции организации видеоокон в CPU. Эта функция может вызываться либо через функцию 05h VESA BIOS, либо непосредственно. Прямой вызов обеспечивает более быстрый доступ к аппаратному листованию страниц, чем Int 10h, и он предназначен для использования в программах, требующих высокой эффективности. Если значение этого поля равно Null, то для установки окон памяти должна вызываться функция 05h, если листование вообще поддерживается.
Поля XResolution и YResolution указывают высоту и ширину видеорежима. В графических режимах разрешение задается в пикселах. В текстовых режимах единицей измерения являются символы. Отметим, что разрешение текстовых режимов в пикселах может быть получено умножением XResolution и YResolution на ширину и высоту матрицы символов.
Поля XCharCellSize и YCharCellSize задают размер матрицы символов в пикселах.
Поле NumberOfPlanes задает число слоев памяти, доступных для программного обеспечения в данном режиме. Для стандартных 16-цветных графических режимов VGA оно равно 4. Для стандартных режимов с упакованными пикселами оно должно устанавливаться равным 1.
Поле BitsPerPixel задает полное число битов, которые определяют цвет единичного пиксела. Например, для стандартных 4-слойных 16-цветных графических режимов VGA в этом поле должно стоять 4, а в 256-цветных режимах с упакованными пикселами - 8. Число бит на пиксел в одном слое обычно получается путем деления поля BitsPerPixel на поле NumberOfPlanes.
Поле MemoryModel указывает тип организации памяти, который используется в данном режиме. Определены следующие модели:
00h = Текстовый режим 01h = CGA-графика 02h = Графика Hercules 03h = Обычный 4-слойный 04h = Упакованные пикселы 05h = Разнесенные по 4, 256 цветов 06h = Непосредственные цвета (Direct Color) 07h = YUV 08h-0Fh = Зарезервировано для определений VESA 10h-FFh = Определяются видеоплатой
В версии 1.1, а также более ранних версиях VESA Super VGA BIOS Extension, определяемые видеоплатой режимы непосредственных цветов с пиксельными форматами 1:5:5:5, 8:8:8 и 8:8:8:8 описывались как модели упакованных пикселов соответственно с 16, 24 и 32 битами на пиксел. В версии 1.2 и более поздних версиях VESA Super VGA Extension рекомендуется, чтобы режимы непосредственных цветов использовали для описания пикселов Direct Color MemoryModel и поля MaskSize и FieldPosition в ModeInfoBlock. Поле BitsPerPixel всегда определяется, как общая память в битах для представления пиксела.
NumberOfBanks. Это число банков, в которые группируются строки растра. Остаток от деления номера строки на номер банка, который содержит эту строку растра, равен номеру строки внутри банка. Например, графические режимы CGA имеют 2 банка, а графические режимы Hercules - 4. Для режимов, которые не имеют банков строк (типа VGA-режимов 0Dh-13h), это поле должно равняться 1.
Поле BankSize указывает размер банка (группы строк растра) в килобайтах. Для графических режимов CGA и Hercules оно равно 8, поскольку каждый банк имеют длину 8192 байтов. Для режимов, которые не имеют банков строк растра (типа VGA-режимов 0Dh-13h), это поле должно равняться 0.
Поле NumberOfImagePages задает число дополнительных полноэкранных изображений, которые могут располагаться в этом режиме в памяти VGA одновременно. Если это поле отлично от 0, то прикладные программы могут загружать в память VGA более одного изображения и выполнять между ними переключение.
Поле Reserved определено для поддержки будущих возможностей VESA BIOS extension и должно заполняться в этой версии нулями.
Поля RedMaskSize, GreenMaskSize, BlueMaskSize и RsvdMaskSize определяют битовый размер красной, зеленой и синей компонент в пикселах непосредственных цветов. Битовая маска может быть получена из полей MaskSize с помощью простого арифметического сдвига. Например, значения полей MaskSize в режиме непосредственных цветов 5:6:5 должны равняться 5, 6, 5 и соответственно для красной, зеленой, синей и зарезервированной компонент. Отметим, что в модели памяти YUV красное поле используется для V, зеленое - для Y, и синее - для U. В режимах с моделями памяти, в которых нет пикселов с цветовыми компонентами, поля MaskSize должны обнуляться.
Поля RedFieldPosition, GreenFieldPosition, BlueFieldPosition и RsvdFieldPosition определяют битовую позицию младшего бита соответствующейцветовой компоненты внутри пиксела непосредственных цветов или YUV-пиксела. Цветовые значения могут быть выровнены за счет сдвига влево на значение FieldPosition. Например, для режима непосредственных цветов 5:6:5 они будут равны соответственно 11, 5, 0 и 0 для красного, зеленого, синего и зарезервированного поля. Отметим, что в модели памяти YUV красное поле используется для V, зеленое - для Y, и синее - для U. В режимах с моделями памяти, в которых нет пикселов с цветовыми компонентами, поля FieldPosition должны обнуляться.
Поле DirectColorModeInfo задает важные характеристики непосредственных цветов. Бит D0 задает является цветовое наполнение DAC фиксированным или программируемым. Если цветовое наполнение фиксировано, то оно не может изменяться. Если цветовое наполнение программируемо, то подразумевается, что таблицы красной, зеленой и синей компонент могут быть загружены с помощью вызова стандартной функции заполнения регистров DAC через BIOS (AX=1012h). Бит D1 указывает может ли поле Rsvd в пикселе непосредственного цвета использоваться прикладной программой или же оно зарезервировано и, следовательно, не используется.
D0 = Цветовое наполнение фиксировано/программируемо 0 = Цветовое наполнение фиксировано 1 = Цветовое наполнение программируемо D1 = Биты поля Rsvd используются/не используются 0 = Биты поля Rsvd зарезервированы 1 = Биты поля Rsvd могут использоваться программой
Замечания:
Начиная с версия 1.1 VESA BIOS extensions происходит обнуление всех неиспользуемых полей в блоке информации о режиме и возвращается всегда ровно 256 байтов. Это облегчает совместимость с будущими версиями стандарта, поскольку каждому вновь добавляемому полю присваивается такое значение, при котором ноль обозначает номинальное умолчание или нереализованную возможность. (Например, поле содержащее битовую маску дополнительных возможностей будет обозначать отсутствие всех таких возможностей). Прикладные программы, которые хотят сохранить совместимость с версией 1.0 VESA BIOS, должны перед обращением к функции возврата информации о режиме Super VGA выполнять предварительную инициализацию 256-байтного буфера.