[net.sources] 520ST COMM

mdf@trwrba.UUCP (Mark D. Falleroni) (11/18/85)

This is the source listingh for ST Comm, a communications program I wrote.
It allows 'unlimited' save capability to either disk or printer.  It does not
include XMODEM capability.  If some knowledgable soul will send me an 
explanation of the protocol, I will include it in the program and repost the
source.  This program was created with the Hippo C compiler.  It runs on
an Atari 520ST under HOS or as a stand alone, dependent upon compiler options at
compile time.
This is not a final version, however, it does work.
When performing any kind of text save, the save buffers are flushed every-
time that the save option is toggled off.  If you are finished saving to
a disk file, be sure to close the file before saving to a different file.
For instance, if you are saving to a disk file, when you toggle the disk save
option off, the save buffer is written to the file, then cleared.  Performing
a close command from the main menu also flushes any save buffers.
Also, when transitioning from terminal mode to offline, if you are
saving text, the buffers will be flushed before the Main Menu is displayed.
----------- cut here ----------- cut here ------------
#include <stdio.h>
#define MASK7 0177
#define OFF 0
#define ON 1
#define RD 0
#define WRT 1
#define EOL 13
#define F10 0x440000
#define F1 0x3B0000
#define F2 0x3C0000
#define F3 0x3D0000
#define HELP 0x620000
#define BUFSIZE 10000
#define PBSIZE 8192
#define PFULL 8100
#define DFULL 9940
#define LIMIT 300

int dlay,cnt,ctr;
short psave,dsave,set;
char buf[BUFSIZE];
char pbuf[PBSIZE];
FILE *fip, *fopen();

main()
{
short go_on,c;
psave = OFF;
dsave = OFF;
go_on = 1;
set = 0;

conout(27);
conout(101);   /* enable cursor */

while (go_on == 1)
{
	clrscreen();  /* CLEAR THE SCREEN */
	inv_on();
	conout(14);
	conout(15);  /* ATARI LOGO */
	printf("	 ST COMM by Mark Falleroni Version 1.2 11/15/85 	\n\n");
	inv_off();
	red_on();
	printf("	~~~~~~~~~~~~~~~~~~~~~~\n");
	printf("	~ MAIN MENU COMMANDS ~\n");
	printf("	~~~~~~~~~~~~~~~~~~~~~~\n\n");
	printf("	*T*");
	grey_on();
	printf(" TERMINAL MODE\n");
	red_on();
	printf("	*E*");
	grey_on();
	printf(" ERASE A FILE \n");
	red_on();
	printf("	*Q*");
	grey_on();
	printf(" QUIT \n");
	red_on();
	printf("	*S*");
	grey_on();
	printf(" SET TRANSMIT DELAY \n");
	red_on();
	printf("	*D*");
	grey_on();
	printf(" DISK FILE SET-UP, EXIT TO TERMINAL MODE\n");
	red_on();
	printf("	*C*");
	grey_on();
	printf(" CLOSE FILE\n\n");
	green_on();
	printf("	**************************\n");
	printf("	* Terminal Mode Commands *\n");
	printf("	**************************\n\n");
	printf("	*F1  *");
	grey_on();
	printf(" toggle printer save on/off\n");
	green_on();
	printf("	*F2  *");
	grey_on();
	printf(" transmit an informal file \n");
	green_on();
	printf("	*F3  *");
	grey_on();
	printf(" toggle file save on/off \n");
	green_on();
	printf("	*F10 *");
	grey_on();
	printf(" exit to MAIN MENU\n");
	green_on();
	printf("	*HELP*");
	grey_on();
	printf(" list terminal mode commands\n\n");

	printf("	Choice = ");
	c = getchar();
	printf("\n");

	switch (c)
	{
	case 'T':
	case 't': put_serial();   /* TERMINAL MODE */
			  break;
	case 'q':
	case 'Q': go_on = 0;	  /* EXIT TO OS */
			  break;
	case 'e':
	case 'E': erase();
			  break;   /* DELETE A FILE */
	case 's':
	case 'S': set_time(); /* SET TRANSMISSION DELAY */
			  break;
	case 'd':
	case 'D': dset();  /* CREATE FILE FOR DATA SAVE */
			  break;
	case 'c':
	case 'C': fclose(fip);
			  break;
	default : go_on = 1;	  /* ILLEGAL CHOICE, CONTINUE */
	}
} /* while */

} /* main */

