Техника программирования на турбо-С
...ла
Комбинации красной, зеленой и голубой цветовых составляющих
позволяют получить набор из восьми отчетливо различаемых цветов:
белого, красного, зеленого, голубого, синего, малинового, желтого
и черного. Использование разряда интенсивности для цвета символа
позволяет получить еще восемь дополнительных оттенков цвета.
В случае использования Монохромного Адаптера значение байта
атрибутов немного отличается от описанного выше. Поскольку
возможность использования различных цветов не поддерживается
контроллером МА, то разрешены только комбинации белого символа
на черном фоне или черного символа на белом фоне. Другие коды
цвета дают комбинации черного на черном или белого на белом.
Хотя следует отметить, что комбинация голубого символа и
черного фона формирует изображение подчеркнутого символа, что не
поддерживается уже контроллером CGA. Монохромный Адаптер, как и
CGA, поддерживает возможности задания интенсивности цвета и
режима мерцания символа.
Поскольку вы теперь знаете, где размещена видеопамять и что
в нее может быть записано, то можете использовать программу pokes
из библиотеки Турбо Си для формирования изображения на экране
дисплея. Ниже приводится листинг 5.1 маленькой программы под
названием vidpoke.c, которая записывает строку непосредственно в
видеопамять. Исходя из предположения, что на вашей машине
работает контроллер CGA, программа формирует для каждого символа
байт атрибута со значением 7, что соответствут отображению строки
в виде белых символов на черном фоне. Если вы используете
Монохромный Адаптер, измените в строке # define VSEG значение с
0xB800 на 0xB000.
Листинг 5.1: vidpoke.c
/* vidpoke.c */
#define VSEG 0x6800
char vdata [] = "Что сделал Кан?";
main()
{
char *vp;
int v;
for (v=0, vp = vdata; *vp; v +=2, vp++)
poke ( VSEG, v, 0x700| *vp);
}
"Снег" и обратный ход луча развертки
-----------------------------------------------------------------
Если вы запустите программу vidpoke.exe в цикле или
значительно увеличите длину выводимой строки, то сможете увидеть
на экране так называемый "снег", который появляется при
выполнении программы. Вы будете наблюдать "снег" только в случае
использования контроллера CGA или его аналога. Контроллеры ЕGA и
МА не дают подобного эффекта. Из нижеследующих объяснений вы
узнаете, почему возникает "снег" и как его можно устранить
программнми средствами.
"Снег" возникает при использовании контроллера CGA из-за
особенностей аппаратной архитектуры видеосистемы. Поскольку и
микропроцессор, и видеоконтроллер обращаются к одной видеопамяти,
то в случае одновременного обращения возникает необходимость в
координировании доступа к памяти. Работа видеоконтроллера
синхронизирована по времени с работой схемы развертки. Во время
формирования элемента изображения на экране видеоконтроллер
должен иметь доступ к ячейке памяти, которая содержит бит,
соответствующий этому элементу изображения. Видеопроцессор при
этом не может ждать, поскольку он жестко синхронизирован с
устройством формирования растра. Следовательно, если
видеоконтроллер и микропроцессор пытаются одновременно
обратиться к одной и той же ячейке памяти, то видеоконтроллер
должен иметь при этом более высокий приоритет. В хорошо
разработанной системе микропроцессор будет находиться в состоянии
ожидания, при котором запросы микропроцессора к видеопамяти не
поступают. В контроллерах МА и EGA использован этот принцип, и
вы можете не беспокоиться о конфликтных ситуациях между
микропроцессором и видеоконтроллером при доступе к видеопамяти.