#include <conio.h>
#include <stdlib.h>
#include <iostream.h>
#include <dos.h>
#include <mem.h>
#include <alloc.h>
#include <time.h>
char palette[768];
void setpal(void)
{
int i;
char *pal;
pal = palette;
for (i=0; i<32; i+=2)
{
*(pal++) = i;
*(pal++) = 0;
*(pal++) = 0;
}
for (i=0; i<32; i+=1)
{
*(pal++) = 31;
*(pal++) = i;
*(pal++) = 0;
}
for (i=0; i<32; i+=1)
{
*(pal++) = 31;
*(pal++) = 31;
*(pal++) = i;
*(pal++) = 31;
*(pal++) = 31;
*(pal++) = i;
}
asm { mov ax,0x1012
mov bx,0
mov cx,256
mov dx, offset palette;
int 0x10
}
}
void setmode (void)
{
asm { mov ax,0x0013
int 0x10
}
}
void waitvbi (void)
{
while (inportb(0x03da) & 0x08)
;
while (!(inportb(0x03da) & 0x08))
;
}
int main (void)
{
unsigned int I, Frames;
time_t ITime;
register int x;
register int y;
char far *Scrn,
*Src,
*ScrBuf;
setmode();
setpal();
randomize();
Frames = 0;
Scrn = (char far *)MK_FP(0xa000,0);
Src = (char *)malloc((unsigned)64320);
if (!Src)
{
asm { mov ax,0x0003
int 0x10
}
cerr << "Unable to allocate the source buffer." << endl;
return -1;
}
ScrBuf = (char *)malloc((unsigned)64320);
if (!ScrBuf)
{
farfree (Src);
asm { mov ax,0x0003
int 0x10
}
cerr << "Unable to allocate the screen buffer." << endl;
return -1;
}
_fmemset(Src,0,64320);
_fmemset(ScrBuf,0,64320);
ITime = time(NULL);
do
{
for (I=0; I < 319; ++I) // Place a random bottom on Src.
if ((rand() % 0x06) > 1) *(Src+64000+I) = 112;
else *(Src+64000+I) = 0;
for (y=140; y<201; ++y) // Average pixels, moving up 1 row
for (x=1; x<319; ++x) // adding the decay.
{
*(ScrBuf+x+(((y-1)<<8)+((y-1)<<6))) = (*(Src+x-1+((y<<8)+(y<<6))) + *(Src+x+1+((y<<8)+(y<<6)))
+*(Src+x-1+(((y+1)<<8)+((y+1)<<6)))+ *(Src+x+(((y+1)<<8)+((y+1)<<6)))
+*(Src+x+1+(((y+1)<<8)+((y+1)<<6))))/5-1;
if (*(ScrBuf+x+(((y-1)<<8)+((y-1)<<6))) < 0)
*(ScrBuf+x+(((y-1)<<8)+((y-1)<<6))) = 0;
}
waitvbi();
_fmemcpy(Scrn+32960,ScrBuf+32000,31040);
++Frames;
for (I=0; I < 319; ++I) // Place a random bottom on Src.
if ((rand() % 0x06) > 1) *(Src+64000+I) = 112;
else *(Src+64000+I) = 0;
for (y=140; y<201; ++y) // Average pixels, moving up 1 row
for (x=1; x<319; ++x) // adding the decay.
{
*(Src+x+(((y-1)<<8)+((y-1)<<6))) = (*(ScrBuf+x-1+((y<<8)+(y<<6))) + *(ScrBuf+x+1+((y<<8)+(y<<6)))
+*(ScrBuf+x-1+(((y+1)<<8)+((y+1)<<6)))+*(ScrBuf+x+(((y+1)<<8)+((y+1)<<6)))
+*(ScrBuf+x+1+(((y+1)<<8)+((y+1)<<6))))/5-1;
if (*(ScrBuf+x+(((y-1)<<8)+((y-1)<<6))) < 0)
*(ScrBuf+x+(((y-1)<<8)+((y-1)<<6))) = 0;
}
waitvbi();
_fmemcpy(Scrn+32960,Src+32000,31040);
++Frames;
}
while (!kbhit());
farfree (Src);
farfree (ScrBuf);
asm { mov ax,0x0003
int 0x10
}
cout << endl << "Display rate was " << (float)Frames / (float)(time(NULL)-ITime) << " frames/second. " << endl;
return 0;
}