home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 17 / CD_ASCQ_17_101194.iso / dos / prg / sphinx / examples / vga / pow4.c__ < prev    next >
Encoding:
Text File  |  1994-03-24  |  4.3 KB  |  180 lines

  1. /*
  2.      SPHINX C-- program of POW4
  3. */
  4.  
  5. ?include "VIDEO.H--"
  6. ?include "WRITE.H--"
  7. ?include "RANDOM.H--"
  8. ?include "DOS.H--"
  9. ?include "KEYCODES.H--"
  10.  
  11.  
  12. ?define  DOTS         1000    /* maximum number around 6666 or so */
  13. ?define  MAXCHANGE       5
  14. ?define  MINCHANGE       1
  15.  
  16. ?define  CHANGEMOD        MAXCHANGE *2 + 1
  17. ?define  MODCHANGE        CHANGEMOD *2 + 1
  18. ?define  LOCATIONCHANGE   100
  19.  
  20. ?define  HI256  0x5C   // vid_800x600_256_ATI /* 99 for ATI VGA Wonder 800x600-256 */
  21.                                     /* 98 for ATI VGA Wonder 640x480-256 */
  22.                                     /* 97 for ATI VGA Wonder 640x400-256 */
  23.  
  24.  
  25. ?define  XMAX     800    /* X width of screen in pixels */
  26. ?define  YMAX     600    /* Y width of screen in pixels */
  27.  
  28. ?define  STARTXMOD    XMAX-100
  29. ?define  STARTYMOD    YMAX-100
  30. ?define  STARTX       XMAX / 2
  31. ?define  STARTY       YMAX / 2
  32.  
  33.  
  34. word x[DOTS],y[DOTS];
  35. int xchange[DOTS],ychange[DOTS];
  36. byte color[DOTS];
  37.  
  38. word startx=STARTX, starty=STARTY;
  39. byte startcolor=15;
  40. byte quit=0;
  41.  
  42.  
  43. main()
  44. {
  45. @ RANDOMIZE();
  46. @ SETVIDEOMODE( HI256 );
  47.  
  48. IF( GETVIDEOMODE() <> HI256 )
  49.     {WRITESTR("Unable to enter 800x600-256 video mode");
  50.     @ EXIT(1);
  51.     }
  52.  
  53. DI = 0;
  54. ES = 0xA000;
  55.  
  56. do { SI = DI+DI;
  57.      x[SI] = startx;
  58.      y[SI] = starty;
  59.  
  60.      xchange[SI] = RAND() % CHANGEMOD - MAXCHANGE;
  61.      ychange[SI] = RAND() % CHANGEMOD - MAXCHANGE;
  62.  
  63.      BL = 0;
  64.      AX = xchange[SI];
  65.      IF( AX < 0 )
  66.          - AX;
  67.      IF( AX >= MINCHANGE )
  68.          BL = 1;
  69.      AX = ychange[SI];
  70.      IF( AX < 0 )
  71.          - AX;
  72.      IF( AX >= MINCHANGE )
  73.          BL = 1;
  74.      IF( BL == 0 )
  75.          xchange[SI] = MINCHANGE;
  76.  
  77.      color[DI] = startcolor;
  78.  
  79.      XORPIXEL_EVGA256();
  80.  
  81.      DI++;
  82.     } while(DI < DOTS);
  83.  
  84. startcolor = 1;
  85.  
  86. do {
  87.     @KBHIT();
  88.     IF(AX != 0)
  89.         {@BIOSREADKEY();
  90.         IF(AX == k_esc)
  91.             quit = 1;
  92.         }
  93.  
  94.     DI = 0;
  95.     do {
  96.         SI = DI+DI;
  97.  
  98.         BX = 0;               /* let BX be a flag */
  99.         IF( x[SI] >= XMAX )
  100.             BX = 1;
  101.         IF( y[SI] >= YMAX )
  102.             BX = 1;
  103.         if( BX == 0 )
  104.             {
  105.             XORPIXEL_EVGA256();
  106.             x[SI] += xchange[SI];
  107.             y[SI] += ychange[SI];
  108.  
  109.             BX = 0;               /* let BX be a flag */
  110.             IF( x[SI] >= XMAX )
  111.                 BX = 1;
  112.             IF( y[SI] >= YMAX )
  113.                 BX = 1;
  114.             IF( BX == 0 )
  115.                 XORPIXEL_EVGA256();
  116.             }
  117.         else{
  118.             AX = RAND() % LOCATIONCHANGE;
  119.             IF( AX == 0 )
  120.                 {startx = RAND() % STARTXMOD + 50;
  121.                 starty = RAND() % STARTYMOD + 50;
  122.                 startcolor = RAND() /*& 15*/;   /* allow any colour 0 to 15 */
  123.                 }
  124.             x[SI] = startx;
  125.             y[SI] = starty;
  126.  
  127.             do {
  128.                 xchange[SI] = RAND() % MODCHANGE - MAXCHANGE;
  129.                 ychange[SI] = RAND() % MODCHANGE - MAXCHANGE;
  130.                 BL = 0;
  131.  
  132.                 AX = xchange[SI];
  133.                 IF( AX < 0 )
  134.                     - AX;
  135.                 IF( AX >= MINCHANGE )
  136.                     BL = 1;
  137.                 AX = ychange[SI];
  138.                 IF( AX < 0 )
  139.                     - AX;
  140.                 IF( AX >= MINCHANGE )
  141.                     BL = 1;
  142.                 } while (BL == 0);
  143.  
  144.             color[DI] = startcolor;
  145.             XORPIXEL_EVGA256();
  146.             }
  147.         DI ++;
  148.         } while( DI < DOTS );
  149.     } while( quit == 0);
  150.  
  151. @ SETVIDEOMODE( 3 );
  152. WRITESTR("SPHINX Programming 1993");
  153. }
  154.  
  155.  
  156.  
  157. XORPIXEL_EVGA256()
  158. {
  159. AX = XMAX * y[SI];   /* Multiply X width by Y coord and store in AX */
  160. AX += x[SI];
  161. $ ADC DL,0      /* INC DL if addition of x coord caused a carry */
  162. BX = AX;        /* the offset address is now in BX */
  163. CH = DL;        /* CH is now the memory plane to select */
  164. DX = 0x01CE;    /* move port number into DX */
  165. AL = 0xB2;
  166. $ CLI           /* disable interrupts so not to interfere with port writing */
  167. $ OUT DX,AL     /* SELECTION OF VIDEO MEMORY PLANE STARTS */
  168. DL++;
  169. $ IN AL,DX      /* read from port DX into AL */
  170. AH = AL;
  171. AH &= 0xE1;
  172. CH += CH;
  173. AH |= CH;
  174. AL = 0xB2;
  175. DL--;
  176. $ OUT DX,AX     /* VIDEO MEMORY PLANE IS SELECTED */
  177. $ STI                      /* enable interrupts */
  178. ESBYTE[BX] ^= color[DI];   /* XOR pixel in memory */
  179. }
  180.