[net.micro.amiga] Printer Escape Sequences

bobp@amiga.UUCP (Robert S. Pariseau) (11/07/85)

TITLE:  Printer Escape Sequences (LONG)

AmigaDOS provides 3 "handlers" which can be used to do I/O to a printer.
These are "par:", "ser:", and "prt:", referring to parallel, serial,
and printer respectively.  If you want to do output to the printer
using the file system routines, you will Open() one of these and
do Write() calls to it.  The CLI commands also expect you to use these
strings as file parameters.  For instance, you can send a file to
the printer handler with the command  "copy myfile to prt:".  Similarly,
you use these handler names when trying to write to the printer
from languages like ABasiC.  [For compatability, Microsoft's Amiga
Basic also defines LPT1 to be the same as prt:.]

An AmigaDOS "handler" is simply a piece of interface code that
translates the device independent file system calls like Write() into
the appropriate message traffic to the "devices" implemented in
Exec, the multi-tasking kernel of the Amiga.  The "par:" handler
uses the device "parallel.device" which is the Exec code that
manages the parallel port connector on the back of your Amiga.
The "ser:" handler uses the device "serial.device" which manages
the serial port connector.

Simply put, when you do output to par: or ser: you are talking straight
through to the hardware -- with no intervening levels of interpretation.
If you have an Okimate 20 printer connected to your parallel port,
then escape sequences sent to par: will reach it directly and will
have whatever effect they are defined to have by OkiData.

Printing to par: or ser: is pretty straightforward.  Keep in mind that
a standard AmigaDOS text file uses LF as a line separator (not CR
or CR-LF), and that a file may or may not have an LF at the end.
You may want to add a carriage-return character to the ends of
your lines (in a simple program you create), or, if your printer
offers this option, flip the switch that automatically gives you
a CR when the printer receives an LF.

[NOTE: Input from par: and ser: is somewhat more complex, since they
do "buffered" I/O -- but I digress.]

If you are writing a program, you can avoid all this handler stuff
by doing an OpenDevice() directly on the Exec device you are interested
in talking to.  You then pass I/O request blocks to the device using
the I/O calls provided by Exec (DoIO() and friends).  The advantage
of talking directly to the device is that you get a lot more
flexibility, including things like asynchronous I/O and the ability
to set device parameters such as serial baud rate.  For more
information on how you call the system library and device routines,
and just what functions are available, please look in the Amiga
ROM Kernel Manual [WHICH WILL BE IN THE STORES SHORTLY!].

Note that the Preferences tool printer settings have NO EFFECT on
the function of the par: and ser: handlers!  [Preferences IS,
however, used to set the default baud rate used by ser:.]  Any
special function you want your printer to do is UP TO YOU when
you use par: or ser:.  YOU must choose the correct escape sequences
to send to do even initialization style functions -- such as
setting the margins.  Obviously, this obliges you to KNOW what
style printer is connected to your Amiga and whether it is
connected to the serial or to the parallel port.

Which brings us to prt:.  The prt: handler uses the Exec device
"printer.device".  The printer device uses the information it
finds in the Preferences settings to understand the type of printer
you have connected and how you want it to be used.  On the
basis of the printer port setting you've made in Preferences, the
printer device talks to either the serial or the parallel device
to reach the printer.

The printer device understands ONLY ITS OWN, PRINTER INDEPENDENT,
ESCAPE SEQUENCES.  It converts these escape sequences into the
printer specific escape sequences appropriate for the printer
currently selected in Preferences.  In addition, the Initialise
funcition (which is invoked when you open the printer device or
when you send it the Initialise escape sequence) causes the
appropriate escapes to be sent to your printer to configure it
according to the options you have selected in Preferences.  This,
for instance, is how your margin settings get sent to the printer.

If you use the printer device (or prt:) you can write code which
is largely independent of the type of printer your customers have
on their Amigas.  The tables below show the escape sequences
understood by the printer device and the ones that it knows how
to translate for each supported printer type.

