10 Глава 1

1.1. ОРГАНИЗАЦИЯ ВИДЕОПАМЯТИ В ГРАФИЧЕСКОМ РЕЖИМЕ

1.1.1. Адаптер CGA

Адаптер CGA в графическом режиме использует те же 16 Кбайт видеопамяти (и по тому же адресу $В800:$0000), что и в текстовом режиме. Это дает возможность реализовать на экране лишь 320х200 пиксел с четырьмя возможными цветами в режиме низкого разрешения и 640х200 пиксел с двумя цветами в режиме высокого разрешения. Связано это со способом использования видеопамяти: в графическом режиме низкого разрешения каждый пиксел отображается в видеопамяти двумя битами (разрядами), а в режиме высокого разрешения — одним битом. Два бита дают возможность закодировать один из четырех возможных цветов, в то время как один бит — лишь два цвета. Так как нулевое значение бита (или пары бит для низкого разрешения) отождествляется с отсутствием светимости пиксела, т.е. с черным цветом, фактически для CGA—адаптера доступны лишь 3 цвета в режиме низкого и один — в режиме высокого разрешения.

Видеопамять в адаптере CGA трактуется как одна длинная строка бит, причем первый бит (пара бит) кодирует пиксел, расположенный в левом верхнем углу экрана, второй бит (пара бит) — пиксел, расположенный справа от него и т.д.; 640—и бит (или 320—я пара бит для низкого разрешения) кодирует самый правый пиксел верхней строки развертки. Следующая строка развертки определяется битами, расположенными начиная с середины видеопамяти, т.е. начиная с адреса $В800:$2000. Эта схема сохраняется для всех остальных строк — четные строки (с номерами О, 2 и т.д.) определяются содержимым первой половины видеопамяти, в то время как нечетные берутся со смещением $2000 = 8192 байта от ее начала.

Таким образом, чтобы в режиме высокого разрешения изменить светимость пиксела с координатами X, У (О<=Х<=639, 0<=У<=199), нужно в байте по адресу

Мет[$В800:((Y div 2)*80 + ord(odd(Y))*$2000 + Х div 8)] изменить бит

7-Х mod 8

(бит 7 соответствует старшему разряду байта), а для режима низкого разрешения (0<=х<=319, О<=Г<=199) — пару бит

(7 - 2*(Х mod 4)) и (6 - 2*(X mod 4)) по адресу

Mem[$B8OO:((Y div 2)*80 + ord(odd(Y))*$2000 + X div 4)]

При непосредственном обращении к видеопамяти CGA—адаптера необходимо синхронизировать доступ к памяти (чтение или запись байта) с