VGA 640x480x16

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
User avatar
Jeko
Member
Member
Posts: 500
Joined: Fri Mar 17, 2006 12:00 am
Location: Napoli, Italy

VGA 640x480x16

Post by Jeko »

I try to implement the 640x480x16 VGA. My code works, except vgaSetPixel(). What is the bug?

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);	
}
[/code]
earlz
Member
Member
Posts: 1546
Joined: Thu Jul 07, 2005 11:00 pm
Contact:

Re: VGA 640x480x16

Post by earlz »

does it not compile, or crash, or not show anything or what gotta give us some info buddy
User avatar
Jeko
Member
Member
Posts: 500
Joined: Fri Mar 17, 2006 12:00 am
Location: Napoli, Italy

Re: VGA 640x480x16

Post by Jeko »

It compile and not crash. vgaClearScreen() clear the screen but when i use vgaSetPixel() it not show what i want.
Last edited by Jeko on Wed Jun 07, 2006 11:00 pm, edited 1 time in total.
Rewriting virtual memory manager - Working on ELF support - Working on Device Drivers Handling

http://sourceforge.net/projects/jeko - Jeko Operating System
User avatar
Jeko
Member
Member
Posts: 500
Joined: Fri Mar 17, 2006 12:00 am
Location: Napoli, Italy

Re: VGA 640x480x16

Post by Jeko »

i find the error. i deleted the line outportb(GRA_D, bitMask); in the function vgaSetPixel.
Rewriting virtual memory manager - Working on ELF support - Working on Device Drivers Handling

http://sourceforge.net/projects/jeko - Jeko Operating System
Post Reply