Plasma.
/*
** This code is a pure DJGPP C ( not difficult to port ), with no Assembly based
** implementation of plasma special effect.
**
** Routine by KR Ranjith ( krranjith@crosswinds.net )
*/
#include <dos.h>
#include <pc.h>
#include <math.h>
#include <sys/nearptr.h>
/* Set RGB values for a color */
void setrgb( unsigned char col,
unsigned char R,
unsigned char G,
unsigned char B )
{
outportb(0x3C8,col);
outportb(0x3C9,R);
outportb(0x3C9,G);
outportb(0x3C9,B);
}
int main()
{
unsigned char *scr;
unsigned char *vscr, *tscr; /* Video buffer for speed */
union REGS s;
int costbl[256];
int t,y,x;
unsigned char a1,a2,a3,a4,
b1,b2,b3,b4;
__djgpp_nearptr_enable();
scr = __djgpp_conventional_base + (unsigned char*) 0xA0000; /* Screen */
vscr = (unsigned char*)malloc(320*200);
if( !vscr )
{
printf("Not enough memory");
return(0);
}
/* Start with a clean screen */
memset(vscr,0,320*200);
/* Initialize cos table */
for(t=0;t<256;t++)
costbl[t] = (int)( 27 * cos(t * (3.14159/128) ) );
/* Start 320*200 graphics mode */
s.w.ax = 0x13;
int386(0x10,&s,&s);
/* Set up a gradient like palette */
for (x=1; x<=32; x++) {
setrgb(x, 0, 0, x*2-1); /* Blue part */
setrgb(x+32, x*2-1, 0, 63);
setrgb(x+64, 63, x*2-1, 63);
setrgb(x+96, 63, 63, 63);
setrgb(x+128, 63, 63, 63);
setrgb(x+160, 63, 63, 63-(x*2-1));
setrgb(x+192, 63, 63-(x*2-1), 0);
setrgb(x+224, 63-(x*2-1), 0, 0); /* Red part */
}
/* Loop until key is pressed */
while( !kbhit() ){
a1 = b1;
a2 = b2;
/* tscr for *tscr++, rather than *(vscr+(y*320)+x) */
tscr = vscr;
for(y=0;y<200;y++)
{
a3 = b3;
a4 = b4;
for(x=0;x<320;x++)
{
*tscr++ = costbl[a1] +
costbl[a2] +
costbl[a3] +
costbl[a4] ;
/* Higher values result in many slower plasmas */
a3 += 1;
a4 += 2;
}
/* Same as the previous comment*/
a1 += 1;
a2 += 2;
}
/* The higher these vars are incremented, the faster is
** the plasma. Need'nt be similar. */
b1 += 3;
b2 -= 5;
b3 -= 3;
b4 += 2;
/* retrace sync */
while( inportb(0x3Da) & 0x8 );
while( ! (inportb(0x3Da) & 0x8) );
/* Blit plasmas unto screen */
memcpy(scr,vscr,320*200);
}
getch();
/* Get back to text mode */
s.w.ax = 0x3;
int386(0x10,&s,&s);
__djgpp_nearptr_disable();
return(0);
}