vga.h:
Code: Select all
/* VGA index register ports */
/** CRT Controller Index - color emulation */
#define CRT_IC 0x3D4
/** CRT Controller Index - mono emulation */
#define CRT_IM 0x3B4
/** Attribute Controller Index & Data Write Regis */
#define ATT_IW 0x3C0
/** Graphics Controller Index */
#define GRA_I 0x3CE
/** Sequencer Index */
#define SEQ_I 0x3C4
/** PEL Write Index */
#define PEL_IW 0x3C8
/** PEL Read Index */
#define PEL_IR 0x3C7
/* VGA data register ports */
/** CRT Controller Data Register - color emulatio */
#define CRT_DC 0x3D5
/** CRT Controller Data Register - mono emulation*/
#define CRT_DM 0x3B5
/** Attribute Controller Data Read Register */
#define ATT_R 0x3C1
/** Graphics Controller Data Register */
#define GRA_D 0x3CF
/** Sequencer Data Register */
#define SEQ_D 0x3C5
/** Misc Output Read Register */
#define MIS_R 0x3CC
/** Misc Output Write Register */
#define MIS_W 0x3C2
/** Input Status Register 1 - color emulation */
#define IS1_RC 0x3DA
/** Input Status Register 1 - mono emulation */
#define IS1_RM 0x3BA
/** PEL Data Register */
#define PEL_D 0x3C9
/** PEL mask register */
#define PEL_MSK 0x3C6
#define MODE80x25 03
#define MODE640x480x16 12
/** The VGA Registers */
typedef struct
{
unsigned char CRTRegisters[24];
unsigned char ATTRegisters[21];
unsigned char GRARegisters[9];
unsigned char SEQRegisters[5];
unsigned char MISRegisters[1];
}VgaRegisters;
/** The VgaMode structure (will be changed) */
typedef struct
{
char isTextMode;
int mode;
int width;
int height;
int bitplanes;
unsigned char * buffer;
unsigned char * memory;
unsigned int memSize;
}VgaMode;
int setVideoMode(int mode);
void vgaClearScreen(void);
int vgaSetPixel(int x, int y, unsigned char color);
vga.c:
Code: Select all
void vgaWriteRegs(VgaRegisters *regs);
void vgaDelay(void);
VgaMode currentVideoMode;
VgaMode lastVideoMode;
VgaRegisters defaultRegs;
VgaRegisters mode12hregs={
{ 0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28,
0x00, 0xE7, 0x04, 0xE3},
{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x01, 0x00, 0x0F, 0x00,
0x00},
{ 0x00, 0x0F, 0x00, 0x20, 0x00, 0x00, 0x05, 0x0F, 0xFF },
{ 0x03, 0x01, 0x0F, 0x00, 0x06 },
{ 0xE3 }
};
int setVideoMode(int mode){
unsigned char* buff=NULL;
if(mode == currentVideoMode.mode){
return(1);
}
if(mode== lastVideoMode.mode){
buff = lastVideoMode.buffer;
}
lastVideoMode.isTextMode=currentVideoMode.isTextMode;
lastVideoMode.mode=currentVideoMode.mode;
lastVideoMode.width=currentVideoMode.width;
lastVideoMode.height=currentVideoMode.height;
lastVideoMode.bitplanes=currentVideoMode.bitplanes;
lastVideoMode.buffer=currentVideoMode.buffer;
lastVideoMode.memory=currentVideoMode.memory;
lastVideoMode.memSize=currentVideoMode.memSize;
switch (mode){
case MODE80x25 :
vgaWriteRegs(&defaultRegs);
currentVideoMode.isTextMode = TRUE;
currentVideoMode.mode = MODE80x25;
currentVideoMode.width = 80;
currentVideoMode.height = 25;
currentVideoMode.bitplanes = 2;
currentVideoMode.buffer = buff;
currentVideoMode.memory = (byte*)0x000B8000;
currentVideoMode.memSize = 0x10000;
break;
case MODE640x480x16:
vgaWriteRegs(&mode12hregs);
currentVideoMode.isTextMode = FALSE;
currentVideoMode.mode = MODE640x480x16;
currentVideoMode.width = 640;
currentVideoMode.height = 480;
currentVideoMode.bitplanes = 4;
currentVideoMode.buffer = buff;
currentVideoMode.memory = (byte*)0x000A0000;
currentVideoMode.memSize = (640*480/8)*4;
break;
}
return(1);
}
void vgaWriteRegs(VgaRegisters *regs){
int i;
outportb(MIS_W , regs->MISRegisters[0]);
vgaDelay();
outportb(IS1_RC,0);
outportb(SEQ_I,0);
outportb(SEQ_D,1);
outportb(SEQ_I,1);
outportb(SEQ_D,regs->SEQRegisters[1]);
for(i=2;i<5;i++){
outportb(SEQ_I,i);
outportb(SEQ_D,regs->SEQRegisters[i]);
vgaDelay();
}
outportb(SEQ_I,0);
outportb(SEQ_D,3);
/* clear Protection bits */
outportw( CRT_IC,0x0e11);
vgaDelay();
for(i=0;i<25;i++){
outportb(CRT_IC,i);
vgaDelay();
outportb(CRT_DC,regs->CRTRegisters[i]);
vgaDelay();
}
for (i=0; i < 9; i++) {
outportb( GRA_I,i);
outportb( GRA_D ,regs->GRARegisters[i]);
}
for (i=0; i < 0x15; i++) {
inportb(IS1_RC);
vgaDelay();
outportb(ATT_IW, i|0x20);
vgaDelay();
outportb(ATT_IW,regs->ATTRegisters[i]);
vgaDelay();
}
inportb(IS1_RC);
vgaDelay();
outportb(ATT_IW, 0x20);
}
void vgaDelay(void){
int i;
for(i=0;i<10;i++){
}
}
void vgaClearScreen(void){
unsigned regBuff[3];
switch(currentVideoMode.mode){
case MODE640x480x16:
outportb(GRA_I,0x08);
regBuff[0]=inportb(GRA_D);
outportb(GRA_I,0x05);
regBuff[1]=inportb(GRA_D);
outportb(GRA_I,0x03);
regBuff[2]=inportb(GRA_D);
outportb(GRA_I,0x05);
outportb(GRA_D,0x02);
outportb(GRA_I,0x03);
outportb(GRA_D,0x00);
outportb(GRA_I,0x08);
outportb(GRA_D,0xff);
memset((byte *)currentVideoMode.memory,0,currentVideoMode.memSize);
outportb(GRA_I,0x08);
outportb(GRA_D,regBuff[0]);
outportb(GRA_I,0x05);
outportb(GRA_D,regBuff[1]);
outportb(GRA_I,0x03);
outportb(GRA_D,regBuff[2]);
break;
}
}
int vgaSetPixel(int x, int y, unsigned char color){
int bitPos;
unsigned char bitMask;
char buff;
int offset;
switch(currentVideoMode.mode){
case MODE640x480x16:
offset =(y*currentVideoMode.width)/8+(x/8);
bitPos= 7-(x % 8);
bitMask = (1 << bitPos);
outportb(GRA_I,0x08); /* BitMask Reg*/
outportb(GRA_D,bitMask);
outportb(GRA_I,0x05); /* GFXMode Reg*/
outportb(GRA_D,0x02); /* write-2 read-0*/
buff=*(byte *)(currentVideoMode.memory + offset);
*(byte*)(currentVideoMode.memory+offset)=color;
/*default Werte setzen*/
outportb(GRA_I,0x08);
outportb(GRA_D,0xff);
outportb(GRA_I,0x05);
outportb(GRA_D,0x00);
break;
}
return(0);
}