|
|
1.1 ! root 1: /* dlcoin.c - dlcoin */ ! 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: * dlcoin -- dlc output interrupt handler ! 12: *------------------------------------------------------------------------ ! 13: */ ! 14: INTPROC dlcoin(dptr) ! 15: register struct dlblk *dptr; ! 16: { ! 17: struct csr *cptr; ! 18: char ch; ! 19: ! 20: cptr = dptr->dioaddr; ! 21: ! 22: switch (dptr->dostate) { ! 23: ! 24: case DLOINIT: /* non-blockmode output */ ! 25: if (dptr->dovalid) { ! 26: cptr->ctbuf = dptr->dochar; ! 27: dptr->dovalid = FALSE; ! 28: } else ! 29: cptr->ctstat = SLUDISABLE; ! 30: return; ! 31: ! 32: case DLOREADY: /* ready to write block */ ! 33: cptr->ctbuf = DLSTART; ! 34: dptr->dostate = DLOSTALL; ! 35: dptr->dostall = DLNSTALL; ! 36: dptr->doesc = FALSE; ! 37: return; ! 38: ! 39: case DLOSTALL: /* stalling a while */ ! 40: cptr->ctstat = SLUDISABLE; ! 41: cptr->ctstat = SLUENABLE; ! 42: if (dptr->dostall-- > 0) ! 43: return; ! 44: dptr->dostate = DLOWRITE; ! 45: return; ! 46: ! 47: case DLOWRITE: /* writing a block */ ! 48: if (dptr->docount-- <= 0) { ! 49: dptr->dostate = DLODONE; ! 50: cptr->ctbuf = DLEOB; ! 51: return; ! 52: } ! 53: if (((ch= *dptr->donext++)&DLESCMASK)==DLESCPED){ ! 54: if (dptr->doesc) { ! 55: dptr->doesc = FALSE; ! 56: cptr->ctbuf = ch & DLEBMASK; ! 57: } else { ! 58: dptr->donext--; ! 59: dptr->docount++; ! 60: dptr->doesc = TRUE; ! 61: cptr->ctbuf = DLESC; ! 62: } ! 63: return; ! 64: } ! 65: cptr->ctbuf = ch; ! 66: return; ! 67: ! 68: case DLODONE: /* finished writing */ ! 69: if (dptr->docount < 0) { ! 70: ready(dptr->doproc, RESCHYES); ! 71: dptr->docount = 0; ! 72: } ! 73: cptr->ctstat = SLUDISABLE; ! 74: return; ! 75: ! 76: case DLORESTART: /* restart transmission */ ! 77: dptr->dostate = DLOREADY; ! 78: dptr->donext = dptr->dostart; ! 79: dptr->docount = dptr->dotot; ! 80: cptr->ctstat = SLUDISABLE; ! 81: cptr->ctstat = SLUENABLE; ! 82: return; ! 83: ! 84: default: ! 85: panic("impossible dlc output state"); ! 86: } ! 87: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.