Note that when using the printer device (or prt:), you should
TURN-OFF any option on your printer providing for an automatic
CR , LF, or CR-LF to be generated whenever the printer receives
an LF.  The printer device will provide end of line CR-LFs as
needed.

Also note that, in addition to the alphnumeric printing described
here, the printer device provides for black and white, grey-scale,
and full color, raster-graphics printing.  This function is
only available when talking directly to the printer device (not
from prt:).

------------------------Known Bugs:

The V1.0 Serial Device (and, thus ser:) does not read reliably
at the higher baud rates.  Writes work just fine.  The serial
device uses CTRL-S / CTRL-Q (XON/XOFF) flow control ONLY for
V1.0.

The V1.0 Printer Device does not correctly interpret length=-1,
which is supposed to indicate that you've given the printer a null
terminated string.  Prt: is not affected by this, since the handler
code always feeds the printer device the correct length.

-------------------Printer Device Command Definitions:

The table below shows the escape sequences understood by V1.0
printer.device.  The command names or numbers may be used instead
when sending commands to printer.device.  Only the escape
sequences are useful when talking to prt:.  Note that not all
printers will implement all commands.  Any unimplemented commands
are treated as NO-OPs.

In the escape sequences, n, n1, and n2 are numeric parameters
which should appear in your escape sequence as a string of ASCII
digits (e.g., "123"), NOT as the equivalent binary value!


#define aRIS     0  /* ESCc  reset 			ISO */
#define aRIN     1  /* ESC#1 initialize 		+++ */
#define aIND     2  /* ESCD  lf 			ISO */               
#define aNEL     3  /* ESCE  return,lf 			ISO */         
#define aRI      4  /* ESCM  reverse lf  		ISO */      

#define aSGR0    5  /* ESC[0m normal char set 		ISO */    
#define aSGR3    6  /* ESC[3m italics on 		ISO */        
#define aSGR23   7  /* ESC[23m italics off 		ISO */
#define aSGR4    8  /* ESC[4m underline on 		ISO */
#define aSGR24   9  /* ESC[24m underline off 		ISO */
#define aSGR1   10  /* ESC[1m boldface on 		ISO */
#define aSGR22  11  /* ESC[22m boldface off 		ISO */
#define aSFC    12  /* SGR30-39  set foreground color	ISO */
#define aSBC    13  /* SGR40-49  set background color	ISO */

#define aSHORP0 14  /* ESC[0w normal pitch		DEC */
#define aSHORP2 15  /* ESC[2w elite on 			DEC */
#define aSHORP1 16  /* ESC[1w elite off 		DEC */
#define aSHORP4 17  /* ESC[4w condensed fine on 	DEC */
#define aSHORP3 18  /* ESC[3w condensed off   		DEC */
#define aSHORP6 19  /* ESC[6w enlarged on 		DEC */
#define aSHORP5 20  /* ESC[5w enlarged off 		DEC */

#define aDEN6   21  /* ESC[6"z shadow print on 		DEC (sort of) */
#define aDEN5   22  /* ESC[5"z shadow print off 	DEC */
#define aDEN4   23  /* ESC[4"z doublestrike on 		DEC */
#define aDEN3   24  /* ESC[3"z doublestrike off 	DEC */
#define aDEN2   25  /* ESC[2"z  NLQ on 			DEC */
#define aDEN1   26  /* ESC[1"z  NLQ off 		DEC */

#define aSUS2   27  /* ESC[2v superscript on 		+++ */
#define aSUS1   28  /* ESC[1v superscript off 		+++ */
#define aSUS4   29  /* ESC[4v subscript on 		+++ */
#define aSUS3   30  /* ESC[3v subscript off 		+++ */
#define aSUS0   31  /* ESC[0v normalize the line 	+++ */
#define aPLU    32  /* ESCL  partial line up 		ISO */
#define aPLD    33  /* ESCK  partial line down	 	ISO */

