#include #include #include #include #include #include /* //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// */ #define ScreenMem (byte *)0x000a0000UL #ifndef BufWidth #define BufWidth 320 #endif #ifndef BufHeight #define BufHeight 200 #endif /* //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// */ typedef unsigned char byte; typedef unsigned long dword; /* //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// */ byte LifeBuffer[2][BufHeight][BufWidth]; /* //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// */ void SetGraphMode(void) { union REGPACK Regs = { 0 }; Regs.w.ax = 0x0013; intr(0x10, &Regs); } /* ---------------------------------------------------------------------------------------------------------------------------- */ void SetTextMode(void) { union REGPACK Regs = { 0 }; Regs.w.ax = 0x0003; intr(0x10, &Regs); } /* ---------------------------------------------------------------------------------------------------------------------------- */ void SetPalette(void) { int i; outp(0x3c8, 0x00); outp(0x3c9, 0x00); outp(0x3c9, 0x00); outp(0x3c9, 0x00); outp(0x3c9, 0x30); outp(0x3c9, 0x30); outp(0x3c9, 0x30); for (i = 2; i < 256; i++) { outp(0x3c9, 0x20); outp(0x3c9, 0x20); outp(0x3c9, 0x20); } } /* ---------------------------------------------------------------------------------------------------------------------------- */ void RandomiseScreen(void) { byte *Ptr = &LifeBuffer[1][0][0]; int Count = BufWidth * (BufHeight - 2); Ptr += BufWidth; srand(*(dword *)0x0000046c); while (Count--) *Ptr++ = (rand() >> 14) & 1; } /* ---------------------------------------------------------------------------------------------------------------------------- */ void LifeASM(byte *Destination, byte *Source, dword Size); #pragma aux LifeASM "*" parm caller [edi][esi][ecx] modify [eax ecx edx ebx esi edi]; /* ---------------------------------------------------------------------------------------------------------------------------- */ void DoLife(int FlipFlop) { LifeASM(&LifeBuffer[FlipFlop][1][1], &LifeBuffer[!FlipFlop][1][1], BufWidth * (BufHeight - 2) - 2); } /* ---------------------------------------------------------------------------------------------------------------------------- */ int main(void) { SetGraphMode(); SetPalette(); RandomiseScreen(); while (kbhit() == 0) { #ifdef BProf while ((inp(0x3da) & 8) == 0) ; while ((inp(0x3da) & 8) != 0) ; outp(0x3c8, 0x00); outp(0x3c9, 0x00); outp(0x3c9, 0x00); outp(0x3c9, 0x3f); #endif DoLife(0); #ifdef BProf outp(0x3c8, 0x00); outp(0x3c9, 0x3f); outp(0x3c9, 0x00); outp(0x3c9, 0x00); #endif memcpy(ScreenMem, &LifeBuffer[0][0][0], 320 * 200); #ifdef BProf outp(0x3c8, 0x00); outp(0x3c9, 0x00); outp(0x3c9, 0x00); outp(0x3c9, 0x00); while ((inp(0x3da) & 8) == 0) ; while ((inp(0x3da) & 8) != 0) ; outp(0x3c8, 0x00); outp(0x3c9, 0x00); outp(0x3c9, 0x00); outp(0x3c9, 0x3f); #endif DoLife(1); #ifdef BProf outp(0x3c8, 0x00); outp(0x3c9, 0x3f); outp(0x3c9, 0x00); outp(0x3c9, 0x00); #endif memcpy(ScreenMem, &LifeBuffer[1][0][0], 320 * 200); #ifdef BProf outp(0x3c8, 0x00); outp(0x3c9, 0x00); outp(0x3c9, 0x00); outp(0x3c9, 0x00); #endif } SetTextMode(); while (kbhit() != 0) getch(); return 0; }