/* Save a rectangular region to a user buffer */
void save_area(int ulrow, int ulcol, int lrrow,
               int lrcol, char *buf)
{
    if (buf)
    {
        int nbytes = 2*(lrcol-ulcol+1), row, n;
    
        for (row = ulrow; row <= lrrow; ++row)
        {
            char far *p = base + (row*160 + 2*ulcol);
            for (n = 0; n < nbytes; ++n)
                *buf++ = *p++;
        }
    }
}

/* Restore a region to the screen from user buffer */
void restore_area(int ulrow, int ulcol, int lrrow,
                  int lrcol, char *buf)
{
 /*  DETAILS OMITTED: Identical to save_area() except the
  *   assignment in the last statement is reversed:
  */
                *p++ = *buf++;
        }
    }
}

/* Fill a region with normal spaces */
void vclear_area(int ulrow, int ulcol, int lrrow, int lrcol)
{
    int far *p;
    int nchars = (lrcol-ulcol+1), row, n;
    
    for (row = ulrow; row <= lrrow; ++row)
    {
        p = (int far *) (base + (row*160 + 2*ulcol));
        for (n = 0; n < nchars; ++n)
            *p++ = 0x0720;
    }
}

