home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 24 / CD_ASCQ_24_0995.iso / dos / prg / dsik205 / dsik.dat / EXAMPLES / EXAMP10.C < prev    next >
C/C++ Source or Header  |  1995-04-10  |  6KB  |  209 lines

  1. /****************************************************************************
  2. *
  3. *                   Digital Sound Interface Kit (DSIK)
  4. *                            Version 2.00
  5. *
  6. *                           by Carlos Hasan
  7. *
  8. * Filename:     example10.c
  9. * Version:      Revision 1.0
  10. *
  11. * Language:     WATCOM C
  12. * Environment:  IBM PC (DOS/4GW)
  13. *
  14. * Description:  Small VGA 320x200 graphics demo.
  15. *
  16. * Notes:        This program requires the routines in the examp10b.asm
  17. *               assembly source file. Use "WMAKE EXAMP10.EXE" to build
  18. *               this example program.
  19. *
  20. ****************************************************************************/
  21.  
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <conio.h>
  26. #include <i86.h>
  27. #include <math.h>
  28. #include "audio.h"
  29. #include "timer.h"
  30.  
  31. #define DSMPATH "SONG.DSM"
  32.  
  33. typedef struct {
  34.     int x,y;
  35. } point;
  36.  
  37. char image[256][256];
  38. char pal[3*256];
  39.  
  40. point vertex[4] = { 0,0, 255,0, 0,255, 255,255 };
  41. int sintab[1024],costab[1024];
  42.  
  43. volatile int delta,retraces;
  44.  
  45. #ifdef __cplusplus
  46. #define EXTERN extern "C"
  47. #else
  48. #define EXTERN extern
  49. #endif
  50.  
  51. /* assembly routine prototype */
  52. EXTERN void drawimage(char *imageptr, point *pnts);
  53. #pragma aux drawimage "_*" parm [eax] [edx];
  54.  
  55. void setmode(int mode)
  56. {
  57.     union REGS r;
  58.     r.h.al = mode;
  59.     r.h.ah = 0;
  60.     int386(0x10,&r,&r);
  61. }
  62.  
  63. void setpal(char *pal)
  64. {
  65.     int i;
  66.     outp(0x3c8,0x00);
  67.     for (i = 0; i < 3*256; i++)
  68.         outp(0x3c9,pal[i]);
  69. }
  70.  
  71. /* plasma routines */
  72. int random(int n)
  73. {
  74.     static int seed = 0x1234;
  75.     seed = 0x00ab*seed + 0x4a37;
  76.     return (n*(seed & 0xffff))>>16;
  77. }
  78.  
  79. int val(int x1, int y1, int x2, int y2, int len)
  80. {
  81.     int n;
  82.     n = (((int)image[x1&0xff][y1&0xff] +
  83.         (int)image[x2&0xff][y2&0xff])>>1) + len*(random(4)-1);
  84.     return ((n<1) ? 1 : ((n>255) ? 255 : n));
  85. }
  86.  
  87. void makeplasma(int x1,int y1,int x2,int y2)
  88. {
  89.     int xc,yc,len;
  90.     if ((len = x2-x1) < 2) return;
  91.     xc = (x1+x2)>>1;
  92.     yc = (y1+y2)>>1;
  93.     if (!image[xc][y1&0xff]) image[xc][y1&0xff] = val(x1,y1,x2,y1,len);
  94.     if (!image[xc][y2&0xff]) image[xc][y2&0xff] = val(x1,y2,x2,y2,len);
  95.     if (!image[x1&0xff][yc]) image[x1&0xff][yc] = val(x1,y1,x1,y2,len);
  96.     if (!image[x2&0xff][yc]) image[x2&0xff][yc] = val(x2,y1,x2,y2,len);
  97.     image[xc][yc] = (val(xc,y1,xc,y2,len) + val(x1,yc,x2,yc,len))>>1;
  98.     makeplasma(x1,y1,xc,yc);
  99.     makeplasma(xc,y1,x2,yc);
  100.     makeplasma(x1,yc,xc,y2);
  101.     makeplasma(xc,yc,x2,y2);
  102. }
  103.  
  104. void makeimage(void)
  105. {
  106.     int i,j,k;
  107.     memset(image,0,sizeof(image));
  108.     makeplasma(0,0,256,256);
  109.     for (i = 0; i < 256; i++) {
  110.         for (j = 0; j < 256; j++) {
  111.             k = (((int)(image[i][j] - image[(i+3)&0xff][(j+0)&0xff]))<<1)+128;
  112.             image[i][j] = ((k<0) ? 0 : ((k>255) ? 255 : k));
  113.         }
  114.     }
  115.     for (k = 0; k < 2; k++) {
  116.         for (i = 0; i < 256; i++) {
  117.             for (j = 0; j < 256; j++) {
  118.                 image[i][j] = ((int)5*image[i][j] +
  119.                     (int)image[(i+1)&0xff][j] + (int)image[i][(j+1)&0xff] +
  120.                     (int)image[(i+1)&0xff][(j+1)&0xff])>>3;
  121.             }
  122.         }
  123.     }
  124. }
  125.  
  126. void timer(void)
  127. {
  128.     dPoll();
  129.     delta++;
  130.     retraces++;
  131. }
  132.  
  133. int main(int argc, char *argv[])
  134. {
  135.     SoundCard SC;
  136.     DSM *M;
  137.     int angle,i;
  138.     long frames;
  139.  
  140.     dRegisterDrivers();
  141.     if (dAutoDetect(&SC))
  142.         printf("No soundcard detected.\n");
  143.     else {
  144.         printf("%s at Port %03Xh using IRQ %d on DMA channel %d.\n",
  145.             dGetDriverStruc(SC.ID)->Name, SC.Port, SC.IrqLine, SC.DmaChannel);
  146.     }
  147.     if (dInit(&SC)) {
  148.         printf("Error initializing the sound system.\n");
  149.         exit(EXIT_FAILURE);
  150.     }
  151.     atexit((void(*)(void))dDone);
  152.     dInitTimer();
  153.     atexit((void(*)(void))dDoneTimer);
  154.     dStartTimer(timer,TICKS(70));
  155.     if (!(M = dLoadModule(DSMPATH))) {
  156.         printf("Error (%03d) loading %s module file: %s.\n",
  157.             dError, DSMPATH, dErrorMsg[dError]);
  158.         exit(EXIT_FAILURE);
  159.     }
  160.     dSetupVoices(M->Header.NumTracks,M->Header.MasterVolume);
  161.     dPlayMusic(M);
  162.  
  163.     printf("Building trig tables...\n");
  164.     for (i = 0; i < 1024; i++) {
  165.         sintab[i] = (int)(256*sin((2.0*3.14159265359*i)/1024.0));
  166.         costab[i] = (int)(256*cos((2.0*3.14159265359*i)/1024.0));
  167.     }
  168.  
  169.     printf("Building bitmap...\n");
  170.     makeimage();
  171.     for (i = 0; i < 256; i++) {
  172.         pal[3*i+0] = i/16;
  173.         pal[3*i+1] = i/8;
  174.         pal[3*i+2] = i/6;
  175.     }
  176.  
  177.     setmode(0x13);
  178.     setpal(pal);
  179.  
  180.     for (frames = retraces = angle = 0; !kbhit(); frames++) {
  181.         /* this demo will run at the same speed on any machine,
  182.            but will look much more smooth in fast computers. */
  183.         i = delta;
  184.         angle += i;
  185.         delta -= i;
  186.  
  187.         vertex[0].x = 0   + sintab[(1*angle) & 1023];
  188.         vertex[0].y = 0   + costab[(1*angle) & 1023];
  189.  
  190.         vertex[1].x = 128 + sintab[(2*angle) & 1023];
  191.         vertex[1].y = 0   + costab[(2*angle) & 1023];
  192.  
  193.         vertex[2].x = 128 + sintab[(3*angle) & 1023];
  194.         vertex[2].y = 128 + costab[(3*angle) & 1023];
  195.  
  196.         vertex[3].x = 0   + sintab[(5*angle) & 1023];
  197.         vertex[3].y = 128 + costab[(5*angle) & 1023];
  198.  
  199.         drawimage((char*)image,vertex);
  200.     }
  201.     setmode(0x03);
  202.     dStopMusic();
  203.     dFreeModule(M);
  204.  
  205.     printf("%ld retraces, %ld frames, %5.2f fps.\n",
  206.         retraces, frames, (70.1*frames)/retraces);
  207.     return 0;
  208. }
  209.