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!