|
|
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.