/*
/* FUNCTION put_serial - processes terminal mode commands/responses
/*
/*
*/

put_serial()
{
unsigned int c;
int wait;
short go_on,n,st;
char name[14];

inv_on();
printf("\n**** F10 = exit to MAIN MENU ****\n");
inv_off();

ctr = 0;
st  = OFF;
wait = 0;
cnt = 0;
go_on = 1;

while (go_on == 1)
{
 while ((n = conis()) < 0)    /* GET CHAR INPUT WITHOUT ECHO */
 {  				/* SCREEN */
	c = necin();
	switch (c)
	{
	case F3 : dsave_on();  /* SAVE TO DISK */
			  break;
	case F2 : transmit();    /* TRANSMIT FILE */
			  break;
	case F1 : psave_on(); /* SAVE FOR PRINTER */
			  break;
	case F10: go_on = 0; /* EXIT TO MAIN MENU */
			  if (psave == ON || dsave == ON)
				dump();
			  break;
	case HELP : help();
				break;
	default : auxout(c);	/* OUTPUT TO SERIAL PORT */
	}
 }
 while (( n = auxis()) < 0)  /* CHAR IS READY AT SERIAL PORT */
   {			   /* GET CHAR FROM SERIAL PORT    */
		c = auxin();	/* MASK LAST 7 CHAR TO GET  	*/
		c = c & MASK7; /* ASCII VALUE   			   */
		putchar(c);
		if (psave == ON)
		  pbuf[cnt++] = c;  /* SAVE TO BUFFER */
		if (dsave == ON)
		  buf[ctr++] = c;
		if (cnt == PFULL || ctr == DFULL)
		{
		  st = ON;
		  c = 19;
		  auxout(c); /* send stop command */
		}
	}

 if (st == ON)
	wait++;
 if (wait > LIMIT)
	{
	dump();
	st = OFF;
	wait = 0;
	c = 17; /* START HOST AGAIN */
	auxout(c);
	}
}

}

/*
*
* FUNCTION dset - opens file for write, exits to terminal mode
*
*/
dset()
{
char name[15];
int ans;

   printf("\nENTER SAVE FILENAME: ");
   get_name(name);
   if ((fip=fopen(name,"r")) == NULL)
	 fip = fopen(name,"w");
   else
	 {
	 printf("File Already Exists; OK to Overwrite? Y/N: ");
	 get_answer(&ans);
	 if ( ans = 1)
		fip = fopen(name,"w");
	 else
		return;
	 }

	put_serial();
}
/*
*
* FUNCTION psave_on - turns on save switch for buffer save
*
*/
psave_on()
{
int n,c;

 if (psave == OFF)   /* F1 TOGGLES SAVE ON AND OFF */
	{
		inv_on();
		psave = ON;
		printf("\n****** PRINTER SAVE ON ******\n");
	}
 else
	{
		printf("\n****** PRINTER SAVE OFF ******\n");
		dump();
		psave = OFF;
		inv_off();
	}

}

/*
/*FUNCTION get_answer - DETERMINES WHETHER USER WANTS TO ERASE
/* EXISTING FILE
*/
get_answer(ans)
int *ans;
{
short c;

if (( c = getchar() ) == 'Y' || c == 'y')  /* OVERWRITE FILE */
   *ans = 1;
else
	{
   *ans = 0;
	inv_on();
	printf("\n** ABORT FILE SAVE **\n");
	inv_off();
	}
}

/*
/*
/*FUNCTION transmit - opens user selected file and transmits
/*file, one char at a time to serial port
/*
*/

transmit()

{
char tname[15];
int  c, i;
FILE *fp, *fopen();

green_on();
printf("\nENTER NAME OF FILE TO TRANSMIT: ");
inv_on();
get_name(tname);
inv_off();

if ((fp = fopen(tname,"r")) == NULL)
	{
	printf("\nCan't open %s\n",tname);
	return;
	}

printf("\n\n");
while ((c = fgetc(fp)) != EOF)
	{
	auxout(c);
	auxin(i);
	printf("%c",c);
	delay();
	}
fclose(fp);
inv_on();
printf("\n*** TRANSMISSION COMPLETE ***\n");
inv_off();
grey_on();
}

