DX-Forth 3
----------

This is the documentation for DX-Forth.  It is divided into two parts:

- A walk-through that introduces new users (even those without
  previous Forth experience) to a few concepts and illustrates some of
  DX-Forth's special features.  However, no attempt is made to teach
  Forth - for this, get hold of an introductory text such as:

    "Forth Programmer's Handbook", Conklin & Rather
    "Programming Forth", Stephen Pelc
    "And so Forth...", J.L. Bezemer

- A technical section for prospective DX-Forth programmers.  It assumes
  the reader has some familiarity with the Forth language programming.


Contents:
---------

 1.  Introduction

 1.1   Overview
 1.2   Distribution files
 1.3   Acknowledgments
 1.4   Legal
 1.5   Installation
 1.6   Getting started
 1.7   Source files
 1.8   Screen editor
 1.9   Command-line interface
 1.10  Machine code assembler
 1.11  Increasing System space
 1.12  Further suggestions
 1.13  Error messages

 2.  Programming reference

 2.1   File system
 2.2   Application and System words
 2.3   Executing applications
 2.4   No Warm-Boot option
 2.5   User Patch area
 2.6   Overlays
 2.7   Multitasking
 2.8   User variables
 2.9   System vectors
 2.10  Deferred words
 2.11  Compiler security
 2.12  Exception handling
 2.13  Exception codes
 2.14  Key codes


1.  Introduction

1.1  Overview

DX-Forth 3 is a Forth language compiler and development system for
MS-DOS 2.x and compatible disk operating systems.  It is intended to
be a complete, easy to use, programming tool for the creation of DOS
applications.

DX-Forth's features include:

 - ANS FORTH Standard (FORTH-94) *
 - Fast direct-threaded code
 - Generate turnkey applications without compiler overhead
 - Floating point and trigonometric functions
 - Many extensions
 - Multitasking
 - Overlays for large applications
 - Forth assembler for CODE words
 - Full source code included

* DX-Forth 3 currently lacks appropriate documentation to qualify for
  ANS FORTH compliance.  Some ANS optional wordset functions may also
  be missing.


1.2  Distribution files

See FILES.TXT


1.3  Acknowledgments

No software is written in a vacuum; therefore the author wishes to
gratefully acknowledge all those in the CP/M and Forth communities who
have generously made their source code available for public scrutiny.
Without these to serve as a starting point and source for ideas,
DX-Forth would not have been written.


1.4  Legal

DX-Forth and all the files in this distribution (apart from excerpts
taken from the FORTH-83 and ANS FORTH documents) are hereby placed into
the PUBLIC DOMAIN by the author.  As a public domain work, no copyright
restrictions apply or may be subsequently imposed.

DX-Forth is an experimental software and is provided without support or
warranty.  The author makes no guarantee as to fitness for purpose, nor
assumes liability for any error, omission, damage or loss caused by the
use of DX-Forth.  Anyone wishing to use this software does so entirely
at his or her own risk.


1.5  Installation

Not applicable to the MS-DOS version of DX-Forth.


1.6  Getting started

Several versions of the DX-Forth compiler are available:

FORTH.EXE      The forth compiler kernel.  It includes everything
               required to load and compile forth source files.

FORTH-F.EXE    As for FORTH.EXE but includes software floating point
               and trigonometric functions.  These increase the size
               of the kernel by approximately 2.5K.

DX.EXE         FORTH-F.EXE with the screenfile editor loaded.

FORTH-C.EXE    As for FORTH-F.EXE but uses a "common stack" model
               i.e. floating point items are placed on the data stack
               rather than on a separate stack.

               Note: FORTH-C.EXE is not in the distribution but can
               be generated by rebuilding the system with FMAKE.BAT

First, enter forth by executing FORTH.EXE (or FORTH-F.EXE or DX.EXE)
from the DOS prompt e.g.

     A> FORTH

You will be greeted with DX-Forth's start-up screen showing the
version number and compilation date.  If you executed FORTH-F.EXE
you will also be informed that the floating point functions are
available.

Now type

     FYI

"For Your Information".  It displays information about the current
forth environment including dictionary size, vocabularies, logged
drive and open screenfiles.

To see the names of all forth functions in the dictionary, type

     WORDS

