
РАБОТА С ОСНОВНЫМИ ГРАФИЧЕСКИМИ УСТРОЙСТВАМИ
46
WriteReg ( EGA_CRTC, 0x17, 0xE3 );
WriteReg ( EGA_CRTC, 0x14, 0 );
WriteReg ( EGA_SEQUENCER, 0, 1 ); // synchronous reset
outportb ( 0x3C2, 0xE7 ); // select 25 MHz dot clock
// & 60 Hz scan rate
WriteReg ( EGA_SEQUENCER, 0, 3 ); // restart sequencer
WriteReg ( EGA_CRTC, 0x11, ReadReg ( EGA_CRTC, 0x11 ) & 0x7F );
for ( int i = 0; i < sizeof ( CRTCTable ) / sizeof ( int ); i++ )
outport ( EGA_CRTC, CRTCTable [i] );
// clear screen
WriteReg ( EGA_SEQUENCER, EGA_MAP_MASK, 0x0F );
_fmemset ( MK_FP ( PageBase, 0 ), '\0', 0xFFFF );
}
void SetVisualPage ( int page )
{
unsigned addr = page * 0x4B00;
// wait for vertical retrace
while ( ( inportb ( 0x3DA ) & 0x08 ) == 0 )
;
WriteReg ( EGA_CRTC, 0x0C, addr >> 8 );
WriteReg ( EGA_CRTC, 0xDC, addr & 0x0F );
}
void SetActivePage ( int page )
{
PageBase = 0xA000 + page * 0x4B0;
}
void WritePixel ( int x, int y, int color )
{
WriteReg ( EGA_SEQUENCER, EGA_MAP_MASK, 1 << ( x & 3 ) );
pokeb ( PageBase, y * BytesPerLine + ( x >> 2 ), color );
WriteReg ( EGA_SEQUENCER, EGA_MAP_MASK, 0x0F );
}
int ReadPixel ( int x, int y )
{
WriteReg ( EGA_GRAPHICS, EGA_READ_MAP_SELECT, x & 3 );
return peekb ( PageBase, y * BytesPerLine + ( x >> 2 ) );
}
Программирование SVGA'адаптеров
Существует большое количество видеокарт, хотя и совместимых с VGA, но
предоставляющих достаточно большой набор дополнительных режимов. Обычно такие карты
называют SuperVGA или SVGA. Существует большое количество SVGAкарт различных
производителей, сильно различающихся по основным возможностям и, как правило,
несовместимых друг с другом. Сам термин "SVGA" обозначает скорее не стандарт (как VGA),
а некоторое его расширение.
Рассмотрим работу с 256цветными режимами SVGAадаптеров. Почти все они
построены одинаково под каждый пиксел отводится один байт, и вся видеопамять
разбивается на банки одинакового размера (обычно по 64 Кбайт), при этом область адресного