|
|
1.1 ! root 1: /* dlciin.c - dlciin */ ! 2: ! 3: #include <conf.h> ! 4: #include <kernel.h> ! 5: #include <slu11.h> ! 6: #include <proc.h> ! 7: #include <sleep.h> ! 8: #include <dlc.h> ! 9: ! 10: /*------------------------------------------------------------------------ ! 11: * dlciin -- dlc input interrupt handler (block + normal modes) ! 12: *------------------------------------------------------------------------ ! 13: */ ! 14: INTPROC dlciin(dptr) ! 15: register struct dlblk *dptr; ! 16: { ! 17: struct csr *cptr; ! 18: register char ch; ! 19: int icode; ! 20: ! 21: ch = ( (icode = ((cptr=dptr->dioaddr)->crbuf)) ) & SLUCHMASK; ! 22: ! 23: switch (dptr->distate) { ! 24: ! 25: case DLIINIT: /* non-blockmode read */ ! 26: if (ch == DLRESTART && dptr->dostate!=DLOINIT) { ! 27: dptr->dostate = DLORESTART; ! 28: return; ! 29: } ! 30: if (dptr->dpid) ! 31: sendf(dptr->dpid, (ch&0377) ); ! 32: return; ! 33: ! 34: case DLIREADY: /* ready for block */ ! 35: if (ch == DLSTART) { ! 36: dptr->distate = DLIREAD; ! 37: defclk++; ! 38: if (currpid == NULLPROC) ! 39: proctab[NULLPROC].pprio = MAXINT; ! 40: else { ! 41: insert(dequeue(NULLPROC),rdyhead, ! 42: proctab[NULLPROC].pprio=MAXINT); ! 43: resched(); ! 44: } ! 45: } else { /* unexpected character */ ! 46: dptr->dochar = DLRESTART; ! 47: dptr->dovalid = TRUE; ! 48: cptr->ctstat = SLUENABLE; ! 49: dptr->distate = DLIWAIT; ! 50: } ! 51: return; ! 52: ! 53: case DLIREAD: /* doing blockmode read */ ! 54: if (icode & SLUERMASK) { /* input error */ ! 55: dptr->distate = DLIWAIT; ! 56: dptr->dicount = 0; ! 57: dptr->dinext = dptr->distart; ! 58: dptr->diesc = FALSE; ! 59: dptr->dochar = DLRESTART; ! 60: dptr->dovalid = TRUE; ! 61: cptr->ctstat = SLUENABLE; ! 62: proctab[NULLPROC].pprio = 0; ! 63: strtclk(); ! 64: return; ! 65: } ! 66: if (ch == DLEOB) { /* end of block */ ! 67: dptr->distate = DLIDONE; ! 68: ready(dptr->diproc, RESCHNO); ! 69: proctab[NULLPROC].pprio = 0; ! 70: strtclk(); ! 71: resched(); ! 72: return; ! 73: } ! 74: if (ch == DLSTART) { /* restart read */ ! 75: dptr->diesc = FALSE; ! 76: dptr->dinext = dptr->distart; ! 77: dptr->dicount = 0; ! 78: return; ! 79: } ! 80: if (dptr->diesc) { /* map escapes */ ! 81: dptr->diesc = FALSE; ! 82: if ( ch & DLESCBIT) { /* impossible */ ! 83: dptr->distate = DLIWAIT; ! 84: dptr->dicount = 0; ! 85: dptr->dinext = dptr->distart; ! 86: dptr->dochar = DLRESTART; ! 87: dptr->dovalid = TRUE; ! 88: cptr->ctstat = SLUENABLE; ! 89: proctab[NULLPROC].pprio = 0; ! 90: strtclk(); ! 91: return; ! 92: } else ! 93: ch |= DLESCBIT; ! 94: } else if (ch == DLESC) { /* escape next */ ! 95: dptr->diesc = TRUE; ! 96: return; ! 97: } ! 98: *dptr->dinext++ = ch; ! 99: if ( ++(dptr->dicount) >= dptr->dimax ) { ! 100: dptr->distate = DLIDONE; ! 101: ready(dptr->diproc, RESCHNO); ! 102: proctab[NULLPROC].pprio = 0; ! 103: strtclk(); ! 104: resched(); ! 105: } ! 106: return; ! 107: ! 108: case DLIWAIT: ! 109: if (ch == DLSTART) { ! 110: dptr->distate = DLIREAD; ! 111: defclk++; ! 112: if (currpid == NULLPROC) ! 113: proctab[NULLPROC].pprio = MAXINT; ! 114: else { ! 115: insert(dequeue(NULLPROC),rdyhead, ! 116: proctab[NULLPROC].pprio=MAXINT); ! 117: resched(); ! 118: } ! 119: } else if (ch == DLEOB) ! 120: dptr->distate = DLIREADY; ! 121: return; ! 122: ! 123: case DLIDONE: ! 124: return; ! 125: ! 126: default: ! 127: panic("impossible dlc input state"); ! 128: } ! 129: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.