daleken/
daleken/data/notes/
daleken/data/player/
daleken/data/system/poses/
daleken/doc/Homepage/images/
daleken/log/
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.