# define DEBUG debug /* * Elscint (TM) Scintillation Counters driver. * written at St. Joseph's Hospital, by Geoff Collyer, 16 Jan 1979. */ # include "../param.h" # include "../user.h" # include "../buf.h" # define SCPRI 8 /* same as VTPRI */ # define SCADDR 0164100 # define CTRS 3 struct screg { int csr; int unused; struct sctr { int low; int high; } ctr[CTRS]; }; /* hardware bits in csr */ # define RUN 0100000 /* zero means HALT */ # define START 0100 /* zero means STOP */ # define RUNBIT 15 /* bit number of RUN */ /* misc. */ # define BCDIGIT 017 # define BCDWIDTH 4 /* width of BCDIGIT */ # define READ 0 # define OPEN 1 # define CLOSED 0 # define NO_MORE (-1) # define STTY 0 long itol(); int scstate CLOSED; scopen(dev, flag) { if(flag != READ || scstate == OPEN) { u.u_error = ENXIO; return; } scstate = OPEN; SCADDR->csr = 0; /* HALT, STOP */ SCADDR->csr |= START; } scclose(dev, flag) { SCADDR->csr = 0; /* HALT, STOP */ scstate = CLOSED; } scsgtty(dev, v) int v[3]; { if(v != STTY) v[0] = (SCADDR->csr>>RUNBIT)&1; } scread(dev) { long regs[CTRS]; char *cp; register long *rp; register struct sctr *scrp; register int i; rp = regs; scrp = &SCADDR->ctr[0]; spl6(); /* this will only take a minute... */ SCADDR->csr &= ~START; for(i = 0; i < CTRS; ++i, ++scrp) *rp++ = itol(scrp->high, scrp->low); SCADDR->csr |= START; spl0(); /* there; that wasn't so bad, now was it? */ for(i = 0; i < CTRS; ++i) # ifdef DEBUG { printf("sc: %d hi %d\n", i, regs[i].low); printf("sc: %d lo %d\n", i, regs[i].high); # endif scbcd(®s[i]); # ifdef DEBUG printf("sc: %d hi %d\n", i, regs[i].low); printf("sc: %d lo %d\n", i, regs[i].high); } # endif cp = (char *) regs; for(i = 0; i < sizeof regs && passc(*cp++) != NO_MORE; ++i) ; } scbcd(digs) register long *digs; { long result, power; # ifdef DEBUG printf("sc: digs=%o\n", digs); # endif power = 1; result = 0; for(; *digs > 0; *digs >>= BCDWIDTH) { # ifdef DEBUG printf("sc: digit: %d\n", (int) (*digs)&BCDIGIT); printf("sc: power: %d\n", (int) power); # endif result += ((*digs)&BCDIGIT)*power; # ifdef DEBUG printf("sc: result: %d\n", (int) result); # endif power *= 10; } *digs = result; }