/*
*
* FUNCTION delay - LOOPS UNTIL VARIABLE DLAY IS ZERO
*
*/
delay()
{
int i,j;
if (set = 1)
  for (i = 0; i < dlay ; i++)
	for (j = 0; j < dlay; j++)
		;
}

/*
*
* FUNCTION clrscreen - CLEAR THE SCREEN
*
*
*/
clrscreen()
{
conout(27);
conout(69); /* ESCAPE E */
}

/*
*
*
* FUNCTION erase - DELETES USER SPECIFIED FILE
*
*
*/
erase()
{
char name[14];
int c, n;

red_on();
printf("\n\nENTER NAME OF FILE TO BE DELETED: ");
inv_on();
get_name(name);
inv_off();
printf("\n");
delete(name);
}

/*
*
*
* FUNCTION get_name - gets a filename
*
*
*/
get_name(name)
char *name;
{
 int c, n;

  n=0;
  while ((c = getchar()) != EOL)
	 name[n++] = c;
  name[n] = '\0';
}

/*
*
* FUNCTION set_time - sets transmission delay between characters
*
*/

set_time()
{
short time[10];
int i, c, l, m;
 l = 0;
 m = 1;
 i = 0;
 inv_on();
 printf("\n\nENTER THE DELAY TIME (1..100): ");
 inv_off();
 green_on();
 while ((c = getchar()) != EOL)
	time[i++] = c-48;
 dlay = 0;
 for (l = i-1; l >= 0; l--)
	{
	  dlay = time[l]*m + dlay;
	  m = m*10;
	}
 set = 1;   	   /* TURN ON SET SWITCH */
 grey_on();
}

/*

*
* FUNCTION dump - dumps buffer to printer or disk
*
*
*/
dump()
{
 int i,c;
	if (psave == ON)
	{
	  for (i = 0; i < cnt; i++)
		prnout(pbuf[i]);
	  cnt = 0;
	  clrpbuf();
	}
	if (dsave == ON)
	  {
		for(i=0; i<ctr; i++)
		 fputc(buf[i],fip);
		ctr = 0;
		clrbuf();
	  }
}

/*
*
* FUNCTION inv_on - turns on inverse video
*
*/
inv_on()
{
conout(27);
conout(112); /* ESCAPE p */
}

/*
*
* FUNCTION inv_off - turns off inverse video
*
*/
inv_off()
{
conout(27);
conout(113); /* ESCAPE q */
}

/*
*
* FUNCTION clrpbuf - clear printer save buffer
*
*/
clrpbuf()
{
int i;
	for (i = 0; i < PBSIZE; i++)
	  pbuf[i] = ' ';
}

/*
*
* FUNCTION clrbuf - clear disk save buffer
*
*/
clrbuf()
{
int i;
	for (i = 0; i < BUFSIZE; i++)
	 buf[i] = ' ';
}

/*
*
* FUNCTION dsave_on - toggle disk save on/off
*
*/
dsave_on()
{
	if (dsave == OFF)
	{
	  red_on();
	  printf("\n ** DISK SAVE ON **\n");
	  dsave = ON;
	}
	else
	{
	  auxout(19);  /* SEND STOP TO HOST */
	  printf("\n ** DISK SAVE OFF **\n");
	  printf("** FLUSHING SECTOR BUFFER **\n");
	  dump();
	  printf("done....\n");
	  auxout(17);  /* SEND START TO HOST */
	  grey_on();
	  dsave = OFF;
	}
}

/*
* FUNCTION red_on - set background color to red
*/
red_on()
{
	  conout(27);
	  conout(99);
	  conout(1);   /* SET BACKGROUND COLOR TO RED */
}

/*
* FUNCTION grey_on - restore background color to grey
*/
grey_on()
{
	  conout(27);
	  conout(99);
	  conout(0);  /* GREY BACKGROUND */
}

/*
* FUNCTION help - lists terminal mode commands
*/
help()
{
clrscreen();
inv_on();
printf("\n\nTerminal Mode Commands\n\n");
printf("*F1 * toggle printer save on/off\n");
printf("*F2 * transmit an informal file \n");
printf("*F3 * toggle file save on/off   \n");
printf("*F10* exit to MAIN MENU 		\n\n");
printf(" Type Any Key to Continue ");
inv_off();
necin();
printf("\n");
}

/*
*
* FUNCTION green_on - turn background color green
*
*/
green_on()
{
  conout(27);
  conout(99);
  conout(2);
}