Press any key to stop the display or <space> to pause.  If you want
to see only word names that contain the sequence 'MOD' then type

     WORDS MOD

You will notice some words are accompanied by a colour attribute.

The bold attribute (normally blue) indicates the word resides in the
SYSTEM dictionary.  All other words reside in the APPLICATION
dictionary.  If the brightness attribute is on, it indicates the word
is IMMEDIATE.  Attributes are accumulative.  Thus a word that appears
in bold and has the brightness toggled is both a SYSTEM word and
IMMEDIATE.

Forth users will be familiar with IMMEDIATE words.  SYSTEM words are
peculiar to DX-Forth and are explained in the programming section.

You can capture screen output to a printer e.g.

     PRINTER  WORDS

then restore output to the console with

     CONSOLE

Adding a new function to forth's dictionary is easy.  Let's try the
ubiquitous 'hello world' program.  Type the following paying
attention to the space between  ."  and  Hello .

     : HELLO-WORLD ." Hello world" ;

If you make a mistake entering text you may use the backspace key
<BS> to delete the previous character, or escape key <ESC> to erase
the entire line.

Spaces are important to forth as they distinguish elements within a
forth statement.  Forth syntax is very simple - a forth statement
consists of functions or numbers separated by one or more spaces.
In the example above  :  ."  ;  each represents a distinct forth
function.

You have just compiled a new function or 'word' called HELLO-WORLD.
Now type

     WORDS

This lists all words in the current vocabulary.  <SPACE> may be used
to pause/resume the listing or <ESC> to stop.  Note that HELLO-WORLD
appears at the top of the list since it was the most recent addition
to the dictionary.

Now execute HELLO-WORLD by typing its name.  It should display the
text

     Hello world

Should you need to enter a quote character '"' within a quote-
delimited string, this may be done by entering it twice e.g.

     S" this text includes ""quote"" marks" CR TYPE

produces

     this text includes "quote" marks

Removing a word from the dictionary is even easier.  Type

     FORGET HELLO-WORLD

This discards HELLO-WORLD ... and any forth word you defined after
it!  Use WORDS to check that HELLO-WORLD was deleted.

Perhaps you would like to save HELLO-WORLD as your first turnkey DOS
application?  To do this, re-enter the HELLO-WORLD definition if you
discarded it.  Once you have tested it to make sure that it works as
expected, save it to disk with

     TURNKEY HELLO-WORLD HELLO

If you now type  DIR  you should see HELLO.EXE in the disk directory.
Note: you may optionally specify a filename with DIR.  Wildcards are
accepted e.g. DIR *.EXE

Now - the most important thing you should know - how to get out of
forth and back to DOS.  Do this now by typing

     BYE

Now that you are back in DOS you may try out your new HELLO program.
You will note that HELLO.EXE executable is considerably smaller in
size than the FORTH.EXE used to create it.  This illustrates one of
DX-Forth's features - turnkey applications may be saved without the
compiler and word headers.  The benefit is that applications take
less disk space, are quicker to load, and have more free memory
available to them when they execute.


1.7  Source files

Forth has traditionally used 'blocks' for mass storage.  Blocks may
hold any type of data including text.  In DX-Forth, blocks are used
primarily to store forth program source.  Each 'screen' (the name
given to blocks that hold forth text) represents 1024 bytes of data
organized as 16 lines of 64 characters each.  DX-Forth screens are
saved as conventional DOS disk files and are distinguished by a .SCR
filetype (some forths use .BLK as the filetype).

DX-Forth also supports forth source in standard text files.  To load
and compile such a file, use:

     INCLUDE filename[.F]

If no filetype is given then .F is assumed.  Another form is:

     S" filename[.F]" INCLUDED  ( Forth-94 Standard )

Forth source files (text or screen) may be nested to the default
maximum of 6.


1.8  Screen editor

Screen files require a special text editor.  DX-Forth includes such
an editor in the form of EDITOR.SCR.  The editor is automatically
loaded and run by FORTH.EXE or FORTH-F.EXE by typing

     n EDIT

where n is the screen number to be edited.  If n is omitted and the
data stack is empty then the editor will use the last LISTed, or if
an error occured, the screen that caused the error.

