This commit is contained in:
randogoth 2026-08-31 16:01:14 +03:00
commit 19991bee2a
44 changed files with 4799 additions and 0 deletions

BIN
nansi/NANSI.SYS Normal file

Binary file not shown.

291
nansi/license.txt Normal file
View file

@ -0,0 +1,291 @@
GNU GENERAL PUBLIC LICENSE
http://www.gnu.org/copyleft/gpl.html
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your freedom
to share and change it. By contrast, the GNU General Public License is
intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This General
Public License applies to most of the Free Software Foundation's
software and to any other program whose authors commit to using it.
(Some other Free Software Foundation software is covered by the
GNU Library General Public License instead.) You can apply it to your
programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new free
programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid anyone
to deny you these rights or to ask you to surrender the rights. These
restrictions translate to certain responsibilities for you if you distribute
copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether gratis
or for a fee, you must give the recipients all the rights that you have. You
must make sure that they, too, receive or can get the source code. And
you must show them these terms so they know their rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on,
we want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software patents.
We wish to avoid the danger that redistributors of a free program will
individually obtain patent licenses, in effect making the program
proprietary. To prevent this, we have made it clear that any patent must
be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS FOR
COPYING, DISTRIBUTION AND
MODIFICATION
0. This License applies to any program or other work which contains a
notice placed by the copyright holder saying it may be distributed under
the terms of this General Public License. The "Program", below, refers
to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it, either
verbatim or with modifications and/or translated into another language.
(Hereinafter, translation is included without limitation in the term
"modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of running
the Program is not restricted, and the output from the Program is
covered only if its contents constitute a work based on the Program
(independent of having been made by running the Program). Whether
that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the notices
that refer to this License and to the absence of any warranty; and give
any other recipients of the Program a copy of this License along with the
Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide a
warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but does
not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program, and
can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based on
the Program, the distribution of the whole must be on the terms of this
License, whose permissions for other licensees extend to the entire
whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your
rights to work written entirely by you; rather, the intent is to exercise the
right to control the distribution of derivative or collective works based
on the Program.
In addition, mere aggregation of another work not based on the
Program with the Program (or with a work based on the Program) on a
volume of a storage or distribution medium does not bring the other
work under the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding
machine-readable source code, which must be distributed under
the terms of Sections 1 and 2 above on a medium customarily
used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your cost
of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with
such an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to control
compilation and installation of the executable. However, as a special
exception, the source code distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies the
executable.
If distribution of executable or object code is made by offering access to
copy from a designated place, then offering equivalent access to copy
the source code from the same place counts as distribution of the source
code, even though third parties are not compelled to copy the source
along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt otherwise
to copy, modify, sublicense or distribute the Program is void, and will
automatically terminate your rights under this License. However, parties
who have received copies, or rights, from you under this License will not
have their licenses terminated so long as such parties remain in full
compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and all
its terms and conditions for copying, distributing or modifying the
Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the original
licensor to copy, distribute or modify the Program subject to these terms
and conditions. You may not impose any further restrictions on the
recipients' exercise of the rights granted herein. You are not responsible
for enforcing compliance by third parties to this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot distribute
so as to satisfy simultaneously your obligations under this License and
any other pertinent obligations, then as a consequence you may not
distribute the Program at all. For example, if a patent license would not
permit royalty-free redistribution of the Program by all those who
receive copies directly or indirectly through you, then the only way you
could satisfy both it and this License would be to refrain entirely from
distribution of the Program.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents
or other property right claims or to contest validity of any such claims;
this section has the sole purpose of protecting the integrity of the free
software distribution system, which is implemented by public license
practices. Many people have made generous contributions to the wide
range of software distributed through that system in reliance on
consistent application of that system; it is up to the author/donor to
decide if he or she is willing to distribute software through any other
system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be
a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in certain
countries either by patents or by copyrighted interfaces, the original
copyright holder who places the Program under this License may add an
explicit geographical distribution limitation excluding those countries, so
that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
9. The Free Software Foundation may publish revised and/or new
versions of the General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may differ in
detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number
of this License, you may choose any version ever published by the Free
Software Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we
sometimes make exceptions for this. Our decision will be guided by the
two goals of preserving the free status of all derivatives of our free
software and of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF
CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM,
TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT
WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE
PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD
THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE
COST OF ALL NECESSARY SERVICING, REPAIR OR
CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW
OR AGREED TO IN WRITING WILL ANY COPYRIGHT
HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED
ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING
ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT
LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE
WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR
OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY
OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS

988
nansi/readme.txt Normal file
View file

@ -0,0 +1,988 @@
NANSI.SYS
An Enhanced MS-DOS Console Driver
Version 3.4 November 1991
Documentation updated February 1999
http://alumni.caltech.edu/~dank/nansi/
1. Introduction - Who should use NANSI.SYS
NANSI.SYS is a console device driver for MS-DOS computers. It exe-
cutes the same ANSI cursor control sequences as does the standard con-
sole driver ANSI.SYS, but significantly faster. It also offers
several extra features, while still being simple, small, and cheap.
You can benefit from using NANSI.SYS if:
1. you use programs (such as DIR, MORE, or NETHACK) which display text
on the screen via DOS, or
2. you have an EGA or VGA, and want to use the 43- or 50-line mode of
your display, or
3. you run out of space when redefining keys with ANSI.SYS, or
4. you are a programmer who uses ANSI escape sequences, and are frus-
trated with slow display updates, or
5. you are porting display-intensive Unix programs to run under MS-
DOS.
You will not benefit from using NANSI.SYS if:
1. you never wish commands like TYPE or DIR were faster, and
2. you only use programs like Microsoft Word or Word Perfect, which
bypass DOS when displaying text, and
3. you aren't interested in displaying 43 lines of text on your EGA or
VGA, and
4. you have never heard of ANSI.SYS anyway.
The display speed improvement you get by installing NANSI.SYS depends
on the kind of programs you run. Installing NANSI.SYS will bring no
improvement in display speed for programs that bypass DOS (e.g. Micro-
soft Word), a 30% improvement in display speed with most programs that
don't bypass DOS, a 50% improvement with "optimized" programs (see
chapter 9 below), and a 95% improvement with "optimized" programs that
avoid scrolling.
One "optimized" program, COPY /b, comes with DOS. To test the speed
improvement yourself, create a long text file named foo.txt, and
display it with COPY /b foo.txt con: with NANSI.SYS installed- it will
go by very quickly. This speed increase occurs even when running in a
window in Microsoft Windows 3.0.
2. Compatibility
NANSI.SYS has been tested on IBM PC/XT, /AT, and PS/2 systems. It
should run on any CGA, MDA, EGA, or VGA compatible video card. It is
compatible with Microsoft Windows 3.0. Unlike many display speedup
progams, it does not use wierd hardware scrolling tricks, and there-
fore remains completely compatible with programs that write directly
to the screen.
November 29, 1991
- 2 -
3. Copyright status
This program and documentation is Copyright 1986, 1991 Daniel Kegel.
The executable program and its documentation may be freely distri-
buted.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
or look on the web at http://www.gnu.org/copyleft/gpl.html.
Correspondence (in English, German, or French) should be
directed to the author at dank@alumni.caltech.edu
4. Version
The version number can be found with the DOS command TYPE NANSI.SYS.
This documentation is for version 3.3, created November 1991.
5. Installation and System Requirements
NANSI.SYS version 3.3 is distributed as the archive NANSI33.ZIP, with
the following contents:
NANSI.SYS - the device driver
NANSI.DOC - this documentation file
RAW.C - how to set and clear RAW mode for faster screen output
RAW.H - definitions for users of RAW.C
GC.ON - text file which, when TYPEd, turns on the graphics cursor
NANSI.SYS requires MS-DOS version 2.0 or higher, and uses about 3
kilobytes of system RAM.
To install NANSI.SYS on your computer, copy the file NANSI.SYS to your
boot disk (usually C:), and include one of the following statements in
the configuration file CONFIG.SYS on your boot disk:
For IBM VGA and Vega VGA cards, or if you don't know (or care) what
kind of card you have:
DEVICE=NANSI.SYS
November 29, 1991
- 3 -
For Paradise VGA Plus cards:
DEVICE=NANSI.SYS /t54 /t55 /t56 /t57
For VGA cards using the Oak Technology OTI-067:
DEVICE=NANSI.SYS /t4F /t50 /t51
For VGA cards using the Trident Microsystems TVGA 8900:
DEVICE=NANSI.SYS /t50 /t51 /t52 /t53 /t54 /t55 /t56 /t57 /t58 /t59 /t5A
6. COMMAND-LINE OPTIONS
6.1. /K : force Nansi to use extended keyboard BIOS calls which
sense F11 and F12
When IBM introduced the extended keyboard with F11 and F12 keys, and
separated the numeric keypad from the arrow keys, it also introduced
an extended way of reading the keyboard with BIOS. The old way still
works, but doesn't recognize the extended keys.
Normally, Nansi tries to detect whether the extended keyboard BIOS
calls are available, and if so, uses them. However, by giving the /k
option you can force Nansi to use these calls even if Nansi doesn't
think they are there. This option is included for compatibility with
ANSI.SYS.
6.2. /X : tell Nansi to let you redefine the extended keys indepen-
dantly
IBM's extended keyboard BIOS calls added something new: they return
different scan codes for different keys with the same meaning. For
instance, they return 71 for the numeric keypad HOME key, but 224;71
for the gray HOME key. Nansi returns 71 when either of these keys are
pressed. However, the /X option causes these keys to be treated dif-
ferently during keyboard redefinition. For example, if you start
Nansi with the /X option, you can define just the gray HOME key to say
"dir/w" by sending the string ESC [224;71;"dir/w";13p
6.3. /S : tell Nansi to be secure, and disable keyboard redefini-
tion
Although it is nice to be able to redefine the keyboard with escape
sequences, it is a gaping security hole. To prevent trojan horse
attacks from messages in text files, archives, and programs downloaded
from the outside world, disable this feature by invoking Nansi with
the /s option in config.sys. For example,
DEVICE=NANSI.SYS /s /t54 /t55 /t56 /t57
This saves a few bytes of memory, too.
November 29, 1991
- 4 -
6.4. /Tnn : tell Nansi that video mode nn is a text mode
No two VGA cards seem to have the same set of video mode codes. The
same mode number can indicate a graphics mode on one card, and a text
mode on another card. Worse yet, BIOS can't tell you what kind of
mode it's in. This is a problem because Nansi gets its speed by
bypassing BIOS, which it can only do in text modes.
Nansi solves this dilemma by maintaining a 256-entry table, one entry
per possible video mode. By default, the table says that only modes
0, 1, 2, 3, and 7 are text modes. You can add new text modes with the
/t option. For instance, if modes D hex and 50 hex are text modes,
you would invoke Nansi as follows:
DEVICE=NANSI.SYS /t0D /t50
How to tell whether you need /t:
If your board is in a non-IBM text video mode (for instance, mode 50
hex), and you haven't added /t50 after NANSI.SYS in CONFIG.SYS, the
cursor will disappear after a CLS command, and the text output will be
sluggish; furthermore, if you turn on the graphics cursor (by TYPEing
the file GC.ON which came with NANSI), the beginning and end of every
text line will be garbled.
How to tell whether you don't need /t:
If you mistakenly specify a graphics mode with the /t option, the
display will be garbled while in that mode. Get back to normal by
typing MODE CO80 or rebooting, and remove the offending /t option from
config.sys.
November 29, 1991
- 5 -
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.
November 29, 1991
- 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.
November 29, 1991
- 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.
November 29, 1991
- 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.
November 29, 1991
- 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
November 29, 1991
- 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.
November 29, 1991
- 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.
November 29, 1991
- 12 -
8. Background - What does a console driver do, and how?
A console driver consists of subroutines which are called by MS-DOS.
MS-DOS itself is mostly just subroutines which can be called by appli-
cation programs.
Programs that want to display text on the screen can call the "Write"
subroutine provided by MS-DOS. This subroutine in turn calls the
"Write" subroutine of the console driver.
When you, for example, type
C> type foo.txt
COMMAND.COM uses the "Read" subroutine of MS-DOS to read the file
"foo.txt" from the disk; it then uses the "Write" subroutine of MS-DOS
with the file's contents. MS-DOS then calls the console driver's
"Write" subroutine, which finally puts the data up on the screen.
Both ANSI.SYS and NANSI.SYS use IBM Video BIOS to control the screen.
However, NANSI.SYS writes directly to the screen in text modes; this
allows much faster operation.
9. How to Display Text Quickly
Output to the screen via DOS is usually slow because characters are
sent one-at-a-time through several layers of software. Application
programs often call a DOS function for each character or line.
To avoid this overhead, application programs should write as many
characters per DOS call as possible (in C programs, this means using
setbuf(), fflush(), and buffered output).
Another problem is that application programs sometimes send line after
line of text, letting the cursor stay at the bottom of the screen.
This forces the console driver to scroll the entire screen up once for
each line displayed, which is rather expensive.
This can be fixed by having the application program clear the screen
and home the cursor after each page of output.
Finally, the biggest problem is that DOS calls the device driver once
or twice for each character written.
Fortunately, DOS can be told to pass the entire write request directly
to the device driver; this is called "raw" mode. The files RAW.C and
RAW.H, included in this package, provide an easy way to set and clear
"raw" mode, to turn break checking on and off, and to check for keys-
trokes when in raw mode.
Even if you follow all these rules, output with ANSI.SYS will still be
very slow, simply because IBM did a bad job designing BIOS, and
because ANSI.SYS was written with total disregard for performance.
NANSI.SYS, on the other hand, was written by a performance fanatic.
November 29, 1991
- 13 -
10. NANSI and Microsoft Windows
Microsoft Windows 1.x and 2.x allowed you to run command.com in a win-
dow, but did not give you access to NANSI.SYS. Windows 3.0 gives you
full access to NANSI.SYS, even when running command.com in a window
(wow!). However, you can only do this if you have a 386-based com-
puter (boo, hiss); on other computers, Windows runs command.com only
in full screen mode.
Under Microsoft Windows 3.0, if you write text to stdout in RAW mode,
the display is not refreshed until the end of the write; no intermedi-
ate scrolling is shown. I suspect this is because Windows doesn't
refresh the display until display memory hasn't been touched for a few
milliseconds.
11. New in version 3.3 of NANSI.SYS
Fixed bug that caused erratic behavior after ESC[p. Bug was present
in all prior versions of NANSI.
Fixed a few typos in documentation.
12. New in version 3.2 of NANSI.SYS
Can finally read F11 and F12!
New /K command-line option forces Nansi to use Extended Keyboard BIOS
calls if for some reason Nansi doesn't recognize the extended key-
board.
New /X command-line option lets user redefine "new" cursor motion keys
independently of "old" cursor motion keys.
Both of these switches are compatible with the switches of the same
name in ANSI.SYS.
13. New in version 3.1 of NANSI.SYS
A new escape sequence has been added to enable and disable the simu-
lated cursor in graphics mode (see SET MODE 99). The graphics cursor
is disabled by default.
Nansi can now sense options given on the DEVICE=NANSI.SYS line in
config.sys.
/S command-line option has been added to disable the keyboard redefin-
ition escape sequence. This closes up a big security loophole.
/T command-line option has been added to allow the user to tell Nansi
about nonstandard text video modes (see COMMAND-LINE OPTIONS). This
is important if you want to use non-IBM text modes properly, as Nansi
treats nonstandard modes as graphics by default, which results in
slower display.
November 29, 1991
- 14 -
14. New in version 3.0 of NANSI.SYS
Now obeys BIOS's idea of number of screen lines, when supported.
Works properly when on video pages greater than zero, too.
Supports 132-column displays.
Deleted Output Character Translation feature. It took up 260 bytes,
and nobody ever used it.
Fixed bug related to setting background color while in graphics mode.
No longer assumes AH is zero upon entry to driver.
November 29, 1991
- 15 -
15. Limitations in the current version of NANSI.SYS
Video modes are specified in hexadecimal on the command line, and in
decimal in escape sequences. This is a needless inconsistancy, but
since users' manuals usually specify the mode numbers in hex, it
shouldn't be too big a bother. You can convert a hexadecimal number
to decimal in BASIC with the print command. For example, from the DOS
prompt, typing
C:>basic
print &h7f
system
displays "127".
All parameter values must be between 0 and 255.
The maximum number of characters available for keyboard redefinition
is 500. Any single keyboard redefinition escape sequence must be
shorter than (500 - (total keyboard redefinition space already used))
bytes.
Insert and delete character do not work in graphics modes.
Graphics mode writing is slow. If this bothers you, try NNANSI, which
is someone else's modification of NANSI v2.2 to attack just this prob-
lem.
Does not support erase-to-end-of-screen and other useful functions.
Nansi determines whether the BIOS number-of-screen-lines variable is
supported by checking for an EGA card. There might be a better way.
Nansi only checks for an EGA or VGA card at startup time. If you have
two video cards installed, and one shows more text lines per screen
than the other, AND you switch between the cards without rebooting,
Nansi could conceivably become confused about the number of text lines
on the screen.
November 29, 1991