terminfo and PFXplus

General information | Wyse50 | Wyse60 | HP-2392A | VT200 series | 16-bit character maps

Gary Schmidt - UNIX Guru - Powerflex Corporation

A version of this article was originally published in installments in POWERlines Volumes 5 and 6. It is designed to be read in conjunction with the UNIX terminfo manual and the associated descriptive material.

It is not intended as a replacement for understanding terminfo, but only as supplementary information to explain the requirements of PFXplus in relation to terminfo.

The CURSES and PFX_CURSES video drivers are equivalent in these articles: where I use CURSES, the same applies to the PFX_CURSES driver unless noted otherwise.

There are six sections to this article:

General Information

Help with configuration of terminals is here

I define 24 function keys (kf1 to kf24), which represent the standard AT-keyboard keys (F1 to F12) and (Shift-F1 to Shift-F12). There are another 12 functions keys available (Ctrl-F1 to Ctrl-F12), which could be mapped to kf25...kf36. (The Alt-Fkeys are not available on the SCO console.)

You should be aware that most of the Unix documentation uses octal (base 8) numbers. You may have to translate some values into decimal to add them to your PFX.INI file. I find the bc program to be very useful for this: just set ibase=8, and type in each number you want to convert.

The various kxxxx entries — kcub1, kcud1, kcuf1, kcuu1, kend, khome, knp, and kpp — are used to set up the various cursor movement keys, the arrow keys, end, home, next/page-down and previous/page-up keys. The kich1 entry is used to switch mode in ENTRY statements. Although kcbt (key cursor back tab) is defined, it is not used, as it has the same value as kf14, used by Shift-F2. The kbs value is set for completeness, but not used by PFXplus (but be aware that other applications may require it).

The cnorm, civis and cvvis values are used to set the display state of the cursor. As CURSES only supports 3 states, I define the normal state to be an underline cursor, and the very-visible state to be a block cursor, allowing the use of the CURSOR statement in PFXplus to function — with states 3 and 4 being equivalent — as a full-height block cursor.

The ACSC string is used to map high ASCII characters (128-255) to a near equivalent when iCharMap is set to 2, enabling 7-bit terminal lines to display screens close to those of an 8-bit DOS display.

Unix function keys explained

The colors# and pairs# entries are used to set up for colour display, and the setb and setf entries are used to turn on the colours. The op entry is used to set the initial or standard state, what colour the display should be on entry and exit. The use of colour in terminfo is somewhat arcane, and the section in the terminfo reference should be studied with care, to understand exactly what is occurring when preparing a terminfo description for a new terminal. The remaining entries are to do with defining the display, positioning the cursor, and setting the display attributes, the strange-looking strings like that of cup, \E[%i%p1%d;%p2%dH, are well explained in the terminfo documentation.

Example 1 - terminfo description of pfxansi terminal

