home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 September / Simtel20_Sept92.cdr / msdos / pcmag / vol5n15.arc / EGADEMO.C < prev    next >
Text File  |  1986-07-01  |  2KB  |  77 lines

  1.  
  2.  
  3. /* EGADEMO.C -- Compile with Microsoft C Version 3 with /Ze parameter
  4.         to enable "far" keyword.  Programmed by Charles Petzold. */
  5. #include <dos.h>
  6. #define MAXROWS 350
  7. #define MAXCOLS 640
  8. #define COLBYTES MAXCOLS/8
  9. #define GRAFOUT(index,value) { outp(0x3CE,index) ; outp(0x3CF,value) ; }
  10. #define SWAP(a,b,temp) { temp = a ; a = b ; b = temp ; }
  11.  
  12. main()    {
  13.     setvideomode(16) ;
  14.     randomrect(0) ;                /* Draw colored rectangles */
  15.     setvideomode(16) ;
  16.     randomrect(0x18) ;            /* Rectangles with XORing */
  17.     setvideomode(3) ;
  18.     }
  19.  
  20. setvideomode(mode)                /* Sets video mode */
  21.     int mode ;
  22.     {
  23.     union REGS regs ;
  24.  
  25.     regs.x.ax = mode ;
  26.     int86(0x10, ®s, ®s) ;
  27.     }
  28.  
  29. randomrect(fnct)                /* Draws 100 rectangles */
  30.     int fnct ;
  31.     {
  32.     unsigned int i, r1, c1, r2, c2, temp ;
  33.  
  34.     GRAFOUT(3, fnct) ;            /* Function Register */
  35.     for (i = 0 ; i < 100 ; i++) {
  36.         r1 = rand() % MAXROWS ; r2 = rand() % MAXROWS ;
  37.         c1 = rand() % MAXCOLS ; c2 = rand() % MAXCOLS ;
  38.         if (r1 > r2) SWAP (r1, r2, temp) ;
  39.         if (c1 > c2) SWAP (c1, c2, temp) ;
  40.         rect(r1, c1, r2, c2, rand()%16);
  41.         }
  42.     }
  43.  
  44. rect(r1, c1, r2, c2, color)            /* r1 <= r2 and c1 <= c2 */
  45.     unsigned int r1, c1, r2, c2, color ;
  46.     {
  47.     char far *addr = (char far *) (0xA0000000L + COLBYTES*r1 + (c1>>3)) ;
  48.     int numrows    = r2 - r1 ;            /* Number of rows */
  49.     int numcols    = (c2 >> 3) - (c1 >> 3) - 1 ;    /* Number of columns */
  50.     char lmask     =   0xFF >> (c1 & 7) ;        /* Mask for left */
  51.     char rmask     = ~(0xFF >> (c2 & 7)) ;        /* Mask for right */
  52.     register row, col ;
  53.  
  54.     if (numcols < 0) {            /* Adjustment for small rows */
  55.         lmask &= rmask ; 
  56.         rmask = numcols = 0 ; 
  57.         }
  58.     GRAFOUT(0, color) ;            /* Set/Reset Register */
  59.     GRAFOUT(1, 0x0F) ;              /* Enable Set/Reset Register */
  60.     for (row = 0 ; row < numrows ; row++) {
  61.         GRAFOUT(8, lmask) ;            /* Bit Mask Register */
  62.         *(addr++) &= 1 ;            /* Left side */
  63.         GRAFOUT(8, 0xFF) ;
  64.         for (col = 0 ; col < numcols ; col++) 
  65.             *(addr++) &= 1 ;        /* Middle part */
  66.         GRAFOUT(8, rmask) ;
  67.         *(addr++) &= 1 ;            /* Right side */
  68.         addr += COLBYTES - 2 - numcols ;    /* Next row */
  69.         }
  70.     GRAFOUT(0, 0) ;                /* Set/Reset to normal */
  71.     GRAFOUT(1, 0) ;                /* S/R Enable to normal */  
  72.     GRAFOUT(8, 0xFF) ;            /* Bit mask to normal */
  73.     }
  74.  
  75.  
  76.  
  77. Figure 16:  An EGA graphics demonstration program written in C that draws random rectangles on the screen.