

/*
**   modes.c
**
**       public domain use only   Mark Ellington   1984
**
**  This program provides easy menu selection of some options
**  of the Epson RX-80 and compatible printers.  
**
*/



/* printer modes */


main()
{
	char s[3];
        int n;

	putchar(0x1a);

	puts("Printer mode selection:\n\n");

	puts("0: Exit.\n");
	
	puts("1: Emphasized mode on.\n");

	puts("2: Emphasized mode off.\n");

	puts("3: Double-strike on.\n");

	puts("4: Double-strike off.\n");

	puts("5: Elite mode on.\n");

	puts("6: Elite mode off.\n");

	puts("7: Compressed mode on.\n");

	puts("8: Compressed mode off.\n");

	puts("9: Set tabs.\n");

	puts("10: Skip-over-perforation OFF.\n");

	puts("11: Graphics character set on.\n");

	puts("12: Graphics character set off.\n");

	puts("13: Reset.\n"); 

	n = 1;
        while (n != 0) {
		gets(s);
		n = atoi(s); 
		switch(n) {
			case 1: newmode('E');
				break;	
			case 2: newmode('F');
				break;	
			case 3: newmode('G');
				break;
			case 4: newmode('H');
				break;	
			case 5: newmode('M');
				break;	
			case 6: newmode('P');
				break;
			case 7: nbr(15);
				break;
			case 8: nbr(18);
				break;	
			case 9: tabs();
				break;
			case 10: newmode('O');
				break;
			case 11:  
                               	newmode('m');
				nbr(4);
				break;
			case 12:  
                               	newmode('m');
				nbr(0);
				break;
			case 13: newmode(64);
				break;
			default: break; 
	  	}
	}
}


/* single byte to printer */

nbr(n)
char n;
{
	bdos(5,n);
}



/* escape sequence to printer  "ESC byte" */

newmode(c)
char c;		/* byte */
{
	bdos(5,27);	/* ESC */
	bdos(5,c);	/* command char */
}




tabs()
{
	char n;
	char s[4];

	puts("\nEnter number spaces per tab: ");
	gets(s);
	n = atoi(s);

	bdos(5,27);		/* ESC */
	bdos(5,'e');		/* e */
	bdos(5,'0');		/* 0 */
	bdos(5,n);		/* n spaces */

}





/* get string of input into array */

gets(stri)
char stri[80];
{ 
char c;
int i;

	while ((c = getchar()) != '\n') {
		stri[i++] = c;
	}	
	stri[i] = '\0';

	return(stri[0]);    /* return 1st char */
}






/* convert byte string to integer */

atoi(s)  char s[8];  
{
	int i;
	unsigned int n;

	n = 0;
	for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
		n = 10 * n + s[i] - '0';
	return(n);
}




/* CP/M direct system call routine */

bdos(funct,value)	
int funct, value;
{
funct;	/* pass C reg data */
#asm
;
;  machine code CP/M system BDOS call 
;
BDOS	EQU	0005H	;BDOS entry
;
	MOV	C,L
;
#endasm

value;
#asm
	MOV	E,L
	MOV	D,H
;
	CALL	BDOS	;CALL CP/M 
	MOV	L,A
	MVI	H,0	
	RET	
#endasm
}





/* string to console */

puts(s)
char *s;
{

	while (*s) putchar(*s++);

}








