435 lines
16 KiB
Plaintext
435 lines
16 KiB
Plaintext
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.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
|
||
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:
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
|
||
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.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
|
||
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].
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
|
||
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 unlesssthe 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.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
|
||
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)
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
|
||
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.BATThad been
|
||
run.
|
||
|
||
Enjoy ANSI! It is a wonderful tool, and can be a lot of fun to use. It's not
|
||
a keyboard enhanccr, 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.
|
||
|
||
|