|
|
1.1 ! root 1: /* ut.c 4.3 82/03/26 */ ! 2: ! 3: /* ! 4: * SI Model 9700 -- emulates TU45 on the UNIBUS ! 5: */ ! 6: ! 7: #include <sys/param.h> ! 8: #include <sys/inode.h> ! 9: #include <sys/pte.h> ! 10: #include <sys/ubareg.h> ! 11: #include "saio.h" ! 12: #include "savax.h" ! 13: ! 14: #include <sys/utreg.h> ! 15: ! 16: u_short utstd[] = { 0172440 }; /* non-standard */ ! 17: ! 18: utopen(io) ! 19: register struct iob *io; ! 20: { ! 21: register skip; ! 22: ! 23: utstrategy(io, UT_REW); ! 24: skip = io->i_boff; ! 25: while (skip--) { ! 26: io->i_cc = 0; ! 27: utstrategy(io, UT_SFORW); ! 28: } ! 29: } ! 30: ! 31: utclose(io) ! 32: register struct iob *io; ! 33: { ! 34: utstrategy(io, UT_REW); ! 35: } ! 36: ! 37: #define utwait(addr) {do word=addr->utcs1; while((word&UT_RDY)==0);} ! 38: ! 39: utstrategy(io, func) ! 40: register struct iob *io; ! 41: { ! 42: register u_short word; ! 43: register int errcnt; ! 44: register struct utdevice *addr = ! 45: (struct utdevice *)ubamem(io->i_unit, utstd[0]); ! 46: int info; ! 47: u_short dens; ! 48: ! 49: dens = (io->i_unit&07) | PDP11FMT | UT_PE; ! 50: errcnt = 0; ! 51: retry: ! 52: utquiet(addr); ! 53: addr->uttc = dens; ! 54: info = ubasetup(io, 1); ! 55: addr->utwc = -((io->i_cc+1) >> 1); ! 56: addr->utfc = -io->i_cc; ! 57: if (func == READ) { ! 58: addr->utba = info; ! 59: addr->utcs1 = UT_RCOM | ((info>>8) & 0x30) | UT_GO; ! 60: } else if (func == WRITE) { ! 61: addr->utba = info; ! 62: addr->utcs1 = UT_WCOM | ((info>>8) & 0x30) | UT_GO; ! 63: } else if (func == UT_SREV) { ! 64: addr->utcs1 = UT_SREV | UT_GO; ! 65: return (0); ! 66: } else ! 67: addr->utcs1 = func | UT_GO; ! 68: utwait(addr); ! 69: ubafree(io, info); ! 70: word = addr->utds; ! 71: if (word&(UTDS_EOT|UTDS_TM)) { ! 72: addr->utcs1 = UT_CLEAR | UT_GO; ! 73: return(0); ! 74: } ! 75: if ((word&UTDS_ERR) || (addr->utcs1&UT_TRE)) { ! 76: if (errcnt == 0) ! 77: printf("tj error: cs1=%b er=%b cs2=%b ds=%b", ! 78: addr->utcs1, UT_BITS, addr->uter, UTER_BITS, ! 79: addr->utcs2, UTCS2_BITS, word, UTDS_BITS); ! 80: if (errcnt == 10) { ! 81: printf("\n"); ! 82: return(-1); ! 83: } ! 84: errcnt++; ! 85: if (addr->utcs1&UT_TRE) ! 86: addr->utcs2 |= UTCS2_CLR; ! 87: addr->utcs1 = UT_CLEAR | UT_GO; ! 88: utstrategy(io, UT_SREV); ! 89: utquiet(addr); ! 90: if (func == WRITE) { ! 91: addr->utcs1 = UT_ERASE | UT_GO; ! 92: utwait(addr); ! 93: } ! 94: goto retry; ! 95: } ! 96: if (errcnt) ! 97: printf(" recovered by retry\n"); ! 98: return (func == READ ? ! 99: io->i_cc - ((-addr->utfc) & 0xffff) : -addr->utwc << 1); ! 100: } ! 101: ! 102: utquiet(addr) ! 103: register struct utdevice *addr; ! 104: { ! 105: register u_short word; ! 106: ! 107: utwait(addr); ! 108: do ! 109: word = addr->utds; ! 110: while ((word&UTDS_DRY) == 0 && (word&UTDS_PIP)); ! 111: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.