If you have a slow computer or are working from a floppy disk then
it will be convenient to save a version of forth where the editor is
permanently loaded.  Let's do this now.

From the DOS prompt, load forth and open EDITOR.SCR

     A>FORTH-F EDITOR  ( if no filetype is given .SCR is assumed )

Forth will boot-up with the message 'Using EDITOR.SCR'.  Alternately,
open EDITOR.SCR from within forth with

     USING EDITOR

In DX-FORTH the most recently opened screenfile is termed the
'current' file and all screen and block commands operate on it.
CLOSE closes the 'current' screenfile.  SWAP-FILE permits users
to switch between two open screenfiles.

Once EDITOR.SCR has been opened, you may view the contents of the
file with the LIST command.  0 LIST  displays screen 0,  1 LIST
displays screen 1 etc.  The following shortcuts are provided:

   L  ( -- )   (L)ist the current screen
   N  ( -- )   list the (N)ext screen
   B  ( -- )   list the previous screen i.e. (B)ack

Line 0 of each screen is called the index line and it traditionally
contains a comment indicating the contents of the screen.  Typing

     0 QX

displays a 'quick index' of 60 screens starting at 0.

To list screens to a printer one could use

     PRINTER  0 LIST  1 LIST  2 LIST  CONSOLE

or more simply

     0 2 SHOW

which prints screens 0 to 2 at three screens per page.

To print all the screens in a source file, type

     LISTING

Now compile the editor into the dictionary with

     1 LOAD

Once loading has completed, typing WORDS will show new commands have
been added to the dictionary.  In addition, FYI reveals some system
memory has been consumed and there is now a new vocabulary in addition
to FORTH - the EDITOR vocabulary.  If you are curious to see what is
in the EDITOR vocabulary, type

     EDITOR WORDS

Now that the editor has been loaded, let's make it permanent by saving
it and the current contents of the forth dictionary as a new executable

     SAVE DX.EXE  ( if no filetype is given .EXE is assumed )

(Note: The supplied executable DX.EXE has the screen editor preloaded
so you may omit the above step.)

For details on using the editor, refer to the EDITOR.TXT documentation
file.


1.9  Command-line interface

DX-Forth allows file opening and command processing from the DOS command
line.  The syntax is:

     A:> FORTH  item1 item2 ... itemn

where:

   item1           filename to be opened (assumed suffix is .SCR)
   item2...itemn   forth command(s) to be executed

Once the command sequence is completed, the DX-Forth sign-on message
appears and control passes to the user.

To bypass file opening, replace item1 with a '-' character.

Including BYE at the end of the command sequence will cause an immediate
return to DOS.  This can be very useful and allows use of the forth
compiler within DOS batch files.


1.10  Machine code assembler

Although threaded-code forth generates code that is compact and quite
fast - up to 10 times faster than interpreted BASIC - there may be
occasion when the full speed of machine code is required.

The assembler provided with DX-Forth allows writing of forth 'code'
words.  Code words are simply machine language routines that end with
a jump to NEXT.  Documentation for the assembler may be found in the
file ASM.TXT.


1.11  Increasing System space

The FORTH and FORTH-F executables are supplied with tools and assembler
installed.  If either are not required, the System dictionary space may
be increased accordingly.  To facilitate this, two marker words are
provided:

 -TOOLS  removes the tools and all subsequent words.
 -ASM    removes the assembler and all subsequently defined words.

Note: As of DX-Forth 3.3, word headers are stored in their own segment
rather than in the System dictionary.  Consequently there is now much
less need to conserve System dictionary space.


1.12  Further suggestions

If you have worked your way through the previous sections - you now
know how to look around DX-Forth, list and compile forth screen files,
save new versions of forth and create turnkey applications.

If this is your first encounter with forth, I hope this brief tour
through DX-Forth will encourage you to look further.  Get a book on
forth and learn it - forth really is EASY!

The best way to learn forth (or any language) is by studying examples.
Several simple applications have been provided with DX-Forth.  When
you encounter a forth word with which you are unfamiliar, find its
definition in the Forth-94 Standard (draft version freely available
on the internet) or the DX-Forth glossary if not a Standard word.

