Here's some newer (optimized) code to play with...
(Just the C front end to the assembly code just reposted)

  John

/* fill.c, processor poly filler   */
/* Copyright (c) 1991 John Schultz */
/* This is the latest version of the C interface to my processor
   polygon fill code.
*/

typedef struct shortpoint2d {
  short x,y;
} shortpoint2d;

#define WIDTH  320
#define HEIGHT 200

static short xmin[HEIGHT+1], xmax[HEIGHT+1];
static short * xt;

/******************* COUNTERCLOCKWISE POLYGONS ********************/
/**************** (This version does clockwise too) ***************/

void drawpolyc(shortpoint2d * vp,
               char * p,    /* PLANEPTR */
               short count,
               short color){
shortpoint2d * tmax, * tmin;
shortpoint2d * tp, * tpn;
shortpoint2d * last;
long cmp;
long orient;

/* Get last point */
  last = &vp[count-1];

/* Cross product to check for check for line case */
  if (count > 3) { /* Use Newell method */
    orient = 0;
    tp = vp; /* Point to first point */
    while (1) {
      if (tp == last)
        tpn = vp; /* Set next pointer to first point */
      else
        tpn = tp + 1; /* point to next. Compiler does: tp + sizeof(*tp) */
      orient += (tp->x - tpn->x)*(tp->y + tpn->y);
      if (tpn == vp) break; /* Come full circle */
      tp = tpn; /* go to next */
    } /* while */
  } else { /* Simple cross-product: triangle case */
    orient = (vp[1].x - vp[0].x)*(vp[2].y - vp[0].y) - 
             (vp[1].y - vp[0].y)*(vp[2].x - vp[0].x);
  } /* if count */

  if (orient == 0L) { /* Collinear: draw a line */
/* Find two points that aren't equal */
    cmp = *(long *)vp; /* First point */
    tp = vp + 1; /* Point to next (Compiler does: vp + sizeof(*vp) */
    while (1) {
      if ((cmp != (*(long *)tp)) || (tp == last)) break;
      tp++;      
    } /* while */
    drawline(p,vp->x,vp->y,tp->x,tp->y,color);
    return;
  } /* if line case */

/* Find miny,maxy */
  tmin = vp;   /* Point at first */
  tmax = vp;   /* "            " */
  tp = vp + 1; /* Point to next (Compiler does: vp + sizeof(*vp) */

  while (1) {
    if (tp->y < tmin->y) {
      tmin = tp;
    } else if (tp->y == tmin->y) {
      if (tp->x >= tmax->x) {
        tmin = tp;
      } /* if tp->x */
    } /* if tp->y */
    if (tp->y > tmax->y) {  /* MaxY */
      tmax = tp;
    } else if (tp->y == tmax->y) {
      if (tp->x < tmax->x) { /* Get maxY, minX */
        tmax = tp;
      } /* if tp->x */
    } /* if tmaxy */
    if (tp == last) break;
    tp++;
  };

  if (orient < 0) {

/* Fill tables */
  tp = tmin; /* Temp point starts at miny */
  xt = xmin; /* Fill xmin table first */
  while (1) {
    if (tp == last)
      tpn = vp; /* Set to first point */
    else
      tpn = tp + 1; /* Next. Compiler does: tp + sizeof(*tp) */
    fillline68k(tp->x,tp->y,tpn->x,tpn->y,xt);
    if (tpn == tmin) break; /* Come full circle, quit */
    if (tpn == tmax) xt = xmax; /* Fill max table */
    tp = tpn; /* Go to next */
  } /* while */

  } else {

/* Fill tables */
  tp = tmin; /* Temp point starts at miny */
  xt = xmax; /* Fill xmax table first */
  while (1) {
    if (tp == last)
      tpn = vp; /* Set to first point */
    else
      tpn = tp + 1; /* Next. Compiler does: tp + sizeof(*tp) */
    fillline68k(tp->x,tp->y,tpn->x,tpn->y,xt);
    if (tpn == tmin) break; /* Come full circle, quit */
    if (tpn == tmax) xt = xmin; /* Fill min table */
    tp = tpn; /* Go to next */
  } /* while */

  } /* if orient */

/* Draw polygon */
  scanconvpix(p,xmin,xmax,tmin->y,tmax->y,color);

} /* drawpolyc */

/* end fill.c */


