// enable all planes writeReg ( EGA_GRAPHICS, EGA__ENABLE_SET_RESET, OxOF ); writeReg ( EGA_GRAPHICS, EGA__SET_RESET, color ); writeReg ( EGA_GRAPHICS, EGAJ3IT_MASK, PixelMask ( x )); *vptr += 1; // perform read/write at memory loc.
// disable all planes writeReg ( EGA_GRAPHICS, EGA_ENABLE_SET__RESET, 0 ); // restore reg
writeReg ( EGA_GRAPHICS, EGA_BIT_MASKf OxFF );
}
4.9.2. Режим записи 1
В этом режиме значения latch-регистров непосредственно копируются в соответствующие плоскости. Регистры масок и режима не действуют. Посланное процессором значение не играет никакой роли. Этот режим позволяет осуществлять быстрое копирование фрагментов видеопамяти. При чтении байга по исходному адресу прочитанные 4 байта с плоскостей загружаются в latch-регистры, а при записи значения latch-регистров записываются в плоскости по адресу, по которому шла запись. Таким образом, за одну операцию перезаписи копируется сразу 4 байта (8 пикселов).
Приведенная ниже функция осуществляет копирование прямоугольной области экрана в соответствующую область с верхним левым углом в точке (.v. у).
В силу ограничений режима записи 1 эта процедура может копировать только области, где .vi кратно 8 и ширина кратна 8, так как копирование осуществляется блоками по 8 пикселов сразу. Кроме того, этот пример не учитывает возможности
4. Работа с основными графическими устройствами того, что область, куда производится копирование, имеет непустое пересечение с исходной областью. В подобном случае возможна некорректная работа процедуры и, чтобы подобного не возникало, необходимо заранее проверять области на пересечение: при непустом пересечении копирование осуществляется в обратном порядке.
(gl // File copyrect.cpp
void copyRect(int x1, int y1, int x2, int y2, int x, int y)
* char far *src = (char far *) MK__FP (OxAOOO, y1*80+(x1 » 3)); char far *dst = (char far *) MK_FP (OxAOOO, y*80+(x » 3)); *mt cols = ( x2 » 3 ) - ( x1 » 3 );
setRWMode ( 0,1 );
for ( int i = y1; i <= y2; i++ )
{
for ( intj = 0; j < cols; j++) *dst++ = *src++;