#include <go32.h>
#include <sys/farptr.h>
#define PERSPECTIVE 256 /* näiden tarkoitukset */
#define ORIGOX 160 /* varmaan muistatkin */
#define ORIGOY 100 /* jo nyt? */
#define NUMBEROFSTARS 2000 /* tämä säätää tähtien määrän */
#define SPEEDOFSTARS 1 /* tähtien nopeus, yleensä 1 */
#define putpixel(x,y,c) _farpokeb(_dos_ds, 0xA0000+(y*320+x), c)
#define waitsync() while ( (inportb(0x03DA) & 0x08))\
while (!(inportb(0x03DA) & 0x08))
struct {
int x,y,z;
}starinfo[NUMBEROFSTARS];
void randomize_star(int value)
{
starinfo[value].x = rand() % 320 - 160;
starinfo[value].y = rand() % 200 - 100;
starinfo[value].z = rand() % 256 + 1;
}
void main(void)
{
int x,y,i; /* koordinaattimuuttujat sekä apumuuttuja */
textmode(0x13); /* siirrymme tilaan 13h */
srand(time(0)); /* alustamme randomgeneraattorimme */
for(i=0;i<NUMBEROFSTARS;i++)
randomize_star(i); /* joka tähdelle koordinaatit */
while(!kbhit()) {
for(i=0;i<NUMBEROFSTARS;i++) {
x = starinfo[i].x * PERSPECTIVE / starinfo[i].z + ORIGOX;
y = starinfo[i].y * PERSPECTIVE / starinfo[i].z + ORIGOY;
if(x > 0 && x < 320 && y > 0 && y < 200) putpixel(x,y,0);
starinfo[i].z--;
if(0 >= starinfo[i].z) {
randomize_star(i);
starinfo[i].z=256;
}
x = starinfo[i].x * PERSPECTIVE / starinfo[i].z + ORIGOX;
y = starinfo[i].y * PERSPECTIVE / starinfo[i].z + ORIGOY;
if(x > 0 && x < 320 && y > 0 && y < 200) putpixel(x,y,15);
}
waitsync(); /* näiden pitäisi vähän hidastaa */
waitsync(); /* pyörimisnopeutta Pentiumeilla */
}
textmode(0x3); /* paluu tekstimoodiin */
}