home *** CD-ROM | disk | FTP | other *** search
/ Total Meltdown / dukenukemtotalmeltdown.img / util / dukenet / gamecom.c < prev    next >
C/C++ Source or Header  |  1996-02-13  |  5KB  |  244 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <process.h>
  5. #include <dos.h>
  6. #include <conio.h>
  7. #include "gamecom.h"
  8. #include "global.h"
  9. #include "commit.h"
  10. #include "network.h"
  11.  
  12. #define GAMECOM_STACKSIZE    (2048)
  13. #define GAMECOM_SAFETYMARGIN (8)
  14.  
  15. gamecom_t         gamecom;
  16. int              control;
  17. static boolean   vectorishooked=false;
  18. void interrupt (*oldgamecomvector) (void);
  19. void interrupt GAMECOM_ISR (void);
  20. static char * gamecom_stack;
  21. static WORD gamecom_stacksegment;
  22. static WORD gamecom_stackpointer;
  23. static WORD old_stacksegment;
  24. static WORD old_stackpointer;
  25.  
  26. /*
  27. =============
  28. =
  29. = SetupGAMECOM
  30. =
  31. =============
  32. */
  33.  
  34. void SetupGAMECOM ( void )
  35.    {
  36.     unsigned char far *vectorptr;
  37.    short vector;
  38.    char * topofstack;
  39.  
  40.    vector = gamecom.intnum;
  41.  
  42.      /* Get an interrupt vector if not already set */
  43.     if (vector == -1)
  44.        {
  45.        for (vector = 0x60 ; vector <= 0x66 ; vector++)
  46.            {
  47.             vectorptr = *(unsigned char far * far *)(vector*4);
  48.             if ( !vectorptr || *vectorptr == 0xcf )
  49.                 break;
  50.            }
  51.        if (vector == 0x67)
  52.            {
  53.             printf ("Warning: no NULL or iret interrupt vectors were found in the 0x60 to 0x65\n"
  54.                       "range.  You can specify a vector in the configuration file\n"
  55.                       "Press a key to continue.\n");
  56.             getch ();
  57.            printf ("Using default vector 0x66\n");
  58.            vector = 0x66;
  59.            }
  60.        }
  61.     gamecom.intnum = vector;
  62.  
  63.    // allocate the gamecom stack
  64.  
  65.    gamecom_stack = SafeMalloc(GAMECOM_STACKSIZE);
  66.  
  67.    // Calculate top of stack
  68.  
  69.    topofstack = gamecom_stack + GAMECOM_STACKSIZE - GAMECOM_SAFETYMARGIN;
  70.  
  71.    // Determine stack segment and pointer
  72.  
  73.    gamecom_stacksegment = FP_SEG( (char huge *)topofstack );
  74.    gamecom_stackpointer = FP_OFF( (char huge *)topofstack );
  75.  
  76.    // hook the vector for the game
  77.  
  78.     oldgamecomvector = getvect (gamecom.intnum);
  79.     setvect (gamecom.intnum, GAMECOM_ISR);
  80.     vectorishooked = true;
  81.    }
  82.  
  83.  
  84. /*
  85. =============
  86. =
  87. = ShutdownGAMECOM
  88. =
  89. =============
  90. */
  91.  
  92. void ShutdownGAMECOM ( void )
  93.    {
  94.     if (vectorishooked == true)
  95.       {
  96.         setvect (gamecom.intnum,oldgamecomvector);
  97.        vectorishooked = false;
  98.       free ( gamecom_stack );
  99.       }
  100.    }
  101.  
  102. /*
  103. =============
  104. =
  105. = GAMECOM_ISR
  106. =
  107. =============
  108. */
  109.  
  110. #define GetStack(a,b) \
  111.    {                  \
  112.    *a = _SS;          \
  113.    *b = _SP;          \
  114.    }
  115. #define SetStack(a,b) \
  116.    {                  \
  117.    _SS=a;             \
  118.    _SP=b;             \
  119.    }
  120.  
  121. void interrupt GAMECOM_ISR (void)
  122.     {
  123.    //
  124.    // Get current stack
  125.    //
  126.  
  127.    GetStack( &old_stacksegment, &old_stackpointer );
  128.  
  129.    //
  130.    // Set the local stack
  131.    //
  132.  
  133.    SetStack( gamecom_stacksegment, gamecom_stackpointer );
  134.  
  135.    switch(gamecom.command)
  136.       {
  137.       case CMD_SEND:
  138.          SendNetworkPacket ();
  139.          break;
  140.       case CMD_SENDTOALL:
  141.          for (control = 1; control<=gamecom.numplayers; control++)
  142.             {
  143.             gamecom.remotenode = control;
  144.             SendNetworkPacket ();
  145.             }
  146.          break;
  147.       case CMD_SENDTOALLOTHERS:
  148.          for (control = 1; control<=gamecom.numplayers; control++)
  149.             {
  150.             if (control != gamecom.consoleplayer)
  151.                {
  152.                gamecom.remotenode = control;
  153.                SendNetworkPacket ();
  154.                }
  155.             }
  156.          break;
  157.       case CMD_GET:
  158.          GetNetworkPacket ();
  159.          break;
  160.       case CMD_SCORE:
  161.          //***********************************
  162.          //SCORE specific stuff here
  163.          //***********************************
  164.          break;
  165.       }
  166.  
  167.    //
  168.    // Restore the old stack
  169.    //
  170.  
  171.    SetStack( old_stacksegment, old_stackpointer );
  172.    }
  173.  
  174. /*
  175. =============
  176. =
  177. = LaunchGAME
  178. =
  179. =============
  180. */
  181.  
  182. void LaunchGAME ( boolean pause )
  183. {
  184.     char    *newargs[39];
  185.     char    adrstring[10];
  186.     long      flatadr;
  187.     int argnum = 1;
  188.     int i,j;
  189.  
  190.     SetupGAMECOM ();
  191.  
  192. // build the argument list for the game
  193. // adding all previous command lines to be passed to the main game
  194.  
  195. // skip over launch parameter if specified
  196.    j = CheckParm("launch");
  197.    for (i=1;i<_argc;i++)
  198.       {
  199.       if (i==j)
  200.          i++;
  201.       else
  202.           newargs [argnum++] = _argv[i];
  203.       }
  204.  
  205. // adding "-net" and the address of gamecom.
  206.  
  207.     newargs [argnum++] = "-net";
  208.  
  209.     /* Add address of gamecom structure */
  210.  
  211.     flatadr = (long)_DS*16 + (unsigned)&gamecom;
  212.     sprintf (adrstring,"%lu",flatadr);
  213.     newargs [argnum++] = adrstring;
  214.  
  215.     newargs [argnum] = NULL;
  216.  
  217. // Make sure arg 0 is correct, if we want to dump the arguments
  218.  
  219.     newargs [0] = config.launchname;
  220.  
  221.    if (pause==1)
  222.       {
  223.       printf ("About to launch %s -- Passing these arguments:\n",config.launchname);
  224.       for (i = 0; i < argnum; i++)
  225.          printf ("  arg %d = %s\n", i, newargs [i]);
  226.       printf ("  player = %d\n", gamecom.consoleplayer);
  227.  
  228.       printf ("\nPress ESC to abort, or any other key to continue...");
  229.       if (getch () == ESC)
  230.          {
  231.          printf ("\n\n");
  232.          return;
  233.          }
  234.       }
  235.    if (spawnvp ( P_WAIT, config.launchname, newargs) != 0)
  236.       {
  237.       if (errno!=0)
  238.          printf("\nErrorNumber: %d %s\n",errno,strerror(errno));
  239.       }
  240. //    printf ("\nReturned from %s\n\n",config.launchname);
  241.  
  242.    ShutdownGAMECOM();
  243.     }
  244.