/* epson JX80 special commands */
 
/****** printer.device/printers/Epson_JX-80_special_functions ***********
 *
 *   NAME
 *   Epson JX-80 special functions
 * 
 ************************************************************************/

#include   <exec/types.h>
#include   <devices/printer.h>
#include   <devices/prtbase.h>

extern struct PrinterData *PD;

DoSpecial(command,outputBuffer,vline,currentVMI,crlfFlag,Parms)
   char outputBuffer[];
   UWORD *command;
   BYTE *vline;
   BYTE *currentVMI;
   BYTE *crlfFlag;
   UBYTE Parms[];

{
    int x=0;
    int y=0;
   static char initMarg[]="\375\033lL\033Qq\375";
static char 
    initThisPrinter[]="\033x\001\0332\022\033P\0335\033-\376\033F\n\033W";

   static BYTE ISOcolorTable[10]= {0,5,6,4,3,1,2,4};

if(*command==aRIN) {
    while(x<18){outputBuffer[x]=initThisPrinter[x];x++;}
    outputBuffer[12]='\000';
    outputBuffer[x++]='\000';

   if((PD->pd_Preferences.PrintQuality)==DRAFT)outputBuffer[2]='\000';

   *currentVMI=36; /* assume 1/6 line spacing */
   if((PD->pd_Preferences.PrintSpacing)==EIGHT_LPI) { /* wrong again */
   outputBuffer[4]='0';
   *currentVMI=27;
   }
   if((PD->pd_Preferences.PrintPitch)!=PICA)outputBuffer[x++]='\033';
   if((PD->pd_Preferences.PrintPitch)==ELITE)outputBuffer[x++]='M';
      else if((PD->pd_Preferences.PrintPitch)==FINE)
       outputBuffer[x++]='\017';

    Parms[0]=(PD->pd_Preferences.PrintLeftMargin);
    Parms[1]=(PD->pd_Preferences.PrintRightMargin);
    *command=aSLRM;
}

if(*command==aSLRM) {
   PD->pd_PWaitEnabled=253;
   if(Parms[0]==0)initMarg[3]=0;
        else initMarg[3]=Parms[0]-1;
        initMarg[6]=Parms[1];
        while(y<8)outputBuffer[x++]=initMarg[y++];
        return(x);
}

if(*command==aCAM) {
   PD->pd_PWaitEnabled=253;
        initMarg[3]=0;
   if(PD->pd_Preferences.PrintPitch == FINE)initMarg[6]=96;
   else if(PD->pd_Preferences.PrintPitch == ELITE)initMarg[6]=137;
   else initMarg[6]=80; 
        while(y<8)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) {
   outputBuffer[x++]='\033';
   outputBuffer[x++]='J';
   outputBuffer[x++]= *currentVMI;
   return(x);
}

if(*command==aRI) {
   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];

   return(x);
   }

if(*command==aRIS) PD->pd_PWaitEnabled=253;

return(0);
}
