/*
 * Copyright (c) 1982, 1986 Regents of the University of California.
 * All rights reserved.  The Berkeley software License Agreement
 * specifies the terms and conditions for redistribution.
 *
 *	@(#)prf.c	7.5 (Berkeley) 6/6/88
 */


#define	RXCS	0x20		/* console receiver control and status */
#define	RXDB	0x21		/* console receiver data buffer */
#define	TXCS	0x22		/* console transmitter control and status */
#define	TXDB	0x23		/* console transmitter data buffer */
#define	RXCS_DONE	0x00000080	/* receiver done */
#define	TXCS_RDY	0x00000080	/* transmitter ready for next char */


int slputc(), slgetc(), slgetct();
extern (*v_putc)(),(*v_getc)(),(*v_getct)();

sl_init()
{
    extern int cpu, sid_ext;

    if (cpu != 8 || sid_ext != 1)
      return(0);

    v_getc = slgetc;
    v_putc = slputc;
    v_getct = slgetct;
    return(1);
}


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

    timo = 30000;
    /*
     * Try waiting for the console tty to come ready,
     * otherwise give up after a reasonable time.
     */
    while((mfpr(TXCS)&TXCS_RDY) == 0)
      if(--timo == 0)
	break;
    if(c == 0)
      return;
    s = mfpr(TXCS);
    mtpr(TXCS,0);
    mtpr(TXDB, c&0xff);
    slputc(0);
    mtpr(TXCS, s);
}

slgetc()
{
    register c;

    while((mfpr(RXCS)&RXCS_DONE) == 0)
      ;
    return(mfpr(RXDB)&0177);
}

slgetct(timeo)
int timeo;
{
    register c;

    timeo *= 10000;
    while ((mfpr(RXCS)&RXCS_DONE) == 0)
      if (timeo-- < 0)
	return(-1);
    c = mfpr(RXDB)&0177;
    return(c);
}


static mtpr(reg, val)
{
    asm("mtpr 8(ap),4(ap)");
}

static mfpr(regno)
{
    asm("mfpr 4(ap),r0");
}
