буферных регистров; для того, чтобы остальные пикселы на самом деле не изменили свой цвет, нам нужно предварительно прочитать значение байта по адресу $АООО:ОООО — в результате буферные регистры будут заполнены правильными значениями, а если этого не сделать, они сохранят значения, оставшиеся от предыдущего обращения к видеопамяти, которое, возможно, было связано с другим адресом.

Фактически мы только что рассмотрели лишь простейшие возможности одного (нулевого) режима записи. В адаптерах EGA/VGA существуют три различных режима записи: 0, 1 и 2. Нужный режим устанавливается с помощью предварительного выбора регистра режима. Для этого в порт по адресу $ЗСЕ необходимо переслать число 5 — номер регистра режима записи. Затем в порт по адресу $3CF следует послать номер режима записи (О, 1 или 2). Разумеется, к этому моменту адаптер должен находиться в графическом режиме работы. Вот как, например, можно установить режим записи 2:

Uses Graph;

var

D,R: Integer;

begin

D := Detect;

InitGraph(D,R,''); {Устанавливаем графический режим} if GraphResultOgrOk then

halt; {Ошибка инициации} Port($3CE) := 5; {Номер регистра} Port($3CF) := 2; {Посылаем в него номер режима}

end.

Таким образом, для записи одного пиксела по адресу Х,У (отсчет от нуля) в режиме 0 необходимо:

• определить адрес видеобайта, содержащего нужный пиксел; для координат Х,У это будет байт по адресу Mem[$AOOO: (Y*80+X div 8)];

• установить в единицу бит (7-Х mod 8) в регистре маски битов и поместить нули во все остальные разряды, т.е. запретить изменение любых пиксел, кроме нужного; для этого в порт $ЗСЕ нужно поместить номер регистра маски битов 8, а в порт $3CF — сформированную маску битов;

• установить нужный цвет в регистр цвета; д^я этого в порт $ЗС4 нужно послать 2 — номер регистра цвета, а затем в порт $ЗС5 — код нужного цвета;

• заполнить буферные регистры; для этого нужно прочитать видеобайт из памяти по адресу Mem[$AOOO: (Y*80+X div 8) ];

• установить в единицу бит (7-Х mod 8) в прочитанном видеобайте и послать его в видеопамять (если запрещены изменения во всех разрядках, кроме нужного, можно послать любой байт, содержащий единицу в этом разряде).