home *** CD-ROM | disk | FTP | other *** search
- #include "windows.h"
- #include "stdlib.h"
- #include "stdio.h"
- #include "bios.h"
-
- #include "knuth.h"
-
- #define HIGHW(L) (*(((unsigned short *) &(L))+1))
- #define LOWW(L) (*(unsigned short *) &(L))
-
- static unsigned long aulRndValTable[64];
- static unsigned long aulRndNumTable[55];
-
- static int k, j;
-
- static unsigned long RndAdditive(void)
- {
- unsigned long ulRndVal;
-
- ulRndVal=aulRndNumTable[j]+aulRndNumTable[k];
- aulRndNumTable[k]=ulRndVal;
- j=(j+54)%55;
- k=(k+54)%55;
-
- return ulRndVal;
- }
-
- static unsigned long ulSeed;
- static unsigned long ulMul=1664525;
-
- static unsigned long RndLinearCongr(void)
- {
- unsigned short us1;
-
- us1=LOWW(ulMul)*HIGHW(ulSeed);
- us1+=HIGHW(ulMul)*LOWW(ulSeed);
-
- ulSeed=((unsigned long) LOWW(ulMul)*LOWW(ulSeed));
- ulSeed+=(((unsigned long) us1)<<16);
- ulSeed+=1;
- return ulSeed;
- }
-
- static void RndSetup(void)
- {
- int i;
-
-
- for (i=0; i<64; i++)
- {
- aulRndValTable[i]=RndLinearCongr();
- }
-
- for (i=0; i<55; i++)
- {
- aulRndNumTable[i]=RndLinearCongr();
- }
- j=23;
- k=54;
- }
-
- static void Randomize(void)
- {
- _bios_timeofday(_TIME_GETCLOCK, (long*) &ulSeed);
- RndSetup();
- }
-
- unsigned short _export __far __pascal GetRandom(unsigned short usMod)
- {
- unsigned long ulRndVal;
- unsigned long ulVal1, ulVal2;
- unsigned short usNdx;
-
- ulRndVal=RndAdditive();
-
- usNdx=((HIGHW(ulRndVal)>>8)&0xFC)/4;
- ulVal1=aulRndValTable[usNdx];
- aulRndValTable[usNdx]=ulRndVal;
- ulRndVal=ulVal1;
-
- ulVal1=(unsigned long) LOWW(ulRndVal)*usMod;
- ulVal2=(unsigned long) HIGHW(ulRndVal)*usMod;
- ulVal2+=HIGHW(ulVal1);
- return HIGHW(ulVal2);
- }
-
- int FAR PASCAL LibMain( HINSTANCE hInstance, WORD wDataSegment,
- WORD wHeapSize, LPSTR lpszCmdLine )
- {
- if ( wHeapSize != 0 )
- UnlockData( 0 );
-
- Randomize();
- return 1;
- }
-
- int FAR PASCAL WEP ( int bSystemExit )
- {
- return 1;
- }
-