Нехватка качественной документации доводит разработчиков эмуляции VGA до отчаяния, а виной тому часто становится устаревшее описание оборудования от IBM. Сама видеокарта не такая уж сложная: там нет микрокода и процессора, да и функции выполняет простые. Проблема кроется в том, что VGA состоит из логически раздельных компонентов, и их совместная работа создает скрытую сложность. Главная трудность реализации эмуляции — отсутствие точных данных. Всё началось с IBM EGA, а последующий VGA был лишь небольшим расширением этой архитектуры. Разработчики EGA создали устройство, поддерживающее высокое разрешение и совместимость с режимами CGA и MDA, но внутренние регистры отличались от предшественников. Эмуляция работы CGA напрямую не срабатывала на EGA; нужно было сначала включать нужный режим через BIOS. Само устройство собиралось из четырёх чипов: Graphics Controller, Sequencer, Attribute Controller и CRT Controller, каждый со своими наборами регистров. Документация IBM написана для пользователей стандартных BIOS-режимов, а не для тех, кто хочет реализовать функционал изнутри. В справочниках часто сказано: «поставьте бит X в единицу и бит Y в ноль», что работает для текста, но не объясняет, что именно делают эти биты. Поскольку устройство из четырёх чипов, для достижения совместимости с CGA нужно правильно настроить биты во всех чипах. Пользователи часто ставят их в стандартные комбинации, но ничего не мешает экспериментаторам менять их произвольно, открывая неожиданные возможности вроде знаменитого VGA Mode X. Автор столкнулся с проблемой управления Odd/Even регистрами в чипах Sequencer и Graphics controller. Эти биты отвечают за чётные и нечётные доступы к памяти, где хранятся коды символов и атрибуты. В официальном IBM VGA Technical Reference Manual (TRM) описание сбивает с толку. Там сказано, что если установить бит SR4[2] (OE) в 0, чётные адреса ЦП обращаются к планам 0 и 2, а нечётные к 1 и 3. Если поставить 1, адреса работают последовательно по маске. Бит GR5[4] (OE) в 1 выбирает режим обращения для мониторного адаптера, обычно следуя значению бита 2 регистра памяти. Бит GR6[1] (OE) заменяет адресный бит A0 более старшим, выбирая чётную или нечётную карту. Три этих бита называют 'OE', но описать их поведение по отдельности практически невозможно. Команды обычно предполагают, что их настраивают вместе, но документация не объясняет, что случится, если поменять пару из трёх. Большинство книг по программированию VGA так же недосказательны. Справочник Compaq оказался неожиданным спасением. Там чётко расписано, что SR4[2] контролирует только записи ЦП, а GR5[4] — чтения, даже если обычно эти биты программируют совместно. Compaq объяснил, что GR6[1] определяет, какой именно адрес памяти используется, тогда как пара SR4[2] и GR5[4] выбирает, какую из четырёх план в этом адресе считать, отдельно для записи и чтения. Автор проверил это на спецификации Matrox MGA-1064. Там сказано, что если бит GR6[3:2] равен 00, VGA декодирует весь диапазон A0000h-BFFFFh, что редко используется. У VGA 256 Кб памяти, но из-за структуры из четырёх планов есть только 64 Кб уникальных адресов. Когда Odd/Even активен, бит A0 фиксируется. Программируя GR6[3:2] в 00, можно использовать диапазон 128 Кб для доступа к 64 Кб адресам. Это возможно, потому что установка GR6[1] в 1 позволяет заменить входящий из ЦП бит A0 на A16. Так пользователь получает доступ к чётным адресам в диапазоне A0000h-AFFFFh и нечётным в B0000h-BFFFFh. Если задать GR6[3:2] иное значение, работает бит MSR[5] как выборщик страницы. Полярность этого бита описана плохо и источники разнятся: одни говорят, что 1 выбирает высокую страницу, другие — низкую. После сброса MSR[5] обычно равен 0, но BIOS большинства EGA/VGA ставит его в 1. Существуют и отдельные биты контроллера CRT (CRTC), определяющие, как данные с экрана отображаются. В режиме word access бит CRTC A15 становится битом MA0, позволяя CRTC отображать чётные адреса в нижнем диапазоне и нечётные в верхнем, что идеально дополняет функционал GR6[1]. Автор не знает программ, использующих MSR[5] для увеличения памяти текста, но эти биты гарантированно использовали какие-то смелые разработчики. Не все эти биты работают в обычных реализациях VGA, и плохая документация мешает создавать совместимое оборудование. Нет единого бита «Включить текстовый режим», есть раздельное управление записью, чтением и адресацией памяти, плюс куча битов для CRTC. Обычно BIOS настраивает их единовременно, но каждый можно менять по отдельности, создавая множество недкументированных комбинаций. Разработчики часто игнорируют детали, полагая их бесполезными, но именно они необходимы для полной совместимости эмуляции.
Инженеры восстанавливают эмуляцию старых машин IBM, несмотря на сложную документацию
09.05.2026 17:49 · hackernews