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 /* ------------------------ */ 8996 8997 8998 8999