From: Colin_Douthwaite@equinox.gen.nz
Date: Thu, 27 Jan 94 07:11:55 +1300

 
                            USING THE ANSI DRIVER

                                      by

                                C. Scot Giles
                               875 Lake Street
                          Oak Park, Illinois   60301


This essay is an attempt to explain how I use the ANSI.SYS driver to configure the
function keys on my computer, and to control the screen.  I have used these
techniques on my PC and AT for years, and find them to be convenient and
effective.  ANSI is not widely used by microcomputer fans because the
documentation supplied by IBM on how to send control codes to the ANSI driver is
among the most cryptic ever produced by IBM.  I learned them by reading computer
magazines, and slowly figured out how it could be done.  I am not a professional
computer programmer (indeed I am a clergyman), so some of my technical
observations might be in error.  But everything here works, and I have retested it
before finishing this essay.

This essay covers only IBM Personal Computers (PC, XT or AT) running DOS 2.n or
greater.  I have no experience with compatibles, so you are on your own if you try
to use these techniques on one.

                           LOADING THE ANSI DRIVER

In order to use any of the techniques in this essay, you must first have loaded
the ANSI.SYS driver into your computer's memory using your CONFIG.SYS file.  You
do this my adding the line, DEVICE=ANSI.SYS somewhere in the CONFIG.SYS file and
rebooting your computer.



                       KEYBOARD REASSIGNMENT WITH ANSI


Before we get to specific ways to send control codes to the (now loaded) ANSI
driver, you must first know what those codes mean.  For the function keys the
codes are listed on the chart below which first appeared in SOFTALK magazine. Each
function key is assigned an "extended function code" which DOS will use to
recognize that a function key has been pressed and in what shifted mode, if any.
Each number is expressed as a 0 followed by a semi-colon, then the number from the
chart below.

                KEY     NORMAL  SHIFT   CONTROL  ALT
                F1      59      84      94      104
                F2      60      85      95      105
                F3      61      86      96      106
                F4      62      87      97      107
                F5      63      88      98      108
                F6      64      89      99      109
                F7      65      90      100     110
                F8      66      91      101     111
                F9      67      92      102     112
                F10     68      93      103     113

Accordingly, the way to designate the F5 key would be 0;63 while the F10 key would
be designated by 0;68 or 0;113 if shifted with the ALT key.








 
                       Using the ANSI driver, Page -2-



If you examine the DOS Technical Reference Manual (not the Technical Manual for PC
hardware), you will find a section on SCREEN/KEYS.  This section was contained in
the DOS 2.0 documentation, but IBM removed it in later editions. Here is a summary
of its contents relative to keyboard redefinition.

