8800: # 8801: /* 8802: */ 8803: 8804: /* 8805: * LP-11 Line printer driver 8806: */ 8807: 8808: #include "../param.h" 8809: #include "../conf.h" 8810: #include "../user.h" 8811: 8812: #define LPADDR 0177514 8813: 8814: #define IENABLE 0100 8815: #define DONE 0200 8816: 8817: #define LPPRI 10 8818: #define LPLWAT 50 8819: #define LPHWAT 100 8820: #define EJLINE 60 8821: #define MAXCOL 80 8822: 8823: struct { 8824: int lpsr; 8825: int lpbuf; 8826: }; 8827: /* --------------------------- */ 8828: 8829: struct { 8830: int cc; 8831: int cf; 8832: int cl; 8833: int flag; 8834: int mcc; 8835: int ccc; 8836: int mlc; 8837: } lp11; 8838: /* --------------------------- */ 8839: 8840: #define CAP 01 /* Set to 0 for 96-char printer, else to 01 */ 8841: 8842: #define EJECT 02 8843: #define OPEN 04 8844: #define IND 010 /* Set to 0 for no indent, else to 010 */ 8845: 8846: 8847: #define FORM 014 8848: 8849: 8850: lpopen(dev, flag) 8851: { 8852: 8853: if(lp11.flag & OPEN || LPADDR->lpsr < 0) { 8854: u.u_error = EIO; 8855: return; 8856: } 8857: lp11.flag =| (IND|EJECT|OPEN); 8858: LPADDR->lpsr =| IENABLE; 8859: lpcanon(FORM); 8860: } 8861: /* --------------------------- */ 8862: 8863: lpclose(dev, flag) 8864: { 8865: lpcanon(FORM); 8866: lp11.flag = 0; 8867: } 8868: /* --------------------------- */ 8869: 8870: lpwrite() 8871: { 8872: register int c; 8873: 8874: while ((c=cpass())>=0) 8875: lpcanon(c); 8876: } 8877: /* --------------------------- */ 8878: 8879: lpcanon(c) 8880: { 8881: register c1, c2; 8882: 8883: c1 = c; 8884: if(lp11.flag&CAP) { 8885: if(c1>='a' && c1<='z') 8886: c1 =+ 'A'-'a'; else 8887: switch(c1) { 8888: 8889: case '{': 8890: c2 = '('; 8891: goto esc; 8892: 8893: case '}': 8894: c2 = ')'; 8895: goto esc; 8896: 8897: case '`': 8898: c2 = '\''; 8899: goto esc; 8900: 8901: case '|': 8902: c2 = '!'; 8903: goto esc; 8904: 8905: case '~': 8906: c2 = '^'; 8907: 8908: esc: 8909: lpcanon(c2); 8910: lp11.ccc--; 8911: c1 = '-'; 8912: } 8913: } 8914: 8915: switch(c1) { 8916: 8917: case '\t': 8918: lp11.ccc = (lp11.ccc+8) & ~7; 8919: return; 8920: 8921: case FORM: 8922: case '\n': 8923: if((lp11.flag&EJECT) == 0 || 8924: lp11.mcc!=0 || lp11.mlc!=0) { 8925: lp11.mcc = 0; 8926: lp11.mlc++; 8927: if(lp11.mlc >= EJLINE && lp11.flag&EJECT) 8928: c1 = FORM; 8929: lpoutput(c1); 8930: if(c1 == FORM) 8931: lp11.mlc = 0; 8932: } 8933: 8934: case '\r': 8935: lp11.ccc = 0; 8936: if(lp11.flag&IND) 8937: lp11.ccc = 8; 8938: return; 8939: 8940: case 010: 8941: if(lp11.ccc > 0) 8942: lp11.ccc--; 8943: return; 8944: 8945: case ' ': 8946: lp11.ccc++; 8947: return; 8948: 8949: default: 8950: if(lp11.ccc < lp11.mcc) { 8951: lpoutput('\r'); 8952: lp11.mcc = 0; 8953: } 8954: if(lp11.ccc < MAXCOL) { 8955: while(lp11.ccc > lp11.mcc) { 8956: lpoutput(' '); 8957: lp11.mcc++; 8958: } 8959: lpoutput(c1); 8960: lp11.mcc++; 8961: } 8962: lp11.ccc++; 8963: } 8964: } 8965: /* --------------------------- */ 8966: 8967: lpstart() 8968: { 8969: register int c; 8970: 8971: while (LPADDR->lpsr&DONE && (c = getc(&lp11)) >= 0) 8972: LPADDR->lpbuf = c; 8973: } 8974: /* --------------------------- */ 8975: 8976: lpint() 8977: { 8978: register int c; 8979: 8980: lpstart(); 8981: if (lp11.cc == LPLWAT || lp11.cc == 0) 8982: wakeup(&lp11); 8983: } 8984: /* --------------------------- */ 8985: 8986: lpoutput(c) 8987: { 8988: if (lp11.cc >= LPHWAT) 8989: sleep(&lp11, LPPRI); 8990: putc(c, &lp11); 8991: spl4(); 8992: lpstart(); 8993: spl0(); 8994: } 8995: /* --------------------------- */