Ниже' приводится файл, определяющий необходимые константы и inline-функции для работы с портами видеокарты. Функции writeReg и readReg служат для доступа к регистрам.
SI // File ega.h
#ifndef | EGA | |
#define | _EGA_ | |
#include | <dos.h> | |
#define | EGA GRAPHICS 0x3CE | // Graphics Controller addr |
#define | EGA SEQUENCER 0x3C4 |
|
#define | EGA_CRTC 0x3D4 | |
#define | EGA SET RESET | |
#define | EGA ENABLE SET RESET | |
#define | EGA COLOR COMPARE | |
#define | EGA DATA ROTATE |
Компьютерная графика. Полигональные модели
#define | EGA | READ MAP SELECT | |
#define | EGA | MODE | |
#define | EGA | MISC | |
#define | EGA | COLOR DONT CARE | |
#define | EGA_ | _BIT_MASK | |
#define | EGA_ | _MAP_MASK | |
struct RGB |
char red; char dreen;. char blue;
inline void writeReg ( int base, int reg, int value )
outportb ( base, reg ); outportb ( base + 1, value );
inline char readReg ( int base, int reg )
outportb ( base, reg ), return inportb ( base + 1 );
inline char pixelMask ( int x ) return 0x80 » ( x & 7 ),
inline char leftMask ( int x ) return OxFF » ( x & 7 );
inline char rightMask ( int x ) return OxFF « ( 7 A ( x & 7 ) );
inline void setRWMode ( int readMode, int writeMode )
writeReg ( EGA_GRAPHICS, EGAJvlODE, ( writeMode & 3 ) | ( ( readMode & 1 ) « 3 ) );
inline void setWriteMode ( int mode )
writeReg ( EGA_GRAPHICS, EGA_DATA_ROTATE, ( mode & 3 ) « 3
int findEGA ();
int findVGA ();
void setVideoMode ( int );
void setVisiblePage ( int );
4. Работа с основными графическими устройствами
char far* findROMFont (int);
void setPalette ( RGB far * palette, int);
#endif
Рассмотрим две основные группы регистров, принадлежащих двум частям видеокарты, - Graphics Controller и Sequencer.
Каждой группе соответствует своя пара портов.
4.7.1. Graphics Controller (порты 3CE-3CF)
Номер |
Регистр |
Стандартное значение |
Set/Reset | ||
Enable Set/Reset | ||
Color Compare | ||
Data rotate | ||
Read Map Select | ||
Mode | ||
Miscellaneous | ||
Color Don't Care | OF | |
Bit Mask | FF |
Для записи в регистр необходимо сначала послать номер регистра в порт ЗСЕ, а затем записать соответствующее значение в порт 3CF.