           Кое-что о программировании для Super VGA
           ========================================

      Под Super VGA (SVGA) здесь понимается всякий адаптер, поддерживаю-
щий режим 800x600 и другие дополнительные видеорежимы, кроме стандартных
режимов VGA.  Лично я еще не встречал VGA-совместимого адаптера, который
бы их не поддерживал. Другое дело, что не всякий дисплей дает 600 строк.
      Расширенные режимы бывают текстовые и графические.
      Текстовые режимы не содержат,  как правило, ничего нового. Они бы-
вают цветные (видеобуфер размещается с сегмента 0B800h) и монохромные (с
0B000h).  Организация видеопамяти в них аналогична режимам 3 и  7  соот-
ветственно.  Они могут быть 80- и 132- столбцовые, на 25, 30, 43, 50, 60
строк и др.
      Графические режимы бывают 4-,  16- и 256-цветные различного разре-
шения в зависимости от объема памяти на плате адаптера (256 К, 512К, 1 М
и т.д.).
      16-цветный режим 800x600 работает на очень многих  VGA-адаптерах,
поскольку требует всего 256К памяти. Так, на Realtek RT-VGA он имеет но-
мер режима 1Fh.  Судя по всему,      режимы 800х600х16 на всех адаптерах
различаются только своими номерами. Поэтому можно, в принципе, использо-
вать драйвер,  например,  для Windows или AutoCAD,  входящий в  комплект
драйверов,  поставляемый  изготовителем  с одним адаптером,  для другого
адаптера.  Для этого только надо с помощью программы типа HIEW  найти  в
нем  код,  устанавливающий  видеорежим (искать байты "CD 10") и поменять
номер этого режима. ("Родной" драйвер supervga.drv от Windows 3.1 не по-
дойдет, т.к. он косвенно загружает номер видеорежима, и найти этот номер
в файле сложно.)
      Видеобуфер в  режиме 800х600 имеет размер 60000 байт,  по 100 байт
на строку.  Его организация абсолютно такая же,  как в режимах EGA  0Dh,
0Eh,  10h и VGA 12h.  В подкаталоге GRAPH16\ приведена библиотечка функ-
ций, приспособленных к этому режиму.
      16-цветные режимы  с  более высоким разрешением требуют уже 512К и
более. Организация доступа к видеопамяти в них, видимо, сложнее.
      В адаптере  Realtek  VGA  (вариант с 256К памяти) есть и два новых
256-цветных режима:  512х512 (24h) и 640х400 (25h). В стандартном режиме
13h  видеопамять процессора организована очень просто:  последовательные
байты в памяти - последовательные пикселы на экране. В описываемых режи-
мах организация такая же.  Но в отличие от режима 320х200, где использу-
ется только четверть памяти адаптера (ок.  64 К из 256  К),  в  них  она
используется  полностью.  Как же это все происходит?  Дело в том,  что в
стандартном режиме 320х200 используются все 4 битовые плоскости,  но  на
каждой из них - только каждый четвертый байт,  т.е., тот, чей номер кра-
тен 4.  Получить доступ к остальным байтам в этом режиме нельзя. (В этом
смысле  более  удобен "режим X" 320х240,  описанный в "Журнале д-ра Доб-
ба".) То же самое и в этих режимах.  Заполняя полностью видеобуфер в ре-
жиме 512х512, вы увидите, что экран закрасится ровно на четверть. Как же
добраться до остальных байтов?  Напомню:  использовались одновременно все
четыре  плоскости  (но не все байты в каждой),  поэтому надежда выйти из
положения,  как  в  16-цветных  режимах,  программируя  регистр   выбора
плоскости 3C5/02, не оправдается.
      Посмотрев на дизассемблированный листинг видео BIOS, я очень быст-
ро,  к счастью,  нашел место,  где переключаются эти самые группы байтов
(4n,  4n+1,  4n+2 и 4n+3 в каждой плоскости),  или на дисплее - четверти
экрана. Пробная программа подтвердила догадки. Это - нигде не документи-
рованный регистр графического контроллера 3CF/0C.  Сначала надо  вывести
байт 0Ch в порт 3CEh,  затем - в порт 3CFh число, соответствующее нужной
четверти экрана. Эти значения следующие:
        0              1                   2                  3
     Третья    Четвертая        Первая                Вторая  четверть

      В режиме 640х400 (Realtek VGA) все точно так же.
      4-цветный режим  1024х768  тоже требует всего 256К памяти (точнее,
даже 192К), и он есть в адаптере Realtek VGA (в нем он 23h). В нем сцеп-
лены  попарно плоскости 0 с 1 и 2 с 3,  как в старых EGA с 64К на борту,
причем так,  что ряд из первых 8 пикселов - это первый байт в плоскостях
0 и  2 (накладываясь,  они создают из двух бит один из четырех цветов на
каждый пиксел),  вторые 8 пикселов - первый байт в  плоскостях  1  и  3,
третьи 8 пикселов - второй байт в плоскостях 0 и 2 и т.д. Управлять всем
этим можно через тот же регистр выбора плоскости для записи 3C5/02.
     
     
      Юцис Михаил Сухарович, г.Черновцы
      тел. (037-22) 2-55-51 (д.)