#define aFNT0   34  /* ESC(B US char set 		DEC */
#define aFNT1   35  /* ESC(R French char set 		DEC */
#define aFNT2   36  /* ESC(K German char set 		DEC */
#define aFNT3   37  /* ESC(A UK char set 		DEC */
#define aFNT4   38  /* ESC(E Danish I char set 		DEC*/
#define aFNT5   39  /* ESC(H Sweden char set 		DEC*/
#define aFNT6   40  /* ESC(Y Italian char set 		DEC */
#define aFNT7   41  /* ESC(Z Spanish char set 		DEC */
#define aFNT8   42  /* ESC(J Japanese char set 		+++ */
#define aFNT9   43  /* ESC(6 Norweign char set 		DEC */
#define aFNT10  44  /* ESC(C Danish II char set 	+++ */
                              
#define aPROP2  45  /* ESC[2p  proportional on 		+++ */
#define aPROP1  46  /* ESC[1p  proportional off 	+++ */
#define aPROP0  47  /* ESC[0p  proportional clear 	+++ */
#define aTSS    48  /* ESC[n E set proportional offset 	ISO */
#define aJFY5   49  /* ESC[5 F auto left justify 	ISO */
#define aJFY7   50  /* ESC[7 F auto right justify 	ISO */
#define aJFY6   51  /* ESC[6 F auto full justify 	ISO */
#define aJFY0   52  /* ESC[0 F auto justify off		ISO */
#define aJFY3   53  /* ESC[3 F letter space (justify)	ISO (special) */
#define aJFY1   54  /* ESC[1 F word fill(auto center)	ISO (special) */

#define aVERP0  55  /* ESC[0z  1/8" line spacing 	+++ */
#define aVERP1  56  /* ESC[1z  1/6" line spacing 	+++ */
#define aSLPP   57  /* ESC[nt  set form length n 	DEC */
#define aPERF   58  /* ESC[nq  perf skip n (n>0)	+++ */
#define aPERF0  59  /* ESC[0q  perf skip off  		+++ */
                        
#define aLMS    60  /* ESC#9   Left margin set 		+++ */
#define aRMS    61  /* ESC#0   Right margin set	 	+++ */
#define aTMS    62  /* ESC#8   Top margin set 		+++ */
#define aBMS    63  /* ESC#2   Bottom marg set 		+++ */
#define aSTBM   64  /* ESC[Pn1;Pn2r  T&B margins 	DEC */
#define aSLRM   65  /* ESC[Pn1;Pn2s  L&R margin 	DEC */
#define aCAM    66  /* ESC#3   Clear margins 		+++ */

#define aHTS    67  /* ESCH    Set horiz tab 		ISO */
#define aVTS    68  /* ESCJ    Set vertical tabs 	ISO */
#define aTBC0   69  /* ESC[0g  Clr horiz tab  		ISO */
#define aTBC3   70  /* ESC[3g  Clear all h tab		ISO */
#define aTBC1   71  /* ESC[1g  Clr vertical tabs 	ISO */
#define aTBC4   72  /* ESC[4g  Clr all v tabs 		ISO */
#define aTBCALL 73  /* ESC#4   Clr all h & v tabs 	+++ */
#define aTBSALL 74  /* ESC#5   Set default tabs         +++ */
#define aEXTEND 75  /* ESC[Pn"x extended commands	+++ */

----------------------Printer Functions Implemented:

