/* @(#)clist.c 1.2 */ #include "sys/param.h" #include "sys/types.h" #include "sys/tty.h" getc(p) register struct clist *p; { register struct cblock *bp; register int c; #ifdef mc68000 /* * Note use of d6 */ #ifndef lint register int s = 0; #endif asm(" movw sr,d6"); asm(" movw #0x2600,sr"); #else register int s; s = spl6(); #endif if (p->c_cc > 0) { p->c_cc--; bp = p->c_cf; c = bp->c_data[bp->c_first++]&0377; if (bp->c_first == bp->c_last) { if ((p->c_cf = bp->c_next) == NULL) p->c_cl = NULL; bp->c_next = cfreelist.c_next; cfreelist.c_next = bp; if (cfreelist.c_flag) { cfreelist.c_flag = 0; wakeup((caddr_t)&cfreelist); } } } else c = -1; #ifdef mc68000 asm(" movw d6,sr"); #else splx(s); #endif return(c); } putc(c, p) register struct clist *p; { register struct cblock *bp, *obp; #ifdef mc68000 /* * Note use of d7 */ #ifndef lint register int s = 0; #endif asm(" movw sr,d7"); asm(" movw #0x2600,sr"); #else register int s; s = spl6(); #endif if ((bp = p->c_cl) == NULL || bp->c_last == (char)cfreelist.c_size) { obp = bp; if ((bp = cfreelist.c_next) == NULL) { #ifdef mc68000 asm(" movw d7,sr"); #else splx(s); #endif return(-1); } cfreelist.c_next = bp->c_next; bp->c_next = NULL; bp->c_first = 0; bp->c_last = 0; if (obp == NULL) p->c_cf = bp; else obp->c_next = bp; p->c_cl = bp; } bp->c_data[bp->c_last++] = c; p->c_cc++; #ifdef mc68000 asm(" movw d7,sr"); #else splx(s); #endif return(0); } struct cblock * getcf() { register struct cblock *bp; register struct chead *cf; #ifdef mc68000 /* * Note use of d7 */ #ifndef lint register int s = 0; #endif asm(" movw sr,d7"); asm(" movw #0x2600,sr"); #else register int s; s = spl6(); #endif cf = &cfreelist; if ((bp = cf->c_next) != NULL) { cf->c_next = bp->c_next; bp->c_next = NULL; bp->c_first = 0; bp->c_last = cf->c_size; } #ifdef mc68000 asm(" movw d7,sr"); #else splx(s); #endif return(bp); } putcf(bp) register struct cblock *bp; { register struct chead *cf; #ifdef mc68000 /* * Note use of d7 */ #ifndef lint register int s = 0; #endif asm(" movw sr,d7"); asm(" movw #0x2600,sr"); #else register int s; s = spl6(); #endif cf = &cfreelist; bp->c_next = cf->c_next; cf->c_next = bp; if (cf->c_flag) { cf->c_flag = 0; wakeup((caddr_t)cf); } #ifdef mc68000 asm(" movw d7,sr"); #else splx(s); #endif } struct cblock * getcb(p) register struct clist *p; { register struct cblock *bp; #ifdef mc68000 /* * Note use of d7 */ #ifndef lint register int s = 0; #endif asm(" movw sr,d7"); asm(" movw #0x2600,sr"); #else register int s; s = spl6(); #endif if ((bp = p->c_cf) != NULL) { p->c_cc -= bp->c_last - bp->c_first; if ((p->c_cf = bp->c_next) == NULL) p->c_cl = NULL; } #ifdef mc68000 asm(" movw d7,sr"); #else splx(s); #endif return(bp); } putcb(bp, p) register struct cblock *bp; register struct clist *p; { #ifdef mc68000 /* * Note use of d7 */ #ifndef lint register int s = 0; #endif asm(" movw sr,d7"); asm(" movw #0x2600,sr"); #else register int s; s = spl6(); #endif if (p->c_cl == NULL) p->c_cf = bp; else p->c_cl->c_next = bp; p->c_cl = bp; bp->c_next = NULL; p->c_cc += bp->c_last - bp->c_first; #ifdef mc68000 asm(" movw d7,sr"); #else splx(s); #endif } #ifdef notdef getcbp(p, cp, n) struct clist *p; register char *cp; register n; { register struct cblock *bp; register char *op; register on; register char *acp = cp; while (n) { if ((bp = p->c_cf) == NULL) break; op = &bp->c_data[bp->c_first]; on = bp->c_last - bp->c_first; if (n >= on) { bcopy(op, cp, on); cp += on; n -= on; if ((p->c_cf = bp->c_next) == NULL) p->c_cl = NULL; bp->c_next = cfreelist.c_next; cfreelist.c_next = bp; } else { bcopy(op, cp, n); bp->c_first += n; cp += n; n = 0; break; } } n = cp - acp; p->c_cc -= n; return(n); } #endif #ifdef notdef putcbp(p, cp, n) struct clist *p; register char *cp; register n; { register struct cblock *bp, *obp; register char *op; register on; register char *acp = cp; while (n) { if ((bp = p->c_cl) == NULL || bp->c_last == cfreelist.c_size) { obp = bp; if ((bp = cfreelist.c_next) == NULL) break; cfreelist.c_next = bp->c_next; bp->c_next = NULL; bp->c_first = 0; bp->c_last = 0; if (obp == NULL) p->c_cf = bp; else obp->c_next = bp; p->c_cl = bp; } op = &bp->c_data[bp->c_last]; on = cfreelist.c_size - bp->c_last; if (n >= on) { bcopy(cp, op, on); cp += on; bp->c_last += on; n -= on; } else { bcopy(cp, op, n); cp += n; bp->c_last += n; n = 0; break; } } n = cp - acp; p->c_cc += n; return(n); } #endif