home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
D!Zone (Collector's Edition)
/
D_ZONE_CD.ISO
/
programs
/
editors
/
ser4_src
/
sersetup.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-12-06
|
24KB
|
1,152 lines
// sersetup.c
#include "sersetup.h"
#include "DoomNet.h"
#include <time.h>
extern que_t inque, outque;
void jump_start( void );
void GetUart (void);
extern int uart;
int usemodem;
void ModemCommand (char *str);
int ModemResponse (char *resp);
void configure (void);
void reset_counters (void);
time_t starttime = 0;
time_t endtime = 0;
time_t playtime = 0;
char init1 [256+1];
char init2 [256+1];
char hangup [256+1];
char config [256+1];
char devparm [256+1];
unsigned long baud = 9600;
char dial [256+1];
int comport = 1;
int irq = -1;
int uart = -1;
int vector = -1;
int loadgame = -1;
int episode = -1;
int map = -1;
int skill = -1;
int deathmatch = 0;
int pulsedial = 0;
int player = 0;
int nomonsters = 0;
int respawn = 0;
/* showReadStats() counters. */
unsigned long writeBufferOverruns = 0;
unsigned long bytesRead = 0;
unsigned long packetsRead = 0;
unsigned long largestReadPacket = 0;
unsigned long smallestReadPacket = 0xFFFFFFFFl;
unsigned long readBufferOverruns = 0;
unsigned long totalReadPacketBytes = 0;
unsigned long oversizeReadPackets = 0;
unsigned long largestOversizeReadPacket = 0;
unsigned long overReadPacketLen = 0;
/* showWriteStats() counters. */
unsigned long bytesWritten = 0;
unsigned long packetsWrite = 0;
unsigned long largestWritePacket = 0;
unsigned long smallestWritePacket = 0xFFFFFFFFl;
unsigned long totalWritePacketBytes = 0;
unsigned long oversizeWritePackets = 0;
unsigned long largestOversizeWritePacket = 0;
/* showUartErrors() counters. */
unsigned long numBreak = 0;
unsigned long numFramingError = 0;
unsigned long numParityError = 0;
unsigned long numOverrunError = 0;
unsigned long numTxInterrupts = 0;
unsigned long numRxInterrupts = 0;
void showReadStats()
{
if ( smallestReadPacket == 0xFFFFFFFFl )
smallestReadPacket = 0;
printf ("Read statistics:\n");
printf ("%9lu Largest packet %9lu Smallest packet\n",
largestReadPacket, smallestReadPacket);
printf ("%9lu Oversize packets %9lu Largest oversize packet\n",
oversizeReadPackets, largestOversizeReadPacket);
printf ("%9lu Total packets %9lu Buffer overruns\n",
packetsRead, readBufferOverruns);
printf ("%9lu Total bytes %9.1f Average bytes/minute\n",
totalReadPacketBytes,
starttime == 0 || playtime == 0 ? 0 :
(float) totalReadPacketBytes / (float) ((float) playtime / 60));
printf ("%9lu Receive interrupts %9.1f Average bytes/interrupt\n",
numRxInterrupts,
numRxInterrupts == 0 ? 0 :
(float) totalReadPacketBytes / (float) numRxInterrupts);
printf ("\n");
}
void showWriteStats()
{
if ( smallestWritePacket == 0xFFFFFFFFl )
smallestWritePacket = 0;
printf ("Write statistics:\n");
printf ("%9lu Largest packet %9lu Smallest packet\n",
largestWritePacket, smallestWritePacket);
printf ("%9lu Oversize packets %9lu Largest oversize packet\n",
oversizeWritePackets, largestOversizeWritePacket);
printf ("%9lu Total packets %9lu Buffer overruns\n",
packetsWrite, writeBufferOverruns);
printf ("%9lu Total bytes %9.1f Average bytes/minute\n",
totalWritePacketBytes,
starttime == 0 || playtime == 0 ? 0 :
(float) totalWritePacketBytes / (float) ((float) playtime / 60));
printf ("%9lu Transmit interrupts %9.1f Average bytes/interrupt\n",
numTxInterrupts,
numTxInterrupts == 0 ? 0 :
(float) totalWritePacketBytes / (float) numTxInterrupts);
printf ("\n");
}
void showUartErrors()
{
puts ("UART line status");
printf ("%9lu Breaks detected %9lu Framing errors\n",
numBreak, numFramingError);
printf ("%9lu Parity errors %9lu Overrun errors\n",
numParityError, numOverrunError);
}
/*
================
=
= write_buffer
=
================
*/
void write_buffer( char *buffer, unsigned int count )
{
// if this would overrun the buffer, throw everything else out
if (outque.size + count > QUESIZE)
{
++writeBufferOverruns;
outque.tail = outque.head;
outque.size = 0;
}
write_bytes (buffer, count);
if ( INPUT( uart + LINE_STATUS_REGISTER ) & 0x40)
jump_start();
}
void hangup_modem (void)
{
printf ("\n");
printf ("\nDropping DTR\n");
OUTPUT( uart + MODEM_CONTROL_REGISTER
, INPUT( uart + MODEM_CONTROL_REGISTER ) & ~MCR_DTR );
delay (1250);
OUTPUT( uart + MODEM_CONTROL_REGISTER
, INPUT( uart + MODEM_CONTROL_REGISTER ) | MCR_DTR );
ModemCommand("+++");
delay (1250);
if (hangup [0] != EOS)
ModemCommand(hangup);
else
{
printf ("Warning: No HANGUP= string in MODEM.CFG file. Using default.\n");
ModemCommand("ATH0");
}
delay (1250);
while (read_byte () != -1)
;
}
/*
=================
=
= Error
=
= For abnormal program terminations
=
=================
*/
void Error (char *error, ...)
{
va_list argptr;
if (usemodem)
hangup_modem ();
ShutdownPort ();
if (vectorishooked)
setvect (doomcom.intnum,olddoomvect);
if (error)
{
va_start (argptr,error);
vprintf (error,argptr);
va_end (argptr);
printf ("\n\n");
// exit (1);
}
// printf ("Clean exit from SERSETUP\n");
exit (error != (char *) NULL);
}
/*
================
=
= ReadPacket
=
================
*/
#define MAXPACKET 512
#define FRAMECHAR 0x70
char packet[MAXPACKET];
int packetlen;
int inescape;
int newpacket;
boolean ReadPacket (void)
{
int c;
// if the buffer has overflowed, throw everything out
if (inque.size > QUESIZE - 4) // check for buffer overflow
{
++readBufferOverruns; /* Count read overruns */
inque.tail = inque.head;
inque.size = 0;
newpacket = true;
return false;
}
if (newpacket)
{
packetlen = 0;
newpacket = 0;
overReadPacketLen = 0;
}
do
{
if ((c = read_byte ()) < 0)
return false; // haven't read a complete packet
if (inescape)
{
inescape = false;
if (c!=FRAMECHAR)
{
newpacket = 1;
++packetsRead; /* Count packets read */
if ( packetlen > largestReadPacket ) /* Track largest packet */
largestReadPacket = packetlen;
if ( packetlen < smallestReadPacket ) /* Track smallest packet */
smallestReadPacket = packetlen;
totalReadPacketBytes += packetlen; /* Count total packet bytes */
return true; // got a good packet
}
}
else if (c==FRAMECHAR)
{
inescape = true;
continue; // don't know yet if it is a terminator
} // or a literal FRAMECHAR
if (packetlen >= MAXPACKET)
{
++overReadPacketLen; /* Keep track of size of oversize packet */
oversizeReadPackets++; /* Count oversize packets */
if ( overReadPacketLen > largestOversizeReadPacket )
largestOversizeReadPacket = overReadPacketLen;
continue; // oversize packet
}
packet[packetlen] = c;
packetlen++;
} while (1);
}
/*
=============
=
= WritePacket
=
=============
*/
void WritePacket (char *buffer, int len)
{
int b;
char static localbuffer[MAXPACKET*2+2];
b = 0;
if (len > MAXPACKET)
{
++oversizeWritePackets; /* Count oversize write packets */
if ( len > largestOversizeWritePacket )
++largestOversizeWritePacket;
return;
}
if ( len > largestWritePacket )
largestWritePacket = len;
if ( len < smallestWritePacket )
smallestWritePacket = len;
totalWritePacketBytes += len;
++packetsWrite;
while (len--)
{
if (*buffer == FRAMECHAR)
localbuffer[b++] = FRAMECHAR; // escape it for literal
localbuffer[b++] = *buffer++;
}
localbuffer[b++] = FRAMECHAR;
localbuffer[b++] = 0;
write_buffer (localbuffer, b);
}
/*
=============
=
= NetISR
=
=============
*/
void interrupt NetISR (void)
{
if (doomcom.command == CMD_SEND)
{
//I_ColorBlack (0,0,63);
WritePacket ((char *)&doomcom.data, doomcom.datalength);
}
else if (doomcom.comman