A sample filecopy program FCOPY is provided in source form.  As well
as illustrating a complete forth application, it also serves as a
primer on using DX-Forth's file functions.  It will show you how to:

  get arguments from the DOS command line
  create file-handles and assign file-buffers
  open disk files
  read data from a disk file
  write data to a disk file
  close disk files
  handle errors

Routines may be extracted for your own use or the entire program can
serve as the basis for a more complex one.

NEWAPP.SCR is a skeletal program that allows users to quickly develop
DOS applications.  Using DOSLIB.SCR it provides access to DOS functions
and routine tasks such as command-line parsing and buffered I/O.  See
NEWAPP.TXT for details.


1.13  Error messages

Compiler error messages
-----------------------
"block out of range"          Attempt to access a block past end of
                              file.
"block r/w error"             Error encountered during a block read or
                              write operation.
"no file open"                File operation was requested but no file
                              was open.
"can't open file"             File not found or write-protected.
"can't create file"           Existing file write-protected or disk full.
"can't delete file"           File not found or write-protected.
"can't resize file"           File not found or write-protected.
"can't rename file"           File exists, not found or write-protected.
"can't save file"             Error occurred during save (probably disk
                              full).
"compilation only"            Use only during compilation.
"execution only"              Use only during execution.
"loading only"                Use only during loading.
"definition unbalanced"       Definition is not properly formed e.g.
                              conditional statements (IF ELSE THEN etc)
                              were incorrectly used or the data stack level
                              changed.
"is protected"                Word is located in protected dictionary.
"is alias"                    Operation on alias not allowed e.g. FORGET.
"invalid name"                Word name length outside the range 1 to 31
                              characters.
"specify filename"            A filename is required but none was given.
"too many files"              Exceeded maximum number of open source files.
"is redefined"                Definition with the same name already exists.
                              Note: this is a warning - not an error.
"is system"                   A System word is being compiled into the
                              Application dictionary. See section 2.2
                              Note: aliases will be displayed using the
                              primary name.
"is undefined"                Word could not be found in the dictionary
                              using the current search order, or was not
                              a valid number.
"no header space"             Header dictionary full.
"stack?"                      Data stack under/overflow.
"r-stack?"                    Return stack under/overflow.
"f-stack?"                    Floating point stack under/overflow.

Run-time error messages
-----------------------
Apart from those listed below, DX-Forth does not perform run-time error
checking.  It is the responsibility of the application programmer to
include error checking appropriate to the task.

"numeric buffer overflow"     The string being built in the pictured numeric
                              output buffer exceeded the buffer size.
"undefined vector"            A DEFERed word was defined but never
                              initialized with IS.
"exception = [n]"             Exception error code n was executed. See
                              section 2.12 for a list of system and DOS
                              codes. Application-defined error codes are
                              typically represented by a positive number.
"no data space"               Data space or dictionary full.
"not enough RAM"              Insufficient DOS memory.
"wrong DOS version"           Requires DOS version 2.x or later.

Assembler error messages
------------------------
"definition unbalanced"       Definition is not properly formed.
"duplicate label"             Label number was previously used.
"execution only"              Word may be used only during execution.
"invalid label"               Incorrect label number or too many labels
                              used.
"branch out of range"         Exceeded the range of a short relative
                              branch (128 bytes).
"too many references"         Exceeded the maximum number of forward
                              references to labels.
"unresolved reference"        A label was referenced but never defined.


2.  Programming reference

This section contains programming and technical information specific
to DX-Forth.


2.1  File system

DX-Forth 2 onwards use ANS FORTH disk file management.


2.2  Application and System words

When a word is compiled into DX-Forth, it added to either the
Application dictionary or the System dictionary.

The above implies that DX-Forth uses two dictionaries.  In actuality,
there is only one dictionary physically divided into two parts.  It
is this physical partitioning that enables DX-Forth to generate small
turnkey applications, free of compiler overhead.

Executing the words APPLICATION or SYSTEM causes all subsequent
definitions to be compiled into the corresponding dictionary segment.
The word FYI shows the current compilation dictionary and statistics.

The 'application' dictionary contains words (less their headers) that
are available for use by either TURNKEY applications or by the forth
compiler.

The 'system' dictionary contains words that are used exclusively by the
forth compiler.  Headers of forth words are located in their own
segment.  System words and headers are NOT saved during the generation
of TURNKEY applications.

