Significant portion of the ansi specification taken from NANSI.SYS
(freedos.org)
7. ANSI Control Sequences
While putting text up on the screen, NANSI.SYS keeps a lookout for the
escape character (chr(27), known as ESC); this character signals the
start of a terminal control sequence. Terminal control sequences fol-
low the format
ESC [ param; param; ...; param cmd
where
ESC is the escape character chr$(27).
[ is the left bracket character.
param is an ASCII decimal number, or a string in quotes.
cmd is a case-specific letter identifying the command.
Usually, zero, one, or two parameters are given. If parameters are
omitted, they usually default to 1; however, some commands (KKR) treat
the no-parameter case specially. Spaces are not allowed between
parameters.
For example, both ESC[1;1H and ESC[H send the cursor to the home posi-
tion (1,1), which is the upper left.
In general, if you ask the cursor to go beyond the edge of the screen,
it goes to the appropriate edge. (ANSI.SYS was not always so nice.)
The following C macro illustrates how one could print a string at a
given location on the screen:
#define printXY(x,y,s) printf("%c[%d;%dH%s", 27, y, x, s);
Either single or double quotes may be used to quote a string. Each
character inside a quoted string is equivalent to one numeric parame-
ter. Quoted strings are normally used only for the Keyboard Key Reas-
signment command.
Each ANSI control sequence supported by NANSI.SYS is described below.
The descriptions follow the format
7.0.1. ABBREVIATED_NAME: what_to_send LONG NAME
where ABBREVIATED_NAME is a short name for the sequence, what_to_send
tells you what characters make up the sequence, and LONG NAME is a
long name for the sequence.
- 6 -
7.1. Sequences dealing with Cursor Positioning
7.1.1. CUP: ESC[#;#H Cursor Position
Moves the cursor to the position specified by the parameters. The
first parameter, y, specifies the row number; the second parameter, x,
specifies the column number. If no parameters are given, the cursor
is moved to (1,1), the upper left corner of the screen.
7.1.2. HVP: ESC[#;#f Horizontal and Vertical Position
This is identical to Cursor Position. Don't ask me why it exists.
7.1.3. CUU: ESC[#A Cursor Up
Moves the cursor up the given number of rows without changing its hor-
izontal position.
7.1.4. CUD: ESC[#B Cursor Down
Moves the cursor down the given number of rows without changing its
horizontal position.
7.1.5. CUF: ESC[#C Cursor Forward
Moves the cursor right the given number of columns without changing
its vertical position.
7.1.6. CUB: ESC[#D Cursor Backward
Moves the cursor left the given number of columns without changing its
vertical position.
7.1.7. DSR: ESC[#n Device Status, Report!
# must be 6. The sequence ESC[6n causes the console driver to output
a CPR (Cursor Position Report) sequence.
Note: This sequence is not supported by the ANSI.SYS emulator built
into Microsoft Windows 1.x or 2.x.
- 7 -
7.1.8. CPR: ESC[#;#R Cursor Position Report
The console driver outputs this sequence upon reciept of a DSR
sequence. The first parameter is the cursor's vertical position; the
second parameter is the cursor's horizontal position.
Note: Contrary to the MS-DOS manual, ANSI.SYS outputs a carriage
return after this sequence. NANSI.SYS faithfully reproduces this
quirk.
The resulting string can have up to eleven characters. For example,
if you have a 100-line display (wow), and the cursor is at
(x=132,y=100), the string will be ESC[132;100R followed by a carriage
return.
This should never be sent to the console driver.
Also note: This sequence is not supported by the ANSI.SYS emulator
built into Microsoft Windows 1.x or 2.x.
Here is an example of how to use DSR/CPR to find the current cursor
position with the C language:
/* Code fragment to get current cursor X and Y from console */
/* Be sure to disable line-buffering on stdin before calling */
int x, y, c;
printf("\033[6n");
fflush(stdout);
if (getchar() != '\033' || getchar() != '[')
abort("Console not responding to DSR?");
for (y=0; isdigit(c=getchar()); y=y*10+(c-'0'));
if (c != ';')
abort("Console CPR faulty?");
for (x=0; isdigit(c=getchar()); x=x*10+(c-'0'));
if (c != 'R')
abort("Console CPR faulty?");
#ifndef VT100
getchar(); /* ignore trailing CR */
#endif
This can also be useful for sensing screen size.
7.1.9. SCP: ESC[s Save Cursor Position
Saves the cursor's X and Y locations in an internal variable. See
RCP.
7.1.10. RCP: ESC[u Restore Cursor Position
Moves cursor to the position it held when the last SCP sequence was
received.
- 8 -
7.2. Sequences that Edit the Display
7.2.1. ED: ESC[#J Erase in Display
# must be 2. Clears the entire screen.
Note: Contrary to the MS-DOS manual, ANSI.SYS also moves the cursor to
the upper left corner of the screen. Contrary to the ANSI standard,
ANSI.SYS does not insist on # being 2. NANSI.SYS faithfully repro-
duces these quirks. (Version 2.2 of NANSI.SYS insisted on # being 2,
and it caused compatibility problems with programs that ignored the
MS-DOS manual. Sigh.)
7.2.2. EL: ESC[K Erase in Line
Deletes from the cursor to the end of the line.
7.2.3. IL: ESC[#L Insert Lines
The cursor line and all lines below it move down # lines, leaving
blank space. The cursor position is unchanged. The bottommost #
lines are lost.
Note: This is not supported in ANSI.SYS.
7.2.4. DL: ESC[#M Delete Lines
The block of # lines at and below the cursor are deleted; all lines
below them move up # lines to fill in the gap, leaving # blank lines
at the bottom of the screen. The cursor position is unchanged.
Note: This is not supported in ANSI.SYS.
7.2.5. ICH: ESC[#@ Insert Characters
The cursor character and all characters to the right of it move right
# columns, leaving behind blank space. The cursor position is
unchanged. The rightmost # characters on the line are lost.
Note: This is not supported in ANSI.SYS.
7.2.6. DCH: ESC[#P Delete Characters
The block of # characters at and to the right of the cursor are
deleted; all characters to the right of it move left # columns, leav-
ing behind blank space. The cursor position is unchanged.
Note: This is not supported in ANSI.SYS.
- 9 -
7.3. Sequences that Set Modes
7.3.1. KKR: ESC["string"p Keyboard Key Reassignment
The first char (or, for function keys, two chars) of the string gives
the key to redefine; the rest of the string is the key's new value.
To specify unprintable chars, give the ASCII value of the char outside
of quotes, as a normal parameter. IBM function keys are two byte
strings starting with zero. For instance, ESC[0;59;"dir a:";13p rede-
fines function key 1 to have the value "dir a:" followed by the ENTER
key.
There are about 500 bytes available to hold redefinition strings.
Once this space fills up, new strings are ignored.
To clear all definitions, send the string ESC[p. (There was no way to
do this in ANSI.SYS.)
This feature is a security risk, and can be disabled with the /s
option when loading Nansi in config.sys. See Command-line Options
above.
Here's a table of the ASCII values of the common function keys; for
others, see the IBM Basic manual or the "IBM PS/2 and PC BIOS Inter-
face Technical Reference," a steal at $80 from IBM (1-800-IBM-PCTB).
F1 0;59 F2 0;60 F3 0;61 F4 0;62
F5 0;63 F6 0;64 F7 0;65 F8 0;66
F9 0;67 F10 0;68 F11 0;133 F12 0;134
HOME 0;71 END 0;79 PGUP 0;73 PGDN 0;81
INS 0;82 DEL 0;83 LEFT 0;75 RIGHT 0;77
UP 0;72 DOWN 0;80
When /X is given, the gray Insert, Delete, Home, End, PageUp, PageDn,
and arrow keys on an Extended keyboard can be redefined separately by
using 224 rather than 0 as the initial byte.
7.3.2. SGR: ESC[#;#;...#m Set Graphics Rendition
The Set Graphics Rendition command is used to select foreground and
background colors or attributes. When you use multiple parameters,
they are executed in sequence, and the effects are cumulative.
Attrib Value
0 All attributes off (normal white on black)
1 Bold
4 Underline
5 Blink
7 Reverse Video
30-37 foreground black/red/green/yellow/blue/magenta/cyan/white
40-47 background black/red/green/yellow/blue/magenta/cyan/white
- 10 -
7.3.3. SM: ESC[=nh Set Video Mode
This sequence selects one of the available video modes. The IBM BIOS
supports several video modes; the codes given in the BIOS documenta-
tion are used as parameters to the Set Mode command. (In bitmap
modes, the cursor is simulated with a small blob (^V).)
Mode Code Value
0 text 40x25 Black & White
1 text 40x25 Color
2 text 80x25 Black & White
3 text 80x25 Color
4 bitmap 320x200 4 bits/pixel
5 bitmap 320x200 1 bit/pixel
6 bitmap 640x200 1 bit/pixel
13 bitmap 320x200 4 bits/pixel
14 bitmap 640x200 4 bits/pixel
15 bitmap 640x350 1 bit/pixel
16 bitmap 640x350 4 bits/pixel
17 bitmap 640x480 1 bit/pixel
18 bitmap 640x480 4 bits/pixel
19 bitmap 320x200 8 bits/pixel
Modes 0, 1, and 4-19 require a CGA, EGA or VGA.
Modes 13-16 require an EGA or VGA.
Modes 17-19 require a VGA.
Other graphics cards may support other video modes.
The EGA and VGA let you use a shorter character cell in text modes in
order to squeeze more lines of text out of the 25-line text modes. To
enter short line mode, set the desired 25-line text mode (0 to 3),
then Set Mode 43. For instance: ESC[=3h ESC[=43h. To exit short line
mode, set the desired 25-line text mode again. On IBM VGA cards, this
sequence gives you a 50 line screen. NANSI.SYS ignores mode 43 unless
there is an EGA or VGA on your computer.
- 11 -
7.3.4. SM: ESC[?nh Set Nonvideo Mode
This sequence is used to set non-video modes. The only value sup-
ported is
Mode Code Value when set
7 Cursor wraps at end of line
Setting mode 7 tells the cursor to wrap around to the next line when
it passes the end of a line.
7.3.5. RM: ESC[?nl Reset Nonvideo Mode
This sequence is used to reset non-video modes. The only value sup-
ported is
Mode Code Value when reset
7 Cursor stops at end of line
Resetting mode 7 tells the cursor to 'stick' at the end of the line
instead of wrapping to the next line.