DX-Forth for MS-DOS ------------------- 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 Resident text file editor 1.10 Command-line interface 1.11 Machine code assembler 1.12 Increasing System space 1.13 Further suggestions 1.14 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 Search order 2.12 Compiler security 2.13 Exception handling 2.14 Exception codes 2.15 Key codes 1. Introduction 1.1 Overview DX-Forth 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. Features include: - ANS-FORTH Standard (FORTH-94) * - Fast direct-threaded code - Generate turnkey applications without compiler overhead - Fast floating point and trigonometric functions - Forth-94 file I/O - DOSLIB application library - Multitasking - ANS locals - Overlays for large applications - 8086/87 Forth assembler for CODE words - Full source code included * DX-FORTH 4 generally follows the FORTH-94 Standard but does not seek to be strictly compliant. 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. 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 their 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 Same as FORTH.EXE but includes software floating point and trigonometric functions. These increase the size of the kernel by approximately 3K bytes. DX.EXE FORTH-F.EXE with full-screen editor loaded. FORTH-C.EXE Same as FORTH-F.EXE but uses "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 functions (Forth calls them "words") in the dictionary, type WORDS Press any key to stop the display or 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 an 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 to delete the previous character, or escape key 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. key may be used to pause/resume the listing or 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 *.EXE you should see HELLO.EXE in the disk directory. 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 SED.SCR. The editor is automatically loaded and run by FORTH.EXE or FORTH-F.EXE by typing n SED 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 SED.SCR A>FORTH-F SED ( if no filetype is given .SCR is assumed ) Forth will boot-up with the message 'Using SED.SCR'. Alternately, open SED.SCR from within forth with USING SED 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 SED.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 LS ( -- ) (S)wap screenfiles and (L)ist Line 0 of each screen is called the index line and traditionally contains a comment indicating the contents of the screen. Typing 0 QX displays a 'quick index' of 60 screens beginning at screen 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. But before doing that you may prefer to use the name EDIT instead of SED. That's easily done by creating a synonym e.g. AKA SED EDIT You can now use either SED or EDIT to invoke the screen editor. Let's finish saving our custom version of DX-Forth to disk. SAVE DX.EXE ( if no filetype is given .EXE is assumed ) Note: DX-Forth comes supplied with DX.EXE so you can omit the above step if you wish. For details on using the editor, refer to the SED.TXT documentation file. 1.9 Resident text file editor DX-Forth includes TED - a simple text file editor. As with the screen editor, text source files may be edited without leaving the forth environment. See TED.TXT for further information. 1.10 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.11 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.12 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. E.g. To remove TOOLS type the following: CHECKING OFF FORGET -TOOLS CHECKING ON 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.13 Further suggestions If you have worked your way through the previous sections, you now know your way around DX-Forth - how to 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 which is unfamiliar, find its definition in the Forth-94 Standard, 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.14 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 name space" Header dictionary full. "stack?" Data stack under/overflow. "r-stack?" Return stack under/overflow. "f-stack?" Floating point stack under/overflow. "invalid chain" Illegal CHAIN argument. See glossary. 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. "HOLD buffer overflow" The string being built in the HOLD buffer exceeded the maximum size. "uninitiated DEFER" A DEFERed word was defined but never initialized with IS. "exception = [n]" Exception error code n was executed. See section 2.14 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 uses FORTH-94 disk file management. 2.2 Application and System words When a word is compiled into DX-Forth, it is added to either the Application dictionary or the System dictionary. The above suggests that DX-Forth uses two dictionaries. In reality, there is 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 5Ch and 80h (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, 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. See #USER in the glossary. 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 as needed. 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 ACCEPT SOUND The current action of a deferred word may be obtained using: ' >BODY @ ( "name" -- xt ) or ADDR @ ( "name" -- xt ) 2.11 Search order The dictionary search order is CONTEXT CURRENT FORTH where each represents a vocabulary or "wordlist". Complex search orders are possible using the CHAIN command. 2.12 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.13 Exception handling CATCH THROW provide a mechanism for handling errors conditions within a program. It is recommended that 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.14 Exception codes DX-Forth implements only a subset of ANS-FORTH Standard exception codes. Codes in the range -257 to -511 are reserved for DOS related errors. DX-Forth exception codes: 0 no error -1 ABORT -2 ABORT" -256 reserved -257 to -511 DOS error code The correlation between DOS error code and DX-Forth exception code is given below: Forth DOS 0 0 no error -511 1 invalid function number -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 e.g. disk full Note: To convert an exception code in the range -257 to -511 to its corresponding DOS error code, use: 255 AND 2.15 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