The following tables tell which of the printer device escape
sequences are implemented for each of the printers supported in
the V1.0 release.  Any unimplemented escape sequence is ignored.


   NAME
   Alphacom AlphaPro101 functions implemented: 
  
      aRIS, aIND, aNEL, aRI, aSGR0, aSGR4, aSGR24, aSGR1, aSGR22,
      aSHORP0, aSHORP1, aSHORP2, aSHORP3, aSHORP4,
      aDEN3, aDEN4, aDEN5, aDEN6,
      aVERP0, aVERP1, aSLPP, aLMS, aRMS, aTMS, aBMS

      special functions implemented:

      aRIN, aSUS0, aSUS1, aSUS2, aSUS3, aSUS4,
      aSLRM, aSFC, aCAM
 

   NAME
   Brother_HL-15XL functions implemented: 
  
      aRIS, aIND, aNEL, aRI, aSGR0, aSGR4, aSGR24, aSGR1, aSGR22,
      aSHORP0, aSHORP1, aSHORP2, aSHORP3, aSHORP4,
      aDEN3, aDEN4, aDEN5, aDEN6,
      aPROP0, aPROP1, aPROP2, aTSS,
      aVERP0, aVERP1, aSLPP, aLMS, aRMS, aTMS, aBMS, aCAM,
      aHTS, aVTS, aTBC0, aTBC3, aTBC4, aTBCALL, aTBSALL

      special functions implemented:

      aRIN, aSUS0, aSUS1, aSUS2, aSUS3, aSUS4, aPLU, aPLD, aSLRM, aSFC



   NAME
   CBM MPS-1000 functions implemented: 
  
      aRIS, aIND, aNEL, aSGR0, aSGR4, aSGR24, aSGR1, aSGR22,
      aSHORP0, aSHORP1, aSHORP2, aSHORP3, aSHORP4, aSHORP5, aSHORP6,
      aDEN1, aDEN2, aDEN3, aDEN4,
      aSUS0, aSUS1, aSUS2, aSUS3, aSUS4,
      aFNT0, aFNT1, aFNT2, aFNT3, aFNT4, aFNT5, aFNT6, aFNT7, aFNT8
      aFNT9, aFNT10,
      aPROP1, aPROP2, aJFY6, aJFY0,
      aVERP0, aVERP1, aSLPP, aPERF, aPERF0,
      aTBC3, aTBC4, aTBCALL, aTBSALL

      special functions implemented:
      aRIN, aSUS0, aSUS1, aSUS2, aSUS3, aSUS4, aCAM
      aPLU, aPLD, aVERP0, aVERP1, aSLRM, aIND


   NAME
   Diablo 630 functions implemented: 
  
      aRIS, aIND, aNEL, aRI, aSGR0, aSGR4, aSGR24, aSGR1, aSGR22,
      aSHORP0, aSHORP1, aSHORP2, aSHORP3, aSHORP4,
      aDEN3, aDEN4, aDEN5, aDEN6, aPLU, aPLD
      aPROP0, aPROP1, aPROP2, aTSS, aJFY5, aJFY0, aJFY1,
      aVERP0, aVERP1, aSLPP, aLMS, aRMS, aTMS, aBMS, aCAM,
      aHTS, aVTS, aTBC0, aTBC3, aTBC1, aTBCALL, aTBSALL

      special functions implemented:
      aRIN, aSUS0, aSUS1, aSUS2, aSUS3, aSUS4,aSLRM, aSFC


   NAME
   Diablo Advantage D25 functions implemented: 
  
      aRIS, aIND, aNEL, aRI, aSGR0, aSGR4, aSGR24, aSGR1, aSGR22,
      aSHORP0, aSHORP1, aSHORP2, aSHORP3, aSHORP4,
      aDEN3, aDEN4, aDEN5, aDEN6, aPLU, aPLD
      aPROP0, aPROP1, aPROP2, aTSS, aJFY5, aJFY0
      aVERP0, aVERP1, aSLPP, aLMS, aRMS, aTMS, aBMS, aCAM,
      aHTS, aVTS, aTBC0, aTBC3, aTBC1, aTBCALL, aTBSALL

      special functions implemented:

      aRIN, aSUS0, aSUS1, aSUS2, aSUS3, aSUS4 ,aPLU, aPLD, aSLRM, aSFC


   NAME
   Diablo C-150 functions implemented: 
  
      aRIS, aIND, aNEL,
      aSLPP, aLMS, aRMS,
      aHTS, aTBC0, aTBC3, aTBCALL, aTBSALL

      special functions implemented:
      aRIN aSLRM aSFC


   NAME
   Epson X-80 functions implemented: 
  
      aRIS, aIND, aNEL, aSGR0, aSGR3, aSGR23, aSGR4, aSGR24, aSGR1, aSGR22,
      aSHORP0, aSHORP1, aSHORP2, aSHORP3, aSHORP4, aSHORP5, aSHORP6,
      aDEN1, aDEN2, aDEN3, aDEN4,
      aSUS0, aSUS1, aSUS2, aSUS3, aSUS4,
      aFNT0, aFNT1, aFNT2, aFNT3, aFNT4, aFNT5, aFNT6, aFNT7, aFNT8
      aFNT9, aFNT10,
      aPROP1, aPROP2, aJFY5, aJFY7, aJFY6, aJFY0, aJFY3, aJFY2,
      aVERP0, aVERP1, aSLPP, aPERF, aPERF0,
      aTBC3, aTBC4, aTBCALL, aTBSALL

      special functions implemented:
      aRIN, aSUS0, aSUS1, aSUS2, aSUS3, aSUS4,
      aPLU, aPLD, aVERP0, aVERP1, aSLRM, aIND, aCAM


   NAME
   Epson JX-80 functions implemented: 
  
      aRIS, aIND, aNEL, aSGR0, aSGR3, aSGR23, aSGR4, aSGR24, aSGR1, aSGR22,
      aSHORP0, aSHORP1, aSHORP2, aSHORP3, aSHORP4, aSHORP5, aSHORP6,
      aDEN1, aDEN2, aDEN3, aDEN4,
      aSUS0, aSUS1, aSUS2, aSUS3, aSUS4,
      aFNT0, aFNT1, aFNT2, aFNT3, aFNT4, aFNT5, aFNT6, aFNT7, aFNT8
      aFNT9, aFNT10,
      aPROP1, aPROP2, aJFY5, aJFY7, aJFY6, aJFY0, aJFY3, aJFY2,
      aVERP0, aVERP1, aSLPP, aPERF, aPERF0,
      aTBC3, aTBC4, aTBCALL, aTBSALL

      special functions implemented:
      aRIN, aRI, aSUS0, aSUS1, aSUS2, aSUS3, aSUS4, aCAM
      aPLU, aPLD, aVERP0, aVERP1, aSLRM, aIND, aSFC


   NAME
   Okimate 20 functions implemented: 
  
      aRIS, aIND, aNEL, aSGR0, aSGR3, aSGR23, aSGR4, aSGR24
      aSHORP0, aSHORP1, aSHORP2, aSHORP3, aSHORP4, aSHORP5, aSHORP6 
      aDEN1, aDEN2, aSUS0, aSUS1, aSUS2, aSUS3, aSUS4,
      aVERP0, aVERP1, aSLPP, aPERF, aPERF0

      special functions implemented:
      aRIN, aSUS0, aSUS1, aSUS2, aSUS3, aSUS4, aPLU, aPLD


   NAME
   Qume LetterPro 20 functions implemented: 
  
      aRIS, aIND, aNEL, aRI, aSGR0, aSGR4, aSGR24, aSGR1, aSGR22,
      aSHORP0, aSHORP1, aSHORP2, aSHORP3, aSHORP4,
      aDEN3, aDEN4, aDEN5, aDEN6, aPLU, aPLD
      aPROP0, aPROP1, aPROP2, aTSS,
      aVERP0, aVERP1, aSLPP, aLMS, aRMS, aCAM

      special functions implemented:
      aRIN, aSUS0, aSUS1, aSUS2, aSUS3, aSUS4
      aPLU, aPLD, aSLRM, aSLPP, aSFC

-------------------That's all for now!