To change one key to have the meaning of another, enter:

                                 ESC [#;#p

where the first # is the ASCII value of the key being changed and the second # is
the ASCII value of the new definition.  For example, "A" has the ASCII value of 65
and "Q" has the value of 81.  So:

                                 ESC [65;81p

will result in "A" being redefined as "Q."  It is also possible to redefine a key
to have the meaning of a string of characters.  This is done by enclosing the
string in quotes.  So:

                                 ESC [65;"Hi there"p

would change the "A" key to have the meaning of "Hi there."  If the first value
for the first # is a 0 however, DOS knows that what is being changed is not an
ASCII value but the meaning of an extended function code.  So if you were to
enter:

                                 ESC [0;68;"Hi there"p

DOS would know to change the meaning of the function key (in this case F10) to the
sting enclosed in quotes.  This is the key to redefining your function keys to
perform much used commands: like DIR, CHKDSK, COPY *.* B: etc. or to load programs
from disk.

There is a final trick here.  If you end the escape command sequence with the
characters ";13p" instead of just "p" the command will self-execute, just as if
you pressed the [enter] key.

The IBM documentation tells the user to preface each command by an ESC command,
and I have represented this in the above paragraphs by writing the characters
"ESC." at the start of each control code sequence mentioned. Most users assume
that this means to press the ESC key on the keyboard when entering the commands.
Not so.  To get the Escape Sequence to the ANSI driver you must enter it using a
prompt command or write a .COM file.  For example to configure the F1 key
(extended function code 59) to have the meaning in DOS of "autoexec" with an
[enter] command at the end of it you cannot type:

                                ESC [0;59;"autoexec";13p

as the ESC will not be recognized by DOS as an escape sequence.  What DOS will
recognize as an escape sequence is the characters "$e" although this surely looks
strange at first.  Users familiar with the PROMPT command will notice that the "$"
character is what the PROMPT command uses as an escape sequence, and that is
precisely how we will get the redefinition to be recognized by DOS.  If you enter
the following command:








 
                       Using the ANSI driver, Page -3-



                                PROMPT $e[0;59;"autoexec";13p

you will see that it works perfectly.  You now have the secret to redefining the
function keys in DOS.  Simply write and run a batch file with a list of PROMPT
commands and you will have done it.  One precaution, ECHO must be ON, otherwise
DOS will suppress the PROMPT command and the escape sequences will not get
through.

As an example, let's create a batch file called KEYON.BAT that will set F1 as
EDITOR [enter], F2 as PC-FILE [enter], F3 as PC-CALC [enter], F4 as PC-GRAPH
[enter], F5 as PC-TALK [enter], F6 as PC-WRITE [enter], F7 as BASICA [enter], F8
as DIR without the [enter], F9 to run a batch file called MENUOFF.BAT [enter] and
F10 to run a batch file called MENUON.BAT [enter].  It would be as follows:

                echo on
                PROMPT $e[0;59;"EDITOR";13p
                PROMPT $e[0;60;"PC-FILE";13p
                PROMPT $e[0;61;"PC-CALC";13p
                PROMPT $e[0;62;"PC-GRAPH";13p
                PROMPT $e[0;63;"PC-TALK";13p
                PROMPT $e[0;64;"PC-WRITE";13p
                PROMPT $e[0;65;"BASICA";13p
                PROMPT $e[0;66;"DIR"p
                PROMPT $e[0;67;"MENUOFF";13p
                PROMPT $e[0;68;"MENUON";13p
                prompt
                cls

You would also want to create another file called KEYOFF.BAT which resets the
function key definitions to DOS normal.  The format would be:

                echo on
                PROMPT $e[0;59;0;59p
                PROMPT $e[0;60;0;60p
                PROMPT $e[0;61;0;61p
                PROMPT $e[0;62;0;62p
                PROMPT $e[0;63;0;63p
                PROMPT $e[0;64;0;64p
                PROMPT $e[0;65;0;65p
                PROMPT $e[0;66;0;66p
                PROMPT $e[0;67;0;67p
                PROMPT $e[0;68;0;68p
                prompt
                cls

I should mention that the purpose of the final blank PROMPT command in each of
these batch files is to reset the DOS prompt to A> or whatever your default prompt
is.  It serves no redefinition purpose, but does keep the screen looking clean.












 
                       Using the ANSI driver, Page -4-


                     USING DEBUG TO LOAD THE ANSI DRIVER

While there is no reason why we could not continue to configure our function keys
by batch files consisting of lists of PROMPT commands, this is a clumsy way to
proceed.  It is easier to use the DEBUG utility supplied with DOS to create a .COM
file that will do the job for us quickly and directly, without sending any input
to screen.  To my knowledge this technique was first published by Michael J.
Grabel in the December 1984 edition of PC WORLD.

Place a formatted DOS disk containing the DEBUG utility in the default drive, and
follow the script below.  As you do so hexadecimal numbers will appear on the left
hand side of your screen.  These numbers will vary depending on the configuration
of your system.  For our purposes here I will represent the numbers in the form
xxxx:nnnn.  What you will see on your screen will be different.

A>DEBUG [enter] -A 100 [enter] MOV AH,9 [enter] MOV DX,109 [enter] INT 21 [enter]
INT 20 [enter] xxxx:nnnn DB 1B'[0;59;"EDITOR";13p' [enter] xxxx:nnnn DB
1B'[0;60;"PC-FILE";13p' [enter] xxxx:nnnn DB 1B'[0;61;"PC-CALC";13p' [enter]
xxxx:nnnn DB 1B'[0;62;"PC-GRAPH";13p' [enter] xxxx:nnnn DB 1B'[0;63;"PC-TALK";13p'
[enter] xxxx:nnnn DB 1B'[0;64;"PC-WRITE";13p' [enter] xxxx:nnnn DB
1B'[0;65;"BASICA";13p' [enter] xxxx:nnnn DB 1B'[0;66;"DIR"p' [enter] xxxx:nnnn DB
1B'[0;67;"MENUOFF";13p' [enter] xxxx:nnnn DB 1B'[0;68;"MENUON";13p' [enter]
xxxx:nnnn DB 1B '$' [enter]

     As soon as you have entered the previous line, your computer will respond
     with a number in the form of xxxx:nnnn.  Copy down the portion of the
     number that is being represented here as "nnnn" as you will need it
     later.  Once you have copied the number down, press [enter]

xxxx:nnnn [enter] -N KEYON.COM [enter] -R BX [enter]

     When you have entered the command above, your computer will respond with
     the following line and a colon as a prompt.  At this prompt enter 0 and
     press [enter].

BX:0000 :0 [enter] -R CX [enter]

     When you enter the R CX command above, the computer will respond with the
     following line and a colon as a prompt.  At this prompt enter the number,
     "nnnn" you copied down above and press [enter].









 
                       Using the ANSI driver, Page -5-


CX 0000 :nnnn [enter] -W [enter]

     The computer will respond with the following.

WRITING nnnn bytes -Q [enter]

As soon as you enter the Q command (for Quit) you will be back at the DOS prompt,
and there will be a new file on disk called KEYON.COM.  Simply type it at the DOS
prompt and your function keys will be configured.  It is a good idea to use this
same procedure to write another .COM file called KEYOFF.COM which will restore the
keys to their native DOS definitions.  The procedure for this is the same as the
above, except that the definition section should be:

xxxx:nnnn DB 1B'[0;59;0;59p' [enter] xxxx:nnnn DB 1B'[0;60;0;60p' [enter]
xxxx:nnnn DB 1B'[0;61;0;61p' [enter] xxxx:nnnn DB 1B'[0;62;0;62p' [enter]
xxxx:nnnn DB 1B'[0;63;0;63p' [enter] xxxx:nnnn DB 1B'[0;64;0;64p' [enter]
xxxx:nnnn DB 1B'[0;65;0;65p' [enter] xxxx:nnnn DB 1B'[0;66;0;66p' [enter]
xxxx:nnnn DB 1B'[0;67;0;67p' [enter] xxxx:nnnn DB 1B'[0;68;0;68p' [enter]
xxxx:nnnn DB 1B '$' [enter]

If you find that KEYON.COM doesn't work correctly, reboot the machine to clear the
definitions and try again.  The most common mistakes are typing errors (I often
enter a colon when I wanted a semi-colon).  Another source of difficulty will
arise if you have another file on disk to start with called KEYON.COM or
KEYOFF.COM.  DEBUG bypasses the normal file allocation of DOS and writes directly
to the disk.  If you have another file on disk with the same name, DEBUG will
overwrite it, but unless the other file was exactly the same size as the new one
or smaller, there may be a piece of the old file left over attached to the end of
the new one.  As a precaution, always erase old versions of the .COM files, or
better yet give each one a unique name and rename it later using the DOS Rename
command.

                            SOME ADDITIONAL TRICKS


Here are some additional control codes for the ANSI driver, summarized from the
IBM material.


1. CURSOR POSITIONING

     To move the cursor to a specified position: ESC [#;#h where the first #
     is the desired line number and the second the desire column.

     To move the cursor up without changing columns: ESC [#a where # specifies
     the number of lines moved.








 
                       Using the ANSI driver, Page -6-



     To move the cursor to a specified horizontal and vertical position: ESC
     [#;#f where # means first the line number and secondly the column number.

     To get a device status report: ESC [6n

     To get a cursor position report: ESC [#;#r where the first # specifies
     the current line and the second # specifies the current column

     To move the cursor down: ESC [#b where # specifies the number of lines
     moved down.

     To move the cursor forward: ESC [#C where # specifies the number of
     columns moved.

     To move the cursor backward: ESC [#d where # specifies the number of
     columns moved.

     To save the cursor position: ESC [s and to restore it: ESC [u.

2. ERASING

     To do a CLS (erase screen move cursor to home position): ESC [2j

     To erase from cursor to end of line: ESC [k


3. COLOR GRAPHICS

     To set the color/graphics attributes, enter ESC [#;#m where the first #
     is the desired foreground color and the second is the desired background
     color.  Select colors from the list below:

     30  black foreground
     31  red foreground
     32  green foreground
     33  yellow foreground
     34  blue foreground
     35  magenta foreground
     36  cyan foreground
     37  white foreground

     40  black background
     41  red background
     42  green background
     43  yellow background
     44  blue background
     45  magenta background
     46  cyan background
     47  white background

     To set additional attributes enter: ESC [#m where # is the number of the
     desired attribute.  Select attributes from the list below:

     0  all attributes off (white on black)








 
                       Using the ANSI driver, Page -7-


     1  bold on
     4  underscore (on IBM Monochrome Display)
     5  blink
     7  reverse video
     8  invisible

To give an example of what can be done with these additional codes, a batch file
called MENUOFF.BAT containing only the line:

                        PROMPT $e[2J$e[30;40m$h

would blank a color display completely.  It does a CLS, sets the display to a
black foreground and background and the with the "$h" performs a backspace to
erase the blinking cursor (the "$h command is documented in the DOS manual under
PROMPT).  Another batch file called MENUON.BAT containing the lines:

      PROMPT $e[0m
      prompt
      cls

Would reset a color display to restore the screen after MENUOFF.BAT had been run.

Enjoy ANSI!  It is a wonderful tool, and can be a lot of fun to use.  It's not a
keyboard enhancer, and if you load it up with too many keyboard redefinitions at
one time you will run out of environment space.  This is harmless and simply means
that ANSI is full.  But it will work fine to define your function keys and control
your screen.