To see which words are System or Application, type WORDS.  If the word
is displayed with a bold attribute (usually blue), then it resides in
the System dictionary otherwise it resides in the Application dictionary.

                      Compiling SYSTEM words

Under no circumstances should an application compiled with TURNKEY be
allowed to execute a System word.  Attempting to do so will result in
unpredictable behaviour and failure of the application.

To assist users from inadvertently compiling System words into TURNKEY
applications, DX-Forth will issue a warning message should this be
attempted (assuming WARNING has not been disabled).

Applications saved with TURNKEY-SYSTEM may safely ignore System warnings
as the entire forth dictionary including compiler and headers is saved.

                      Spurious SYSTEM warnings

It is possible to receive a System warning message that is neither an
error condition, nor results in failure of the turnkey application.
Typically it occurs during the compilation of defining words e.g.

   APPLICATION  WARNING ON

   : BYTE-CONSTANT
     CREATE C,  DOES> C@  ;

Compiling the above causes the following message to appear

   "CREATE is system  C, is system  (;CODE) is system"

DX-Forth is warning the user that words CREATE C, (;CODE) are System
words and are being compiled into the Application dictionary.

The reason this will NOT cause the application to fail is that the
words between CREATE and DOES> inclusive represent the "compiling" part
of the defining word.  This part is executed only during compilation
- never when the application is run.

To disable spurious System warning messages one may use WARNING OFF or
precede the offending definition with -? which will turn off WARNING
for that definition only.

Tip: For an alternative way of creating defining words which avoids the
peculiarities of CREATE ... DOES> see BUILD in the glossary.


2.3  Executing applications

Applications can often be fully tested and debugged from within the
forth environment.  However when they are eventually TURNKEYed and
executed from the DOS command-line, there will be differences of which
the programmer should be aware:

 - The amount of unused memory available to an application will vary
   depending on whether it is run from within forth or from the DOS
   command-line.  UNUSED may be used by applications to determine how
   much free memory is currently available.

 - SET-LIMIT allows the programmer to specify a top-of-memory address
   or LIMIT for the application.  The effect of SET-LIMIT is postponed
   until the turnkey application is executed.

 - The memory region at $5C and $80 (DOS default FCB and DMA buffer) is
   overwritten by the forth compiler during DIR, RENAME, INCLUDE etc.
   Otherwise, this region is unaffected and may be used by turnkey
   applications to interrogate the DOS command-line.


2.4  No Warm-Boot option

Not applicable to the MS-DOS version of DX-Forth.


2.5  User patch area

Not applicable to the MS-DOS version of DX-Forth.


2.6  Overlays

As DX-Forth resides in a single 64K segment (excluding headers), there
will be a limit on the size of applications that may be compiled.  If
larger applications are needed this can often be achieved with overlays.

Using overlays will require a little more planning of the application.
Some important aspects the programmer must consider are listed below.

 - The resident part of the program must ensure that the correct overlay
   is in memory before executing an overlay word.

 - An overlay must not execute words that exist in other overlays.

 - An overlay must not execute words in the resident part, which in
   turn, execute words in a different overlay.

See OVERLAY.SCR for a demonstration of a simple overlay system.


2.7  Multitasking

A co-operative 'round robin' multi-tasker is provided with DX-Forth.
It permits an application to have several tasks run concurrently.

Refer to the multitasker documentation MULTI.TXT and the source file
MULTI.SCR for further details.


2.8  User variables

In common with most forth systems, DX-Forth has 'user' variables.  User
variables occupy a common region in memory.  They hold various system
and boot up values and are also used for multi-tasking applications.

In DX-Forth the default size of the user area is 128 bytes.  User
variables are defined as follows:

   44 USER VAR1
   46 USER VAR2
   50 USER VAR3 ...

The number preceding USER is the offset in bytes of the variable from
the user base address (given by the variable UP).  Offsets beginning
with 44 decimal are available to applications.  In the above example,
VAR1 occupies 2 bytes (1 cell) at offset 44, VAR2 occupies 4 bytes
(2 cells) at offset 46 etc.

As with normal variables, executing the name of a user variable returns
its address.  Unlike normal variables, the literal value of the address
may differ at compile and run time.  In multi-tasking applications the
contents of a user variable may differ between tasks.