pfxansi|pfx_ansi|pfx ansi terminal,
   mir, am, bce, eo, xon, colors#8, cols#80, it#8, lines#25, pairs#64,
   cnorm=\E[=11;13C, civis=\E[=12;11C, cvvis=\E[=1;13C,
   acsc=+/\,.0[a2fxgqh0k?lZm@jYnEwBvAu4tCqDx3, bel=^G, blink=\E[5m,
   bold=\E[1m, cbt=\E[Z, clear=\E[2J\E[H, cr=\r, cub1=\b, cud1=\E[B,
   cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P, dl1=\E[M,
   ed=\E[J, el=\E[K, home=\E[H, ht=\t, ich1=\E[@, il1=\E[L, ind=\E[S,
   invis=\E[8m, kbs=\b, kcbt=\E[Z, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
   kcuu1=\E[A, kend=\E[F,
   kf1=\E[M, kf10=\E[V, kf11=\E[W, kf12=\E[X,
   kf13=\E[Y, kf14=\E[Z, kf15=\E[a, kf16=\E[b, kf17=\E[c, kf18=\E[d,
   kf19=\E[e, kf2=\E[N, kf20=\E[f, kf21=\E[g, kf22=\E[h, kf23=\E[i,
   kf24=\E[j, kf3=\E[O, kf4=\E[P, kf5=\E[Q, kf6=\E[R, kf7=\E[S,
   kf8=\E[T, kf9=\E[U,
   khome=\E[H, kich1=\E[L, knp=\E[G, kpp=\E[I,
   op=\E[37;40m, rev=\E[7m, ri=\E[T, rmacs=\E[10m, rmso=\E[m, rmul=\E[m,
   setb=\E[4%p1%dm, setf=\E[3%p1%dm, smacs=\E[12m, smso=\E[7m, smul=\E[4m,
   sgr0=\E[10;m, rmir=\E[4l, smir=\E[4h,

Example 2: tKeyMap Segment

This is the terminfo description I currently use for the SCO UNIX ANSI console, a colour display with 80 columns and 25 rows, with various SCO extensions to the ANSI standard terminal definition:

tkeyMap= @1  13 1 281 1  27 7 260 0 261 0   1 5 268 5 280 5 273 1 283 1
tkeyMap=@11 266 1 271 1 269 5 339 5 338 5 259 1 258 1 265 5 272 1 331 0
tkeyMap=@21 127 0   8 0   9 1
tkeyMap=@30 274 1 282 1
tkeyMap=@32 270 7 267 7
tkeyMap=@38 262 0 360 0  22 0  21 0   5 0   2 0   6 0  20 0

This is the tKeyMap segment of the PFX.INI file used when running PFXplus on the ANSI console using the CURSES mode video driver. The CURSES key map maps terminfo key values to TERMCHAR entries.

Color map for CURSES, PFX_CURSES — and ANSI display mode drivers to emulate video mode colors — for PFXplus for UNIX

Would you like your color displays under Unix to be the same as the SCO console in VIDEO mode? If you are running color ANSI terminals, or you prefer to use CURSES for your console display, and want the same colors as in VIDEO mode, simply replace your current color map with the one printed below! (Just remember, it won't do a thing for your mono terminals).

; This colormap sets up the colors for the ANSI, 
; CURSES and PFX_CURSES drivers to be equivalent to 
; the colors displayed by the VIDEO mode driver. They 
; are only equivalent for ANSI displays under CURSES 
; and PFX_CURSES, non-ANSI displays may differ.


tColorMap=  @4   1   @6   3   @9  12 
tColorMap= @11  14  @12   9  @14  11 
tColorMap= @16  64  @17  68  @18  66  @19  70
tColorMap= @20  65  @21  69  @22  67  @23  71  @24  72 
tColorMap= @25  76  @26  74  @27  78  @28  73  @29  77 
tColorMap= @30  75  @31  79  @33  36
tColorMap= @35  38  @36  33  @38  35 
tColorMap= @41  44  @43  46  @44  41 
tColorMap= @46  43  @48  96  @49 100
tColorMap= @50  98  @51 102  @52  97  @53 101  @54  99 
tColorMap= @55 103  @56 104  @57 108  @58 106  @59 110 
tColorMap= @60 105  @61 109  @62 107  @63 111  @64  16 
tColorMap= @65  20  @66  18  @67  22  @68  17  @69  21 
tColorMap= @70  19  @71  23  @72  24  @73  28  @74  26 
tColorMap= @75  30  @76  25  @77  29  @78  27  @79  31 
tColorMap= @81  84  @83  86  @84  81
tColorMap= @86  83  @89  92
tColorMap= @91  94  @92  89  @94 91
tColorMap= @96  48  @97  52  @98  50  @99  54 
tColorMap=@100  49 @101  53 @102  51 @103  55 @104  56 
tColorMap=@105  60 @106  58 @107  62 @108  57 @109  61 
tColorMap=@110  59 @111  63 @113 116
tColorMap=@115 118 @116 113 @118 115 
tColorMap=@121 124 @123 126 @124 121 
tColorMap=@126 123

The Wyse50 Terminal

Terminals are not boring

The terminfo description that I currently use for Wyse50 terminal with a 24 line display is shown in Example 1.

I cannot recommend Wyse50 terminals for use in a PFXplus or UNIX environment for the following reasons:

  1. The left arrow key sends Control-H, BACKSPACE
  2. The down arrow key sends Control-J, LINEFEED

The use of Control-H and Control-J for the arrow keys make it very difficult to navigate around the screen.

Most sites set up their terminfo descriptions to reprogram the arrow keys to send the ANSI escape sequences. See Example 2 for an example of the code required.

But this requires the user to log in again after a terminal power failure, or to turn off the terminal to clear any problems, which can be a nuisance.

As there are many Wyse50 terminals out there as a legacy of decisions along the lines of "it's cheap, so it must be going to save us money", I have included the Wyse50 in this series for those of you who have inherited these terminals. Please note that your mileage may vary: not all Wyse50 terminals were created alike, and what works with my Wyse50 may not work with yours. This is another reason why I cannot recommend them.

The Wyse series of terminals have an addressable status line, which may be turned on or off, and a settable clock. Unfortunately, there is no way to set the clock programmatically; it has to be done by hand, and the time is lost when the terminal is switched off! (Some clones of the Wyse50 do have batteries to keep the clock going, or extensions to program it from the computer.) All in all, not very useful.

terminfo is a stack-based language

An explanation of some of the entries in the Wyse50 terminfo description:

dch1 This is set to \EW$<1>, and is of interest because it shows the use of padding after a display function has been used, the $<1> meaning "Put a one-millisecond delay after doing this".
ed - \Ey$<20> Delay for 20 milliseconds.
.ich1 This shows how the initial '.' character disables a function, while keeping it within a terminal description. Useful for testing changes without having to rewrite everything.
ip - $<1> The amount of padding after inserting a character.
PFX How to program the function keys to send customised strings.
tsl How to get to the status line.
fsl How to return to the main display after entering the status line.
wsl Width of the status line.
xon The terminal uses xon/xoff handshaking. This setting, and the related set up of the terminal and configuration of the line from the UNIX end is critical. Low end terminals like the Wyse50 and its close relatives can suffer very badly from data overrun, and incorrectly set up handshaking will make this problem worse.

Example 1: terminfo description of Wyse50 terminal for PFXplus

wy50-pfx|wyse50-pfx|a fixed wyse50 description,
   acsc=0wa_h[jukslrmqnxqzttuyv]wpxv, am, bel=^G, blink=\EG2, bw,
   cbt=\EI, civis=\E`0, clear=\E*$<20>, cnorm=\E`1, cols#80,
   cr=^M, cub1=^H, cud1=^J, cuf1=^L, cup=\E=%p1%' '%+%c%p2%' '%+%c,
   cuu1=^K, dch1=\EW$<1>, dim=\EGp, dl1=\ER, dsl=\EF^M,
   ed=\Ey$<20>, el=\Et, fsl=^M,
   hs, ht=^I, hts=\E1,
   .ich1=\EQ,
   il1=\EE, ind=^J, invis=\EG1, ip=$<1>, 
   kbs=^H, kcbt=\EI, kcub1=^H, kcud1=^J, kcuf1=^L, kcuu1=^K,
   kdch1=\EW, kdl1=\ER, ked=\EY, kel=\ET, kent=\E7,
   kf1=^A@^M, kf2=^AA^M, kf3=^AB^M, kf4=^AC^M, kf5=^AD^M, kf6=^AE^M,
   kf7=^AF^M, kf8=^AG^M, kf9=^AH^M, kf10=^AI^M, kf11=^AJ^M, kf12=^AK^M,
   kf13=^A`^M, kf14=^Aa^M, kf15=^Ab^M, kf16=^Ac^M, kf17=^Ad^M, kf18=^Ae^M,
   kf19=^Af^M, kf20=^Ag^M, kf21=^Ah^M, kf22=^Ai^M, kf23=^AL^M, kf24=^AM^M,
   kHOM=\E{, khome=^^, kich1=\EQ,
   kil1=\EE, knp=\EK, kpp=\EJ, kprt=\EP, krpl=\Er,
   lh#1, lines#24, lw#8,
   mc0=\EP, mc4=^T, mc5=^R, mir,
   nel=^M^J, nlab#8,
   pfx=\Ez%p1%'?'%+%c%p2%s\177, pln=\Ez%p1%'/'%+%c%p2%s^M, prot=\EG0\E),
   rev=\EG4, ri=\Ej, rmacs=\EG0\EH^C, rmir=\Er, rmln=\EA11, rmso=\EG0,
   rmul=\EG0,
   sgr=\EG%'0'%?%p1%p3%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p2%t%{8}%|%;
      %?%p7%t%{1}%|%;%c%?%p5%p6%|%p8%|%t\E)%e\E(%;%?%p9%t\EH^B%e\EH^C%;,
   sgr0=\EG0\E(\EH^C, smacs=\EG0\EH^B, smir=\Eq, smln=\EA10, smso=\EG4,
   smul=\EG8, tbc=\E0, tsl=\EF, wsl#45, xon,

This is the terminfo description I currently use for a Wyse50 terminal with a 24-line display.

Example 2: Configure Wyse50 to send ANSI arrow key sequences

is2=\Ez"\E[A\177\Ez.\E[B\177\Ez0\E[C\177\Ez/\E[D\177,
kcub1=\E\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,

Example 3: tKeyMap segment

; CURSES key map - maps terminfo key values to TERMCHAR entries
tkeyMap= @1  13 1 281 1  27 7 260 0 261 0   1 5 268 5 280 5 273 1 283 1
tkeyMap=@11 266 1 271 1 269 5 339 5 338 5 259 1 258 1 265 5 272 1 331 0
tkeyMap=@21 330 0   8 0   9 1
tkeyMap=@30 274 1 282 1
tkeyMap=@32 270 7 267 7
tkeyMap=@38 262 0 360 0  22 0  21 0   5 0   2 0   6 0  20 0

This is the tKeyMap segment of the PFX.INI file used when running PFXplus on Wyse50 terminal using the CURSES mode video driver.

The Wyse60 Terminal

Wyse60 is better than Wyse50

These are the terminfo descriptions I currently use for Wyse60 terminals, with 25/43 line and 80/132 column displays.

I cannot recommend Wyse60 terminals for use in a PFXplus or Unix environment for the following reasons:

  1. By default, the left arrow key sends Control-H, backspace
  2. By default, the down arrow key sends Control-J, linefeed

The use of Control-H and Control-J for the arrow keys make it very difficult to navigate around the screen.

Most sites set up their terminfo descriptions to reprogram the arrow keys to send the ANSI escape sequences as shown in Listing 3. But this requires that the user log in again after a terminal power failure, or turn off the terminal to clear any problems, which can be a nuisance.

As there are many Wyse60 terminals out there as a legacy of decisions along the lines of "it's cheap, so it must be going to save us money", I have included the Wyse60 in this series for those of you who have inherited these terminals. Please note that your mileage may vary: not all Wyse60 terminals were created alike, and what works with my Wyse60 may not work with yours. This is another reason why I cannot recommend them.

But please note that the Wyse60 is a much better terminal than the Wyse50.

Use SET_TERMTYPE command to change screen sizes

The Wyse series of terminals have an addressable status line, that may be turned on or off, and a settable clock. Unlike the Wyse50, the clock in the Wyse60 is programmatically settable, although the time is still lost when the terminal is switched off. If you want to set the clock in your Wyse60, add the following line to your .profile/.login file:

/bin/echo "\033c8`date +%H%M`"

A useful feature of the Wyse60 is the ability to switch it between 24, 25, 42 and 43 line, and 80 and 132 column displays. This allows the SET_TERMTYPE command to be used to display reports and the like in a wider or longer screen, then returning to the usual 80 by 25 screen for data entry or inquiry.

Set your display clock on login

The Wyse60 is also designed to be controlled programmatically to a greater degree than many terminals, so I will explain many of the entries in the terminfo descriptions. I have edited the entries I will discuss to avoid unnecessary repetition, and am only going to touch on those areas I feel are important.

Listing 1 gives the terminfo description for a Wyse60 terminal for running 80 columns 25 lines. The explanations are in Listing 2.

Listing 4 is the same terminal, but displaying 132 columns instead of 80. The explanations are in Listing 5.

Listing 6 is the same terminal, but displaying 43 lines instead of 25. The explanations are in Listing 7.

Listing 8 is the same terminal, but displaying 132 columns instead of 80, and 43 lines instead of 25. The explanations are in Listing 9.

If you wish to use the SET_TERMTYPE command to change display size dynamically when running PFXplus using the CURSES or PFX_CURSES display drivers, you must ensure that the sequences the terminal uses to change or set the display dimensions are in the smcup field of the terminfo description.

Listing 10 shows the tKeyMap segment of the PFX.INI file used when running PFXplus on Wyse60 terminal using the CURSES mode video driver.

Listing 1: 80 Columns 25 Lines - terminfo

pfxwy60|wy60pfx|a fixed wyse60 80 columns 25 lines description,
   am, bw, hs, km, mir, ul, xon,
   cols#80, lh#1, lines#25, lw#8, nlab#8, wsl#80,
   acsc=07a?h;j5k3l2m1n8q:t4u9v=w0x6, bel=^G, blink=\EG2,
   cbt=\EI, civis=\E`0, clear=\E*$<100>, cnorm=\E`1,
   cr=\r, cub1=\b, cud1=\n, cuf1=\f,
   cup=\Ea%i%p1%dR%p2%dC, cuu1=^K, dch1=\EW$<11>,
   dim=\EGp, dl1=\ER$<5>, dsl=\Ez(\r, ed=\EY$<100>,
   el=\ET, fsl=\r, home=^^$<2>, ht=\t$<5>, hts=\E1,
   if=/usr/lib/tabset/std, il1=\EE$<4>, ind=\n,
   invis=\EG1, ip=$<3>,
   is2=\Ed$\EcD\E'\Er\EH^C\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\EZ1+
       \E[A^?\EZ1\,\E[B^?\EZ1-\E[D^?\EZ1.\E[C^?\EZ1\\\E[F^?
       \EZ1q\E[L^?\Ec72,
   kHOM=\E{, kbs=\b, kcbt=\EI, kcub1=\E[D, kcud1=\E[B,
   kcuf1=\E[C, kcuu1=\E[A, kdch1=\EW, kdl1=\ER, ked=\EY,
   kend=\E[F, kent=\E7, kf1=^A@\r, kf10=^AI\r,
   kf11=^AJ\r, kf12=^AK\r, kf13=^A`\r, kf14=^Aa\r,
   kf15=^Ab\r, kf16=^Ac\r, kf17=^Ad\r, kf18=^Ae\r,
   kf19=^Af\r, kf2=^AA\r, kf20=^Ag\r, kf21=^Ah\r,
   kf22=^Ai\r, kf23=^Aj\r, kf24=^Ak\r, kf3=^AB\r,
   kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r,
   kf9=^AH\r, khome=^^, kich1=\E[L, kil1=\EE, knp=\EK,
   kpp=\EJ, kprt=\EP, krpl=\Er, mc0=\EP, mc4=^T, mc5=^R,
   nel=\r\n$<3>, pfloc=\EZ2%p1%'?'%+%c%p2%s^?,
   pfx=\EZ1%p1%'?'%+%c%p2%s^?, pln=\Ez%p1%'/'%+%c%p2%s\r,
   prot=\E), rev=\EG4, ri=\Ej$<7>, rmacs=\EH^C,
   rmam=\Ed., rmir=\Er, rmln=\EA11, rmso=\EG0, rmul=\EG0,
   rmxon=\Ec20, rs1=\E~!\E~4$<150>,
   rs3=\EwG\E`:\Ee)$<150>,
   sgr=\EG%'0'%?%p1%p3%|%t%{4}%|%;%?%p4%t%{2}%|%;
       %?%p2%t%{8}%|%;%?%p7%t%{1}%|%;
       %c%?%p5%p6%|%p8%|%t\E)%e\E(%;%?%p9%t\EH^B%e\EH^C%;,
   sgr0=\E(\EH^C\EG0\EcD, smacs=\EH^B, smam=\Ed/,
   smcup=\EZ1+\E[A^?\EZ1\,\E[B^?\EZ1-E[D^?\EZ1.\E[C^?
         \EZ1\\\E[F^?\EZ1q\E[L^?\E`:\Ee),
   smir=\Eq, smln=\EA10, smso=\EG4, smul=\EG8,
   smxon=\Ec21, tbc=\E0, tsl=\Ez(, uc=\EG8%p1%c\EG0,

Listing 2 - 80 Columns 25 Lines - Explanation

is2=... This string is sent as part of the login process, it sets the terminal into a known mode, with predictable behaviour
\Ed$ Bidirectional mode off - controls behaviour of an attached printer
\EcD Select primary character set - use the standard character set for display
\E' Protect mode off - allow access to all character cells on the screen and in memory
\Er Insert mode off, replace mode on - characters typed will erase those beneath them
\EH^C Graphics mode off - want characters, not graphics
\Ed/ End-of-line wrap on - wrap to next line when last column filled
\EO Autoscrolling mode on - scroll upwards when last line filled
\Ee1 Character attribute mode on - attributes affect characters, not entire lines
\Ed* Autopage mode off - set line/character mode
\E`@ Set jump scroll - scroll the screen quickly
\E`9 Screen display on - ensure that the display is visible
\E`1 Cursor on - ensure the cursor is visible
\EZ1+\E[A^? Program Up Arrow key - to send the ANSI escape sequence
\EZ1\,\E[B^? Program Down Arrow key - to send the ANSI escape sequence
\EZ1-\E[D^? Program Left Arrow key - to send the ANSI escape sequence
\EZ1.\E[C^? Program Right Arrow key - to send the ANSI escape sequence
\EZ1\\\E[F^? Program End key - to send an escape sequence rather than the default
\EZ1q\E[L^? Program Ins Char key - to send an escape sequence rather than the default
\Ec72 Set maximum function key speed none - send fkey sequences as fast as possible
rs1=... This string is sent when resetting the display for any reason
\E~! Enhance mode on - ensure all features are available
\E~4$<150> Select WY-60 personality, pad for 150ms - want to be a Wyse60
rs3=... This string is sent when resetting the display for any reason
\EwG Divide memory into pages, 1*lines, equal to number of data lines
\E`: Select 80-column display - want 80 by
\Ee)$<150> Display 25 data lines, pad for 150ms - 25 display
smcup=... Sent when a program that will address the cursor is started, for example PFXplus
\EZ1+\E[A^? Program Up Arrow key - repeat initialisation to be very sure
\EZ1\,\E[B^? Program Down Arrow key - repeat initialisation to be very sure
\EZ1-\E[D^? Program Left Arrow key - repeat initialisation to be very sure
\EZ1.\E[C^? Program Right Arrow key - repeat initialisation to be very sure
\EZ1\\\E[F^? Program End key - repeat initialisation to be very sure
\EZ1q\E[L^? Program Ins Char key - repeat initialisation to be very sure
\E`: Select 80-column display - want 80 by
\Ee) 25 data lines - 25 display

Listing 3: terminfo descriptions to reprogram the arrow keys

is2=\Ez"\E[A\177\Ez.\E[B\177\Ez0\E[C\177\Ez/\E[D\177,
kcub1=\E\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,

Listing 4: 132 columns 25 lines - terminfo

pfxwy60-w|wy60pfx-w|wyse60 132 columns 25 lines description,
   is2=\Ed$\EcD\E'\Er\EH^C\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1
       \EZ1+\E[A\177\EZ1\,\E[B\177\EZ1-\E[D\177\EZ1.
       \E[C\177\EZ1\\\E[F\177\EZ1q\E[L\177\Ec72,
   smcup=\EZ1+\E[A\177\EZ1\,\E[B\177\EZ1-E[D\177\EZ1.
         \E[C\177\EZ1\\\E[F\177\EZ1q\E[L\177\E`;\Ee),
   rs3=\EwG\E`;\Ee)$<150>,
   cols#132, lines#25, use=pfxwy60,

Listing 5: 132 columns 25 lines - explanation

smcup=... Sent when a program that will address the cursor is started, for example PFXplus.
\E`; Select 132-column display - want 132 by
\Ee) 25 data lines - 25 display
rs3=... This string is sent when resetting the display for any reason
\E`; Select 132-column display - want 132 by
\Ee)$<150> 25 data lines - 25 display
cols#132 Inform curses that we have 132 columns
lines#25 Inform curses that we have 25 lines
use=pfxwy60 Use the values set in the 80 by 25 Wyse60 description, to avoid typing

Listing 6: 80 columns 43 lines - terminfo

pfxwy60-l|wy60pfx-l|wyse60 80 columns 43 lines description,
   is2=\Ed$\EcD\E'\Er\EH^C\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1
       \EZ1+\E[A\177\EZ1\,\E[B\177\EZ1-\E[D\177\EZ1.
       \E[C\177\EZ1\\\E[F\177\EZ1q\E[L\177\Ec72,
   smcup=\EZ1+\E[A\177\EZ1\,\E[B\177\EZ1-\E[D\177\EZ1.
         \E[C\177\EZ1\\\E[F\177\EZ1q\E[L\177\E`:\Ee+,
   rs3=\EwG\E`:\Ee+$<150>,
   cols#80, lines#43, use=pfxwy60,

Listing 7: 80 columns 43 lines - Explanation

smcup=... Sent when a program that will address the cursor is started, for example PFXplus.
\E`: Select 80-column display - want 80 by
\Ee+ 43 data lines - 43 display
rs3=... This string is sent when resetting the display for any reason
\E`: Select 80-column display - want 80 by
\Ee+$<150> 43 data lines - 43 display
cols#80 Inform curses that we have 80 columns
lines#43 Inform curses that we have 43 lines
use=pfxwy60 Use the values set in the 80 by 25 Wyse60 description, to avoid typing

Listing 8: 132 columns 43 lines - terminfo

pfxwy60-wl|wy60pfx-wl|pfxwy60-lw|wy60pfx-lw|wyse60 132 columns 43 lines,
   is2=\Ed$\EcD\E'\Er\EH^C\Ed/\EO\Ee1\Ed*\E`@\E`9
       \E`1\EZ1+\E[A\177\EZ1\,\E[B\177\EZ1-\E[D\177
       \EZ1.\E[C\177\EZ1\\\E[F\177\EZ1q\E[L\177\Ec72,
   smcup=\EZ1+\E[A\177\EZ1\,\E[B\177\EZ1-\E[D\177\EZ1.
         \E[C\177\EZ1\\\E[F\177\EZ1q\E[L\177\E`;\Ee+,
   rs3=\EwG\E`;\Ee+$<150>,
   cols#132, lines#43, use=pfxwy60,

Listing 9: 132 columns 43 lines - explanation

smcup=... Sent when a program that will address the cursor is started, for example PFXplus
\E`; Select 132-column display - want 132 by
\Ee+ 43 data lines - 43 display
rs3=... This string is sent when resetting the display for any reason
\E`; Select 132-column display - want 132 by
\Ee+$<150> 43 data lines - 43 display
cols#132 Inform curses that we have 132 columns
lines#43 Inform curses that we have 43 lines
use=pfxwy60 Use the values set in the 80 by 25 Wyse60 description, to avoid typing

Listing 10: tKeyMap Segment

; CURSES key map - maps terminfo key values to TERMCHAR entries
tkeyMap= @1  13 1 281 1  27 7 260 0 261 0   1 5 268 5 280 5 273 1 283 1
tkeyMap=@11 266 1 271 1 269 5 339 5 338 5 259 1 258 1 265 5 272 1 331 0
tkeyMap=@21 330 0   8 0   9 1
tkeyMap=@30 274 1 282 1
tkeyMap=@32 270 7 267 7
tkeyMap=@38 262 0 360 0  22 0  21 0   5 0   2 0   6 0  20 0

The HP-2392A Terminal

An effectively "bulletproof" terminal

In this article I will discuss the Hewlett-Packard HP-2392A terminal, which has been one of my favourite terminals for many years. You may ask why, given the caning I have given to previous terminals discussed in this series. The 2392 was one of the first terminals I used that did not suffer from the dreaded "Green Slime Disease" that was common at the time.

This was due to the use of a half-dot-shift technique in the display font, and until the arrival of VGA displays it was the only (affordable) screen I could sit and look at all day without suffering from severe eye-strain.

The HP-2392A is also effectively bullet-proof, and, if you can find one, it is usually very cheap. I recently picked up two in fairly good condition, for $40 each, and the keyboards with them are still better than 99% of PC keyboards, even though they were built in 1984. In fact, the terminals came from a previous employer of mine, via a convoluted path, so I know what sort of life they had, and one of these two sat on my desk for about six months in 1988.

Less eyestrain for me

The HP-2392A does have some limitations. There are only 8 functions keys, which cannot be shifted, the 4 standard arrow keys, and the following keys:

There are other keys on the keyboard, but these are for control of the terminal itself: the Reset/Break, Stop, Menu, User/System, Print/Enter Extend char, and Select keys. There are also 4 blank keys above the numeric keypad, I have no idea what use they are!

The configuration of a PFXplus application to run on an HP-2392A terminal may require the use of control keys to get the required keyboard functionality.

A minor drawback with the HP-2392A is they way in which display attributes are handled. They are active from where they are turned on until they are turned off, or the end of the line. Overwriting attributes with new attributes will not clear them. This means that updating the display can be slow if there are many minor changes in the line; for example: a line which contains alternating or moving reverse video and underlined sections.

No "green slime" on this display

Another limitation with older HP-2392A terminals is that they do not like to run in character mode at speeds greater than 9600 bps, although they can be set to 19200 bps, and are fine in block mode at this speed. Models with newer ROMs run quite happily at 19200 bps, but the only way to be sure is to try them and see.

Details on terminfo description for the HP-2392A

(Please see Listing 1 below for the terminfo description I currently use for the HP-2392A terminal.)

da, db Indicates that the display may be retained above/below the screen. This means that the logical display area is larger than the physical.
xhp Indicates that standout is not erased by overwriting, display enhancements have to be turned off directly.
hpa Go to absolute column in display, may lead to faster screen updates, as less data is sent down the line.
rmkx Exit "keypad-transmit" mode, some terminal function keys are local after this has been sent, they are not transmitted to the host computer.
smkx Sets "keypad-transmit" mode, the terminal functions keys are transmitted to the host computer.
vpa Go to absolute row in display, may lead to faster screen updates, as less data is sent down the line.

The sgr string for the HP-2392A is an example of one of the more complex variations available to the terminfo description writer. It uses the IF operator %? and the OR operator %| to build up the final character output as the attribute to be set. It first turns off all attributes by the '@' character, and ORs in any other required values, setting the display attribute as a single character. Then it outputs the shift in or out to select the line-drawing set if wanted; otherwise the standard character set is selected. See Listing 2 for the tKeyMap segment of the pfx.ini file used when running PFXplus on HP-2392A terminal using the CURSES mode video driver, and character map 2, which maps the standard PC character set into its nearest equivalents using the alternate character set characters.

The HP-2392A terminal has an 8-bit character set called the "Roman-8" character set, which is a multi-national character set, allowing the terminal to be used in environments where pure ASCII is insufficient. It allows the terminal to display many European characters, for example ä, when necessary.

To enable PFXplus to make use of these features, and still display output using the line-drawing character set, the internal character map tables have been expanded to 16-bits. For more information on how to use this feature, please see the section on 16-bit character maps later in this article.

Listing 1: terminfo description of HP-2392A terminal for PFXplus

pfxhp2392|pfx2392|pfx2393|pfx modified 239x series,
   am, da, db, mir, xhp, xon,
   cols#80, lines#24,
   acsc=0ca?jgktlrmfn/q\,t5u6v8w7x.,
   bel=^G, cbt=\Ei, clear=\EH\EJ, cr=\r,
   cub1=\b, cud1=\EB, cuf1=\EC, cuu1=\EA,
   cup=\E&a%p1%dy%p2%dC,
   dch1=\EP, dl1=\EM,
   ed=\EJ, el=\EK,
   hpa=\E&a%p1%dC, ht=\t,
   if=/usr/lib/tabset/stdcrt, il1=\EL, ind=\n,
   is2=\E&s1A\E<\E&k0\\,
   kbs=\b, kcbt=\Ei, kclr=\EJ,
   kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA,
   kdch1=\EP, kdl1=\EM, kel=\EK, kend=\EF,
   kf1=\Ep, kf2=\Eq, kf3=\Er, kf4=\Es,
   kf5=\Et, kf6=\Eu, kf7=\Ev, kf8=\Ew,
   khome=\Eh, kich1=\EQ, kil1=\EL, knp=\EU, kpp=\EV,
   rmir=\ER, rmkx=\E&s0A,
   sgr=\E&d%'@'%?%p1%t%'B'%|%;%?%p2%t%'D'%|%;
       %?%p3%t%'B'%|%;%?%p4%t%'A'%|%;%?%p5%t%'H'%|%;
       %?%p6%t%'H'%|%;%c%?%p9%t^N%e^O%;,
   sgr0=\E&d@^O, smir=\EQ, smkx=\E&s1A, vpa=\E&a%p1%dY,

Listing 2: tKeyMap segment

; CURSES key map - maps terminfo key values to TERMCHAR entries

iSelectCharMap=2

tkeyMap= @1  13 1  16 1  27 7 260 0 261 0 353 5 268 5  15 5 273 1 333 1
tkeyMap=@11 266 1 271 1 269 5 339 5 338 5 259 1 258 1 265 5 272 1 331 0
tkeyMap=@21 330 0   8 0   9 1
tkeyMap=@30 274 1 282 1
tkeyMap=@32 270 7 267 7
tkeyMap=@38 262 0 360 0 329 0  21 0   5 0   2 0   6 0  20 0

The VT200 Series of Terminals

VT200 terminals work as documented

In this article I will discuss the DEC VT200 and later terminals. This is one of my more favoured terminals, as it simply works as documented.

VT200s do have some minor complications, however, as they are supplied with various keyboards, so purchasing them second-hand can be confusing. The earlier VT220 terminals had the backspace key hard-wired to send DEL, as this is used by the VMS operating system to backspace characters.

Many UNIX systems default the DEL character as the interrupt signal, causing unwary VT200 UNIX users to unintentionally stop what they were doing, or erase a nearly completed command line, which was (and is) very frustrating.

Later models allowed this to be configured to send DEL or BACKSPACE. This makes life easier for users and administrators of UNIX systems who do not want to use stty to change the terminal behaviour. Please refer to the stty(1) manual pages for information on using stty to change terminal settings for backspace and interrupt.

The VT200 has a well laid-out keyboard

As the VT220 terminals I have all use the word-processing keyboard, the names of some keys I refer to may be different, but the layout and functionality of all the VT series keyboards is essentially the same.

Across the top of the keyboard are 20 function keys, grouped 5, 5, 4, 2, and 4. On the word-processing keyboard they are labelled:

The first five of these keys are directly in control of the terminal, and do not send escape sequences that can be interpreted by CURSES, and can be ignored for the remainder of this article.

Underneath the row of function keys is a standard(ish) typewriter keyboard, with a cursor control inverted 'T' next to it. There is a set of six keys above it, labelled as follows.

Next to this is a numeric keypad with the original VT100 function keys (PF1, PF2, PF3, and PF4) above it.

There are only 25 function keys available on the VT200 keyboard, and none of them is shiftable or alterable with a control key. A PFXplus application may require the use of control keys to get the required keyboard functionality.

Details on terminfo description for VT200 terminals

(See Listing 1 for the terminfo description that I currently use for the dec vt220 terminal.)

By now most readers should have enough understanding of terminfo descriptions, so I will not go into great detail about the various entries, but only highlight a few new or different ones.

acsc The acsc string is unusual in that it maps the characters onto themselves. As the model used is from the VT100 terminal, and the VT200 is a superset of the VT100, the alternate characters are in the same locations.
csr
(change_scroll_region)
The csr attribute is useful, as it can allow curses to do less work when scrolling a region of the screen. Unfortunately, the region consists of the entire screen width, and is seldom a fast enough optimisation for it to be chosen by curses when updating the screen. However, the general rule with terminfo descriptions is "if it's available, put it in", and allow the programs using the information to decide whether or not they can use it.

See Listing 2 for the tKeyMap segment of the PFX.INI file used when running PFXplus on a DEC VT220 terminal using the CURSES mode video driver. It uses character map 2, which maps the standard PC character set into its nearest equivalents using the alternate character set characters.

It should be noted that I have not set the key map up to map the backspace key to key.bs. It is set as key.delch. To backspace with this keymap, it is necessary to use Ctrl+H.

The VT200 terminal supports multi-national character set

If you are using a VT-series terminal that has the hard-wired DEL being sent, I would suggest that you modify the key map so that DEL is mapped to key.bs and select another key to use as key.delch. Perhaps Ctrl+X would be a suitable choice.

I would also suggest that stty be used in the users .profile or .login files to set the backspace and interrupt keys to the more usable values of DEL and Ctrl+C, as shown here.

stty erase '^?' intr '^C'

The VT200 terminal has an 8-bit character set called the "DEC Multi-National" character set, which allows the terminal to be used in environments where pure ASCII is insufficient. It can be used to display many European characters such as "ä".

The technique for using these 8-bit characters without losing access to the line-drawing characters is explained in the section on 16-bit character maps later in this article. This article contains a complete example on simulating the MSDOS Latin-1 character set using the DEC VT220 terminal.

Listing 1: terminfo description of DEC VT200 terminal for PFXplus

pfxvt220|DEC VT220 in vt100 emulation mode,
   am, mir, xenl, xon,
   cols#80, lines#24, vt#3,
   acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
   bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
   civis=\E[?25l, clear=\E[H\E[2J$<50>, cnorm=\E[?25h,
   cr=\r, csr=\E[%i%p1%d;%p2%dr, cub1=\b, cud1=\E[B,
   cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH$<10>, cuu1=\E[A,
   dch1=\E[P, dl1=\E[M, ed=\E[J$<50>, el=\E[K$<3>,
   home=\E[H, ht=\t, if=/usr/lib/tabset/vt100, il1=\E[L,
   ind=\ED$<20/>, is2=\E[1;24r\E[24;1H, kbs=\b,
   kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
   kdch1=\E[3~, kend=\E[4~, kf1=\EOP, kf10=\E[29~,
   kf11=\E[28~, kf12=\E[23~, kf13=\E[24~, kf14=\E[25~,
   kf15=\E[26~, kf16=\E[30~, kf17=\E[31~, kf18=\E[32~,
   kf19=\E[33~, kf2=\EOQ, kf20=\E[34~, kf3=\EOR,
   kf4=\EOS, kf5=\E[17~, kf6=\E[18~, kf7=\E[19~,
   kf8=\E[20~, kf9=\E[21~, khome=\E[1~, kich1=\E[2~,
   knp=\E[6~, kpp=\E[5~, rc=\E8, rev=\E[7m$<2>,
   rf=/usr/lib/tabset/vt100, ri=\EM$<14/>,
   rmacs=\E(B$<4>, rmir=\E[4l, rmso=\E[m, rmul=\E[m,
   rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
   sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;
       7%;m%?%p9%t\E(0%e\E(B%;,
   sgr0=\E[m$<2>, smacs=\E(0$<2>, smir=\E[4h, smso=\E[7m,
   smul=\E[4m,

Listing 2: tKeyMap segment

; CURSES key map - maps terminfo key values to TERMCHAR entries

iSelectCharMap=2

tkeyMap= @1  13 1 281 1  27 7 260 0 261 0   1 5 268 5 280 5 273 1 283 1
tkeyMap=@11 266 1 271 1 269 5 339 5 338 5 259 1 258 1 265 5 272 1 331 0
tkeyMap=@21 127 0   8 0   9 1
tkeyMap=@30 274 1 282 1
tkeyMap=@32 270 7 267 7
tkeyMap=@38 262 0 360 0  22 0  21 0   5 0   2 0   6 0  20 0

16-Bit Character Maps in PFXplus for Unix

How I Learnt to Forget My Fear, and Came to Love non-ASCII Character Displays

Introduction

This is a discussion and explanation of the changes of the Unix tCharMap INI file item, made to support 8-bit multi-national character sets while allowing the use of line-drawing character sets on terminals which also support these. At the same time, we also added the ability to translate between the character input from the keyboard and the character received by PFXplus.

The Unix character maps, as selected by iSelectCharMap and modified by tCharMap, have been expanded to 16-bits in width to allow the support of 8-bit character sets and alternate character sets at the same time. No change in the default behaviour of character maps 1, 2 and 3 has been made, but it is possible to patch them using the new format.

Display line drawing-characters and eight-bit characters

The format allows the setting of "use alternate character set" or "translate character".

The low 8-bits, 0-255, are the character to be output. Bit 10 (+1024) selects it to be output as an alternate character set character. Bit 11 (+2048) selects the character to be translated both on output and input.

Using the new values - DEC VT220 to Latin 1

Using character map 1 as our base, and a DEC VT220 terminal, we want to display the ä (a-umlaut) character — value 132 from the MS/PC-DOS Latin 1 code page — using the multinational character set, where it has the value 228. This needs the entry

in the INI file. This will display the value 132 as character 228 (ä). If we also want the "ä" character to be input from the terminal and translated to the Latin 1 code page value of 132, we require the entry in the INI file to be

which will set the character to be translated on input as well (2276 = 2048 + 228). This means that when the user enters <COMPOSE>a" to generate the "ä", the value 132 is what is received.

Note that this translation only works to the screen, and from the console. Input and output to and from channels and files is unaffected.

To display the line drawing set character '|' (vertical bar), value 179 in the Latin 1 code page, we would have

where 1144 = 1024 + 120. 120 is the character 'x' in the ASCII character set, and the alternate character set value of 'x' on a VT220 is the line drawing character '|'. To display the double line drawing character (value 186), which is not available in the VT220 character set, we would map it to the same character

allowing the display to remain similar.

Code page-850 applications can run on Unix

Note that it is possible to specify a character to be both translated and output via the alternate character set. The behaviour of input if this occurs will be strange.

A new map, 4, has been added using the new format, and is set up for translation from the DEC VT220 Multilingual character set to the MS/PC-DOS 850 Latin 1 code page characters.

See Listing 1 for the tCharMap entries equivalent to using iSelectCharMap=4, the map which translates to and from the DEC Multi-National character set and the MS/PC-DOS 850 Latin 1 code page character set.

HP Roman-8 to code page 437

The Hewlett-Packard Roman-8 character set also allows us to generate a similar mapping. For this example we will map to and from the MS/PC-DOS code page 437, the standard code page for PCs, using the HP-2392A terminal. Using the "ä" character from code page 437, which has the value 132 and has the value 204 in the Roman-8 character set, to simply display the "ä" on the screen of the HP-2392A terminal we would put

in the INI file.

To translate the "ä" on input as well, when the user types <Extend char>ua to generate the "ä" character, we would put

where 2252 = 2048 + 204 in the ini file.

Displaying elements from the line drawing set is as was explained above to display the character '|', which has the value 179 in code page 437, we would have

where 1144 = 1024 + 120. 120 is the character 'x' in the ASCII character set, and the alternate character set value of 'x' on an HP-2392A is the line drawing character '|'.

Translate keyboard characters on input

The HP-2392A terminal does not display all elements of the Roman-8 character set, so some of the code page 437 characters need to be approximated from the available, displayable, characters. For example, the character '±' cannot be displayed, so it is simulated on output by the character '+', and is not translated on input, for what should be obvious reasons.

See Listing 2 for the tCharMap entries that translate to and from the Hewlett-Packard Roman-8 character set and the standard MS/PC-DOS 437 code page character set.

It may sound complicated, but it makes life easy for our European customers.

Listing 1: tCharMap Equivalent to iSelectCharMap=4, DEC Multinational to/from MS/PC-DOS 850 Latin 1

[PFL]

iSelectCharMap=1

tCharMap=  @0   32   @1 1128   @2 1121   @3  118   @4 1120   @5 1120
tCharMap=  @6 1120   @7 1150
tCharMap= @11  111  @12  111
tCharMap= @14 1144  @15   42  @16 1067  @17 1068  @18 1144  @19   33
tCharMap= @20  182  @21  167  @22 1139  @23 1144  @24 1069  @25 1070
tCharMap= @26 1067  @27 1068  @28   45  @29 1137  @30 1069  @31 1070
tCharMap=@127   94 @128 2247 @129 2300 @130 2281 @131 2274 @132 2276
tCharMap=@133 2272 @134 2277 @135 2279 @136 2282 @137 2283 @138 2280
tCharMap=@139 2287 @140 2286 @141 2284 @142 2244 @143 2245 @144 2249
tCharMap=@145 2278 @146 2246 @147 2292 @148 2294 @149 2290 @150 2299
tCharMap=@151 2297 @152 2301 @153 2262 @154 2268 @155 2296 @156 2211
tCharMap=@157 2264 @158   88 @159  102 @160 2273 @161 2285 @162 2291
tCharMap=@163 2298 @164 2289 @165 2257 @166 2218 @167 2234 @168 2239
tCharMap=@169   82 @170 1131 @171 2237 @172 2236 @173 2209 @174 2219
tCharMap=@175 2235 @176 1121 @177 1121 @178 1121 @179 1144 @180 1141
tCharMap=@181 2241 @182 2242 @183 2240 @184 2217 @185 1141 @186 1144
tCharMap=@187 1131 @188 1130 @189 2210 @190 2213 @191 1131 @192 1133
tCharMap=@193 1142 @194 1143 @195 1140 @196 1137 @197 1134 @198 2275
tCharMap=@199 2243 @200 1133 @201 1132 @202 1142 @203 1143 @204 1140
tCharMap=@205 1137 @206 1134 @207 2216 @208  100 @209   68 @210 2250
tCharMap=@211 2251 @212 2248 @213  105 @214 2253 @215 2254 @216 2255
tCharMap=@217 1130 @218 1132 @219 1121 @220 1121 @221  124 @222 2252
tCharMap=@223 1121 @224 2259 @225 2271 @226 2260 @227 2258 @228 2293
tCharMap=@229 2261 @230 2229 @231  112 @232   80 @233 2266 @234 2267
tCharMap=@235 2265 @236  121 @237   89 @238 1135 @239   39 @240   45
tCharMap=@241 2225 @242 1139 @243 1121 @244 2230 @245 2215 @246   47
tCharMap=@247   44 @248 2224 @249   34 @250  183 @251 2233 @252 2227
tCharMap=@253 2226 @254 1121 @255   32

Listing 2: tCharMap for Hewlett-Packard Roman-8 Character set to/from MS/PC-DOS Code Page 437

[PFL]

iSelectCharMap=1

tCharMap=@128 2228 @129 2255 @130 2245 @131 2240 @132 2252 @133 2248
tCharMap=@134 2260 @135 2229 @136 2241 @137 2253 @138 2249 @139 2269
tCharMap=@140 2257 @141 2265 @142 2264 @143 2256 @144 2268 @145 2263
tCharMap=@146 2259 @147 2242 @148 2254 @149 2250 @150 2243 @151 2251
tCharMap=@152  121 @153 2266 @154 2267 @155 2239 @156 2235 @157 2236
tCharMap=@158   80 @159 2238 @160 2244 @161 2261 @162 2246 @163 2247
tCharMap=@164 2231 @165 2230 @166   97 @167  111 @168 2233 @169 1132
tCharMap=@170 1131 @171   50 @172   52 @173 2232 @174   60 @175   62
tCharMap=@176 1128 @177 1121 @178 1072 @179 1144 @180 1141 @181 1141
tCharMap=@182 1141 @183 1131 @184 1131 @185 1141 @186 1144 @187 1131
tCharMap=@188 1130 @189 1130 @190 1130 @191 1131 @192 1133 @193 1142
tCharMap=@194 1143 @195 1140 @196 1137 @197 1134 @198 1140 @199 1140
tCharMap=@200 1133 @201 1132 @202 1142 @203 1143 @204 1140 @205 1137
tCharMap=@206 1134 @207 1142 @208 1142 @209 1143 @210 1143 @211 1143
tCharMap=@212 1133 @213 1132 @214 1132 @215 1134 @216 1134 @217 1130
tCharMap=@218 1132 @219 1072 @220 1072 @221 1144 @222 1072 @223   42
tCharMap=@224   97 @225 2270 @226   89 @227   80 @228   69 @229  111
tCharMap=@230  117 @231  121 @232   79 @233   48 @234   81 @235  100
tCharMap=@236   42 @237 2262 @238   69 @239  110 @240   61 @241   43
tCharMap=@242   62 @243   60 @244   83 @245   83 @246   47 @247   61
tCharMap=@248 2227 @249   46 @250   46 @251   86 @252  110 @253   50
tCharMap=@254 1072

 

Back to FAQ Page