kl.c

8000 # 8001 /* KL/DL-11 driver */ 8002 #include "../param.h" 8003 #include "../conf.h" 8004 #include "../user.h" 8005 #include "../tty.h" 8006 #include "../proc.h" 8007 /* base address */ 8008 #define KLADDR 0177560 /* console */ 8009 #define KLBASE 0176500 /* kl and dl11-a */ 8010 #define DLBASE 0175610 /* dl-e */ 8011 #define NKL11 1 8012 #define NDL11 0 8013 #define DSRDY 02 8014 #define RDRENB 01 8015 struct tty kl11[NKL11+NDL11]; 8016 struct klregs { 8017 int klrcsr; 8018 int klrbuf; 8019 int kltcsr; 8020 int kltbuf; 8021 } 8022 /* ------------------------ */ 8023 klopen(dev, flag) 8024 { register char *addr; 8025 register struct tty *tp; 8026 if(dev.d_minor >= NKL11+NDL11) { 8027 u.u_error = ENXIO; 8028 return; 8029 } 8030 tp = &kl11[dev.d_minor]; 8031 if (u.u_procp->p_ttyp == 0) { 8032 u.u_procp->p_ttyp = tp; 8033 tp->t_dev = dev; 8034 } 8035 /* set up minor 0 to address KLADDR 8036 * set up minor 1 thru NKL11-1 to address from KLBASE 8037 * set up minor NKL11 on to address from DLBASE 8038 */ 8039 addr = KLADDR + 8*dev.d_minor; 8040 if(dev.d_minor) 8041 addr =+ KLBASE-KLADDR-8; 8042 if(dev.d_minor >= NKL11) 8043 addr =+ DLBASE-KLBASE-8*NKL11+8; 8044 tp->t_addr = addr; 8045 if ((tp->t_state&ISOPEN) == 0) { 8046 tp->t_state = ISOPEN|CARR_ON; 8047 tp->t_flags = XTABS|LCASE|ECHO|CRMOD; 8048 tp->t_erase = CERASE; 8049 tp->t_kill = CKILL; 8050 } 8051 addr->klrcsr =| IENABLE|DSRDY|RDRENB; 8052 addr->kltcsr =| IENABLE; 8053 } 8054 /* ------------------------ */ 8055 klclose(dev) 8056 { register struct tty *tp; 8057 tp = &kl11[dev.d_minor]; 8058 wflushtty(tp); 8059 tp->t_state = 0; 8060 } 8061 /* ------------------------ */ 8062 klread(dev) 8063 { 8064 ttread(&kl11[dev.d_minor]); 8065 } 8066 /* ------------------------ */ 8067 klwrite(dev) 8068 { 8069 ttwrite(&kl11[dev.d_minor]); 8070 } 8071 /* ------------------------ */ 8072 klxint(dev) 8073 { register struct tty *tp; 8074 tp = &kl11[dev.d_minor]; 8075 ttstart(tp); 8076 if (tp->t_outq.c_cc == 0 || tp->t_outq.c_cc == TTLOWAT) 8077 wakeup(&tp->t_outq); 8078 } 8079 /* ------------------------ */ 8080 klrint(dev) 8081 { register int c, *addr; 8082 register struct tty *tp; 8083 tp = &kl11[dev.d_minor]; 8084 addr = tp->t_addr; 8085 c = addr->klrbuf; 8086 addr->klrcsr =| RDRENB; 8087 if ((c&0177)==0) 8088 addr->kltbuf = c; /* hardware botch */ 8089 ttyinput(c, tp); 8090 } 8091 /* ------------------------ */ 8092 klsgtty(dev, v) 8093 int *v; 8094 { register struct tty *tp; 8095 tp = &kl11[dev.d_minor]; 8096 ttystty(tp, v); 8097 } 8098 /* ------------------------ */ 8099