/*
 * Standalone console I/O
 */

char	consaddr	= 0x10;
char	conscmd2	= 0xee;

#define	DIS	0200
#define	ENA	0100
#define	DTR	0040
#define	WRT	0002
#define	CMD1	0001

#define PF		0100
#define FRERR		0040
#define	BSY		0010
#define EXA		0004
#define	CARR_OFF	0002

/*
 * Print a character on console.
 */
putchar(c)
register c;
{
	register s, timo;
	register waddr;

	waddr = consaddr | 01;
	/*
	 * Set baud rate & disarm interrupts
	 */
	oc(waddr, conscmd2);
	oc(waddr, DIS | ENA | WRT | DTR | CMD1);
	/*
	 *  If last char was a break or null, don't print
	*/
/*** ???
	if ((KLADDR->rbuf&0177) == 0)
		return;
***/
	timo = 30000;
	/*
	 * Try waiting for the console tty to come ready,
	 * otherwise give up after a reasonable time.
	 */
	while(ss(waddr)&BSY)
		if(--timo == 0)
			break;
	if(c == 0)
		return;
	wd(consaddr, c);
	if(c == '\n') {
		putchar('\r');
/***
		putchar(0177);
		putchar(0177);
***/
	}
	putchar(0);
}


getchar()
{
	register c, raddr;

	raddr = consaddr;
	/*
	 * Set baud rate & disarm interrupts
	 */
	oc(raddr, conscmd2);
	oc(raddr, DIS | ENA |  DTR | CMD1);
	/*
	 * Read a character
	 */
	c = rd(raddr);
	while (ss(raddr)&BSY)
		;
	c = rd(raddr)&0177;
	if (c=='\r')
		c = '\n';
	putchar(c);
	return(c);
}

gets(buf)
char	*buf;
{
register char *lp;
register c;

	lp = buf;
	for (;;) {
		c = getchar() & 0177;
		if (c>='A' && c<='Z')
			c -= 'A' - 'a';
		if (lp != buf && *(lp-1) == '\\') {
			lp--;
			if (c>='a' && c<='z') {
				c += 'A' - 'a';
				goto store;
			}
			switch ( c) {
			case '(':
				c = '{';
				break;
			case ')':
				c = '}';
				break;
			case '!':
				c = '|';
				break;
			case '^':
				c = '~';
				break;
			case '\'':
				c = '`';
				break;
			}
		}
	store:
		switch(c) {
		case '\n':
		case '\r':
			c = '\n';
			*lp++ = '\0';
			return;
		case '\b':
		case '#':
			lp--;
			if (lp < buf)
				lp = buf;
			continue;
		case '@':
			lp = buf;
			putchar('\n');
			continue;
		default:
			*lp++ = c;
		}
	}
}
