буферных регистров; для того, чтобы остальные пикселы на самом деле не изменили свой цвет, нам нужно предварительно прочитать значение байта по адресу $АООО:ОООО — в результате буферные регистры будут заполнены правильными значениями, а если этого не сделать, они сохранят значения, оставшиеся от предыдущего обращения к видеопамяти, которое, возможно, было связано с другим адресом.
Фактически мы только что рассмотрели лишь простейшие возможности одного (нулевого) режима записи. В адаптерах 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) в прочитанном видеобайте и послать его в видеопамять (если запрещены изменения во всех разрядках, кроме нужного, можно послать любой байт, содержащий единицу в этом разряде).