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 >
Wrap
C/C++ Source or Header
|
1995-04-10
|
6KB
|
209 lines
/****************************************************************************
*
* Digital Sound Interface Kit (DSIK)
* Version 2.00
*
* by Carlos Hasan
*
* Filename: example10.c
* Version: Revision 1.0
*
* Language: WATCOM C
* Environment: IBM PC (DOS/4GW)
*
* Description: Small VGA 320x200 graphics demo.
*
* Notes: This program requires the routines in the examp10b.asm
* assembly source file. Use "WMAKE EXAMP10.EXE" to build
* this example program.
*
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <i86.h>
#include <math.h>
#include "audio.h"
#include "timer.h"
#define DSMPATH "SONG.DSM"
typedef struct {
int x,y;
} point;
char image[256][256];
char pal[3*256];
point vertex[4] = { 0,0, 255,0, 0,255, 255,255 };
int sintab[1024],costab[1024];
volatile int delta,retraces;
#ifdef __cplusplus
#define EXTERN extern "C"
#else
#define EXTERN extern
#endif
/* assembly routine prototype */
EXTERN void drawimage(char *imageptr, point *pnts);
#pragma aux drawimage "_*" parm [eax] [edx];
void setmode(int mode)
{
union REGS r;
r.h.al = mode;
r.h.ah = 0;
int386(0x10,&r,&r);
}
void setpal(char *pal)
{
int i;
outp(0x3c8,0x00);
for (i = 0; i < 3*256; i++)
outp(0x3c9,pal[i]);
}
/* plasma routines */
int random(int n)
{
static int seed = 0x1234;
seed = 0x00ab*seed + 0x4a37;
return (n*(seed & 0xffff))>>16;
}
int val(int x1, int y1, int x2, int y2, int len)
{
int n;
n = (((int)image[x1&0xff][y1&0xff] +
(int)image[x2&0xff][y2&0xff])>>1) + len*(random(4)-1);
return ((n<1) ? 1 : ((n>255) ? 255 : n));
}
void makeplasma(int x1,int y1,int x2,int y2)
{
int xc,yc,len;
if ((len = x2-x1) < 2) return;
xc = (x1+x2)>>1;
yc = (y1+y2)>>1;
if (!image[xc][y1&0xff]) image[xc][y1&0xff] = val(x1,y1,x2,y1,len);
if (!image[xc][y2&0xff]) image[xc][y2&0xff] = val(x1,y2,x2,y2,len);
if (!image[x1&0xff][yc]) image[x1&0xff][yc] = val(x1,y1,x1,y2,len);
if (!image[x2&0xff][yc]) image[x2&0xff][yc] = val(x2,y1,x2,y2,len);
image[xc][yc] = (val(xc,y1,xc,y2,len) + val(x1,yc,x2,yc,len))>>1;
makeplasma(x1,y1,xc,yc);
makeplasma(xc,y1,x2,yc);
makeplasma(x1,yc,xc,y2);
makeplasma(xc,yc,x2,y2);
}
void makeimage(void)
{
int i,j,k;
memset(image,0,sizeof(image));
makeplasma(0,0,256,256);
for (i = 0; i < 256; i++) {
for (j = 0; j < 256; j++) {
k = (((int)(image[i][j] - image[(i+3)&0xff][(j+0)&0xff]))<<1)+128;
image[i][j] = ((k<0) ? 0 : ((k>255) ? 255 : k));
}
}
for (k = 0; k < 2; k++) {
for (i = 0; i < 256; i++) {
for (j = 0; j < 256; j++) {
image[i][j] = ((int)5*image[i][j] +
(int)image[(i+1)&0xff][j] + (int)image[i][(j+1)&0xff] +
(int)image[(i+1)&0xff][(j+1)&0xff])>>3;
}
}
}
}
void timer(void)
{
dPoll();
delta++;
retraces++;
}
int main(int argc, char *argv[])
{
SoundCard SC;
DSM *M;
int angle,i;
long frames;
dRegisterDrivers();
if (dAutoDetect(&SC))
printf("No soundcard detected.\n");
else {
printf("%s at Port %03Xh using IRQ %d on DMA channel %d.\n",
dGetDriverStruc(SC.ID)->Name, SC.Port, SC.IrqLine, SC.DmaChannel);
}
if (dInit(&SC)) {
printf("Error initializing the sound system.\n");
exit(EXIT_FAILURE);
}
atexit((void(*)(void))dDone);
dInitTimer();
atexit((void(*)(void))dDoneTimer);
dStartTimer(timer,TICKS(70));
if (!(M = dLoadModule(DSMPATH))) {
printf("Error (%03d) loading %s module file: %s.\n",
dError, DSMPATH, dErrorMsg[dError]);
exit(EXIT_FAILURE);
}
dSetupVoices(M->Header.NumTracks,M->Header.MasterVolume);
dPlayMusic(M);
printf("Building trig tables...\n");
for (i = 0; i < 1024; i++) {
sintab[i] = (int)(256*sin((2.0*3.14159265359*i)/1024.0));
costab[i] = (int)(256*cos((2.0*3.14159265359*i)/1024.0));
}
printf("Building bitmap...\n");
makeimage();
for (i = 0; i < 256; i++) {
pal[3*i+0] = i/16;
pal[3*i+1] = i/8;
pal[3*i+2] = i/6;
}
setmode(0x13);
setpal(pal);
for (frames = retraces = angle = 0; !kbhit(); frames++) {
/* this demo will run at the same speed on any machine,
but will look much more smooth in fast computers. */
i = delta;
angle += i;
delta -= i;
vertex[0].x = 0 + sintab[(1*angle) & 1023];
vertex[0].y = 0 + costab[(1*angle) & 1023];
vertex[1].x = 128 + sintab[(2*angle) & 1023];
vertex[1].y = 0 + costab[(2*angle) & 1023];
vertex[2].x = 128 + sintab[(3*angle) & 1023];
vertex[2].y = 128 + costab[(3*angle) & 1023];
vertex[3].x = 0 + sintab[(5*angle) & 1023];
vertex[3].y = 128 + costab[(5*angle) & 1023];
drawimage((char*)image,vertex);
}
setmode(0x03);
dStopMusic();
dFreeModule(M);
printf("%ld retraces, %ld frames, %5.2f fps.\n",
retraces, frames, (70.1*frames)/retraces);
return 0;
}