Files
Digital-Research-Source-Code/CONTRIBUTIONS/cpm-handbook/cpmsrc/PROTOCOL.C
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

264 lines
7.1 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#define VN "\nPROTOCOL Vn 1.0 02/17/83"
/* PROTOCOL - This utility sets the serial port protocol for the
specified physical device. Alternatively, it displays the
current protocols for all of the serial devices. */
#include <LIBRARY.H>
/* code tables used to relate ASCII strings to code values */
struct _ct ct_iproto[3]; /* code table for input protocols */
struct _ct ct_oproto[4]; /* code table for output protocols */
struct _ct ct_dproto[7]; /* code table for displaying protocols */
struct _ct ct_pdev[MAXPDEV + 2]; /* physical device table */
struct _ct ct_io[3]; /* input, output */
/* parameters on the command line */
#define PDEV argv[1] /* physical device */
#define IO argv[2] /* input/output */
#define PROTO argv[3] /* protocol */
#define PROTOL argv[4] /* protocol message length */
main(argc,argv)
int argc;
char *argv[];
{
printf(VN); /* display signon message */
setup(); /* setup code tables */
chk_use(argc); /* check correct usage */
/* check if request to show current settings */
if (usstrcmp("SHOW",argv[1]))
{ /* no, assume a set is required */
set_proto(get_pdev(PDEV), /* physical device */
/* Input/Output and Protocol */
get_proto(get_io(IO),PROTO),
PROTOL); /* Protocol message length */
}
show_proto();
} /* end of program */
setup() /* setup the code tables for this program */
{
/* initialize the physical device table */
ct_init(ct_pdev[0],0,PN_T); /* terminal */
ct_init(ct_pdev[1],1,PN_P); /* printer */
ct_init(ct_pdev[2],2,PN_M); /* modem */
ct_init(ct_pdev[3],CT_SNF,"*"); /* terminator */
/* initialize the input/output table */
ct_init(ct_io[0],0,"INPUT");
ct_init(ct_io[1],1,"OUTPUT");
ct_init(ct_io[2],CT_SNF,"*"); /* terminator */
/* initialize the output protocol table */
ct_init(ct_oproto[0],DT_ODTR,"DTR");
ct_init(ct_oproto[1],DT_OXON,"XON");
ct_init(ct_oproto[2],DT_OETX,"ETX");
ct_init(ct_oproto[3],CT_SNF,"*"); /* terminator */
/* initialize the input protocol table */
ct_init(ct_iproto[0],DT_IRTS,"RTS");
ct_init(ct_iproto[1],DT_IXON,"XON");
ct_init(ct_iproto[2],CT_SNF,"*"); /* terminator */
/* initialize the display protocol */
ct_init(ct_dproto[0],DT_ODTR,"Output DTR");
ct_init(ct_dproto[1],DT_OXON,"Output XON");
ct_init(ct_dproto[2],DT_OETX,"Output ETX");
ct_init(ct_dproto[3],DT_IRTS,"Input RTS");
ct_init(ct_dproto[4],DT_IXON,"Input XON");
ct_init(ct_dproto[5],CT_SNF,"*");
}
unsigned
get_pdev(ppdev) /* get physical device */
/* This function returns the physical device code
specified by the user in the command line. */
char *ppdev; /* pointer to character string */
{
unsigned retval; /* return value */
retval = ct_parc(ct_pdev,ppdev); /* get code for ASCII string */
if (retval == CT_SNF) /* if string not found */
{
printf("\n\007Physical Device '%s' is invalid or ambiguous.",
ppdev);
printf("\nLegal Physical Devices are : ");
ct_disps(ct_pdev); /* display all values */
exit();
}
return retval; /* return code */
}
unsigned
get_io(pio) /* get input/output parameter */
char *pio; /* pointer to character string */
{
unsigned retval; /* return value */
retval = ct_parc(ct_io,pio); /* get code for ASCII string */
if (retval == CT_SNF) /* if string not found */
{
printf("\n\007Input/Output direction '%s' is invalid or ambiguous.",
pio);
printf("\nLegal values are : ");
ct_disps(ct_io); /* display all values */
exit();
}
return retval; /* return code */
}
unsigned
get_proto(output,pproto)
/* This function returns the protocol code for the
protocol specified by the user in the command line. */
int output; /* =1 for output, =0 for input */
char *pproto; /* pointer to character string */
{
unsigned retval; /* return value */
if (output) /* OUTPUT specified */
{
/* get code for ASCII string */
retval = ct_parc(ct_oproto,pproto);
if (retval == CT_SNF) /* if string not found */
{
printf("\n\007Output Protocol '%s' is invalid or ambiguous.",
pproto);
printf("\nLegal Output Protocols are : ");
ct_disps(ct_oproto); /* display valid protocols */
exit();
}
}
else /* INPUT specified */
{
/* get code for ASCII string */
retval = ct_parc(ct_iproto,pproto);
if (retval == CT_SNF) /* if string not found */
{
printf("\n\007Input Protocol '%s' is invalid or ambiguous.",
pproto);
printf("\nLegal Input Protocols are : ");
ct_disps(ct_iproto); /* display valid protocols */
exit();
}
}
return retval; /* return code */
}
set_proto(pdevc,protoc,pplength) /* set the protocol for physical device */
int pdevc; /* physical device code */
unsigned protoc; /* protocol byte */
char *pplength; /* pointer to protocol length */
{
struct _ppdt
{
char *pdt[16]; /* array of 16 pointers to the device tables */
} ;
struct _ppdt *ppdt; /* pointer to the device table array */
struct _dt *dt; /* pointer to a device table */
ppdt = get_cba(CB_DTA); /* set pointer to array of pointers */
dt = ppdt -> pdt[pdevc];
if (!dt) /* chk if pointer in array is valid */
{
printf("\nError - Array of Device Table Addresses is not set for device #%d.",
pdevc);
exit();
}
if (protoc & 0x8000) /* check if protocol byte to be set
directly or to be OR'ed in */
{ /* OR'ed */
dt -> dt_st1 |= (protoc & 0x7F);
}
else
{ /* set directly */
dt -> dt_st1 = (protoc & 0x7F);
}
if ((protoc & 0x7F) == DT_OETX) /* if etx/ack, check for message
length */
{
if (isdigit(*pplength)) /* check if length present */
{
/* convert length to binary and set device
table field. */
dt -> dt_etxml = atoi(pplength);
}
}
}
show_proto() /* show the current protocol settings */
{
struct _ppdt
{
char *pdt[16]; /* array of 16 pointers to the device tables */
} ;
struct _ppdt *ppdt; /* pointer to the device table array */
struct _dt *dt; /* pointer to a device table */
int pdevc; /* physical device code */
struct _ct *dproto; /* pointer to display protocols */
ppdt = get_cba(CB_DTA); /* set pointer to array of pointers */
/* for all physical devices */
for (pdevc = 0; pdevc <= MAXPDEV; pdevc++)
{
/* set pointer to device table */
dt = ppdt -> pdt[pdevc];
if (dt) /* chk if pointer in array is valid */
{
printf("\n\tProtocol for %s - ",ct_strc(ct_pdev,pdevc));
/* check if any protocols set */
if (!(dt -> dt_st1 & ALLPROTO))
{
printf("None.");
continue;
}
/* set pointer to display protocol table */
dproto = ct_dproto;
while (dproto -> _ct_code != CT_SNF)
{
/* check if protocol bit set */
if (dproto -> _ct_code & dt -> dt_st1)
{ /* display protocol */
printf("%s ",dproto -> _ct_sp);
}
++dproto; /* move to next entry */
}
/* chk if etx/ack protocol and
message length to be displayed */
if (dt -> dt_st1 & DT_OETX)
printf(" Message Length %d bytes.",
dt -> dt_etxml);
}
}
}
chk_use(argc) /* check for correct usage */
int argc; /* argument count on commmand line */
{
if (argc == 1)
{
printf("\nPROTOCOL sets the physical device's serial protocols.");
printf("\n\tPROTOCOL physical-device direction protocol {message-length}");
printf("\n\nLegal physical devices are :");
ct_disps(ct_pdev);
printf("\nLegal direction/protocols are :");
ct_disps(ct_dproto);
printf("\n\tMessage length can be specifed with Output Etx.\n");
exit();
}
}