Predefined user variables in DX-Forth are:

S0  R0  DP  VOC-LINK  FS0  DPH  DPL  BASE  OUT  CATCHER


2.9  System vectors

SYS-VEC returns the address of the system vector and parameter table.
The table contains default values used by the system.  Applications
may alter the vectors and values in the table on an as needs basis.
Note that some changes will not take effect until COLD is executed.
Refer to SYS-VEC in the glossary document for details.


2.10 Deferred words

The following is a list of DX-Forth words built with DEFER IS .

   BEEP  FIND  MS  PAUSE  REFILL  SOUND  ACCEPT

The current action of a deferred word may be obtained using:

   ' >BODY @  ( "name" -- xt )  or
   ADDR @     ( "name" -- xt )


2.11 Compiler security

DX-Forth includes compiler security to detect malformed definitions
and constructs e.g. failing to terminate an IF section with a THEN.

Compiler security words used by DX-Forth are listed in the glossary.
How and when to use them is a topic of its own and is not discussed
here (see the DX-Forth source files for examples of use).

It is sometimes useful to disable balance checking in high-level or
code definitions.  This may be done by setting variable CHECKING
to false (i.e. zero).


2.12  Exception handling

THROW and CATCH provide a mechanism for handling errors conditions
within a program.

It is recommended applications use only positive THROW codes.
Exception values in the range -1 to -4095 are reserved by ANS FORTH
for use by the system.  See: "Exception codes"


2.13  Exception codes

DX-Forth implements only a subset of ANS FORTH Standard exception
codes.  Codes in the range -257 to -511 are reserved for MS-DOS
related errors.

DX-Forth exception codes:

   0             no error
  -1             ABORT
  -2             ABORT"
  -256           reserved
  -257 to -511   MS-DOS error number

The correlation between DX-Forth exception code and MS-DOS error
number is given below:

 Exception  MS-DOS
     0        0     no error
   -511       1     function number invalid
   -510       2     file not found
   -509       3     path not found
   -508       4     too many open files
   -507       5     access denied
   -506       6     invalid handle
   -505       7     memory control block destroyed
   -504       8     insufficient memory
   -503       9     memory block address invalid
   -502      10     environment invalid
   -501      11     format invalid
   -499      12     access code invalid
   -498      13     data invalid
   -497      14     reserved
   -496      15     invalid drive
   -495      16     attempted to remove current directory
   -494      17     not same device
   -493      18     no more files
    ...     ...
   -257     255     unspecified error

Note: To convert an exception code in the range -257 to -511 to its
corresponding MS-DOS error number, use: 255 AND


2.14  Key codes

