home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 5 / ctrom5b.zip / ctrom5b / DOS / UTILITY / DIVERSEN / STFKEY41 / STUFFKEY.DOC < prev    next >
Text File  |  1995-01-05  |  47KB  |  1,225 lines

  1.                             Documentation
  2.                                  for
  3.                     STUFFIT 3.21 / STUFFKEY 4.10
  4.              ------------------------------------------
  5.           Stuffit Copyright (c) Terje Mathison 1990 - 1992
  6.        Stuffkey Enhancements Copyright (c) Juergen Geist 1992
  7.       Stuffkey 4.10 Enhancements Copyright (c) Mike Smith 1995
  8.        ------------------------------------------------------
  9.          Although copyrighted, the described programs are a
  10.                            'labor of love'
  11.                         and completely free!
  12.  
  13.  
  14. Stuffkey.doc Last updated by Mike Smith 1995 January 5.
  15.      Stuffkey 4.10 has the following enhancements over 4.0
  16.      -    {KeyOn}/{KeyOff} allows you to turn monitoring of keyboard
  17.           activity on and off to reset +{Wait}. Also affects
  18.           ={AtTime} and ~{Timeout}.
  19.  
  20. Stuffkey.doc Last updated by Juergen Geist 1992 November 16.
  21.      Stuffkey 4.00 has the following enhancements over 3.30
  22.      -    {IfSucc}/{Else}/{Endif} logic using ~{Timeout} on F{Find}
  23.           and P{Prompt} commands.
  24.      -    A {Stop} command.
  25.      -    Improved error message pointers.
  26.  
  27. Stuffkey.doc Last updated by Juergen Geist 1992 October 17.
  28.      Stuffit  3.21 was written by Terje Mathison. 
  29.      Stuffkey 3.30, by Juergen Geist, is Terje's code with the
  30.      following enhancements:
  31.       -   Error messages including error location pointer.
  32.       -   Improved background time handling in Windows, Desqview,
  33.           etc.
  34.       -   Timer resolution down to timer ticks, 1/18 sec.
  35.       -   A time out feature for Prompt and Find commands; the
  36.           first step to adding If/Then/Else login.
  37.       -   A simplified Prompt command, i.e.: p"text".
  38.      It is hoped that Terje will incorporate these mods; to avoid
  39.      confusion until/if he does, Stuffkey will exist. All Stuffkey
  40.      changes are documented here and in the .asm file. The 'zip'
  41.      file should contain both versions of the .asm and .com files.
  42.  
  43. StuffIt.Doc  Last-1 update by Roedy Green 1992 June 21
  44.                          Table of Contents
  45.                           -----------------
  46.           ** To be created soon!
  47. PURPOSE
  48. -------
  49.  
  50. Stuffit 3.21 is a utility that automates the keyboard.  You can
  51. provide a script of keystrokes and Stuffit will automatically
  52. type them into your application programs.  What makes Stuffit
  53. different from other similar keyboard macro programs is:
  54.  
  55.   1. The keyboard remains fully functional the entire time
  56.      for additional manual input or correction.
  57.  
  58.   2. Stuffit works with intractable programs that throw away
  59.      keystrokes, bypass DOS etc.
  60.  
  61.   3. Stuffit watches the screen. It does not just type
  62.      blindly.
  63.  
  64.   4  Stuffkey 4.0 supports if/else/endif logic based on what it
  65.      finds on the screen.
  66.  
  67.   5. Stuffit can handle large scripts, up to 64K.
  68.  
  69.   6. Stuffit lets you generate more possible keystroke
  70.      chords than other similar products.
  71.  
  72.   7. Assembler source code is provided, giving you the
  73.      option of adding new features to the program.
  74. COMMAND LINE PARAMETERS IN A NUTSHELL
  75.  
  76. +0 or +        Delay until the application has used up all the
  77.                keystrokes in the type-ahead buffer.  This is
  78.                useful for applications that throw away keystrokes
  79.                fed to it too quickly.  This is also a handy way
  80.                to flush any pending (uneaten) codes from a
  81.                previous invocation of StuffIt. e.g.: StuffIt +0
  82.                empties StuffIt's internal buffer. Note + all
  83.                by itself defaults to +0.
  84.  
  85. +hh:mm:ss      time delay. (hours and minutes optional) +4 means
  86.                wait 4 seconds (must be 0..59).  +2:4 means wait 2
  87.                minutes and 4 seconds.  +5:: means wait 5 hours.
  88.                Represented internally as {Wait}.  Often you want
  89.                a +5 or so at the start of your script to give the
  90.                program you are stuffing 5 seconds to load and get
  91.                ready for a keystroke.  The timing starts relative
  92.                to when STUFFIT runs, not from when the following
  93.                application requests its first keystroke.
  94.  
  95. +.tt           time delay as above, but in timer ticks, or
  96.                1/18 second resolution. tt can range from 1 to
  97.                18. Note this can't be mixed with hh:mm:ss,
  98.                etc. Useful when you need just a bit of delay
  99.                between keystrokes. +.6 will delay 1/3 second.
  100.                (**-Stuffkey-**)
  101.  
  102. =hh:mm:ss      delay until a specific time of day (24 hour
  103.                format) (hours and minutes optional).  =16:00:00
  104.                means wait till 4 PM.  =00:00:00 means wait till
  105.                midnight.  =0 also means wait till midnight.
  106.                Represented internally as {AtTime}.  Be careful!
  107.                =04:00 would mean 4 minutes after midnight!
  108.  
  109. ~hh:mm:ss      {TimeOut} next function, i.e., {Prompt}, {Find} in
  110.                supplied time. Timer tick format is ok. i.e. ~.15.
  111.                This allows script to continue on a "not found"
  112.                condition. Stuffkey V.4.00 adds the ability to test
  113.                the results of P {Prompt} and F {Find} commands. See
  114.                {IfSucc}, {Else} and {Endif} for details.
  115.                (**-Stuffkey-**).
  116.  
  117. nn             stuff a given character code e.g. 27 for Escape,
  118.                13 for Enter Only ASCII decimal numerics are
  119.                accepted.  See ASCII code chart in your IBM AT
  120.                tech Reference.  You may also use the mnemonics
  121.                e.g. {Esc} for 27.  Note that you may use either
  122.                [] or {} but you must use [{], [}], {[} and {]}
  123.                for the braces and brackets themselves.
  124.  
  125. @nn            stuff an extended code preceded by a null.  Only
  126.                numerics are accepted.  You may use the numeric
  127.                forms or the mnemonics e.g. @68 or {F10}, @73 or
  128.                {PgUp}  See table following for the common codes.
  129.                If you cannot find an mnemonic, you will have to
  130.                use the numeric form.
  131.  
  132. cc:ss          specify both the decimal character and its scan
  133.                code e.g. 43:74 to mean the Plus key on the
  134.                numeric keypad, rather than the ordinary plus key.
  135.                See table following for common pairs.  You may use
  136.                the numeric forms or the mnemonics e.g. 10:28 or
  137.                {^Cr} for Control-Enter.  If you cannot find a
  138.                mnemonic, you will have to use the numeric pair
  139.                form.
  140.  
  141. 'xxxx'         Stuff the characters between the quote marks. The
  142.                string itself may not contain 's.
  143.  
  144. "xxxx"         Stuff the characters between the double quote
  145.                marks.  The string itself may not contain "s.
  146.  
  147. F70,20,5,01,"Please enter your phone number"
  148.                The absolute FIND command.  Wait patiently for
  149.                text to appear at col, row, length, attribute.
  150.                The attribute is optional.  StuffIt searches
  151.                starting at column 70, row 20 for the string
  152.                "Please enter your phone number".  It waits until
  153.                the string appears.  The 5 means allow some slop.
  154.                The string may START anywhere in a window within 5
  155.                characters to the right of the specified starting
  156.                point.  It does not mean the whole string must FIT
  157.                in a window five characters wide.  The slop may
  158.                wrap around from one line to the next.  See the
  159.                notes below on Stuffit's co-ordinate system, where
  160.                1,1 is the upper left corner.  The 01 is a rarely
  161.                used feature.  It means, the match only counts if
  162.                the string is displayed with decimal video
  163.                attribute "01".  If you leave out the 01, leave
  164.                out its comma as well.  Represented internally as
  165.                {Find}.
  166.                (**-Stuffkey-**) Provides the ~ or {TimeOut} feature
  167.                to enable escaping from an "unfound" condition.
  168.  
  169. P10,1,5,01,"Please enter your phone number"
  170.                The relative PROMPT command.  Wait patiently for
  171.                text to appear at relative col, row, length,
  172.                attribute.  The attribute is optional.  Stuffit
  173.                searches for the string "Please enter your phone
  174.                number" starting left ten columns, and up one row
  175.                from where the cursor is.  It waits until the
  176.                string appears.  The 5 means allow some slop.  The
  177.                string may START anywhere in a window within 5
  178.                characters to the right of the specified starting
  179.                point.  It does not mean the whole string must FIT
  180.                in a window five characters wide.  The slop may
  181.                wrap around from one line to the next.  The 01 is
  182.                a rarely used feature.  It means, the match only
  183.                counts if the string is displayed with decimal
  184.                video attribute "01".  If you leave out the 01,
  185.                leave out its comma as well.  Represented
  186.                internally as {Prompt}.
  187. P"Password: "
  188.                (**--Stuffkey--**)
  189.                The 'easy to use' version of the PROMPT command.
  190.                This works the same as above, but defaults to
  191.                looking for text at 3 spaces plus the length of the
  192.                supplied text to the left of the cursor on the
  193.                current line. The default 'slop' window is 4, with
  194.                no attributes. In the example above, the text
  195.                "Password: " is 10 characters long, so this is
  196.                equivalent to P13,0,4,"Password: " in the detailed
  197.                Prompt command. If the cursor is on line 12,
  198.                position 30, Stuffkey would search for the text on
  199.                line 12 starting at positions 27 thru 30. These
  200.                defaults usually work, and certainly make the Prompt
  201.                command easier to use!  
  202.                Stuffkey provides the ~ or {TimeOut} feature to
  203.                enable escaping from an "unfound" condition for both
  204.                versions of {Prompt}.
  205.  
  206. !              Reboot. (=0 ! will reboot at midnight.)  Also
  207.                known as {^aDel} or {Boot}.  The code used to
  208.                reboot is bare bones.  It does not flush caches,
  209.                watch out for DESQview or Windows etc.  If you
  210.                need a safer reboot, use the separate REBOOT.Com
  211.                utility posted on BIX in IBM.UTILS/LISTINGS.
  212.                (**--Stuffkey--**) changes this from a warm to cold
  213.                boot; reset vs. Ctl-Alt-Del.
  214.  
  215. {IfTrue}
  216. {IfT}
  217. {IfSucc}       (**--Stuffkey--** 4.00)
  218.                If the ~ {TimeOut} function is used before a F
  219.                {Find} or P {Prompt} command, said command can be
  220.                tested for success or failure. If the string
  221.                indicated is found, {IfSucc} will be true, and
  222.                commands immediately following it will be executed.
  223.                If the string is not found, execution will resume
  224.                after the next {Else} or {Endif}, whichever is found
  225.                first. No attempt is made to match up If's with
  226.                else's and endif's, they are processed as they are
  227.                found. Unexpected {Else} and {Endif} commands are
  228.                simply ignored. Thus, one {Else} or {Endif} command
  229.                will respond to two or more prior {IfSucc} commands.
  230.  
  231. {IfFalse}      (**--Stuffkey--** 4.00)
  232. {IfF}          The inverse of {IfSucc} above. Equivalent to If NOT
  233. {IfFail}       Success. All rules for {IfSucc} apply.
  234.  
  235. {Else}         (**--Stuffkey--** 4.00)
  236.                Stuffkey will resume execution at this point on a
  237.                failed {IfSucc}, {IfTrue}, {IfT}, {IfFail},
  238.                {IfFalse} or {IfF} command. If the {Else} command is
  239.                run into unexpectedly, it will simply be ignored.
  240.  
  241. {Endif}        (**--Stuffkey--** 4.00)
  242.                Stuffkey searches for a and will resume execution
  243.                here after any If statement, unless it finds an Else
  244.                statement first. Unexpected {Endif}'s are simply
  245.                ignored.
  246.   
  247. {Stop}         (**--Stuffkey--** 4.00)
  248.                This command allows you to halt a script. Useful for
  249.                'one way' If commands. i.e., If 'something' Do
  250.                'something' else stop the program.
  251.  
  252. {KeyOn}        (**--Stuffkey--** 4.10)
  253.                This command allows you to reset a delay (+) to its
  254.                original value with every keypress.  Also resets a
  255.                timeout (~).  Useful for executing a script after a certain 
  256.                period of inactivity such as logging a user off a lan.
  257.                Once invoked, {KeyOn} is active until Stuffkey is reinvoked
  258.                or {KeyOff} is executed.
  259.                BEWARE: If not turned off, can have strange effects on (=).
  260.  
  261. {KeyOff}       (**--Stuffkey--** 4.10)
  262.                This turns off the monitoring of keyboard activity.  Useful
  263.                for subsequent commands involving elapsed time. [ex (=), (~)]
  264.                Stuffkey 4.10 defaults to {KeyOff}.
  265.  
  266. /F:MyFile.Txt  FILE.  Read commands from MyFile.Txt instead of
  267.                from the command line.  This command may be only
  268.                be used on the command line, not nested in a file.
  269.  
  270. /B:512         BUFFER.  Allocate room for 512 bytes for the
  271.                script.  You must allocate enough to store the
  272.                ENTIRE script once it has been converted to a
  273.                compact internal form.  On initial loading,
  274.                StuffIt will use a minimum of 512 bytes, or
  275.                automatically expand to whatever is necessary to
  276.                needed to store the compact tokenized form of the
  277.                input file.  If you want to save a few bytes you
  278.                can prune it back using the /B: command.  Future
  279.                versions may do this automatically.
  280.  
  281. /E             EXPANDED.  Makes Stuffit compatible with keyboard
  282.                look-ahead buffer expanders.  Unfortunately this
  283.                option is incompatible with very old BIOSes that
  284.                do not support the BIOS table header entries at
  285.                40:80 and 40:82.
  286.  
  287. /L             LIST.  Displays a list of all the mnemonic codes
  288.                for keystrokes supported -- in other words a
  289.                miniature version of this manual.  Since that list
  290.                is generated directly from the parsing tables
  291.                inside the program, when there are discrepancies,
  292.                use that list in preference to this manual.
  293.  
  294. /R             REMOVE.  Will remove (Unload) Stuffit from RAM.
  295.                StuffIt is a TSR and so stays resident in RAM.
  296.                The overhead is minuscule, a mere 1408 bytes, half
  297.                of which is the buffer.  You cannot combine /R
  298.                with a script on the same line.  STUFFIT /R will
  299.                automatically terminate any script running.
  300.  
  301. /Sxx           SIGNATURE.  If want to have multiple copies of
  302.                Stuffit running at once, you need to give each one
  303.                its own two-letter signature.  /SST is the
  304.                default.  Why would you want more than one copy
  305.                running?  Stuffit can only look for one string on
  306.                the screen at a time.  If you needed to look for
  307.                two AT ONCE, you would need two copies of Stuffit
  308.                running.
  309.  
  310.  
  311. CO-ORDINATE SYSTEM
  312.  
  313. The co-ordinate system Stuffit uses for the FIND command is very
  314. familiar to programmers who poke bytes into the REGEN buffer of
  315. display adapters, but it may seem a little strange to someone who
  316. has a mathematical background.  Mathematicians have two systems:
  317.  
  318.   1. X,Y co-ordinates where the origin 0,0 is in the lower
  319.      left corner.
  320.  
  321.   2. Matrices indexed by row and column.  Usually rows and
  322.      columns are numbered starting with 1.  Rows are
  323.      numbered starting at the top.  Traditionally co-
  324.      ordinates are given in the order row, then column.
  325.  
  326. Stuffit uses a hybrid of these two schemes.  It uses row and
  327. column, and starts numbering at 1,1 in the upper left corner.
  328. Stuffit uses column, row order rather than the usual row, column.
  329. The co-ordinate system for the PROMPT command is strange until
  330. you consider that the text you want to look for will usually be
  331. to the left and above the cursor.  For relative positioning in
  332. the PROMPT command, left and up are considered positive with the
  333. current cursor position considered as 0,0.  This is the exact
  334. opposite convention to what the FIND command uses.  Beware!
  335. (Stuffkey's EASY prompt command might help.) 
  336.  
  337. EXAMPLES:
  338. ---------
  339.  
  340. Format floppies alternately in A: and B:, without answering any
  341. prompts:
  342.  
  343. REM EXAMPLE 1 FLOPPY FORMATTER (Batch file calling Stuffit)
  344. echo off
  345. :loop
  346. Stuffit ' ' +0 13 P25,0,5,"Format another" +1 'N' 13
  347. format A:
  348. Stuffit ' ' +0 13 P25,0,5,"Format another" +1 'N' 13
  349. format B:
  350. goto loop
  351.  
  352.  
  353. REM EXAMPLE 2 AUTOEXEC.BAT
  354. Rem Start backup program in batch mode:
  355. Rem Use Stuffit, to reboot GW program at midnight
  356. Stuffit =00:00:00 !
  357. Rem Start GW program
  358. LAN-GW
  359.  
  360.  
  361. REM Example 3, running Stacker's Defragger unattended
  362. C:\SYS\Stuffit.Com +5 {C} F21,12,1,"Optimization complete" +2
  363. {F10} {Y}
  364. C:\Stacker\SDEFRAG.Exe F: /SE
  365.  
  366.  
  367. REM   Example 4, logging into a NOVELL LAN with Stuffkey 4.0.
  368. rem   Assuming use of Novell's IPX and NETX, network drive is F:,
  369. rem login name is poltergeist, and password is pword.
  370. rem   Load stuffkey to provide password if the Password: 
  371. rem prompt is found within 30 seconds of loading ipx, else reboot.
  372. rem   This loading of stuffkey before running ipx, netx, etc.,
  373. rem allows recovering/rebooting from a 'hung machine' condition
  374. rem if any of ipx, netx, or log commands fail; this is a real live
  375. rem example, used daily - it works!
  376.  
  377. stuffkey + ~30 P"password: "{IfT}+ 'pword' 13 {Else} + +1 ! {Endif}
  378. ipx
  379. netx
  380. f:
  381. log poltergeist
  382.  
  383. NOTE: Extra examples are included in the archive as xxxxx.bat
  384. and/or xxxxx.key files. To use the .bat files, just run them. To
  385. use the .key files, type "stuffkey /f:xxxxx.key", without the
  386. quotes, where xxxxxx is the name of the file. One such is
  387. stufftim.key, which tests the time commands across midnight. Also
  388. included is stufferr.bat, which runs stuffkey with deliberate
  389. errors to produce the following error examples.
  390.  
  391. ERROR EXAMPLES
  392. --------------
  393.  
  394.   The error handler in Stuffkey 4.0 first displays the text of the
  395. errored line.
  396.   Second, it attempts to point to the beginning of the command in
  397. error, followed by dashes to a second pointer under the actual
  398. offending character or number. These pointers, while not perfect,
  399. are pretty close; certainly better than not having them!
  400.   Third, it displays the errored line number.
  401.   Fourth, it gives a textual description of the error. 
  402.  
  403. Stuffkey error examples, generated by Stufferr.bat, follow.
  404.  
  405.  
  406. EXAMPLE 1: THE COMMA FOLLOWING THE PROMPT PROBABLY SHOULDN'T BE
  407.  THERE. THIS MAKES THE FIRST ARG, DX (COLUMN) 0, AND SHIFTS THE
  408.  REMAINING ARGS LEFT. THUS, THE 0 CHANGES FROM A LEGAL DY (ROW) ARG
  409.  TO AN ILLEGAL SLOP ARGUMENT. NOTE THE ARROW POINTS TO THE ARG      
  410.  AFTER THE ERROR; A QUIRK TO BE AWARE OF.
  411.  
  412.  +0 +1 {Prompt},12,0,4,"Password: " 'Poltergeist' 13
  413.                ^----^
  414. ** Error lin# 1 Invalid Prompt find cmd.  Bad number - out of
  415. range. 
  416.  
  417.  
  418.  
  419. EXAMPLE 2: THE 128 DX (COLUMN) ARG. IS ILLEGAL. VALUES ARE +/- 127.
  420.  
  421.  +0 +1 {Prompt}128,0,4,"Password: " 'Poltergeist' 13
  422.                ^--^
  423. ** Error lin# 1 Invalid Prompt find cmd.  Bad number - out of
  424. range. 
  425.  
  426.  
  427.  
  428. EXAMPLE 3: A SPACE IS A LEGAL TOKEN, LEADING SPACES ARE NOT.
  429.  
  430.  +0 { } {F12} { F12}
  431.                ^---^
  432. ** Error lin# 1 Invalid Token. 
  433.  
  434.  
  435. EXAMPLE 4: THE TRAILING SPACE CAUSES THIS TOKEN TO BE UNRECOGNIZED. 
  436.  NOTE THE DIFFERENCES IN THE ERROR LOCATION POINTER BETWEEN INVALID 
  437.  TOKENS AND UNRECOGNIZED TOKENS/COMMANDS.
  438.  
  439.  +0 { } {F12} {F12 }
  440.                ^
  441. ** Error lin# 1 Invalid or unknown command. 
  442.  
  443.  
  444.  
  445. EXAMPLE 5: TIME FORMAT CAN BE HH:MM:SS OR .TT, BUT NOT BOTH
  446.  
  447.  + +.1 +1 +1.1 F0,1,1920,"Cshow version" + +1 13"*.gif"13
  448.           ^-^
  449. ** Error lin# 1 Invalid Time.  Bad number. 
  450.  
  451.  
  452.  
  453. EXAMPLE 6: THE FIND COMMAND COORDINATES START AT 1,1 NOT 0,0.
  454.  
  455.  + +.1 +1  F0,1,1920,"Cshow version" + +1 13"*.gif"13
  456.             ^
  457. ** Error lin# 1 Invalid Find string cmd.  Bad number - out of
  458. range. 
  459.  
  460.  
  461.  
  462. EXAMPLE 7: THE QUOTES AFTER THE 13 MAKE IT LOOK LIKE A BAD NUMBER.
  463. IT IS A GOOD IDEA TO LEAVE A SPACE BETWEEN ITEMS.
  464.  
  465.  + +.1 +1  F1,1,1920,"Cshow version" + +1 13"*.gif"13
  466.                                           ^-^
  467. ** Error lin# 1 Invalid or unknown command.  Bad number. 
  468.  
  469.  
  470.  
  471. EXAMPLE 8: NOTE THE LOCATION OF THE ERROR POINTERS.
  472.  
  473.  + {TimeOut}.1 {TokenTooLong}
  474.                 ^------^
  475. ** Error lin# 1 Invalid Token. 
  476.  
  477.  
  478. TROUBLE SHOOTING
  479. ----------------
  480.  
  481. PROBLEM:  Stuffit fails to send all the keystrokes.  Only some
  482. keystrokes get through.
  483.  
  484. SOLUTION:  Your program is clearing the type-ahead buffer from
  485. time to time.  You can outfox it by using, say, +2 or +.6 commands
  486. to insert a short delay AFTER the program has cleared the
  487. type-ahead buffer before Stuffit starts poking characters into it
  488. again.
  489.  
  490. This can be combined with the F and P commands to hold off
  491. generating the keystrokes until an omen appears on the screen that
  492. the program is ready for input and is not about to throw away the
  493. keystrokes you feed it.  Sometimes you must combine the
  494. techniques, an F or P command followed by a short delay.
  495.  
  496. PROBLEM:  I finally got Stuffit to work by putting in a huge
  497. great time delay at the start to handle the worst case, but most
  498. of the time such a long time delay is not needed, and just wastes
  499. time.
  500.  
  501. SOLUTION:  Stuffit starts sending keystrokes right away.  It does
  502. not wait until the succeeding program is loaded.  You can stuff a
  503. dummy character followed by a +0 time delay, e.g. Stuffit 'z' +0.
  504. Stuffit will stuff the z, then process the +0 which causes it to
  505. wait for the keystroke buffer to empty.  The application program
  506. then starts up.  The application goes about its initialization
  507. then finally it throws the 'z' away by clearing the keystroke
  508. buffer.  Stuffit notices the buffer is now empty and continues
  509. with the script.  The net effect is Stuffit waited for the
  510. precise moment the program was ready before stuffing the
  511. keystrokes for the app.
  512.  
  513. Another solution is to use the FIND feature to look for the
  514. initial prompt.
  515.  
  516. PROBLEM:  I tried the find command but it just won't work.
  517.  
  518. SOLUTION:  First read up again on Stuffit's two co-ordinate
  519. systems.  You may not be numbering your rows and columns the way
  520. Stuffit does.  Next, note the slop only works to the right.  If
  521. your guess at the co-ordinate were off by one to the left, you
  522. would never get a hit, no matter how much slop you allowed.  Note
  523. that slop only works on columns, not rows.  You generally must
  524. get the row bang on.  If you had 160 COLUMNS of slop however,
  525. this would be treated as two ROWS of slop.
  526.  
  527. PROBLEM:  Stuffit just echoes its command syntax summary no
  528. matter what I do.
  529.  
  530. SOLUTION:  Stuffit is laconic in its error messages, but it is
  531. still better than it used to be.  It does not tell you what you
  532. did wrong.  You have to guess.  In a worst case, the way you do
  533. this is to take out all your commands.  Then add them one by one.
  534. The one you last added at the time of failure is the one with the
  535. syntax error.
  536.  
  537. Note that Stuffit completely analyzes the script before starting
  538. to send any keystrokes to your application.  If there is even one
  539. tiny error in it, it will not do anything.
  540.  
  541. ALTERNATE SOLUTION: Use (**--Stuffkey--**). It has reasonably
  542. robust error handling. It will still abort on the first error it
  543. finds, but it will describe the nature of the error, display the
  544. offending line, and point to the error. See the ERROR EXAMPLES
  545. section for more detail. 
  546.  
  547. PROBLEM:  My program insists I use keypad - minus.  Where do I
  548. find the magic colon pair for such keystrokes?
  549.  
  550. SOLUTION:  There is a list of the most commonly used pairs at the
  551. end of this document.  See the IBM AT Technical reference manual
  552. for more information on system scan codes.
  553.  
  554. PROBLEM:  You referred me to the IBM AT Technical Reference
  555. Manual for scan codes and ASCII codes.  I don't have this
  556. expensive book.  What can I do?
  557.  
  558. SOLUTION: Call Falk Data Systems at (915) 684-7670, 5322 Rockwood
  559. Court, El Paso Texas, 79932.  They make an inexpensive wall chart
  560. that shows the ASCII codes.
  561.  
  562. PROBLEM:  I want to generate Shift-PrtSc.  There does not appear
  563. to be a scan code for this combination.
  564.  
  565. SOLUTION:  Use the {PrintScreen} mnemonic.  It will simulate the
  566. special handling of PrtSc or Shift-PrtSc.
  567.  
  568. PROBLEM:  the F command does not work to fetch a script out of a
  569. file.
  570.  
  571. SOLUTION:  The command is /F:, not F, for fetching from a file.
  572. This is confusing.  The F command is for FINDING a magic string
  573. on the screen.  Perhaps you forgot the colon or inserted spaces.
  574.  
  575. PROBLEM:  My program does not seem to recognize keystrokes.
  576.  
  577. SOLUTION:  It is unlikely, but one possible cause is this: when
  578. you DON'T use the colon form to give Stuffit both the ASCII and
  579. scan code, then Stuffit fakes it by using 2 as the scan code.
  580. Most programs do not check the scan code, but a few might be
  581. confused.  Stuffit automatically generates the proper scan code
  582. for most keys. If your application needs a specific scan
  583. code/char combination, you night need the explicit CC:SS form.
  584.  
  585. PROBLEM:  The scan codes I need are not in the list below.  Also
  586. I suspect some of the entries are incorrect, or might not be
  587. correct for my Ichiban Samurai (Steve Job's mythical Japanese
  588. computer company) computer.
  589.  
  590. SOLUTION:  Terje Mathisen has written a companion utility called
  591. KEYCODE2.ZIP available on BIX in the IBM.UTILS/LISTINGS section
  592. that will display the scan codes and ASCII codes of any
  593. keystrokes as you depress them.
  594.  
  595. PROBLEM:  Stuffit hiccoughs every time I use any command with a ^
  596. in it such as {^Z} and says there is a syntax error.  I have
  597. looked at the line until I am blue in the face.  It is perfect!
  598.  
  599. SOLUTION:  I bet you are using 4DOS.  4DOS reserves the ^
  600. character to allow you to glue two commands together on one line.
  601. There are four ways out:
  602. 1.) stop using 4DOS.
  603. 2.) use COMMAND.COM temporarily by typing COMMAND.
  604. 3.) use the sequence Ctrl-X ^ in place of ^ to warn 4DOS this is
  605. a literal ^, not a line glue character.
  606. 4.) look for an alias -- a different way of specifying the same
  607. character, e.g. {Sub} for {^Z}, or 0:116 for {^Right}
  608.  
  609. PROBLEM:  I feel like a mushroom, kept in the dark.  I want to
  610. understand better what is going on.  I just don't get this scan
  611. code stuff.
  612.  
  613. SOLUTION:  Roedy Green has written a companion essay called "How
  614. an AT Keyboard Works" that will explain how BIOS processes
  615. keystrokes.
  616.  
  617. PROBLEM:  Stuffit seems too complicated for what I need.  My
  618. applications don't even throw away keystrokes.  I want something
  619. simpler -- not a TSR.
  620.  
  621. SOLUTION:  Try Roedy Green's SAY! posted on BIX in
  622. IBM.UTILS/LISTINGS.  It is a simple utility that generates
  623. keystrokes you can feed to your applications using pipes -- e.g.
  624. SAY "Y" 13 | DEL *.*
  625.  
  626. PROBLEM:  I am going stark raving bonkers trying to figure out
  627. the absolute screen co-ordinates that various applications are
  628. using to paint the strings I need to get Stuffit to look for.
  629. Often the string I want is hanging out in the middle of nowhere.
  630. How are you supposed to count columns without a reference grid?
  631.  
  632. SOLUTION:  Use PRNDSK available on BIX in IBM.UTILS/LISTINGS to
  633. capture the screen contents to a file as you run the application
  634. manually.  Then use a text editor to examine the screens and
  635. count the rows and columns.
  636.  
  637. PROBLEM:  The application program I am using sometimes gives me
  638. an error message, and sometimes it does not.  If I wait for the
  639. error message, Stuffit will wait for ever.  If I blithely assume
  640. there will be no error, my script will get stuck in the weeds
  641. when there is an error.
  642.  
  643. SOLUTION:  Run TWO copies of Stuffit.  Let one wait for the error
  644. message using the FIND command, and generate the keystrokes to
  645. handle it, and the other copy handle only the normal case.
  646. Stuffit normally assumes that when you run it, you just want to
  647. tack on more to the script of the copy already running.  If you
  648. want to start up a second script to run in parallel you must do
  649. something like this:
  650.  
  651. Stuffit.Com /F:C:\Doc\MyScript.txt /SAA
  652.  
  653. Stuffit.Com /F:C:\Doc\Script2.txt /SBB
  654.  
  655. ALTERNATE SOLUTION. Use (**--Stuffkey--** 4.0).
  656. It fixes exactly this problem. You can now test if the find command
  657. was successful. See ~ {Timeout}, {IfSucc}, {Else}, and {Endif}
  658. earlier in the documentation. Also have a look at the usage example
  659. for logging into a Novell network; it uses If/Else logic with the
  660. prompt command.
  661.  
  662. WINDOWS, DESQVIEW, MULTI-TASKING PROBLEMS
  663. -----------------------------------------
  664.  
  665.  
  666. PROBLEM:  I run Stuffit in a Windows 3.1 Dos box, or in Desqview,
  667. and all the time functions take longer than they should.
  668.  
  669. SOLUTION:  Switch from Stuffit to Stuffkey; it fixes this, though
  670. not all, multitasking quirks. Both versions rely on the timer tick
  671. interrupt to operate. Stuffit assumed it would be interrupted on
  672. each tick, which doesn't happen in multi-tasking environments.
  673. Stuffkey double checks how many timer ticks have actually gone by,
  674. so it can 'catch up' if it has missed some. Note though, that
  675. Stuffkey will not do anything if it receives no timer tick
  676. interrupts. Make sure the 'run in background' option is on for any
  677. background windows containing Stuffkey. 
  678.  
  679.  
  680. PROBLEM:  I run Stuffkey in a Windows 3.1 Dos window, and it never
  681. does anything!
  682.  
  683. SOLUTION:  Most likely, the window you started Stuffkey in is not
  684. the active one. Stuffkey, like any other program, needs processor
  685. time. Check to make sure the Dos Window you started stuffkey in is
  686. set to run in the background. This is normally defined in a .pif
  687. file; use the Windows Pif editor to verify background processing is
  688. enabled.
  689.  
  690. PROBLEM:  I run Stuffkey in a Desqview Window, switch it to run in
  691. the background, but it stuffs its keystrokes into my foreground
  692. window.
  693.  
  694. SOLUTION:  As of 16 Nov. 92, there is no solution. Desqview, by
  695. default (unlike Windows), shares the keyboard buffer among its
  696. tasks. It may be possible to change this with DV's myriad keyboard
  697. settings....this is being checked.
  698.  
  699.  
  700. HOW IT WORKS UNDER THE HOOD
  701. ---------------------------
  702.  
  703. Most typists can type faster than programs can process
  704. keystrokes.  Thus the BIOS stores keystrokes in a type-ahead
  705. buffer.  Stuffit works by sneakily poking keystrokes to the type-
  706. ahead buffer when BIOS is not looking.  Stuffit thus has no need
  707. of taking over INT 16 to control the handing over of keystrokes
  708. to the application.  The advantage of this method is, Stuffit
  709. works with programs that sneak past INT 16 to use the Enhanced
  710. 101-key keyboard features.
  711.  
  712. There are 254 different extended ASCII codes that can be stored
  713. in a byte.  However there are control sequences such as F1, Home,
  714. Ctrl-F1 which don't have a 1-byte code.  These require a two byte
  715. code, the first byte being a 0-byte lead in.  Stuffit can easily
  716. handle poking that pair into the keystroke buffer, using the @nn
  717. feature.
  718.  
  719. There are some keys duplicated on the keyboard.  For example
  720. there is a + key sharing the = key.  There also a + key on the
  721. numeric keypad.  Most programs do not care which + key you
  722. pressed. Some do.  These programs find out by using interrupt HEX
  723. 16 function 00.  The processed character is returned in AL and
  724. the semi-cooked scan code from the keyboard is returned in AH.
  725. If you the program is picky, you can get Stuffit to generate the
  726. precise character and scan code using the cc:ss command.
  727.  
  728. Because of history, with each new keyboard design attempting to
  729. maintain partial compatibility with earlier designs, the process
  730. of generating a keystroke has become more and more complex.  Each
  731. keypress down generates a code, as does each key release.
  732.  
  733. The keyboard itself translates the codes from row-column on the
  734. keyboard to a raw scan code format.  Then the keyboard controller
  735. in the PC (a miniature computer in its own right) translates them
  736. again.  Then the BIOS translates them yet again, and matches up
  737. the ups and downs, notices chords (multiple keys pressed at once
  738. such as Ctrl Alt and Shift) and generates the keystrokes and puts
  739. them in the keystroke type-ahead buffer.  Further DOS, with its
  740. KEYB utility, may interfere with BIOS to support foreign
  741. keyboards.  So you can see the term "scan" code has many meanings
  742. -- depending just where in this assembly line you look at the
  743. codes.
  744.  
  745. CREDITS
  746.  
  747.    - Terje W. Mathisen wrote Stuffit and the first documentation.
  748.    - Roedy Green polished the documentation.
  749.    - Juergen Geist added his 2 bits worth to Stuffit and called it
  750.      Stuffkey (3.3). It remains to be seen whether Terje absorbs
  751.      these mods into Stuffit. Juergen will definitely be adding the
  752.      {IfSuccess} {Else} {Endif} logic to Stuffkey if Terje doesn't
  753.      wish to add this to Stuffit.
  754.    - 16 Nov 92, Stuffkey 4.0, Juergen has added If/Else logic.
  755.    - 05 Jan 95, Stuffkey 4.10, M.Smith added {KeyON}{KeyOff} code.
  756.  
  757. PAYMENT AND LICENSING
  758.  
  759.   The program Stuffit is absolutely FREE.  I (Terje) don't want
  760. money; I have money. What I want is recognition from my peers.  You
  761. may use it for whatever you like, but it is not warranted for any
  762. purpose.
  763. Copyright 1991, 1992 by Terje W. Mathisen.
  764.  
  765. Terje W. Mathisen
  766. Spanish Fork, Utah, June 1992.
  767.  
  768.   The added/modified code contained in Stuffkey is also free. I
  769. (Juergen in this paragraph) applaud Terje's efforts and will extend
  770. his philosophy - even though I could use some money!
  771.   I probably would not have expended this effort had Terje not
  772. provided his program, including source code, with no strings
  773. attached. I believe Terje's work, like mine, was/is a labor of
  774. love. Bravo Terje!
  775.   Stuffkey is copyrighted the same as Stuffit; I also like
  776. recognition and would like my name mentioned. Terje?
  777.  
  778. Juergen Geist, bixname 'poltergeist'
  779. Vancouver, B.C. November 1992 
  780.   
  781.   The added/modified code contained in Stuffkey 4.10 is also free. I
  782. (Mike in this paragraph) applaud Terje's and Juergen's efforts and will 
  783. extend their philosophy.
  784.   I know I would not have expended this effort had Terje and Juergen not
  785. provided this program, including source code, with no strings attached.
  786.   Stuffkey 4.10 enhancements are copyrighted the same as Stuffkey 4.00.
  787. (Hope you don't mind a little plagerism here Juergen.)  My thanks to
  788. both of you!  Please recognize my efferts in subsequent versions.
  789.  
  790. Mike Smith, mirsmith@indiana.edu
  791. Indianapolis, IN  USA, January 1995
  792.  
  793. FUTURES VAPOR WARE (Some are done, actually!)
  794.  
  795. Possible futures for Stuffit include:
  796.  
  797.   1. Allowing very large e.g. greater than a megabyte sized
  798.      scripts that are stored on disk or in expanded RAM.
  799.  
  800.   2. Automatic /B: command.
  801.  
  802. --------------- Following ideas from J.Geist (Stuffkey)
  803.  
  804.   3. * {Repeat} command, i.e., *5 {Right} or maybe {Right 5}.
  805.  
  806.   4. Definitions. i.e.:
  807.      Define {SloYes} +0 +.6 {y} +0 {Cr} +0 +.6  ; Slow y, Enter
  808.  
  809.   5. Macros, Subroutines, Looping, or Gotos ???
  810.  
  811.   6. A way to pause and/or abort a script from the keyboard. Eyeing
  812.      the Scroll Lock key for this function.
  813.  
  814.   7. A status function. i.e., Stuffkey /S[nn]? to get status of
  815.      loaded copies - idle, waiting for Prompt, etc.
  816.  
  817.   8. DesqView script compatibility. Desqview/Windows awareness.
  818.  
  819.   9. Variables, integers at first, for looping, counting, etc.
  820.  
  821.  10. String variables, including ability to "get" them from screen,
  822.      keyboard, or Dos environment, and later "put" them somewhere.
  823. SCAN CODES
  824.  
  825. Here are the Stuffit codes for some keystrokes you might want to
  826. generate. They are case insensitive.  You may key them in any
  827. mixture of upper and lower case, except of course the codes for
  828. the letters themselves {A} and {a}.  See your IBM AT Tech manual
  829. for more:
  830.  
  831.  
  832. PLAIN KEYS
  833.  
  834. {Bs}     8:14     backspace
  835. {Cr}     13:28    Enter (Carriage Return)
  836. {Del}    0:83     Del
  837. {Down}   0:80     Down
  838. {Esc}    27:1     Esc key
  839. {End}    0:79     End
  840. {Home}   0:71     Home
  841. {Ins}    0:82     Ins
  842. {Left}   0:75     Left
  843. {PgDn}   0:81     PgDn
  844. {PgUp}   0:73     PgUp
  845. {PrtScrn}         255:5  PrtScrn
  846. {Right}  0:77     Right
  847. {Tab}    9:15     Tab
  848. {Up}     0:72     Up
  849.  
  850. [{]      123:26   left curly brace.
  851. [}]      125:27   right curly brace.
  852. { }      32:57    space
  853. {!}      33:2     exclamation
  854. {"}      34:40    quote
  855. {#}      35:4     sharp
  856. {$}      36:5     dollar
  857. {%}      37:6     percent
  858. {&}      38:8     ampersand
  859. {'}      39:40    tick, apostrophe
  860. {(}      40:10    left parentheses
  861. {)}      41:11    right parenthesis
  862. {*}      42:9     star
  863. {+}      43:13    plus
  864. {,}      44:51    comma
  865. {-}      45:12    minus
  866. {.}      46:52    period
  867. {/}      47:53    forward slash
  868. {:}      58:39    colon
  869. {;}      59:39    semi-colon
  870. {<}      60:51    less than
  871. {=}      61:13    equals
  872. {>}      62:52    greater than
  873. {?}      63:53    question mark
  874. {@}      64:3     at sign
  875. {[}      91:26    left square bracket
  876. {\}      92:43    backslash
  877. {]}      93:27    right square bracket
  878. {^}      94:7     circumflex
  879. {_}      95:12    underscore
  880. {`}      96:41    grave
  881. {|}      124:43   vertical bar
  882. {~}      126:7    tilde
  883.          174      << French open quote
  884.          175      >> French close quote
  885.  
  886. {0}      48:11    zero
  887. {1}      49:2     one
  888. {2}      50:3     two
  889. {3}      51:4     three
  890. {4}      52:5     four
  891. {5}      53:6     five
  892. {6}      54:7     six
  893. {7}      55:8     seven
  894. {8}      56:9     eight
  895. {9}      57:10    nine
  896.  
  897. {¥}      157:39   Yen
  898.                   Norway O slash
  899. {å}      134:26   a ring
  900. {æ}      145:40   lower case ae
  901. {¢}      155:39   cent sign
  902.                   Norway o slash
  903. {a}      97:30    lower case a
  904. {b}      98:48    lower case b
  905. {c}      99:46    lower case c
  906. {d}      100:32   lower case d
  907. {e}      101:18   lower case e
  908.          130      lower case e acute
  909. {f}      102:33   lower case f
  910. {g}      103:34   lower case g
  911. {h}      104:35   lower case h
  912. {i}      105:23   lower case i
  913. {j}      106:36   lower case j
  914. {k}      107:37   lower case k
  915. {l}      108:38   lower case l
  916. {m}      109:50   lower case m
  917. {n}      110:49   lower case n
  918. {o}      111:24   lower case o
  919. {p}      112:25   lower case p
  920. {q}      113:16   lower case q
  921. {r}      114:19   lower case r
  922. {s}      115:31   lower case s
  923. {t}      116:20   lower case t
  924. {u}      117:22   lower case u
  925. {v}      118:47   lower case v
  926. {w}      119:17   lower case w
  927. {x}      120:45   lower case x
  928. {y}      121:21   lower case y
  929. {z}      122:44   lower case z
  930.  
  931. {F1}     0:59     F1
  932. {F2}     0:60     F2
  933. {F3}     0:61     F3
  934. {F4}     0:62     F4
  935. {F5}     0:63     F5
  936. {F6}     0:64     F6
  937. {F7}     0:65     F7
  938. {F8}     0:66     F8
  939. {F9}     0:67     F9
  940. {F10}    0:68     F10
  941. {F11}    0:133    F11
  942. {F12}    0:134    F12
  943.  
  944. NUMERIC PAD CHARACTERS
  945.  
  946. {Enter}  13:224   numpad Enter
  947. {n*}     42:55    numpad *
  948. {n+}     43:78    numpad +
  949. {n-}     45:74    numpad -
  950. {n.}     46:83    numpad .
  951. {n/}     47:224   numpad /
  952. {n0}     48:82    numpad 0
  953. {n1}     49:79    numpad 1
  954. {n2}     50:80    numpad 2
  955. {n3}     51:81    numpad 3
  956. {n4}     52:75    numpad 4
  957. {n5}     53:76    numpad 5
  958. {n6}     54:77    numpad 6
  959. {n7}     55:74    numpad 7
  960. {n8}     56:72    numpad 8
  961. {n9}     57:73    numpad 9
  962.  
  963. {^Enter} 10:224   numpad Ctrl-Enter
  964. {^n5}    0:143    numpad Ctrl-5
  965. {^n*}    0:150    numpad Ctrl-*
  966. {^n+}    0:144    numpad Ctrl-+
  967. {^n-}    0:142    numpad Ctrl--
  968. {^n/}    0:149    numpad Ctrl-/
  969.  
  970. {aEnter} 10:224   numpad Alt-Enter
  971. {an+}    0:78     numpad Alt-+
  972. {an-}    0:74     numpad Alt--
  973. {an/}    0:164    numpad Alt-/
  974.  
  975. EXTENDED ARROWPAD CHARACTERS
  976.  
  977. {eDel}   224:83   extpad Del
  978. {eDown}  224:80   extpad Down
  979. {eEnd}   224:79   extpad End
  980. {eHome}  224:71   extpad Home
  981.  
  982. {eIns}   224:82   extpad Ins
  983. {eLeft}  224:75   extpad Left
  984. {ePgDn}  224:81   extpad PgDn
  985. {ePgUp}  224:73   extpad PgUp
  986. {eRight} 224:77   extpad Right
  987. {eUp}    224:72   extpad Up
  988.  
  989. {aeDel}  0:163    extpad Alt-Del
  990. {aeDown} 0:160    extpad Alt-Down
  991. {aeEnd}  0:159    extpad Alt-End
  992. {aeHome} 0:151    extpad Alt-Home
  993. {aeIns}  0:162    extpad Alt-Ins
  994. {aeLeft} 0:155    extpad Alt-Left
  995. {aePgDn} 0:161    extpad Alt-PgDn
  996. {aePgUp} 0:153    extpad Alt-PgUp
  997. {aeRight}         0:157  extpad Alt-Right
  998. {aeUp}   0:152    extpad Alt-Up
  999. {an*}    0:55     extpad Alt-*
  1000. {^eDel}  224:147  extpad Ctrl-Del
  1001. {^eDown} 224:145  extpad Ctrl-Down
  1002. {^eEnd}  224:117  extpad Ctrl-End
  1003. {^eHome} 224:119  extpad Ctrl-Home
  1004. {^eIns}  224:146  extpad Ctrl-Ins
  1005. {^eLeft} 224:115  extpad Ctrl-Left
  1006. {^ePgDn} 224:118  extpad Ctrl-PgDn
  1007. {^ePgUp} 224:132  extpad Ctrl-PgUp
  1008. {^eRight}         224:116     extpad Ctrl-Right
  1009. {^eUp}   224:141  extpad Ctrl-Up
  1010.  
  1011. SHIFT + KEY
  1012.  
  1013. {sTab}   0:15     Shift-Tab
  1014.                   Shift-PrtSc (not avail)
  1015. {Å}      143:26   Upper case A ring
  1016. {Æ}      146:40   capital AE
  1017. {A}      65:30    capital A
  1018. {B}      66:48    capital B
  1019. {C}      67:46    capital C
  1020. {D}      68:32    capital D
  1021. {E}      69:18    capital E
  1022. {F}      70:33    capital F
  1023. {G}      71:34    capital G
  1024. {H}      72:35    capital H
  1025. {I}      73:23    capital I
  1026. {J}      74:36    capital J
  1027. {K}      75:37    capital K
  1028. {L}      76:38    capital L
  1029. {M}      77:50    capital M
  1030. {N}      78:49    capital N
  1031. {O}      79:24    capital O
  1032. {P}      80:25    capital P
  1033. {Q}      81:16    capital Q
  1034. {R}      82:19    capital R
  1035. {S}      83:31    capital S
  1036. {T}      84:20    capital T
  1037. {U}      85:22    capital U
  1038. {V}      86:47    capital V
  1039. {W}      87:17    capital W
  1040. {X}      88:45    capital X
  1041. {Y}      89:21    capital Y
  1042. {Z}      90:44    capital Z
  1043.  
  1044. {sF1}    0:84     Shift-F1
  1045. {sF2}    0:85     Shift-F2
  1046. {sF3}    0:86     Shift-F3
  1047. {sF4}    0:87     Shift-F4
  1048. {sF5}    0:88     Shift-F5
  1049. {sF6}    0:89     Shift-F6
  1050. {sF7}    0:90     Shift-F7
  1051. {sF8}    0:91     Shift-F8
  1052. {sF9}    0:92     Shift-F9
  1053. {sF10}   0:93     Shift-F10
  1054. {sF11}   0:135    Shift-F11
  1055. {sF12}   0:136    Shift-F12
  1056.  
  1057. ALT + KEY
  1058.  
  1059. {aBS}    0:14     Alt-Backspace
  1060. {aCR}    0:28     Alt-Enter
  1061. {aEsc}   0:1      Alt-Esc
  1062.  
  1063. {a'}     0:40     Alt-'
  1064. {a*}     0:55     Alt-*
  1065. {a,}     0:51     Alt-,
  1066. {a-}     0:130    Alt--
  1067. {a.}     0:52     Alt-.
  1068. {a/}     0:53     Alt-/
  1069. {a;}     0:39     Alt-;
  1070. {a=}     0:131    Alt-=
  1071. {a[}     0:26     Alt-[
  1072. {a\}     0:43     Alt-\
  1073. {a]}     0:27     Alt-]
  1074. {a`}     0:41     Alt-`
  1075.  
  1076. {a0}     0:129    Alt-0
  1077. {a1}     0:120    Alt-1
  1078. {a2}     0:121    Alt-2
  1079. {a3}     0:122    Alt-3
  1080. {a4}     0:123    Alt-4
  1081. {a5}     0:124    Alt-5
  1082. {a6}     0:125    Alt-6
  1083. {a7}     0:126    Alt-7
  1084. {a8}     0:127    Alt-8
  1085. {a9}     0:128    Alt-9
  1086.  
  1087. {aA}     0:30     Alt-A
  1088. {aB}     0:48     Alt-B
  1089. {aC}     0:46     Alt-C
  1090. {aD}     0:32     Alt-D
  1091. {aE}     0:18     Alt-E
  1092. {aF}     0:33     Alt-F
  1093. {aG}     0:34     Alt-G
  1094. {aH}     0:35     Alt-H
  1095. {aI}     0:23     Alt-I
  1096. {aJ}     0:36     Alt-J
  1097. {aK}     0:37     Alt-K
  1098. {aL}     0:38     Alt-L
  1099. {aM}     0:50     Alt-M
  1100. {aN}     0:49     Alt-N
  1101. {aO}     0:24     Alt-O
  1102. {aP}     0:25     Alt-P
  1103. {aQ}     0:16     Alt-Q
  1104. {aR}     0:19     Alt-R
  1105. {aS}     0:31     Alt-S
  1106. {aT}     0:20     Alt-T
  1107. {aU}     0:22     Alt-U
  1108. {aV}     0:47     Alt-V
  1109. {aW}     0:17     Alt-W
  1110. {aX}     0:45     Alt-X
  1111. {aY}     0:21     Alt-Y
  1112. {aZ}     0:44     Alt-Z
  1113.  
  1114. {aF1}    0:104    Alt-F1
  1115. {aF2}    0:105    Alt-F2
  1116. {aF3}    0:106    Alt-F3
  1117. {aF4}    0:107    Alt-F4
  1118. {aF5}    0:108    Alt-F5
  1119. {aF6}    0:109    Alt-F6
  1120. {aF7}    0:110    Alt-F7
  1121. {aF8}    0:111    Alt-F8
  1122. {aF9}    0:112    Alt-F9
  1123. {aF10}   0:113    Alt-F10
  1124. {aF11}   0:139    Alt-F11
  1125. {aF12}   0:140    Alt-F12
  1126.  
  1127.  
  1128. CONTROL + KEY
  1129.  
  1130. {Nul}    0:3      Ctrl-@ 0
  1131. {Soh}    1:30     Ctrl-A 1
  1132. {Stx}    2:48     Ctrl-B 18
  1133. {Etx}    3:46     Ctrl-C 2
  1134. {Eot}    4:32     Ctrl-D 19
  1135. {Enq}    5:18     Ctrl-E 3
  1136. {Ack}    6:33     Ctrl-F 20
  1137. {Bel}    7:34     Ctrl-G 4
  1138. {Bs}     8:35     Ctrl-H 5
  1139. {Ht}     9:23     Ctrl-I 6
  1140. {Lf}     10:36    Ctrl-J 7
  1141. {Vt}     11:37    Ctrl-K 8
  1142. {Ff}     12:38    Ctrl-L 9
  1143. {Cr}     13:50    Ctrl-M 10
  1144. {So}     14:49    Ctrl-N 11
  1145. {Si}     15:24    Ctrl-O 12
  1146. {Dle}    16:25    Ctrl-P 13
  1147. {Xon}    17:16    Ctrl-Q 14
  1148. {Dc2}    18:19    Ctrl-R 15
  1149. {Dc3}    19:31    Ctrl-S 16
  1150. {Dc4}    20:20    Ctrl-T 17
  1151. {Nak}    21:22    Ctrl-U 21
  1152. {Syn}    22:47    Ctrl-V 22
  1153. {Etb}    23:17    Ctrl-W 23
  1154. {Can}    24:45    Ctrl-X 24
  1155. {Em}     25:21    Ctrl-Y 25
  1156. {Eof}    26:44    Ctrl-Z 26
  1157. {Esc}    27:1     ctrl-[ 27
  1158. {Fs}     28:43    Ctrl-\ 28
  1159. {Gs}     29:27    Ctrl-] 29
  1160. {Rs}     30:7     Ctrl-^ 30
  1161. {Us}     31:12    Ctrl-_ 31
  1162.  
  1163. {^Bs}    127:14   Ctrl-Backspace
  1164. {^@}     0:3      Ctrl-@ null
  1165. {^Break} 255:6    Ctrl-Break
  1166. {^Cr}    10:28    Ctrl-Enter
  1167. {^Del}   0:147    Ctrl-Del
  1168. {^Down}  0:145    Ctrl-Down
  1169. {^End}   0:117    Ctrl-End
  1170. {^Home}  0:119    Ctrl-Home
  1171. {^Ins}   0:146    Ctrl-Ins
  1172. {^Left}  0:115    Ctrl-Left
  1173. {^PgDn}  0:118    Ctrl-PgDn
  1174. {^PgUp}  0:132    Ctrl-PgUp
  1175. {^PrtScrn}        0:114  Ctrl-PrtScrn
  1176. {^Right} 0:116    Ctrl-Right
  1177. {^Tab}   0:148    Ctrl-Tab
  1178. {^Up}    0:141    Ctrl-Up
  1179.  
  1180. {^[}     27:26    Ctrl-[ Esc
  1181. {^\}     28:43    Ctrl-\ fs
  1182. {^]}     29:27    Ctrl-] gs
  1183. {^^}     30:7     Ctrl-^ rs
  1184. {^_}     31:12    Ctrl-_ us
  1185. {^A}     1:30     Ctrl-A soh
  1186. {^B}     2:48     Ctrl-B stx
  1187. {^C}     3:46     Ctrl-C etx
  1188. {^D}     4:32     Ctrl-D eot
  1189. {^E}     5:18     Ctrl-E enq
  1190. {^F}     6:33     Ctrl-F ack
  1191. {^G}     7:34     Ctrl-G bel
  1192. {^H}     8:35     Ctrl-H bs
  1193. {^I}     9:23     Ctrl-I ht hor tab
  1194. {^J}     10:36    Ctrl-J lf
  1195. {^K}     11:37    Ctrl-K vt
  1196. {^L}     12:38    Ctrl-L ff
  1197. {^M}     13:50    Ctrl-M cr
  1198. {^N}     14:49    Ctrl-N so
  1199. {^O}     15:24    Ctrl-O si
  1200. {^P}     16:25    Ctrl-P dle
  1201. {^Q}     17:16    Ctrl-Q dc1 xon
  1202. {^R}     18:19    Ctrl-R dc2
  1203. {^S}     19:31    Ctrl-S dc3
  1204. {^T}     20:20    Ctrl-T dc4 xoff
  1205. {^U}     21:22    Ctrl-U nak
  1206. {^V}     22:47    Ctrl-V syn
  1207. {^W}     23:17    Ctrl-W etb
  1208. {^X}     24:45    Ctrl-X can
  1209. {^Y}     25:21    Ctrl-Y em
  1210. {^Z}     26:44    Ctrl-Z sub/eof
  1211.  
  1212. {^F1}    0:94     Ctrl-F1
  1213. {^F2}    0:95     Ctrl-F2
  1214. {^F3}    0:96     Ctrl-F3
  1215. {^F4}    0:97     Ctrl-F4
  1216. {^F5}    0:98     Ctrl-F5
  1217. {^F6}    0:99     Ctrl-F6
  1218. {^F7}    0:100    Ctrl-F7
  1219. {^F8}    0:101    Ctrl-F8
  1220. {^F9}    0:102    Ctrl-F9
  1221. {^F10}   0:103    Ctrl-F10
  1222. {^F11}   0:137    Ctrl-F11
  1223. {^F12}   0:138    Ctrl-F12
  1224.  
  1225.