|
|
1.1 ! root 1: /* ttyiin.c ttyiin, erase1, eputc, echoch */ ! 2: ! 3: #include <conf.h> ! 4: #include <kernel.h> ! 5: #include <tty.h> ! 6: #include <io.h> ! 7: #include <slu.h> ! 8: ! 9: /*------------------------------------------------------------------------ ! 10: * ttyiin -- lower-half tty device driver for input interrupts ! 11: *------------------------------------------------------------------------ ! 12: */ ! 13: INTPROC ttyiin(iptr) ! 14: register struct tty *iptr; /* pointer to tty block */ ! 15: { ! 16: register struct csr *cptr; ! 17: register int ch, ct; ! 18: ! 19: cptr = iptr->ioaddr; ! 20: ch=cptr->crbuf; ! 21: if (ch & SLUERMASK) ! 22: return; /* discard if error */ ! 23: ch &= SLUCHMASK; ! 24: if (iptr->imode == IMRAW) { ! 25: if (scount(iptr->isem) >= IBUFLEN) { ! 26: return; /* discard if no space */ ! 27: } ! 28: iptr->ibuff[iptr->ihead++] = ch; ! 29: if (iptr->ihead >= IBUFLEN) /* wrap buffer pointer */ ! 30: iptr->ihead = 0; ! 31: signal(iptr->isem); ! 32: } else { /* cbreak | cooked mode */ ! 33: if ( ch == RETURN && iptr->icrlf ) ! 34: ch = NEWLINE; ! 35: if (iptr->iintr && ch == iptr->iintrc) { ! 36: send(iptr->iintpid, INTRMSG); ! 37: eputc(ch, iptr, cptr); ! 38: return; ! 39: } ! 40: if (iptr->oflow) { ! 41: if (ch == iptr->ostart) { ! 42: iptr->oheld = FALSE; ! 43: cptr->ctstat = SLUENABLE; ! 44: return; ! 45: } ! 46: if (ch == iptr->ostop) { ! 47: iptr->oheld = TRUE; ! 48: return; ! 49: } ! 50: } ! 51: iptr->oheld = FALSE; ! 52: if (iptr->imode == IMCBREAK) { /* cbreak mode */ ! 53: if (scount(iptr->isem) >= IBUFLEN) { ! 54: eputc(iptr->ifullc,iptr,cptr); ! 55: return; ! 56: } ! 57: iptr->ibuff[iptr->ihead++] = ch; ! 58: if (iptr->ihead >= IBUFLEN) ! 59: iptr->ihead = 0; ! 60: if (iptr->iecho) ! 61: echoch(ch,iptr,cptr); ! 62: if (scount(iptr->isem) < IBUFLEN) ! 63: signal(iptr->isem); ! 64: } else { /* cooked mode */ ! 65: if (ch == iptr->ikillc && iptr->ikill) { ! 66: iptr->ihead -= iptr->icursor; ! 67: if (iptr->ihead < 0) ! 68: iptr->ihead += IBUFLEN; ! 69: iptr->icursor = 0; ! 70: eputc(RETURN,iptr,cptr); ! 71: eputc(NEWLINE,iptr,cptr); ! 72: return; ! 73: } ! 74: if (ch == iptr->ierasec && iptr->ierase) { ! 75: if (iptr->icursor > 0) { ! 76: iptr->icursor--; ! 77: erase1(iptr,cptr); ! 78: } ! 79: return; ! 80: } ! 81: if (ch == NEWLINE || ch == RETURN || ! 82: (iptr->ieof && ch == iptr->ieofc)) { ! 83: if (iptr->iecho) { ! 84: echoch(ch,iptr,cptr); ! 85: if (ch == iptr->ieofc) ! 86: echoch(NEWLINE,iptr,cptr); ! 87: } ! 88: iptr->ibuff[iptr->ihead++] = ch; ! 89: if (iptr->ihead >= IBUFLEN) ! 90: iptr->ihead = 0; ! 91: ct = iptr->icursor+1; /* +1 for \n or \r*/ ! 92: iptr->icursor = 0; ! 93: signaln(iptr->isem,ct); ! 94: return; ! 95: } ! 96: ct = scount(iptr->isem); ! 97: ct = ct < 0 ? 0 : ct; ! 98: if ((ct + iptr->icursor) >= IBUFLEN-1) { ! 99: eputc(iptr->ifullc,iptr,cptr); ! 100: return; ! 101: } ! 102: if (iptr->iecho) ! 103: echoch(ch,iptr,cptr); ! 104: iptr->icursor++; ! 105: iptr->ibuff[iptr->ihead++] = ch; ! 106: if (iptr->ihead >= IBUFLEN) ! 107: iptr->ihead = 0; ! 108: } ! 109: } ! 110: } ! 111: ! 112: /*------------------------------------------------------------------------ ! 113: * erase1 -- erase one character honoring erasing backspace ! 114: *------------------------------------------------------------------------ ! 115: */ ! 116: LOCAL erase1(iptr,cptr) ! 117: struct tty *iptr; ! 118: register struct csr *cptr; ! 119: { ! 120: char ch; ! 121: ! 122: if (--(iptr->ihead) < 0) ! 123: iptr->ihead += IBUFLEN; ! 124: ch = iptr->ibuff[iptr->ihead]; ! 125: if (iptr->iecho) { ! 126: if (ch < BLANK || ch == 0177) { ! 127: if (iptr->evis) { ! 128: eputc(BACKSP,iptr,cptr); ! 129: if (iptr->ieback) { ! 130: eputc(BLANK,iptr,cptr); ! 131: eputc(BACKSP,iptr,cptr); ! 132: } ! 133: } ! 134: eputc(BACKSP,iptr,cptr); ! 135: if (iptr->ieback) { ! 136: eputc(BLANK,iptr,cptr); ! 137: eputc(BACKSP,iptr,cptr); ! 138: } ! 139: } else { ! 140: eputc(BACKSP,iptr,cptr); ! 141: if (iptr->ieback) { ! 142: eputc(BLANK,iptr,cptr); ! 143: eputc(BACKSP,iptr,cptr); ! 144: } ! 145: } ! 146: } else ! 147: cptr->ctstat = SLUENABLE; ! 148: } ! 149: ! 150: /*------------------------------------------------------------------------ ! 151: * echoch -- echo a character with visual and ocrlf options ! 152: *------------------------------------------------------------------------ ! 153: */ ! 154: LOCAL echoch(ch, iptr, cptr) ! 155: char ch; /* character to echo */ ! 156: register struct tty *iptr; /* ptr to I/O block for this dev*/ ! 157: register struct csr *cptr; /* csr address for this devptr */ ! 158: { ! 159: if ((ch==NEWLINE||ch==RETURN)&&iptr->ecrlf) { ! 160: eputc(RETURN,iptr,cptr); ! 161: eputc(NEWLINE,iptr,cptr); ! 162: } else if ((ch<BLANK||ch==0177) && iptr->evis) { ! 163: eputc(UPARROW,iptr,cptr); ! 164: eputc(ch+0100,iptr,cptr); /* make it printable */ ! 165: } else { ! 166: eputc(ch,iptr,cptr); ! 167: } ! 168: } ! 169: ! 170: /*------------------------------------------------------------------------ ! 171: * eputc - put one character in the echo queue ! 172: *------------------------------------------------------------------------ ! 173: */ ! 174: LOCAL eputc(ch,iptr,cptr) ! 175: char ch; ! 176: register struct tty *iptr; ! 177: register struct csr *cptr; ! 178: { ! 179: iptr->ebuff[iptr->ehead++] = ch; ! 180: if (iptr->ehead >= EBUFLEN) ! 181: iptr->ehead = 0; ! 182: cptr->ctstat = SLUENABLE; ! 183: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.