DX-Forth supports IBM-PC extended keystrokes and enhanced keyboards.
For ease of use, two-byte extended keystrokes are returned as single
values.  The codes below are for an enhanced 101-key US keyboard.
Ascii codes 32-126 are not shown.

   Key     Code           Key    Code          Key      Code
   ----    -----          ----   -----         ----     ------
           00 0           Alt F  A1 161        Ctrl F7  E4  228
   Ctrl A  01 1           Alt G  A2 162        Ctrl F8  E5  229
   Ctrl B  02 2           Alt H  A3 163        Ctrl F9  E6  230
   Ctrl C  03 3           Alt J  A4 164       Ctrl F10  E7  231
   Ctrl D  04 4           Alt K  A5 165         Alt F1  E8  232
   Ctrl E  05 5           Alt L  A6 166         Alt F2  E9  233
   Ctrl F  06 6           Alt ;  A7 167         Alt F3  EA  234
   Ctrl G  07 7           Alt '  A8 168         Alt F4  EB  235
   Ctrl H  08 8           Alt `  A9 169         Alt F5  EC  236
   Ctrl I  09 9                  AA 170         Alt F6  ED  237
   Ctrl J  0A 10          Alt \  AB 171         Alt F7  EE  238
   Ctrl K  0B 11          Alt Z  AC 172         Alt F8  EF  239
   Ctrl L  0C 12          Alt X  AD 173         Alt F9  F0  240
   Ctrl M  0D 13          Alt C  AE 174        Alt F10  F1  241
   Ctrl N  0E 14          Alt V  AF 175     Ctrl Prtsc  F2  242
   Ctrl O  0F 15          Alt B  B0 176      Ctrl Left  F3  243
   Ctrl P  10 16          Alt N  B1 177     Ctrl Right  F4  244
   Ctrl Q  11 17          Alt M  B2 178       Ctrl End  F5  245
   Ctrl R  12 18          Alt ,  B3 179      Ctrl PgDn  F6  246
   Ctrl S  13 19          Alt .  B4 180      Ctrl Home  F7  247
   Ctrl T  14 20          Alt /  B5 181          Alt 1  F8  248
   Ctrl U  15 21                 B6 182          Alt 2  F9  249
   Ctrl V  16 22        * Alt *  B7 183          Alt 3  FA  250
   Ctrl W  17 23                 B8 184          Alt 4  FB  251
   Ctrl X  18 24                 B9 185          Alt 5  FC  252
   Ctrl Y  19 25                 BA 186          Alt 6  FD  253
   Ctrl Z  1A 26             F1  BB 187          Alt 7  FE  254
   Ctrl [  1B 27             F2  BC 188          Alt 8  FF  255
   Ctrl \  1C 28             F3  BD 189          Alt 9  100 256
   Ctrl ]  1D 29             F4  BE 190          Alt 0  101 257
   Ctrl ^  1E 30             F5  BF 191          Alt -  102 258
   Ctrl _  1F 31             F6  C0 192          Alt =  103 259
                             F7  C1 193      Ctrl PgUp  104 260
  Ctrl <-  7F 127            F8  C2 194            F11  105 261
           80 128            F9  C3 195            F12  106 262
  Alt Esc  81 129           F10  C4 196      Shift F11  107 263
           82 130                C5 197      Shift F12  108 264
           83 131                C6 198       Ctrl F11  109 265
           84 132          Home  C7 199       Ctrl F12  10A 266
           85 133            Up  C8 200        Alt F11  10B 267
           86 134          PgUp  C9 201        Alt F12  10C 268
           87 135       * Alt -  CA 202        Ctrl Up  10D 269
           88 136          Left  CB 203       * Ctrl -  10E 270
           89 137           * 5  CC 204       * Ctrl _  10F 271
           8A 138         Right  CD 205                 110 272
           8B 139       * Alt +  CE 206      Ctrl Down  111 273
           8C 140           End  CF 207       Ctrl Ins  112 274
           8D 141          Down  D0 208       Ctrl Del  113 275
   Alt <-  8E 142          PgDn  D1 209       Ctrl Tab  114 276
Shift Tab  8F 143           Ins  D2 210         Ctrl /  115 277
    Alt Q  90 144           Del  D3 211       * Ctrl *  116 278
    Alt W  91 145      Shift F1  D4 212       Alt Home  117 279
    Alt E  92 146      Shift F2  D5 213         Alt Up  118 280
    Alt R  93 147      Shift F3  D6 214       Alt PgUp  119 281
    Alt T  94 148      Shift F4  D7 215                 11A 282
    Alt Y  95 149      Shift F5  D8 216       Alt Left  11B 283
    Alt U  96 150      Shift F6  D9 217                 11C 284
    Alt I  97 151      Shift F7  DA 218      Alt Right  11D 285
    Alt O  98 152      Shift F8  DB 219                 11E 286
    Alt P  99 153      Shift F9  DC 220        Alt End  11F 287
    Alt [  9A 154     Shift F10  DD 221       Alt Down  120 288
    Alt ]  9B 155       Ctrl F1  DE 222       Alt PgDn  121 289
Alt Enter  9C 156       Ctrl F2  DF 223        Alt Ins  122 290
           9D 157       Ctrl F3  E0 224        Alt Del  123 291
    Alt A  9E 158       Ctrl F4  E1 225        * Alt /  124 292
    Alt S  9F 159       Ctrl F5  E2 226        Alt Tab  125 293
    Alt D  A0 160       Ctrl F6  E3 227    * Alt Enter  126 294

(*) on keypad

Note:

 - Codes 261 and above are only available on AT-class machines
   fitted with an enhanced keyboard

 - DOS versions prior to 4.0 do not support enhanced keys
   irrespective of the hardware

