koreth@panarthea.ebay.sun.com (Steven Grimm) (10/10/89)
Submitted-by: BD05@DKAUNI2.Bitnet (Roland Waldi)
Posting-number: Volume 2, Issue 87
Archive-name: truchet
Here is the source to the truchet tiling demo, which I submitted to
the binaries group earlier.
/*-------------------------------------------------------------*
* *
* TRUCHET2.C: main() *
* display random Truchet tiles on a monochrome screen *
* *
* compiler used: LASER C (Atari ST) *
* *
* The comments may be used to get a better view of the *
* program structure: type 'EXCLUDE /**' for the top level *
* structure, 'EXCLUDE /***' to reveal the next level etc. *
* where 'EXCLUDE' should be replaced by the appropriate *
* command of your favourite editor. *
* *
*-----Version 1.00-----(C) 1989 Roland Waldi------------------*/
/* */
#include <osbind.h> /* */
/* globals */
int *screen[2]; /** globals */
int tile[2][16] = {128,128,192,64, /** globals ... */
96,48,28,-4089, /*** globals */
7168,1536,768,256, /*** globals */
384,128,128,128, /*** globals */
/*** globals */
128,128,384,256, /*** globals */
768,1536,7168,-4089, /*** globals */
28,48,96,64, /*** globals */
192,128,128,128}; /*** globals */
/***** ........X....... 128 ........X....... 128 */
/***** ........X....... 128 ........X....... 128 */
/***** ........XX...... 192 .......XX....... 384 */
/***** .........X...... 64 ...... X........ 256 */
/***** .........XX..... 96 ......XX........ 768 */
/***** ..........XX ... 48 .....XX......... 1536 */
/***** ...........XXX.. 28 ...XXX.......... 7168 */
/***** XXXX.........XXX -4089 XXXX.........XXX -4089 */
/***** ...XXX.......... 7168 ...........XXX.. 28 */
/***** .....XX......... 1536 ..........XX.... 48 */
/***** ......XX........ 768 .........XX..... 96 */
/***** .......X........ 256 .........X...... 64 */
/***** .......XX....... 384 ........XX...... 192 */
/***** ........X....... 128 ........X....... 128 */
/***** ........X....... 128 ........X....... 128 */
/***** ........X....... 128 ........X....... 128 */
/*** */
long RINT = 7716383l; /** globals for Rn */
long RMULT = 331804469l; /** globals for Rn */
/** */
main() /* main */
{ /* main */
int actual; /** declarations */
register int i, n; /** declarations */
register int *c; /** declarations */
long temp; /** declarations */
/** */
if (Getrez() != 2) Pterm(1); /** check resolution */
actual = 1; /** initialize ... */
screen[0] = (int *)Physbase(); /*** initialize */
temp = Malloc(32256l); /*** initialize */
if (!temp) Pterm(2); /*** initialize */
screen[1] = (int *)((temp+256)&0xFFFF00l); /*** initialize */
a_hidemouse(); /*** initialize */
RINT += Tgettime(); /*** initialize */
/** */
for (n=0; n<1000; n++) /** init loop */
{ /** init loop */
copytile(0,n,actual); /*** init loop */
} /** init loop */
Setscreen(-1l,screen[actual],-1); /** initialize ... */
Vsync(); /*** initialize */
/** */
while (!Cconis()) /** main loop */
{ /** main loop */
actual = !actual; /*** main loop */
fwcopy(screen[actual],screen[!actual], /*** main loop */
32000l); /*** main loop */
n = Rn(1000); /*** main loop */
c = screen[actual] /*** main loop */
+ (n/40) * 640 + (n%40) + 320; /*** main loop */
i = (*c)>>12; /*** flip tile */
copytile(i,n,actual); /*** flip tile */
Setscreen(-1l,screen[actual],-1); /*** main loop */
Vsync(); /*** main loop */
} /** main loop */
/** */
Setscreen(-1l,screen[0],-1); /** terminate ... */
Vsync(); /*** terminate */
a_showmouse(); /*** terminate */
Mfree(temp); /*** terminate */
Pterm(0); /*** terminate */
} /* end main */
/* */
copytile(i,n,actual) /* copytile */
register int i, actual; int n; /* copytile */
{ /* copytile */
register int j; /** declarations */
register int *start; /** declarations */
/** */
start = screen[actual] /** get address ... */
+ (n/40) * 640 + (n%40); /*** get address */
for (j=0; j<16; j++) /** copy loop */
{ /** copy loop */
*(start + j*40) = tile[i][j]; /*** copy loop */
} /** copy loop */
/** */
return; /** copytile */
} /* end copytile */
/* */
int Rn(n) int n; /* Rn */
/* Random number generator, return pseudo random number in [0...n-1] */
{ /* Rn */
RINT = (RINT * RMULT) - 1; /** Rn */
return (int)( (((RINT & 0x7FFFFFFFl) >> 16) /** Rn */
* n) / 0x8000l ); /** Rn */
} /* end Rn */