I'm using the below function to draw a line that uses the Bresenham's algorithm copied code from "256-Color VGA Programming in C" tutorial.

My problems are that when plotting a straight line the first pixel isn't plotted and when drawing diagonal lines they aren't straight.

The program is to use a resolution of 640x480x16.

Thank you for your help.

Code:
void line(SDL_Surface *screen, int x1, int y1, int x2, int y2, Uint8 R, Uint8 G, Uint8 B)
{
  int i,dx,dy,sdx,sdy,dxabs,dyabs,x,y,px,py;

  dx=x2-x1;      /* the horizontal distance of the line */
  dy=y2-y1;      /* the vertical distance of the line */
  dxabs=abs(dx);
  dyabs=abs(dy);
  sdx=sgn(dx);
  sdy=sgn(dy);
  x=dyabs>>1;
  y=dxabs>>1;
  px=x1;
  py=y1;

//  VGA[(py<<8)+(py<<6)+px]=color; 
	DrawPixel(screen, py<<8, py<<6, R, G, B);

  if (dxabs>=dyabs) /* the line is more horizontal than vertical */
  {
    for(i=0;i<dxabs;i++)
    {
      y+=dyabs;
      if (y>=dxabs)
      {
        y-=dxabs;
        py+=sdy;
      }
      px+=sdx;
		DrawPixel(screen, px, py, R, G, B);
    }
  }
  else /* the line is more vertical than horizontal */
  {
    for(i=0;i<dyabs;i++)
    {
      x+=dxabs;
      if (x>=dyabs)
      {
        x-=dyabs;
        px+=sdx;
      }
      py+=sdy;
		DrawPixel(screen, px, py, R, G, B);
    }
  }
}