/* DoSpecial for EpsonX driver. */ #include "exec/types.h" #include "devices/printer.h" #include "devices/prtbase.h" #define LMARG 3 #define RMARG 6 #define MARGLEN 8 #define CONDENSED 7 #define PITCH 9 #define QUALITY 17 #define LPI 24 #define INITLEN 26 DoSpecial(command, outputBuffer, vline, currentVMI, crlfFlag, Parms) char outputBuffer[]; UWORD *command; BYTE *vline; BYTE *currentVMI; BYTE *crlfFlag; UBYTE Parms[]; { extern struct PrinterData *PD; int x = 0, y = 0; /* 00-00 \375 wait 01-03 \033lL set left margin 04-06 \033Qq set right margin 07-07 \375 wait */ static char initMarg[MARGLEN+1] = "\375\033lL\033Qq\375"; /* 00-01 \0335 italics off 02-04 \033-\000 underline off 05-06 \033F boldface off 07-07 \022 cancel condensed mode 08-09 \033P select pica (10 cpi) 10-12 \033W\000 enlarge off 13-14 \033H doublestrike off 15-17 \033x\000 draft 18-19 \033T super/sub script off 20-22 \033p0 proportional off 23-24 \0332 6 lpi 25-25 \015 carriage return */ static char initThisPrinter[INITLEN+1] = "\0335\033-\000\033F\022\033P\033W\000\033H\033x\000\033T\033p0\0332\015"; static BYTE ISOcolorTable[10] = {0, 5, 6, 4, 3, 1, 2, 0}; if (*command == aRIN) { while (x < INITLEN) { outputBuffer[x] = initThisPrinter[x]; x++; } if (PD->pd_Preferences.PrintQuality == LETTER) { outputBuffer[QUALITY] = 1; } *currentVMI = 36; /* assume 1/6 line spacing (36/216 => 1/6) */ if (PD->pd_Preferences.PrintSpacing == EIGHT_LPI) { outputBuffer[LPI] = '0'; *currentVMI = 27; /* 27/216 => 1/8 */ } if (PD->pd_Preferences.PrintPitch == ELITE) { outputBuffer[PITCH] = 'M'; } else if (PD->pd_Preferences.PrintPitch == FINE) { outputBuffer[CONDENSED] = '\017'; /* condensed */ outputBuffer[PITCH] = 'P'; /* pica condensed */ } Parms[0] = PD->pd_Preferences.PrintLeftMargin; Parms[1] = PD->pd_Preferences.PrintRightMargin; *command = aSLRM; } if (*command == aCAM) { /* cancel margins */ y = PD->pd_Preferences.PaperSize == W_TRACTOR ? 136 : 80; if (PD->pd_Preferences.PrintPitch == PICA) { Parms[1] = (10 * y) / 10; } else if (PD->pd_Preferences.PrintPitch == ELITE) { Parms[1] = (12 * y) / 10; } else { /* fine */ Parms[1] = (17 * y) / 10; } Parms[0] = 1; y = 0; *command = aSLRM; } if (*command == aSLRM) { /* set left and right margins */ PD->pd_PWaitEnabled = 253; if (Parms[0] == 0) { initMarg[LMARG] = 0; } else { initMarg[LMARG] = Parms[0] - 1; } initMarg[RMARG] = Parms[1]; while (y < MARGLEN) { outputBuffer[x++] = initMarg[y++]; } return(x); } if (*command == aPLU) { if (*vline == 0) { *vline = 1; *command = aSUS2; return(0); } if (*vline < 0) { *vline = 0; *command = aSUS3; return(0); } return(-1); } if (*command == aPLD) { if (*vline == 0) { *vline = -1; *command = aSUS4; return(0); } if (*vline > 0) { *vline = 0; *command = aSUS1; return(0); } return(-1); } if (*command == aSUS0) { *vline = 0; } if (*command == aSUS1) { *vline = 0; } if (*command == aSUS2) { *vline = 1; } if (*command == aSUS3) { *vline = 0; } if (*command == aSUS4) { *vline = -1; } if (*command == aVERP0) { *currentVMI = 27; } if (*command == aVERP1) { *currentVMI = 36; } if (*command == aIND) { /* lf */ outputBuffer[x++] = '\033'; outputBuffer[x++] = 'J'; outputBuffer[x++] = *currentVMI; return(x); } if (*command == aRI) { /* reverse lf */ outputBuffer[x++] = '\033'; outputBuffer[x++] = 'j'; outputBuffer[x++] = *currentVMI; return(x); } if (*command == aSFC) { if (Parms[0] == 39) { Parms[0] = 30; /* set defaults */ } if (Parms[0] > 37) { return(0); /* ni or background color change */ } outputBuffer[x++] = '\033'; outputBuffer[x++] = 'r'; outputBuffer[x++] = ISOcolorTable[Parms[0] - 30]; /* Kludge to get this to work on a CBM_MPS-1250 which interprets 'ESCr' as go into reverse print mode. The 'ESCt' tells it to get out of reverse print mode. The 'NULL' is ignored by the CBM_MPS-1250 and required by all Epson printers as the terminator for the 'ESCtNULL' command which means select normal char set (which has no effect). */ outputBuffer[x++] = '\033'; outputBuffer[x++] = 't'; outputBuffer[x++] = 0; return(x); } if (*command == aRIS) { PD->pd_PWaitEnabled = 253; } return(0); }