#include "sys/param.h"
#include "../vax/gencons.h"
#include "mtpr.h"
#include "sid.h"
#include "rpb.h"
#include "ka630.h"
#include "data.h"
void setup(void);
static void (*put_fp)(int) = NULL;
static int (*get_fp)(void) = NULL;
static int (*test_fp)(void) = NULL;
void pr_putchar(int c);
int pr_getchar(void);
int pr_testchar(void);
void rom_putchar(int c);
int rom_getchar(void);
int rom_testchar(void);
int rom_putc;
int rom_getc;
unsigned char *ka630_conspage;
void ka630_consinit(void);
void ka630_rom_putchar(int c);
int ka630_rom_getchar(void);
int ka630_rom_testchar(void);
unsigned char *ka53_conspage;
void ka53_consinit(void);
void ka53_rom_putchar(int c);
int ka53_rom_getchar(void);
int ka53_rom_testchar(void);
void vxt_putchar(int c);
int vxt_getchar(void);
int vxt_testchar(void);
void putchar(int);
int getchar(void);
int testkey(void);
void consinit(void);
void _rtt(void);
void
putchar(int c)
{
(*put_fp)(c);
if (c == 10)
(*put_fp)(13);
}
int
getchar(void)
{
int c;
do
c = (*get_fp)() & 0177;
while (c == 17 || c == 19);
if (c < 96 && c > 64)
c += 32;
return c;
}
int
testkey(void)
{
return (*test_fp)();
}
void
consinit(void)
{
put_fp = pr_putchar;
get_fp = pr_getchar;
test_fp = pr_testchar;
switch (vax_boardtype) {
case VAX_BTYP_43:
case VAX_BTYP_410:
case VAX_BTYP_420:
put_fp = rom_putchar;
get_fp = rom_getchar;
test_fp = rom_testchar;
rom_putc = 0x20040058;
rom_getc = 0x20040044;
break;
case VAX_BTYP_VXT:
put_fp = vxt_putchar;
get_fp = vxt_getchar;
test_fp = vxt_testchar;
break;
case VAX_BTYP_630:
ka630_consinit();
break;
case VAX_BTYP_46:
case VAX_BTYP_48:
case VAX_BTYP_49:
put_fp = rom_putchar;
get_fp = rom_getchar;
test_fp = rom_testchar;
rom_putc = 0x20040068;
rom_getc = 0x20040054;
break;
case VAX_BTYP_53:
ka53_consinit();
break;
#ifdef notdef
case VAX_BTYP_630:
case VAX_BTYP_650:
case VAX_BTYP_9CC:
case VAX_BTYP_60:
put_fp = pr_putchar;
get_fp = pr_getchar;
break
#endif
}
return;
}
void
pr_putchar(int c)
{
int timeout = 1<<15;
while (mfpr(PR_RXCS) & GC_DON) {
if ((mfpr(PR_RXDB) & 0x7f) == 19) {
while (1) {
while ((mfpr(PR_RXCS) & GC_DON) == 0)
;
if ((mfpr(PR_RXDB) & 0x7f) == 17)
break;
}
}
}
while ((mfpr(PR_TXCS) & GC_RDY) == 0)
if (--timeout < 0)
break;
mtpr(c, PR_TXDB);
}
int
pr_getchar(void)
{
while ((mfpr(PR_RXCS) & GC_DON) == 0)
;
return (mfpr(PR_RXDB));
}
int
pr_testchar(void)
{
if (mfpr(PR_RXCS) & GC_DON)
return mfpr(PR_RXDB);
else
return 0;
}
void ka630_consinit(void)
{
short *NVR;
int i;
NVR = (short *) KA630_NVR_ADRS;
i = *NVR++ & 0xFF;
i |= (*NVR++ & 0xFF) << 8;
i |= (*NVR++ & 0xFF) << 16;
i |= (*NVR++ & 0xFF) << 24;
ka630_conspage = (unsigned char *) i;
ka630_conspage[KA630_ROW] = ka630_conspage[KA630_MAXROW];
ka630_conspage[KA630_COL] = ka630_conspage[KA630_MINCOL];
put_fp = ka630_rom_putchar;
get_fp = ka630_rom_getchar;
test_fp = ka630_rom_testchar;
}
void ka53_consinit(void)
{
ka53_conspage = (unsigned char *) 0x2014044b;
put_fp = ka53_rom_putchar;
get_fp = ka53_rom_getchar;
test_fp = ka53_rom_testchar;
}
static volatile int *vxtregs = (int *)0x200A0000;
#define CH_SR 1
#define CH_DAT 3
#define SR_TX_RDY 0x04
#define SR_RX_RDY 0x01
void
vxt_putchar(int c)
{
while ((vxtregs[CH_SR] & SR_TX_RDY) == 0)
;
vxtregs[CH_DAT] = c;
}
int
vxt_getchar(void)
{
while ((vxtregs[CH_SR] & SR_RX_RDY) == 0)
;
return vxtregs[CH_DAT];
}
int
vxt_testchar(void)
{
if ((vxtregs[CH_SR] & SR_RX_RDY) == 0)
return 0;
return vxtregs[CH_DAT];
}