home *** CD-ROM | disk | FTP | other *** search
/ The Pier Shareware 6 / The_Pier_Shareware_Number_6_(The_Pier_Exchange)_(1995).iso / 010 / exc36.zip / exc.doc next >
Text File  |  1994-09-11  |  97KB  |  2,204 lines

  1.  
  2.                                      EXC 
  3.                            The EXeCution Processor
  4.                                  USER'S GUIDE
  5.  
  6.                        Copyright 1993 by Gary C. Crider
  7.                                
  8.  
  9. Is writing scripts a pain?  See Appendix C about the new EXCR script recorder.
  10.  
  11.  
  12. TABLE OF CONTENTS:
  13.  
  14.         What is EXC? ..................................... 1.0
  15.         Requirements ..................................... 1.1
  16.         The EXC command line ............................. 2.0
  17.           Parameters that contain quotes ................. 2.1
  18.         Operational notes ................................ 3.0
  19.           General notes .................................. 3.1
  20.           Interrupt keys ................................. 3.2
  21.           Memory usage ................................... 3.3
  22.           Timing considerations .......................... 3.4
  23.           When EXC may not function or cause problems .... 3.5
  24.           Specific problems .............................. 3.6
  25.             Remote control communications ................ 3.6.1
  26.           Error handling ................................. 3.7
  27.         Scripts .......................................... 4.0
  28.           Script Basics .................................. 4.1
  29.           Script Commands ................................ 4.2
  30.             BEEP ......................................... 4.2.1
  31.             CASE ......................................... 4.2.2
  32.             CLEAR ........................................ 4.2.3
  33.             CURSOR ....................................... 4.2.4
  34.             CURSX ........................................ 4.2.5
  35.             CURSY ........................................ 4.2.6
  36.             DELAY ........................................ 4.2.7
  37.             FAST ......................................... 4.2.8
  38.             FILE ......................................... 4.2.9
  39.             GET .......................................... 4.2.10
  40.             GOTO ......................................... 4.2.11
  41.             HIDEWIN ...................................... 4.2.12
  42.             HLOCATE ...................................... 4.2.13
  43.             IFN .......................................... 4.2.14
  44.             IFY .......................................... 4.2.15
  45.             INT9 ......................................... 4.2.16
  46.             KEY .......................................... 4.2.17
  47.             LOCATE ....................................... 4.2.18
  48.             LOOK ......................................... 4.2.19
  49.             NOINT9 ....................................... 4.2.20
  50.             ON ........................................... 4.2.21
  51.             ONRESET ...................................... 4.2.22
  52.             PAUSE ........................................ 4.2.23
  53.             QUIET ........................................ 4.2.24
  54.             QUIT ......................................... 4.2.25
  55.             READ ......................................... 4.2.26
  56.             REWIND ....................................... 4.2.27
  57.             SCRMAX ....................................... 4.2.28
  58.             SEARCH ....................................... 4.2.29
  59.             SET .......................................... 4.2.30
  60.             SETWAIT ...................................... 4.2.31
  61.             SHOW ......................................... 4.2.32
  62.             SHOWAT ....................................... 4.2.33
  63.             SHOWIN ....................................... 4.2.34
  64.             SLOW ......................................... 4.2.35
  65.             TICK ......................................... 4.2.36
  66.             TIME ......................................... 4.2.37
  67.             TIMEOUT ...................................... 4.2.38
  68.             TYPE ......................................... 4.2.39
  69.             TYPFILE ...................................... 4.2.40
  70.             VLOCATE ...................................... 4.2.41
  71.             WAITFOR ...................................... 4.2.42
  72.             WAITSCR ...................................... 4.2.43
  73.             WINCOLS ...................................... 4.2.44
  74.             WINMAX ....................................... 4.2.45
  75.             WINROWS ...................................... 4.2.46
  76.           Labels ......................................... 4.3
  77.           Remarks ........................................ 4.4
  78.           Using variables ................................ 4.5
  79.           Environment variable substitution .............. 4.6
  80.           User variables ................................. 4.7
  81.           Example script ................................. 4.8
  82.         Installation ..................................... Appendix A
  83.         Keycode table .................................... Appendix B
  84.         EXCR Script Recorder ............................. Appendix C
  85.         EXCDEMO .......................................... Appendix D
  86.         Definition of Shareware .......................... Appendix E
  87.         Disclaimer ....................................... Appendix F
  88.         Support .......................................... Appendix G
  89.         Registration ..................................... Appendix H
  90.  
  91.  
  92. 1.0 What Is EXC?
  93.  
  94.    As administrator of a large local area network, I believe whole-
  95. heartedly in automating every task that can be automated.  Even though 
  96. many tasks are computerized, that does not make them automated.  By
  97. automated I mean that you enter one command or batch file name on the
  98. DOS command line and forget about it until the task is performed.  Unfor-
  99. tunately many, if not most, programs require an operator to fill in blanks,
  100. select choices or otherwise interact with the PC to accomplish a task in
  101. which all of these parameters and choices were known to the user beforehand.
  102.  
  103.    I, for one, do not want to have to sit and watch my backups take place.
  104. In fact, I want them done while I am away from the office.  After backups, 
  105. what better time to defragment a hard disk?  Do I want to have to chase menus 
  106. to achieve this after the backup completes?  One of the worst offenders of 
  107. this I have seen is Stacker's SDEFRAG program.  You can automate just about 
  108. everything until the defrag has finished, then a stupid dialogue box pops up 
  109. and asks you if you want to exit the program.  No way to just move on back 
  110. to the batch file and begin defragmenting the next drive.
  111.  
  112.    I first experimented with various keyboard stuffers such as PC Magazine's
  113. KEY-FAKE by Charles Petzold and STACKEY by Barry Simon and Richard Wilson.
  114. These programs take pre-programmed key sequences and stuff them into the
  115. keyboard buffer as if you had typed them at the keyboard.  The trouble is
  116. that many programs rudely clear the keyboard buffer before requesting you to 
  117. enter something or they allow you to interrupt the processing by pressing any 
  118. key.  Since you have already simulated pressing the key, oops!.  In either 
  119. case, you can't simply preprogram your reply and go.  Stacker's SDEFRAG exit 
  120. prompt is an example.  
  121.  
  122.    Stuffers usually offer a way to get around this by programming a delay
  123. into the keystrokes that causes so many seconds to elapse before the key
  124. code is stuffed into the keyboard buffer.  This is a help, but what if the
  125. time for a task (backup and defrag, for example) to complete varies greatly
  126. from one execution to another?  You have to program for the longest possible 
  127. execution time and the task then takes way too long to run in most cases.
  128.  
  129.    Another problem I have with stuffers is that they are almost always 
  130. terminate-and-stay-resident (TSR) programs.  I hate to stuff another program
  131. in my 640k when I don't have to.  Although most allow you to unload them,
  132. you will forget more often than not.
  133.  
  134.    I then came across a program called AUTOMATE by Geoff Friesen that was
  135. a better approach.  You built a script, compiled it and executed it.  No
  136. TSR remained in memory.  The trouble is, the only commands in the script
  137. were execute a program, wait, and insert keys in the buffer.  Also, you
  138. couldn't pass parameters to the program.  AUTOMATE served as my inspiration 
  139. to take it further.
  140.  
  141.    What I wanted was a program that had the intelligence to monitor the 
  142. screen and detect when an event occurred that required me to insert more 
  143. keycodes in the buffer.  I would also like to see logical branching in the 
  144. script and the ability to plan for exception processing as well as when 
  145. everything performs normally.  I want to be able to enter keyboard input
  146. when a certain string appears on the screen or when a string such as 
  147. "Please wait..." disappears from the screen.  There are times I just want 
  148. to wait until any change at all occurs on the screen.
  149.  
  150.    EXC then, is more than just a buffer stuffer.  It is a script (a.k.a. 
  151. macro) processor that has a very simple script language that allows very 
  152. complex scripts to execute much faster than you could execute them in attended 
  153. mode.  There are only slightly over thirty commands in the entire script 
  154. language!  Only about a dozen of these will be used often.  The script 
  155. language is interpretive, so no compile is needed.  It is not a TSR, so 
  156. nothing remains to eat up your precious RAM.
  157.  
  158.    EXC can even be used with your favorite DOS communications program to
  159. process online scripts.  Send E-mail, download files, etc.  EXC can even be
  160. used to automate mainframe tasks through your 3270 emulation gateway.
  161.  
  162.    You simply execute EXC specifying the script file to use and the program
  163. to be executed.  You include all command line parameters for the program
  164. as usual.  By combining EXC executions in batch files, extremely complex
  165. processing can be reduced to a single DOS command.  EXC even returns the
  166. same DOS ERRORLEVEL that your program returned upon completion.
  167.  
  168.    All you need to know now is the format of the EXC command line and how
  169. to write a script.
  170.  
  171.  
  172. 1.1 Requirements
  173.  
  174.   EXC works on any Intel 80x86 and compatible processors.  At this time, 
  175.   we are unaware of any unresolved incompatibilities with any software or 
  176.   hardware configurations.  Any that are reported and not resolved will 
  177.   be reported here.
  178.  
  179.   Since Borland C++ v4.0 no longer supports code generation for 8086/8088
  180.   processors, EXC requires a 286 (80286) or better.
  181.  
  182.  
  183. 2.0 The EXC Command Line
  184.  
  185.    Format: EXC [path]scriptfile [[path]program] [command-line parameters]
  186.  
  187.    The scriptfile is the filename of the script to be processed.  The 
  188. extension, if specified, must be .SCR, but is not required to be specified.
  189. the script file is assumed to be in the current directory if a path is
  190. not specified.
  191.  
  192.    The program does not require a file name extension, but it must be a .EXE 
  193. or .COM executable program file.  .BAT files cannot be executed by EXC.  If 
  194. the path is not specified, the environment PATH= directories are searched.  
  195. If the program is omitted from the command line, COMMAND.COM (or whatever 
  196. command processor is reported in the COMSPEC environment variable) is assumed.  
  197. Letting the program defaut to COMMAND.COM will probably cause a fatal memory
  198. violation error in an OS/2 DOS box.
  199.  
  200.    The command-line parameters are any parameters that you would specify
  201. on the DOS command line if you were executing the program without EXC.
  202.  
  203.  
  204. 2.1 Parameters that contain quotes
  205.    
  206.    If you try to pass command-line parameters to the spawned program that 
  207. contain imbedded quotes, you must use \q in place of the quotes to be 
  208. imbedded within the parameter.
  209.  
  210.    Parameters that contain spaces, |, < or > must be enclosed in quotes in
  211. order to be treated as a single parameter.
  212.  
  213.    If you want the spawned program to receive a parameter that looks like:
  214.      Help "Me" Out,
  215. you would include it on the EXC command line as 
  216.      "Help \qMe\q Out"
  217.  
  218.   Confusing?  You bet!  But I have to work within the rules of DOS and the
  219. parameter passing rules of different languages and compilers. Amazingly, they
  220. do not all handle quoted strings in the same manner.  I learned this the
  221. hard way by publishing a release (v2.2) that did not work when spawning most
  222. PASCAL and assembler programs and passing quoted parameters.
  223.  
  224.  
  225.  
  226. 3.0 Operational notes   
  227.  
  228. 3.1 General notes
  229.  
  230.    If you want EXC scripts to execute multiple programs and/or enter 
  231. intrinsic DOS commands on the DOS command line, omit the program from
  232. the EXC command line or specify COMMAND.COM which is the default (unless
  233. a different command processor such as 4DOS and NDOS is specified in the
  234. COMSPEC environment variable).  Your script will begin executing on an 
  235. empty DOS command line.  EXC automatically issues an EXIT if COMMAND.COM 
  236. was invoked.  If you terminate the script with LEFT SHIFT-RIGHT SHIFT, or 
  237. the script terminates with an error, you need to type EXIT at the DOS prompt 
  238. to terminate the COMMAND.COM that you started and remove EXC from memory.
  239.    
  240.    Don't get cute and try to execute EXC as the object program of an EXC
  241. command.  While it might logically work, I can see no possible need for
  242. such action and you and your system are at your own risk.
  243.  
  244.    EXC creates an extended keyboard buffer that will hold 256 keycodes.  The
  245. DOS keyboard buffer will hold 16 keycodes.  Thus you may stuff up to 272
  246. keycodes with TYPE and KEY before the program requests keyboard input.  If
  247. you overflow this buffer (very unlikely), a runtime error occurs and script
  248. processing is halted.
  249.  
  250.    EXC is written in Borland C++, a product of Borland International.
  251.  
  252.  
  253. 3.2 Interrupt keys
  254.  
  255.    You can pause execution of a script by pressing the Scroll Lock key.  If   
  256. your keyboard has a Scroll Lock indicator light, the light will be on while   
  257. the script is paused.  Pressing Scroll Lock again resumes execution of the
  258. script exactly where it left off.  Any unexpired wait time must elapse
  259. before another command is processed.
  260.  
  261.    You can terminate execution of a script by holding down both the LEFT
  262. and RIGHT SHIFT keys.  A beep will indicate that the script is being
  263. terminated.  Execution of any spawned program will continue.
  264.  
  265.    The Pause key on your keyboard pauses all execution at the time the next
  266. screen write occurs.  Timer interrupts continue.  EXC detects the pause
  267. state and suspends itself.  When you strike any key, both EXC and the
  268. spawned task will resume processing.  Any unexpired wait time must elapse
  269. before another command is processed.  While paused, the spawned program
  270. remains active.
  271.    
  272.    Since EXC is executing as a timer interrupt with your program operating
  273. as a spawned subtask, cycle-stealing multitasking is occurring.  This can 
  274. cause a few problems.  If you must interrupt execution of your program, your 
  275. best bet may actually be pressing CTRL-ALT-DEL to reboot the computer.  If 
  276. you hit CTRL-BREAK, you will normally interrupt just one task while the other
  277. continues.  Pressing CTRL-BREAK again then interrupts the remaining task.
  278. This can confuse the remaining task to no end and lead to a system lock-up
  279. or other undesirable result.  If you are lucky, you may actually get by with
  280. it, but I don't recommend it.  Even if you terminate EXC with LEFT SHIFT-
  281. RIGHT SHIFT, the timer interrupt is still active until your program 
  282. terminates, so the same problem can occur.
  283.  
  284.  
  285. 3.3 Memory usage
  286.  
  287.    EXC requires approximately 40K of conventional memory overhead.  After
  288. loading, it then allocates a buffer to hold your script file and a buffer
  289. for reading the screen contents.  If your application program's requirements 
  290. are pushing the limits of available RAM, you may not be able to execute it 
  291. under EXC control.  If COMMAND.COM is spawned, an additional 3K (DOS 5) is 
  292. used.
  293.  
  294.    The screen buffer varies according to the screen size active at startup or
  295. the value specified in an SCRMAX command.  It will require one byte for every
  296. character position on the screen, plus 4 bytes.  Thus an 80 x 25 text mode 
  297. will require a buffer of 2004 bytes.  If SCRMAX is present, that buffer size
  298. is always allocated, regardless of the initial text mode.
  299.  
  300.    The script buffer is the size required to hold all script commands strung
  301. end-to-end with 1 byte between each command.  Leading and trailing spaces
  302. are not counted.  If you use TYPFILE, the contents of the specified file are
  303. added to the script buffer.  Thus, your script buffer will increase by the 
  304. size of all files specified in TYPFILE commands.  If you specify the same
  305. file in two different TYPFILE commands, the file will be loaded into memory 
  306. twice.  If the TYPFILE is executed multiple times within a loop, it only 
  307. requires buffer space for a single copy of the file.
  308.  
  309.    With 604k of available memory, I am able to load a simple script with
  310. 35,000 fairly short commands.  
  311.  
  312.    Versions prior to 2.0 were limited to a total memory allocation of 64k
  313. for all buffers.
  314.  
  315.    If your script is too large, you may encounter an error allocating script
  316. memory, allocating screen buffer memory or you will see an error message that
  317. says you do not have enough memory to spawn your program.
  318.    
  319.  
  320. 3.4 Timing considerations
  321.  
  322.    EXC installs itself as a timer interrupt that is invoked 18.2 times
  323. per second.  If it has no work to do, it simply executes the system timer
  324. interrupt and any other chained timer interrupts and returns.  During waits 
  325. (DELAY, WAITFOR, etc.) the frequency of invocation is reduced to twice per 
  326. second.  This minimizes the impact of the interrupt on the performance of 
  327. your program.  A half-second is forever to most computers.  This also means
  328. that if you are searching for a string with WAITFOR, and the string flashes 
  329. on the screen for less than 1/2 second, it will not be detected.
  330.  
  331.    Needless to say, EXC does not have but 1/18th of a second to retrieve and
  332. execute a command.  This is a long time in a fast computer and a short
  333. time to a slow system.  I try to break commands down into logical parts that
  334. are executed in consecutive interrupts.  Obviously, there are some commands
  335. that will probably take longer than 1/18th of a second, especially on slower
  336. systems.  EXC is a handler for interrupt 1C.  No new 1C interrupts are
  337. initiated by the system until the active one is complete.  While missing
  338. a few interrupts has minimal effect on EXC or DOS, it could effect a spawned 
  339. task or TSR that is also servicing 1C interrupts.
  340.  
  341.    Very slow CPUs (6 Mhz or slower) may experience problems getting some
  342. tasks to function properly.  Sometimes a few judiciously placed DELAY or
  343. TICK commands will help.  Sometimes you may have to break down very long
  344. typed strings into multiple TYPE commands.  Others just may not work at all 
  345. if they just cannot accomplish their tasks fast enough.  Most of the more
  346. commonly used commands should work fine.
  347.  
  348.  
  349. 3.5 When EXC may not function properly
  350.  
  351.    GRAPHICS MODES do not store text characters in video memory, only pixels
  352. of differing colors.  EXC cannot interpret these pixels into characters, thus
  353. commands that are based on screen reads will not work in graphics modes. This
  354. includes WINDOWS, OS/2 and their apllications.  Note that EXC can be run in
  355. a WINDOWS or OS/2 DOS session.  EXC also does not support recording mouse 
  356. movement and clicks.
  357.  
  358.    In order to execute screen reads an writes rapidly due to timing 
  359. restraints, EXC reads and writes (SHOW, SHOWIN, READ, WAITFOR, WAITSCR, etc.)
  360. directly to and from video memory at pages B000-B7FF.  If you use DESQVIEW
  361. or a special graphics mode that relocates the active video page outside
  362. this area, screen reads and writes will not function properly.  This also
  363. prevents these commands from working properly in CGA modes.  All VGA text
  364. modes and most SVGA text modes should work properly.  If you use programs
  365. that change to a different text resolution during processing, please be sure 
  366. to read about the SCRMAX command.
  367.  
  368.    If the program you are executing or a TSR that is loaded in memory moves
  369. or otherwise messes with the DOS keyboard buffer, it could cause EXC to
  370. malfunction.  The most likely symptom would be keys that you TYPE or KEY
  371. not showing up or not appearing to have been pressed.  EXC uses BIOS 
  372. interrupt 16h, service 5 to insert the keys into the keyboard buffer.  It
  373. does not reallocate or move the buffer.  It merely creates a new extended
  374. buffer that only EXC is aware of.  As the timer interrupts occur, EXC
  375. always checks to see if anything is in the extended buffer, if so it will
  376. move as many keycodes as the PC keyboard buffer will hold into the keyboard
  377. buffer, or until the extended buffer is empty.  BIOS interrupt 16h is not
  378. available until later XT BIOSes.  As a general rule, EXC should not be used
  379. except on AT models or later.
  380.  
  381.    Other factors that could cause EXC to malfunction include programs and
  382. TSRs that have timer and keyboard interrupt handlers.  Customary usage of
  383. these interrupts provides for allowing other installed handlers to perform
  384. their function, but you cannot count on all programmers to abide by these
  385. conventions.  Since even "behaved" handlers can do virtually anything within 
  386. these routines, EXC cannot be guaranteed to function on these programs.  
  387. Fortunately, they are very rare.  EXC will work with many of them (i.e. 
  388. QBASIC and EDIT from MS-DOS 5.0 up).
  389.  
  390.    If a TSR or spawned task is using timer interrupt 1C for timing (music,
  391. communications, etc.) the timing could be thrown off slightly by EXC, 
  392. especially in slower systems.  In most cases, the effect will be negligible,
  393. but in some it will prevent you from being able to use EXC.
  394.  
  395.    If you experience problems with keys being ignored or missing or out of
  396. order, try the SLOW and/or NOINT9 commands.  See the description of these
  397. commands for more details.
  398.  
  399.    If you spot another program, video mode or anything else that causes
  400. EXC to malfunction, send me a CIS mail or U.S. mail note and I will check
  401. it out if I can.  I will include a note in this section on those reported
  402. problems if they cannot be fixed.
  403.  
  404.  
  405. 3.6 Specific problems
  406.  
  407. 3.6.1 Remote control communications
  408.  
  409. Some communications programs, especially those used for remote control of
  410. a PC, may cause some particular problems for EXC.  WIZLINK, a very good 
  411. shareware implementation, evidently runs a timer interrupt that empties the 
  412. comm buffer and paints the screen.  This interrupt has a lot to accomplish 
  413. and does not take kindly to another interrupt handler stealing CPU cycles 
  414. that it needs.
  415.  
  416. The symptoms seen are unusual characters appearing on the screen and WIZLINK
  417. occasionally logging off the host.  This is seen when a WAITFOR or WAITSCR
  418. is active at this point in your script.  The WAITFOR may not detect a
  419. matching string because of the garbaged screen display.
  420.  
  421. The best solution is not to use WAITFOR and WAITSCR commands.  By using
  422. DELAY instead, all seems to work well.  Here is a compromise that appears 
  423. to work O.K. with a little experimentation and tuning:
  424.  
  425. In your script, just before the connection is made with the host, issue a
  426. SLOW command. Then in the place of WAITFORs during an active session, use 
  427. the following:
  428.  
  429.         :LOOP1
  430.         DELAY 5
  431.         SEARCH "String I Want"
  432.         IFN LOOP1
  433.  
  434. Use this loop in the place of the WAITFOR and make sure you place the DELAY
  435. before the SEARCH.  Experiment with the amount of delay to find the lowest
  436. value that repeatedly eliminates the garbled screen.  The slower the baud 
  437. rate used for the session, the longer the DELAY has to be.
  438.  
  439. Similar problems have been reported, but not yet verified by me, with 
  440. pcANYWHERE III and SmartTerm 240.
  441.  
  442.  
  443. 3.7 Error handling
  444.  
  445.    If an error occurs that prevents EXC from initiating the program, a
  446. message will appear and a DOS ERRORLEVEL of 255 will be returned.  If
  447. the program is successfully initiated, EXC will return the DOS ERRORLEVEL
  448. that the program returned when it completed.  There is an RC = nnn message
  449. after EXC terminates that displays the DOS ERRORLEVEL returned by your
  450. program and by EXC.  When COMMAND.COM is executed, the ERRORLEVEL will
  451. not reflect what was returned from one of the programs you executed and
  452. will always be zero.
  453.  
  454.    If EXC encounters an error while processing the script (i.e. an invalid
  455. script statement) it will sound two short beeps on the PC speaker and
  456. terminate processing any more script commands.  When the spawned program
  457. completes or is exited, a message will appear specifying the error EXC 
  458. encountered.
  459.  
  460.    If the spawned program terminates before EXC has finished processing
  461. the script, all script processing terminates at that point.  Keycodes
  462. that have been stuffed into the buffer remain there.  This allows you
  463. to enter a new command on the DOS command line from within your script.
  464. You can actually chain EXC processing without the use of a batch file.
  465.  
  466.  
  467. 4.0 Scripts
  468.  
  469.   Scripts can be written with any ASCII text file editor.  There is one 
  470. command per line.  Leading and trailing blanks and tabs, lines beginning with
  471. a semicolon (;) and blank lines are ignored by the script processor.  You may 
  472. have more than one blank between the command and its parameter(s).
  473.  
  474.   All window coordinates specified in some commands are based on the full 
  475. screen currently displayed.  The upper left corner is column 1, row 1.
  476.  
  477.   All "string" parameters can accept quotes within the string by placing
  478. the characters \q (lower case) in the string where you want a quote to
  479. occur.
  480.  
  481.  
  482. 4.1 Script Basics
  483.  
  484. Scripts are text files created with your favorite text editor that emulate
  485. your actions and reasoning as you perform an interactive task while using a
  486. DOS-based program.  As you would say to yourself, "When I see this on the
  487. screen, I will type this and press these keys and wait for that to appear
  488. before I enter this", etc.  You can create EXC scripts that use this same
  489. logic and perform the same tasks, even to making decisions when different
  490. results may appear on the screen.
  491.  
  492. Creating a script is not that difficult.  Do not be intimidated by all the
  493. commands below.  You will find that 90% of your scripts may only use three or
  494. four of them.  The rest are for more esoteric applications, but they are
  495. there if you need them.
  496.  
  497. To create a script to preform a repetitive task, perform the task as you
  498. normally do, taking notes as to what changes on the screen and what keys you
  499. press.  Then simply reproduce these actions with script commands, testing
  500. a little at a time as you go.
  501.  
  502. Commands may start anywhere on a line, but only one command per line is 
  503. allowed.  This allows indentation for clarity.  If the first non-blank 
  504. character on a line is a semi-colon (;), the line is treated as a comment 
  505. and disregarded.  Blank lines are also disregarded.  If the first non-blank
  506. character is a colon (:), the following text is treated as a label, to be
  507. used as a branching destination.  There must be at least one space between
  508. the command and the first parameter and between parameters.  More than one 
  509. space is allowed, but could increase the memory requirements of EXC.
  510.  
  511. As mentioned earlier there are a few basic commands that can handle most of
  512. your needs.  These include TYPE, KEY, WAITFOR, and DELAY.  These are the true
  513. workhorse commands of EXC.
  514.  
  515.   READ, LOOK and SEARCH may come in handy when looking for more than one thing
  516. on the screen and WAITSCR is handy when you don't care what the results are,
  517. only that something was sent back to the screen.
  518.  
  519.   Some commands are truly useful only while debugging.  These include commands
  520. such as BEEP, SHOW, SHOWIN, SHOWAT, HIDEWIN and PAUSE.
  521.  
  522.   Decision making, looping and branching within the script to different logic
  523. paths are facilitated by commands such as GOTO, IFN, IFY, ON, ONRESET, QUIT, 
  524. and TIMEOUT.
  525.  
  526.   Moving the data entry cursor around the screen are facilitated by commands
  527. like CURSOR, CURSX, CURSY, LOCATE, VLOCATE, and HLOCATE.  The last two are
  528. exceptionally valuable when moving menu bars to the selection you need.
  529.  
  530.   Sectioning the screen to limit your reads and searches to a sector of the
  531. screen is done with WINCOLS, WINROWS and WINMAX.
  532.  
  533.   FILE, GET and REWIND are particularly beneficial to projects that seek to
  534. convert data from one database or database type to another.  To do this you
  535. export or print to disk a listing of the contents of the source database, one
  536. field per line.  You can create a script that uses the exported ASCII file as
  537. input and does the data entry into the new database manager.
  538.  
  539.   The uses for EXC scripts are many and varied, from automating repetitive
  540. tasks, to creating elaborate "macros."  Many users use it to automate data
  541. communications tasks such as downloading files from a remote computer.  Think
  542. of EXC as a macro processor for any type of DOS text-based program.  Of course,
  543. if the program you are using has a built-in macro or script processor, you
  544. would be better off using the one that is native to your program.
  545.  
  546.  
  547. 4.2 Script Commands
  548.  
  549.  Note: Brackets ([]) indicate an optional parameter and should not be
  550.        included as part of the command.  Quotes (""), where specified,
  551.        are required to be entered as part of the parameter.
  552.  
  553.  BEEP                   Sound a short beep on speaker. Useful in debugging
  554.                         scripts.
  555.  CASE ON                The CASE commands enable case-sensitive (ON) or case-
  556.  CASE OFF               insensitive (OFF) compares by WAITFOR and SEARCH.  The
  557.                         initial mode is CASE ON.
  558.  CLEAR                  Clear the screen.
  559.  CURSOR col row         Move the cursor to the specified coordinates.
  560.  CURSX col              Move the cursor to the specified column.
  561.  CURSY row              Move the cursor to the specified row.
  562.  DELAY n                Wait n seconds
  563.  FAST                   Turns off SLOW mode if SLOW was invoked.
  564.  FILE filespec          Open a file for processing with GET commands.
  565.  GET eoflabel blanklbl  Read a record from and external file into variable 16.
  566.  GOTO label             Unconditional branch to label.
  567.  IFN label              If condition set to N, go to label.
  568.  IFY label              If condition set to Y, go to label.
  569.  INT9                   Issue interrupt 9 (default mode).
  570.  HIDEWIN                Restore a window displayed with SHOWIN to it's
  571.                         original color attributes.
  572.  HLOCATE "string"       Same as LOCATE except cursor only moves horizontally
  573.                         to the column where the search string was found.
  574.  KEY mnemonic [n]       Push the key onto the keyboard stack. 'n' is the
  575.                         number of times you want the keycode inserted.
  576.  LOCATE "string"        Reads the screen until the string appears, then moves 
  577.                         the cursor to the start of the string.
  578.  LOOK "string"          Test to see if the string was on the screen at the 
  579.                         time the screen was last read.  Screen reads occur
  580.                         during execution of READ, SEARCH, WAITSCR and WAITFOR
  581.                         commands.  Sets "Y/N" condition.
  582.  NOINT9                 Stop issuing interrupt 9s.
  583.  ON n label             Command will do nothing n times and on pass n+1, it
  584.                         will branch to label.
  585.  ONRESET                Reset the ON counter when terminating an ON loop
  586.                         early.
  587.  PAUSE                  Causes the script to be paused as if Scroll Lock were
  588.                         pressed.
  589.  QUIET                  Supresses messages to screen from EXC.
  590.  QUIT                   Halt processing the script file.
  591.                         End-of-file on the script file issues an automatic
  592.                         QUIT.
  593.  READ                   Read the current screen contents.
  594.  REWIND                 Go to the start of an external file (see FILE, GET).
  595.  SCRMAX cols rows       Specifies the largest screen size that will be used
  596.                         during execution.  Used to allocate screen buffer.
  597.  SEARCH "string"        Read screen and test to see if the string is on the
  598.                         screen. Sets "Y/N" condition.
  599.  SET n "string"         Set variable n to value "string".
  600.  SETWAIT nnn            Wait nnn seconds before a WAITFOR or WAITSCR times
  601.                         out.
  602.  SHOW attr "string"     Display the string using the specified attribute.
  603.                         Displays at the location specified in SHOWAT.
  604.  SHOWAT col row         Specifies location for subsequent SHOW command
  605.                         strings to be displayed.
  606.  SHOWIN attr            Rewrite the current window text in the specified
  607.                         attribute.
  608.  SLOW [n]               SLOW mode can help you on slow CPUs or slow programs.  
  609.                         Slower keying.
  610.  TICK n                 Same as DELAY except n represents 1/18th of a second
  611.                         instead of a second.
  612.  TIME hhmmss            Pause execution of subsequent commands until the
  613.                         specified time of day.
  614.  TIMEOUT label          Branch to label when the next WAITFOR or WAITSCR
  615.                         timeout occurs.
  616.  TYPE "string"          Type the ASCII string.
  617.  TYPFILE filespec [mnemonic]      
  618.                         Type the contents of the specified file.  Replace
  619.                         CR/LFs with specified mnemonic.
  620.  VLOCATE "string"       Same as LOCATE except cursor only moves vertically
  621.                         to the row where the search string was found.
  622.  WAITFOR [NOT] "string" Wait until the string appears on the screen.  If NOT
  623.                         specified, wait until string is not on screen.
  624.  WAITSCR                Wait until anything changes on the screen.
  625.  WINCOLS start end      Limit screen reads and SHOWIN to the screen columns
  626.                         specified.
  627.  WINMAX                 Remove row and column restraints imposed by WINCOLS
  628.                         and WINROWS.  Subsequent reads read the full screen.
  629.  WINROWS start end      Limit screen reads and SHOWIN to the screen rows
  630.                         specified.
  631.  :label                 Define a label.
  632.  
  633.  
  634. 4.2.1 BEEP
  635.  
  636.  Sounds a short BEEP on the PC speaker.  Since there is no visual feedback
  637.  for many of the operations and branches performed while processing a script,
  638.  debugging a script can be tough if it is complex.  Inserting a BEEP at a
  639.  strategic location in the script will tell you if processing ever reached
  640.  that point in the script.
  641.  
  642.  NOTE: BEEP does not extend the duration of the timer interrupt.  It actually
  643.  is turned on, then turned off a few ticks later.
  644.  
  645.  
  646. 4.2.2 CASE ON / CASE OFF
  647.  
  648.  The CASE commands determine case sensitivity during SEARCH, LOOK and WAITFOR
  649.  string searches.  If CASE is ON, the search string and screen contents are
  650.  unchanged during the search, and must match in upper and lower case.  If 
  651.  CASE is OFF, the search string and all characters read from the screen are 
  652.  converted to upper-case before the search begins so that case does not 
  653.  influence the result of the compare.
  654.  
  655.  The initial CASE mode is ON.
  656.  
  657.  NOTE - You must reread the screen after changing the CASE mode before the
  658.  new CASE mode will take effect.
  659.  
  660.  See TIMEOUT for example.
  661.  
  662.  
  663. 4.2.3 CLEAR
  664.  
  665.  The CLEAR command clears the entire screen, not just the active window.
  666.  It also homes the cursor.  Use with caution, this could cause problems 
  667.  within many applications.
  668.  
  669.  
  670. 4.2.4 CURSOR col row
  671.  
  672.  The cursor is moved to the location on the screen (not just within the
  673.  active window) specified by col and row.  Col and row are the screen column
  674.  and row.
  675.  
  676.  CURSOR is designed primarily to be used in a full screen editor or similar
  677.  applications where the cursor can be moved with the arrow keys.  The 
  678.  destination must be in an area of the screen where the active application 
  679.  allows typing.
  680.  
  681.  CAUTION:
  682.  In order for your application to recognize that the cursor has been moved,
  683.  a series of <LEFT> <RIGHT> <UP> and <DOWN> keys are stuffed into the
  684.  buffer and executed until the cursor is at the desired location.  If you
  685.  send the cursor to a location that is not in an acceptable input area of
  686.  the active application, the cursor will jump around the destination, but
  687.  never get there.  You will have to terminate the script with LEFT SHIFT-
  688.  RIGHT SHIFT. Some applications require the use of other keys such as TAB
  689.  to move from one field to another.
  690.  
  691.  Example: CURSOR 17 41
  692.  
  693.  
  694. 4.2.5 CURSX col
  695.  
  696.  The cursor is moved to the column specified.  No vertical movement keys are
  697.  issued.  See CURSOR for more details and a CAUTION.
  698.  
  699.  Example: CURSX 12
  700.  
  701.  
  702. 4.2.6 CURSY row
  703.  
  704.  The cursor is moved to the row specified.  No horizontal movement keys are
  705.  issued.  See CURSOR for more details and a CAUTION.
  706.  
  707.  Example: CURSY 20
  708.  
  709.  
  710. 4.2.7 DELAY n
  711.  
  712.  Pauses execution of subsequent script commands until the specified number
  713.  of seconds has elapsed.
  714.  
  715.  Example: DELAY 3
  716.  
  717.  
  718. 4.2.8 FAST
  719.  
  720.  FAST is used to reverse the effect of a previous SLOW command.  FAST is the
  721.  initial state.  See the SLOW command for a full explanation.  FAST has no
  722.  parameters.
  723.  
  724.  
  725. 4.2.9 FILE filespec
  726.  
  727.  FILE specifies an external ASCII text file path/name to be opened for input
  728.  when EXC initializes.  The records of the file can be retrieved one at a time
  729.  using the GET command.  When the script terminates, the file is closed.
  730.  
  731.  There can only be one FILE statement within a script.  If you attempt to
  732.  issue another, a message indicating an open error will be issued and the
  733.  spawned program will not be invoked.
  734.  
  735.  The FILE statement can occur anywhere within the script, before or after
  736.  any GET statements.
  737.  
  738.  The filespec is any valid DOS file name.  If it is not in the current working
  739.  directory, include the drive and path to access the file.
  740.  
  741.  CAUTION!  File I/O from within a timer interrupt such as EXC is a DOS no-no.
  742.            EXC invokes some tricks to pull it off, but if you experience
  743.            problems using FILE and GET in a particular script, you should
  744.            abandon the idea and seek another approach.
  745.  
  746.  See GET for example.
  747.  
  748.  
  749. 4.2.10 GET eoflabel blanklabel
  750.  
  751.  GET reads the next record (up to 128 bytes) from the file specified in a
  752.  FILE command.  The record is retrieved into variable 16 and can be used
  753.  as any variable can.  Trailing blanks are removed from the record as are
  754.  carriage return and new line characters.
  755.  
  756.  If there is no FILE command in the script, GET is ignored.
  757.  
  758.  To return to the first record in the file, use the REWIND command.
  759.  
  760.  The eoflabel parameter is a label to which control is transferred upon
  761.  reaching end-of-file on the file.
  762.  
  763.  The blanklabel parameter is a label to which control is passed if the
  764.  current record is blank or empty.  When a blank record is read, variable
  765.  16 contains nothing, therefore special handling may be required.  If not,
  766.  just specify a label immediately following the GET command.
  767.  
  768.  Please see the FILE command for additional information and a caution.
  769.  
  770.  Example:
  771.  
  772.   Reads file TESTEXC.FIL and types each record followed by pressing ENTER.
  773.   If a blank record occurs, the ENTER key is pressed.  Returns to the start
  774.   of the file and does it again.
  775.  
  776.   FILE TESTEXC.FIL
  777. :LOOP
  778.   GET ENDLOOP BLANK
  779.   TYPE "@16@"
  780. :BLANK
  781.   KEY <ENTER>
  782.   GOTO LOOP
  783. :ENDLOOP
  784.   REWIND
  785. :LOOP2
  786.   GET ENDLOOP2 BLANK2
  787.   TYPE "@16@"
  788. :BLANK2
  789.   KEY <ENTER>
  790.   GOTO LOOP2
  791. :ENDLOOP2
  792.  
  793.  
  794. 4.2.11 GOTO label
  795.  
  796.  Executes an unconditional branch to the command following the specified
  797.  label.
  798.  
  799.  See ON for example.
  800.  
  801.  
  802. 4.2.12 HIDEWIN
  803.  
  804.  Restore the active window to its original attributes after a SHOWIN command
  805.  has be executed.  If no SHOWIN has been executed, the results will not be
  806.  pleasing to the eye.  Also, screen reading commands must not be executed
  807.  between a SHOWIN and its corresponding HIDEWIN.  See SHOWIN for reasons for
  808.  using SHOWIN and HIDEWIN.
  809.  
  810.  See SHOWIN for example.
  811.  
  812.  
  813. 4.2.13 HLOCATE "string"
  814.  
  815.  Same as LOCATE except that only horizontal movement keys are issued to
  816.  place the cursor in the same column where the search argument was located.
  817.  It is actually the column of the first character of the located string.
  818.  
  819.  See LOCATE for more details and a CAUTION.
  820.  
  821.  Example: HLOCATE "Help"
  822.  
  823.  
  824. 4.2.14 IFN label
  825.  
  826.  This tests the results of a previous SEARCH or LOOK command.  If the search
  827.  string was not located on the screen, processing resumes at the command
  828.  following the specified label.  If the string was found on the screen,
  829.  processing resumes with the next command after the IFY command.
  830.  
  831.  If no previous SEARCH or LOOK has been issued, processing continues after
  832.  branching to the specified label.  Thus, without a preceding SEARCH or
  833.  LOOK command, the IFN command becomes an unconditional branch equivalent to
  834.  a GOTO command.
  835.  
  836.  The IFN statement does not have to be the next command after the SEARCH or
  837.  LOOK.
  838.  
  839.  Example:
  840.  
  841.  :Loop
  842.    READ
  843.    LOOK "XYZ"
  844.    IFN LoopEnd
  845.    .
  846.    .
  847.    .
  848.    GOTO Loop
  849.  :LoopEnd
  850.    .
  851.    .
  852.    .
  853.  
  854.  
  855. 4.2.15 IFY label
  856.  
  857.  This tests the results of a previous SEARCH or LOOK command.  If the search
  858.  string was located on the screen, processing resumes at the command
  859.  following the specified label.  If the string was not found on the screen,
  860.  processing resumes with the next command after the IFY command.
  861.  
  862.  If no previous SEARCH or LOOK has been issued, the result is negative and
  863.  processing continues without branching.  Thus, without a preceding SEARCH
  864.  or LOOK command, the IFY statement appears as a null or nonexistent command.
  865.  
  866.  The IFY statement does not have to be the next command after the SEARCH or
  867.  LOOK.
  868.  
  869.  See ON for example.
  870.  
  871.  
  872. 4.2.16 INT9
  873.  
  874.  INT9 is used to reverse the effect of a previous NOINT9 command.  INT9 is
  875.  the initial state.  See the NOINT9 command for a full explanation.  INT9
  876.  has no parameters.
  877.  
  878.  
  879. 4.2.17 KEY <mnemonic> [n]
  880.  
  881.  KEY is used to enter special keys that require mnemonics (special names
  882.  enclosed in <> that represent their function) in order to input them to
  883.  the keyboard buffer.
  884.  
  885.  If n is specified, it is the number of times <mnemonic> will be inserted
  886.  into the keyboard buffer.  For instance, if you wanted three TABs, you would
  887.  type "KEY <TAB> 3".  If n is not specified, it is assumed to be 1.
  888.  
  889.  The following key mnemonics are recognized:
  890.  
  891.  Single keys mnemonics:
  892.  
  893.  <BKSP>          <DEL>            <DOWN>           <END>            <ENTER>
  894.  <F1>-<F12>      <ESC>            <HOME>           <INS>            <LEFT>
  895.  <PGDN>          <PGUP>           <PRTSC>          <RIGHT>          <TAB>
  896.  <UP>            <GRAY5>          <GRAY+>          <GRAY->          <GRAY*>
  897.  <x>             <SPACE>
  898.  
  899.  Two key mnemonics (see note below):
  900.  
  901.  Shift key combinations: <SHF+s> or <SHF+x>
  902.  CTL key combinations:   <CTL+s> or <CTL+x>
  903.  ALT key combinations:   <ALT+s> or <ALT+x>
  904.  
  905.  Three key mnemonics (see note below):
  906.  
  907.  Shift + ALT key combinations: <ALT+SHF+s> or <ALT+SHF+x>
  908.  CTL + ALT key combinations:   <CTL+ALT+s> or <CTL+ALT+x>
  909.  CTL + Shift key combinations: <CTL+SHF+s> or <CTL+SHF+x>
  910.  
  911.  Four key mnemonics (see note below):
  912.  
  913.  <CTL+ALT+SHF+s> or <CTL+ALT+SHF+x>
  914.  
  915.  x = any ASCII value that can be entered from the keyboard with a single
  916.      key, or SHIFT + a single key.
  917.  
  918.  s = any of the single key mnemonic keywords or character except <PRTSC>.
  919.  
  920.  NOTE: Some SHF, CTL and ALT key combinations are undefined.  See the
  921.        keycode table in Appendix A.  
  922.  
  923.        Do not use <SHF+a> to simulate a capital A, or any other letter.  Just 
  924.        use the appropriate case in a TYPE statement, i.e. TYPE "A".
  925.  
  926.        When entering 3-or-more-key combinations you must make sure you are
  927.        at the correct point in your program for entering these keys and that
  928.        no other keys are still unprocessed in the buffer.  To detect these
  929.        combinations, a program must interrogate the BIOS keyboard flags to 
  930.        see if CTL, ALT or SHIFT are being held down.  This can only be done 
  931.        in real time as the keys are being pressed, therefore they cannot be 
  932.        stuffed into the keyboard buffer, and must be executed immediately
  933.        upon encountering the KEY command in the script.  The appropriate
  934.        flags are set, the keycode is stuffed and an interrupt 9 is issued.
  935.        If there is already a key in the buffer, the flags will accompany
  936.        the wrong keycode when the interrupt 9 is processed.
  937.  
  938.        Not all programs will recognize these combinations as simulated by
  939.        EXC.  Attachmate's EXTRA!, for example, maintains such tight control
  940.        of the keyboard, that EXC's control key combinations are ignored.
  941.  
  942.        The <CTL+ALT+DEL> mnemonic causes a system warm boot.  It does not work
  943.        properly in a WINDOWS DOS session.  WINDOWS will intercept the jump to
  944.        the system BIOS and produce a "System integrity violation" message.
  945.  
  946.  Examples:
  947.  
  948.    KEY <ESC> 3
  949.    KEY <CTL+F10>
  950.    KEY <ENTER>
  951.  
  952.  
  953. 4.2.18 LOCATE "string"
  954.  
  955.  The LOCATE command is mostly a combination of WAITFOR and CURSOR.  You
  956.  provide a string.  Processing will be suspended until that string appears
  957.  in the active window or a timeout occurs.  Once the string is located,
  958.  the cursor is moved, via a sequence of arrow keys stuffed in the keyboard
  959.  buffer, to the location of the first character of the string.
  960.  
  961.  LOCATE is designed primarily to be used in a full screen editor or similar
  962.  application where the cursor can be moved with the arrow keys.  The located
  963.  string must be in an area of the screen where the active application allows
  964.  typing.
  965.  
  966.  CAUTION:
  967.  In order for your application to recognize that the cursor has been moved,
  968.  a series of <LEFT> <RIGHT> <UP> and <DOWN> keys are stuffed into the
  969.  buffer and executed until the cursor is at the desired location.  If you
  970.  send the cursor to a location that is not in an acceptable input area of
  971.  the active application, the cursor will jump around the destination, but
  972.  never get there.  You will have to terminate the script with LEFT SHIFT-
  973.  RIGHT SHIFT. Some applications require the use of other keys such as TAB
  974.  to move from one field to another.
  975.  
  976.  Example: LOCATE "Help"
  977.  
  978.  
  979. 4.2.19 LOOK "string"
  980.  
  981.  Look at the last screen that was read to see if it contains the value in
  982.  "string".  The entire active window contents will be searched to see if
  983.  "string" was being displayed when the last screen read occurred.   The
  984.  string may be any valid screen characters.  There is no wait involved as
  985.  with WAITFOR.
  986.  
  987.  The screen contents are read each time a READ, SEARCH, WAITSCR, WAITFOR or
  988.  LOCATE command is executed.  In the case of WAITFOR and WAITSCR, multiple
  989.  reads occur until a search string or change is detected.  The contents of
  990.  the screen buffer remain as they were when the last read was executed at the
  991.  time the search string or change was detected or a timeout occurred.
  992.  
  993.  Once it has been determined whether or not "string" was being displayed,
  994.  an internal variable is set to "Y" or "N".  IFY and IFN can then be used to
  995.  test the result of the search and then branch accordingly.
  996.  
  997.  Example: LOOK "Help"
  998.  
  999.  
  1000. 4.2.20 NOINT9
  1001.  
  1002.  A few certain programs (i.e. MS-DOS's EDIT and the QBASIC editor) require
  1003.  a keyboard interrupt before they will process keys in the keyboard buffer.
  1004.  For this reason, EXC normally issues the interrupt 9 keyboard interrupt.
  1005.  
  1006.  It is conceivable that other programs may have interrupt handlers that do
  1007.  not like the INT9 being issued.  The most likely symptom would be keys not
  1008.  processed or processed out of order.
  1009.  
  1010.  Specifying NOINT9 will cause EXC to not issue the INT9.  Try this command
  1011.  if you are having problems you can't seem to resolve.  Also try the SLOW
  1012.  command.
  1013.  
  1014.  INT9 should normally be issued once in the script before any TYPE, KEY or 
  1015.  TYPFILE commands are issued.  It can however, be turned on to get you over 
  1016.  a sticky area, then reversed by issuing the INT9 command.  You can issue
  1017.  the NOINT9/INT9 commands as many times as you wish.  NOINT9 has no
  1018.  parameters.
  1019.  
  1020.  Example:
  1021.   
  1022.    NOINT9
  1023.    TYPFILE C:\MYFILE.TXT
  1024.    INT9
  1025.  
  1026.  
  1027. 4.2.21 ON n label
  1028.  
  1029.  For the first n executions of the ON command, execution simply passes to the
  1030.  next command.  On the next pass through the ON command, a branch occurs to
  1031.  label.  The value of n can range from 1 to 9999.
  1032.  
  1033.  A second ON command must not be issued while another ON command is active.
  1034.  This will cause unpredictable results.  After an ON command has counted
  1035.  down and branched, another ON command may be issued.  You can reset the
  1036.  ON counter to zero by using the ONRESET command.  Then additional ON
  1037.  command can be issued even if the previous one has not reached zero.
  1038.  Obviously, multiple ON commands cannot be processing at the same time.  For
  1039.  instance, you may not call a subroutine that contains an ON command from
  1040.  within an ON loop.  A good practice is to always issue the ONRESET command
  1041.  when exiting an ON loop via any branch other than that specified in the
  1042.  ON command.
  1043.  
  1044.  Example:
  1045.  
  1046.      :LOOP
  1047.        ON 5 ENDLOOP
  1048.        SEARCH "ERROR:"
  1049.        IFY ERROR
  1050.        TYPE "xyz"      - These two instructions are executed five
  1051.        KEY <DOWN>      - times unless an error message pops up.
  1052.        GOTO LOOP
  1053.      :ENDLOOP
  1054.        KEY <ENTER>
  1055.      :ERROR
  1056.        ONRESET
  1057.      :LOOP2
  1058.        ON 3 QUITPGM
  1059.        .
  1060.        .
  1061.        .
  1062.        GOTO LOOP2
  1063.      :QUITPGM
  1064.        QUIT
  1065.  
  1066.  
  1067. 4.2.22 ONRESET
  1068.  
  1069.  Used to reset the ON counter so than another ON may be issued if the
  1070.  previous one has not completed.
  1071.  
  1072.  See ON for further explanation and example.
  1073.  
  1074.  
  1075. 4.2.23 PAUSE
  1076.  
  1077.  PAUSE simulates pressing the Scroll Lock key to pause the script execution.
  1078.  See the section on interrupt keys for a description of pause processing.
  1079.  
  1080.  
  1081. 4.2.24 QUIET
  1082.  
  1083.  The QUIET command, placed anywhere in a script will cause EXC to supress
  1084.  displaying any messages on the screen.  It is only operable on registered
  1085.  copies of EXC.  This prevents suppression of the registration notice and
  1086.  is the only command in EXC that operates any differently in the registered 
  1087.  and unregistered copies of EXC.
  1088.  
  1089.  Exceptions to the quiet suppression are error messages that prevent EXC
  1090.  from reading the script file and initiating.
  1091.  
  1092.  
  1093. 4.2.25 QUIT [n]
  1094.  
  1095.  QUIT stops processing a script at the point where it is encountered during
  1096.  script execution.  The same result is obtained when there are no more script
  1097.  commands to process.
  1098.  
  1099.  Normally on exit, EXC returns the return code of the executed program.  If
  1100.  a number (0-255) is specified with the QUIT command, that value is returned
  1101.  as the DOS ERRORLEVEL return code instead of what was passed from the
  1102.  spawned program.
  1103.  
  1104.  An example of why you would want to set a return code:
  1105.  
  1106.    I use EXC to control PROCOMM PLUS to execute a script that synchro-
  1107.    nizes my clock with the Naval Observatory.  I need to know if it
  1108.    fails.
  1109.  
  1110.    I can detect the error with my EXC script, but when I exit PCPLUS,
  1111.    PCPLUS always returns a return code of 255.  Using the QUIT 1 command,
  1112.    I can set a DOS ERRORLEVEL of 1 on error and 0 when there is no error.
  1113.  
  1114.  If COMMAND.COM was invoked by the EXC command line, QUIT types EXIT and keys
  1115.  <ENTER> in order for EXC to be able to complete.  If you issue the QUIT
  1116.  while another program is active, you will not obtain the desired results.
  1117.  
  1118.  See TIMEOUT for example.
  1119.  
  1120.  
  1121. 4.2.26 READ
  1122.  
  1123.  Reads the active window for subsequent testing with the LOOK command.  Using
  1124.  a READ followed by several LOOKs that examine the same screen contents can
  1125.  be much more efficient than issuing several SEARCHes, each of which reads
  1126.  the entire screen contents.
  1127.  
  1128.  
  1129. 4.2.27 REWIND
  1130.  
  1131.  The REWIND command returns the file pointer for an external file to the
  1132.  start of the file so that the next GET command will return the first
  1133.  record in the file. GET and FILE contain additional information regarding
  1134.  the use of external files.
  1135.  
  1136.  See GET for example.
  1137.  
  1138.  
  1139. 4.2.28 SCRMAX cols rows
  1140.  
  1141.  I hate including technical parameters in my commands, but this one is a
  1142.  must for successful operation of EXC in larger screen modes.
  1143.  
  1144.  Specify SCRMAX if you expect a spawned application to change to a text
  1145.  screen mode larger than the text mode in use when EXC is initiated.  For
  1146.  instance, if you are in DOS with 25 rows of 80 column text and you initiate
  1147.  an editor with EXC and the editor places the screen in 80x50 text mode,
  1148.  specify "SCRMAX 80 50" in your script (no quotes).  Since this command is
  1149.  processed when the script is being loaded into memory and not after the
  1150.  script processing begins, it may be placed anywhere within your script.
  1151.  Logically, it should occur at the start.  If multiple SCRMAX commands are
  1152.  encountered, only the last one input will be used.  If your application will
  1153.  use multiple screen sizes, specify the largest (in area: cols times rows)
  1154.  that will be used.
  1155.  
  1156.  If you do not include SCRMAX in your script, it is assumed that the screen
  1157.  size in effect when EXC is loaded and before the spawned program is loaded
  1158.  will be the maximum size needed.
  1159.  
  1160.  The range of text mode screen sizes supported by EXC includes from 40x20 to
  1161.  200x100 characters.
  1162.  
  1163.  SCRMAX can have a major impact in the amount of memory occupied by EXC.
  1164.  It would seem that the logical thing for EXC to do would be to examine
  1165.  the screen size before each read and allocate the screen memory buffer
  1166.  accordingly at that time.  However, since EXC spawns another program which
  1167.  can, and often does, allocate all of the remaining memory, EXC must pre-
  1168.  allocate the largest buffer that will be required before spawning the
  1169.  program.  A screen buffer requires the same number of bytes as the rows 
  1170.  times the columns, plus 4 bytes.  Thus, an 80x25 VGA text screen will 
  1171.  require a 2,004 byte buffer.  I actually had a user contact me who uses a 
  1172.  132x66 display (great eyes or a huge monitor!).  This would require 132 * 66
  1173.  or 8,712 bytes of memory.  
  1174.  
  1175.  If you do not specify SCRMAX and your program bumps up the screen size,
  1176.  the effective area of the larger screen is the upper left quadrant
  1177.  corresponding to the size of the screen when EXC was loaded.  This is
  1178.  also true if you specify an SCRMAX smaller than the largest screen.  In
  1179.  other words, if you specify SCRMAX 80 25 and your program changes to a
  1180.  132x44 screen,  Only the first 80 columns and 25 rows are read by EXC's
  1181.  READ, WAITFOR, WAITSCR, LOCATE and SEARCH commands.  If all of the strings
  1182.  you search for and changes you wish to detect are in the upper left of
  1183.  the screen, you can save memory by specifying a smaller SCRMAX size.  You 
  1184.  would really have to be in a memory crunch to bother with this approach, 
  1185.  I suspect.
  1186.   
  1187.  Examples:
  1188.  
  1189.    SCRMAX 80 50
  1190.    SCRMAX 132 25
  1191.  
  1192.  
  1193. 4.2.29 SEARCH "string"
  1194.  
  1195.  At any point in processing the script, you may check to see if certain
  1196.  information is on the screen.  The entire active window will be read and
  1197.  searched to see if "string" is being displayed.   The string may be any
  1198.  valid screen characters.  There is no wait involved as with WAITFOR.
  1199.  
  1200.  Once it has been determined whether or not the string is being displayed,
  1201.  an internal variable is set to "Y" or "N".  IFY and IFN can then be used to
  1202.  test the result of the search and then branch accordingly.
  1203.  
  1204.  SEARCH is basically a READ followed immediately by a LOOK.
  1205.  
  1206.  See ON for example.
  1207.  
  1208.  
  1209. 4.2.30 SET n "string"|NULL
  1210.  
  1211.  SET is used to set one of the 16 user variables to a value, where n is
  1212.  the variable number (1-16) and string is the value which will be assigned to
  1213.  the variable.  Do not surround n with @s which are used to reference 
  1214.  variables for substitution.
  1215.  
  1216.  To clear a variable, type SET n NULL.
  1217.  
  1218.  See "User variables" for more information and examples.
  1219.  
  1220.  
  1221. 4.2.31 SETWAIT seconds
  1222.  
  1223.  This sets the timeout limit for WAITSCR, WAITFOR and LOCATE commands.  If
  1224.  processing is waiting after invoking any of these commands and the specified
  1225.  number of seconds elapses, TIMEOUT processing, described under TIMEOUT, will
  1226.  be invoked.
  1227.  
  1228.  You may change the SETWAIT timeout limit at any point while processing the
  1229.  script.
  1230.  
  1231.  If SETWAIT is set to zero, no timeout ever takes place and EXC will wait
  1232.  indefinitely during WAITFOR, WAITSCR and LOCATE.  The initial value of the
  1233.  SETWAIT timer is zero.
  1234.  
  1235.  See TIMEOUT for example.
  1236.  
  1237.  
  1238. 4.2.32 SHOW attr "string"
  1239.  
  1240.   SHOW displays a string at a given location on the screen.  This command
  1241.  is mostly useful for debugging scripts by displaying information about the
  1242.  progress of the script during execution.  While mostly harmless, it can cause
  1243.  problems if a spawned program reads screen memory.  Use it cautiously.
  1244.  
  1245.  The string is displayed at the location specified in the last executed
  1246.  SHOWAT command.
  1247.  
  1248.  The screen attribute is the sum of a background value plus a foreground
  1249.  value from the table below.  Add 128 if you want it to blink.
  1250.  
  1251.   Background colors:       Foreground colors:
  1252.  
  1253.     0 Black                 0 Black
  1254.    16 Blue                  1 Blue
  1255.    32 Green                 2 Green
  1256.    48 Cyan                  3 Cyan
  1257.    64 Red                   4 Red
  1258.    80 Magenta               5 Magenta
  1259.    96 Brown                 6 Brown
  1260.   112 Light Gray            7 Light Gray
  1261.                             8 Dark Gray
  1262.                             9 Light Blue
  1263.                            10 Light Green
  1264.                            11 Light Cyan
  1265.                            12 Light Red
  1266.                            13 Light Magenta
  1267.                            14 Yellow
  1268.                            15 White
  1269.  
  1270.  See TIMEOUT for example. 
  1271.  
  1272.  
  1273. 4.2.33 SHOWAT col row
  1274.  
  1275.  Specifies the location on the screen where subsequent SHOW commands will
  1276.  display their strings.  The location does not have to be within the active
  1277.  window set via WINROWS and WINCOLS.
  1278.  
  1279.  See TIMEOUT for example.
  1280.  
  1281.  
  1282. 4.2.34 SHOWIN attr
  1283.  
  1284.  SHOWIN is designed as an aid to script writing.  Sometimes you will want to
  1285.  restrict the active window to certain rows and columns, thus creating a
  1286.  smaller active window for processing commands that read the screen.
  1287.  
  1288.  To make sure you have calculated the correct area for the active window, you
  1289.  can use SHOWIN to show you where the active window is located on the
  1290.  screen.  SHOWIN will change the attribute of all characters and spaces
  1291.  within the active window to that specified.  See the SHOW command for
  1292.  attribute values.
  1293.  
  1294.  HIDEWIN can then be used to restore the window to its normal attributes.
  1295.  There must never be any screen reading commands (WAITFOR, WAITSCR, SEARCH,
  1296.  READ and LOCATE) executed between the SHOWIN and its associated HIDEWIN.
  1297.  
  1298.  
  1299.  Example:
  1300.  
  1301.     WINCOLS 10 30
  1302.     WINROWS 12 22
  1303.     SHOWIN
  1304.     PAUSE
  1305.     HIDEWIN
  1306.  
  1307.  
  1308. 4.2.35 SLOW [n]
  1309.  
  1310.  Some slow CPUs may have problems where a few characters in TYPEd strings get
  1311.  entered out of order or are missing.  The problem may also occur when
  1312.  TYPFILE is used.  The problem can also occur with an application that is
  1313.  slow in reading the keyboard.  Using the SLOW command can often resolve the
  1314.  problem, although the strings will be typed in a little slower.
  1315.  
  1316.  Other problems, as yet undetermined, might be fixed by using SLOW, so give
  1317.  it a try if your script is not responding properly, regardless of the speed
  1318.  of your CPU.  You might also try the NOINT9 command.
  1319.  
  1320.  SLOW should normally be issued once in the script before any TYPE, KEY or 
  1321.  TYPFILE commands are issued.  It can however, be turned on to get you over 
  1322.  a sticky area, then turned off by issuing the FAST command.  You can issue
  1323.  the SLOW/FAST commands as many times as you wish.  SLOW has no parameters.
  1324.  
  1325.  The parameter [n] controls the amount of slowing, with 1 being the slowest
  1326.  and 16 being the fastest keyboard entry speed.  SLOW 16 is still much slower
  1327.  than FAST mode on large strings and files.  SLOW 3 is assumed if n is not
  1328.  specified.
  1329.  
  1330.  Example:
  1331.  
  1332.    SLOW 5
  1333.    TYPFILE C:\MYFILE.TXT
  1334.    FAST
  1335.  
  1336.  
  1337. 4.2.36 TICK n
  1338.  
  1339.  Pauses execution of subsequent script commands until the specified number
  1340.  of system clock ticks (18.2 per second) have elapsed.
  1341.  
  1342.  Example: TICK 12
  1343.  
  1344.  
  1345. 4.2.37 TIME hhmmss
  1346.  
  1347.  Pauses execution of subsequent script commands until the specified time of
  1348.  day.  The time must be specified in 24-hour format.  If the time has
  1349.  already passed when the TIME command is processed, processing is suspended
  1350.  until the next time the specified time of day occurs.
  1351.  
  1352.  Leading zeros are required if the hour, minute or second is less that two
  1353.  digits.  For instance two minutes after one in the morning is entered as
  1354.  010200.
  1355.  
  1356.  Note- The real time clock (set by the DOS TIME command in AT and later
  1357.  machines using DOS 3.x or later) and the system timer (which EXC uses) are
  1358.  not always in synch to the second.  There may be a few seconds variation.
  1359.  
  1360.  Example:
  1361.  
  1362.   ; At 1:15 PM, set off an alarm that can be shut off with LEFT SHIFT-RIGHT
  1363.   ; SHIFT
  1364.  
  1365.     TIME 131500
  1366.  
  1367.   :Loop
  1368.     BEEP
  1369.     GOTO Loop
  1370.  
  1371.  
  1372. 4.2.38 TIMEOUT label
  1373.  
  1374.  When the timeout limit specified by SETWAIT expires while waiting for a
  1375.  WAITSCR, WAITFOR or LOCATE, TIMEOUT processing is invoked.  Timeout
  1376.  processing is as follows:
  1377.  
  1378.  If no TIMEOUT command has yet been issued in the script, processing of the
  1379.  script is halted at this point.  Otherwise, the control will pass to the
  1380.  command following the label specified in the last TIMEOUT command 
  1381.  encountered.
  1382.  
  1383.  Example:
  1384.  
  1385.    SETWAIT 20
  1386.    TIMEOUT TimedOut
  1387.    SHOWAT 17 25
  1388.    WINCOLS 20 40
  1389.    WINROWS 15 22
  1390.    CASE ON
  1391.    
  1392.    WAITFOR "XYZ"
  1393.    SHOW 79 "Found XYZ in window."
  1394.    QUIT
  1395.  
  1396. :TimedOut
  1397.    SHOW 79 "Timed out waiting for XYZ to appear in window."
  1398.    WINMAX
  1399.    CASE OFF
  1400.    .
  1401.    .
  1402.    .
  1403.  
  1404.  
  1405. 4.2.39 TYPE "string"
  1406.  
  1407.  The string following the TYPE command contains ASCII characters to be placed
  1408.  in the keyboard buffer.  ASCII character are those with a decimal equivalent
  1409.  of 0-127.  Do not use high-bit characters (graphics characters, foreign
  1410.  language characters and most symbols) that range from 128-255 in their
  1411.  decimal equivalents.  These characters hove no valid keycode associated
  1412.  with them.  To enter special keys such as function keys, ENTER, ESC, etc.,
  1413.  use the KEY command followed by the required mnemonic.  You cannot enter
  1414.  these mnemonics with the TYPE command.  The string must be enclosed in
  1415.  quotes.
  1416.  
  1417.  See ON for example.
  1418.  
  1419.  
  1420. 4.2.40 TYPFILE filespec [mnemonic]
  1421.  
  1422.  TYPFILE allows you to type the contents of a file into the keyboard buffer.
  1423.  The filespec is the filename with optional path information.
  1424.  
  1425.  A possible use for this would be to feed an electronic mail message to a
  1426.  communications program.  Each line of the file is entered as is (no
  1427.  deletion of leading or trailing spaces, conversion of quotes, etc.).
  1428.  
  1429.  If no mnemonic is specified, the carriage return/line feed characters at
  1430.  the end of each line are ignored by EXC, and nothing is entered in their
  1431.  place.  If a mnemonic is specified, carriage return/line feed pairs are
  1432.  converted to the key mnemonic specified.  For instance, if the file is
  1433.  being copied into a word processor or editor that uses the ENTER key to
  1434.  move to the next line, you may want to convert CR/LFs to <ENTER>.  If you
  1435.  want the word processor to split the lines according to its margins, you
  1436.  would not specify a mnemonic or you would specify <SPACE>.
  1437.  
  1438.  Specifying <SPACE> for the mnemonic will keep the last word on a line from
  1439.  running into the first word on the next line when the CR/LF is removed.
  1440.  
  1441.  All other key mnemonics are described under the KEY command.
  1442.  
  1443.  Since EXC only has a 256 byte extended keyboard buffer, it feeds a maximum 
  1444.  of 80 bytes every clock tick into the extended buffer.  This should give 
  1445.  time for the spawned program to read characters from the buffer and will 
  1446.  usually prevent the buffer from overflowing.
  1447.  
  1448.  Please see the notes in section 3 regarding memory usage to determine the
  1449.  effects on memory of using TYPFILE.
  1450.  
  1451.  
  1452. 4.2.41 VLOCATE "string"
  1453.  
  1454.  Same as LOCATE except that only vertical movement keys are issued to
  1455.  place the cursor on the same row where the search argument was located.
  1456.  This is especially useful in moving menu selection bars up or down
  1457.  to a specific choice.
  1458.  
  1459.  See LOCATE for more details and a CAUTION.
  1460.  
  1461.  Example: VLOCATE "Help"
  1462.  
  1463.  
  1464. 4.2.42 WAITFOR [NOT] "string"
  1465.  
  1466.  No further script file command will be processed until "string" appears on
  1467.  the screen.  The entire screen will be searched for "string".  The string
  1468.  may be any valid screen characters.  If the string does not appear before
  1469.  the SETWAIT limit expires, TIMEOUT processing will be invoked.
  1470.  
  1471.  If NOT is specified, processing will be halted until "string" is not on the
  1472.  screen.  This is handy for waiting on a "Please wait.." type message to
  1473.  disappear.
  1474.  
  1475.  Since WAITFOR reads the screen each 1/2 second, values that flash on the
  1476.  screen for less than 1/2 second may not be detected.
  1477.  
  1478.  See TIMEOUT for example.
  1479.  
  1480.  WAITFOR NOT example:
  1481.  
  1482.    WAITFOR NOT "XYZ"
  1483.  
  1484.  
  1485. 4.2.43 WAITSCR
  1486.  
  1487.  Wait until there is any change to the screen before executing the next
  1488.  script command.  If there is no screen change before the SETWAIT limit
  1489.  expires, TIMEOUT processing will be invoked.
  1490.  
  1491.  
  1492. 4.2.44 WINCOLS start end
  1493.  
  1494.  Sometimes you may want to restrict your screen searches to a certain area
  1495.  of the screen.  WINCOLS allows you to specify what columns (far left = 1)
  1496.  you want read by all commands that read the screen (READ, SEARCH, WAITFOR,
  1497.  WAITSCR and LOCATE).  Specify the starting and ending columns inclusively.
  1498.  
  1499.  By combining WINCOLS with WINROWS, you can restrict reads to a selected
  1500.  box within the screen.  This is referred to as the active window.  Use
  1501.  WINMAX to return the active window to the full screen.
  1502.  
  1503.  See TIMEOUT and SHOWIN for examples.
  1504.  
  1505.  
  1506. 4.2.45 WINMAX
  1507.  
  1508.  If you have restricted the active window with WINCOLS and/or WINROWS, you
  1509.  can return the active window to the full screen area by issuing a WINMAX
  1510.  command.  The size of the new active window will be determined by the
  1511.  currently displayed columns and rows, but never exceeding the values
  1512.  specified in SCRMAX.
  1513.  
  1514.  See TIMEOUT for example.
  1515.  
  1516.  
  1517. 4.2.46 WINROWS start end
  1518.  
  1519.  Sometimes you may want to restrict your screen searches to a certain area
  1520.  of the screen.  WINROWS allows you to specify what rows (top = 1) you want
  1521.  read by all commands that read the screen (READ, SEARCH, WAITFOR, WAITSCR
  1522.  and LOCATE).  Specify the starting and ending rows inclusively.
  1523.  
  1524.  By combining WINCOLS with WINROWS, you can restrict reads to a selected
  1525.  box within the screen.  This is referred to as the active window.  Use
  1526.  WINMAX to return the active window to the full screen.
  1527.  
  1528.  See TIMEOUT and SHOWIN for examples.
  1529.  
  1530.  
  1531. 4.3 Labels
  1532.  
  1533.  Labels can be up to 15 characters long and may contain letters, numbers,
  1534.  special characters or spaces.  They are treated as upper case regardless of
  1535.  how they are coded.  Duplicate labels are not allowed in the same script.
  1536.  END, end and End would all be considered duplicate labels.  If duplicate
  1537.  labels exist, all branches to the duplicate labels will go to the first
  1538.  one in the script.
  1539.  
  1540.  Labels must be immediately preceded by a colon (:) and placed on a line
  1541.  which does not contain any commands.
  1542.  
  1543.  labels are used as destinations for branching commands (TIMEOUT, GOTO, ON,
  1544.  IFY and IFN).
  1545.  
  1546.  It doesn't hurt a thing if you want to use labels for comments, but the
  1547.  semicolon (;) remark is a better approach since there is no length
  1548.  limitation on remarks and they will not be confused with labels that are
  1549.  actual destinations.
  1550.  
  1551.  See TIMEOUT and ON for examples.
  1552.  
  1553.  
  1554. 4.4 Remarks
  1555.  
  1556.  Anything on a line for which the first non-blank character is a semicolon
  1557.  (;) is treated as a comment line and is ignored by the script processor.
  1558.  
  1559.  
  1560. 4.5 Using variables
  1561.  
  1562.  You may not specify variables in data included with the TYPFILE command.
  1563.  Any variables found in the file data will not be interpreted as variables
  1564.  by EXC.
  1565.  
  1566. 4.6 Environment variable substitution
  1567.  
  1568.  You may use environment strings (initialized with the DOS SET command) in
  1569.  any command parameter by typing %VAR% where you want the environment string
  1570.  labeled VAR to be substituted.  Here are some examples:
  1571.  
  1572.  Given these environment variables:
  1573.   SET ATTR=15
  1574.   SET ME=Gary
  1575.   SET LAST=Crider
  1576.   SET FULL="Gary Crider"
  1577.   SET FULL2=Gary Crider
  1578.  
  1579.   SHOW %ATTR% "I am %ME%"  would equate to  SHOW 15 "I am Gary"
  1580.   TYPE "%ME% %LAST%"       would equate to  TYPE "Gary Crider" 
  1581.   TYPE %FULL%              would equate to  TYPE "Gary Crider"
  1582.   TYPE "%FULL2%"           would equate to  TYPE "Gary Crider"
  1583.   DELAY %ATTR%             would equate to  DELAY 15
  1584.   SHOW %ATTR% "%FULL%"     would equate to  SHOW 15 "\qGary Crider\q"
  1585.   TYPE "%LAST%, %ME%"      would equate to  TYPE "Crider, Gary"
  1586.  
  1587.  The substitution is made before EXC begins to evaluate the parameters.
  1588.  
  1589.  This could be handy on networks where the values keyed or searched might 
  1590.  vary with the user's network ID, which could be stored in an environment
  1591.  variable.  Many other uses also come to mind.
  1592.  
  1593.  If you want to use a set a variables that are only used in the script and
  1594.  are not normally maintained in the environment, set up a batch file to
  1595.  set the variables, execute the script, and then delete the variables after
  1596.  the script has executed.  This frees up the environment space so that it
  1597.  can be reused.  An example of such a batch file would be:
  1598.  
  1599.  SET X1=abc
  1600.  SET X2=5
  1601.  SET X3=Gary Crider
  1602.  EXC MYSCRIPT 123
  1603.  SET X1=
  1604.  SET X2=
  1605.  SET X3=
  1606.  
  1607.  If you get a message from DOS that says "Out of environment space", you
  1608.  can increase the size of the environment region by placing the following 
  1609.  line in your CONFIG.SYS file and rebooting:
  1610.  
  1611.    SHELL=C:\COMMAND.COM /p /e:nnnn
  1612.  
  1613.  Replace nnnn with the number of bytes (160-32768) that you want used by the 
  1614.  environment region.  The default is 256.  The number should be divisible by
  1615.  16.  1024 is usually pretty good.  Note that each byte you increase the 
  1616.  region by will decrease the amount of free conventional memory used to
  1617.  run programs.  Each variable name, the equal sign, and the variable value
  1618.  are stored in your environment.  To see what is currently stored in your
  1619.  environment, type the word SET at the DOS prompt.  Your full PATH= state-
  1620.  ment is also stored there.
  1621.  
  1622.  If you use 4DOS, NDOS or another different command interpreter, or locate
  1623.  it in another directory, adjust the SHELL= statement accordingly.
  1624.  
  1625.  
  1626. 4.7 User Variables
  1627.  
  1628.  EXC reserves 16 variables which can be set to string values of up to 120
  1629.  characters each.  The variable values may contain leading, trailing or
  1630.  embedded spaces.  The variables are numbered 1 to 16.
  1631.  
  1632.  The variables are initialized or cleared with the SET command.
  1633.  
  1634.  You can then reference any variable in any command parameter or string by
  1635.  enclosing the variable number in @s.  For instance to substitute a variable
  1636.  destination label in a GOTO statement, when the destination label name is
  1637.  stored in variable 4, type GOTO @4@.  If variable 4 contained the value
  1638.  "SUB1", the above notation would be equivalent to typing GOTO SUB1.  You can
  1639.  also use the variable substitution within strings such as:
  1640.  
  1641.    TYPE "Good morning, @1@"
  1642.  
  1643.  A very beneficial side effect of allowing variables is that it now allows
  1644.  you to perform multiple executions of a subroutine, returning each time
  1645.  to a different area of the script.  Here is an example from TESTEXC.SCR:
  1646.  
  1647.  
  1648.   SHOW 12 "TESTING 3 subroutine executions.          "
  1649.   SET 2 1
  1650.   SET 1 DO2
  1651.   GOTO SUB1
  1652.  
  1653. :DO2
  1654.   SET 2 2
  1655.   SET 1 DO3
  1656.   GOTO SUB1
  1657.  
  1658. :DO3
  1659.   SET 2 3
  1660.   SET 1 EXIT
  1661.   GOTO SUB1
  1662.  
  1663. :EXIT
  1664.   SHOW 12 "Done, exiting Microsoft Editor            "
  1665.   DELAY 1
  1666.   KEY <ALT+F>
  1667.   WAITFOR "Exit"
  1668.   TYPE "x"
  1669.   WAITFOR "Save it now?"
  1670.   TYPE "n"
  1671.   QUIT
  1672.  
  1673. :SUB1
  1674.   TYPE "Subroutine execution number @2@."
  1675.   KEY <ENTER>
  1676.   GOTO @1@
  1677.  
  1678.  
  1679. 4.8 Example Script
  1680.  
  1681.  The following example demonstrates the use of most of the more commonly used
  1682.  commands.  Please note that the  QUIT statement after the End label is not
  1683.  needed since the same action takes place when there are no more commands to
  1684.  execute.
  1685.  
  1686.  Also please note that the SEARCH and IFN statements after the Loop label
  1687.  could more easily be accomplished with a WAITFOR command.  This just
  1688.  demonstrates that looping logic is supported in scripts.
  1689.  
  1690.    SETWAIT 30
  1691.    TIMEOUT End
  1692.    CASE OFF
  1693.    WAITFOR "Entries"
  1694.    CASE ON
  1695.    TYPE "FO"
  1696.    WAITFOR "OPEN CATALOG"
  1697.    TYPE "E:\NOVLIB\"
  1698.    KEY <TAB>
  1699.    KEY <ESC>
  1700.    TYPE "NOVLIB.L11"
  1701.    KEY <CTL+ENTER>
  1702.    WAITSCR
  1703.  
  1704.  :Loop
  1705.    SEARCH "NOVLIB.L11"
  1706.    IFN Loop
  1707.  
  1708.    TYPE "SLADDNAEA"
  1709.    KEY <CTL+ENTER>
  1710.    DELAY 2;
  1711.    WAITFOR NOT "Sorting Index"
  1712.    TYPE "FS"
  1713.    KEY <CTL+ENTER>
  1714.    DELAY 2
  1715.    WAITFOR NOT "Please wait."
  1716.  
  1717.  :End   
  1718.    BEEP
  1719.    KEY <ALT+X>
  1720.    QUIT
  1721.  
  1722.  
  1723.  For a more comprehensive example, see the script file, TESTEXC.SCR.  Please
  1724.  read the comments before and after that script.
  1725.  
  1726.  
  1727.  
  1728. APPENDIX A
  1729.  
  1730. Installation
  1731.  
  1732.     EXC is distributed in a self-extracting ZIP file called EXC3.EXE or a ZIP 
  1733. file called EXC.ZIP.  It contains the following files:
  1734.  
  1735.         EXC.EXE         The executable file for EXC.
  1736.         EXC.DOC         The documentation file.
  1737.         HELP.TXT        Script command quick reference.  It is formatted as
  1738.                         script file comments so that it can be included in
  1739.                         you script for quick referencing.z
  1740.         TESTEXC.SCR     Example script used to test EXC functionality.
  1741.         TESTEXC.TXT     Text file for testing with TESTEXC.SCR.
  1742.         TESTEXC.FIL     Another text file for testing with TESTEXC.SCR.
  1743.         TESTEXC.BAT     Batch file for executing TESTEXC.SCR.
  1744.         TESTOS2.BAT     Batch file for executing TESTEXC.SCR in an OS/2 DOS
  1745.                         window.
  1746.         EXC.HST         Text description of past updates.
  1747.         EXC.Vnn         Text description of latest updates in version nn.
  1748.         PRODUCTS.DOC    Description of other Parity Solutions products.
  1749.  
  1750.     For best results, extract the file into a directory on your PATH.  If you
  1751. don't use a directory in your path, you will have to designate the directory
  1752. containing EXC.EXE when executing the program.
  1753.  
  1754.     If you have a utility directory that is on your PATH, this is an excellent
  1755. location for EXC.  An example installation would be:
  1756.  
  1757.     C:
  1758.     CD \UNTIL
  1759.     COPY [path]EXC3.EXE
  1760.     EXC3
  1761.     DEL EXC3.EXE
  1762.  
  1763.     If they are not currently in your path, simply copy all of the files to a 
  1764. directory in your path.  Keep the EXC3.EXE file anywhere you like, but give 
  1765. plenty of copies, as is, to your friends.  If you register EXC, you are not 
  1766. licensed to give your serial number to anybody without first removing the 
  1767. serialization from your copy.
  1768.  
  1769.  
  1770.  
  1771.  
  1772. APPENDIX B
  1773.  
  1774.  
  1775. Keycode Table
  1776.  
  1777. Although you do not need to know these codes to write EXC scripts, the
  1778. following table does show you which combinations are defined and available
  1779. by using the appropriate mnemonics.  Do not try to use combinations which
  1780. indicate N/A in the table, unless they are followed by an asterisk (*).
  1781.  
  1782.     Key             Norm        Shift       Ctrl        Alt
  1783.     ----            ----        -----       ----        ---
  1784.     A               1E61        1E41        1E01        1E00
  1785.     B               3062        3042        3002        3000
  1786.     C               2E63        2E42        2E03        2E00
  1787.     D               2064        2044        2004        2000
  1788.     E               1265        1245        1205        1200
  1789.     F               2166        2146        2106        2100
  1790.     G               2267        2247        2207        2200
  1791.     H               2368        2348        2308        2300
  1792.     I               1769        1749        1709        1700
  1793.     J               246A        244A        240A        2400
  1794.     K               256B        254B        250B        2500
  1795.     L               266C        264C        260C        2600
  1796.     M               326D        324D        320D        3200
  1797.     N               316E        314E        310E        3100
  1798.     O               186F        184F        180F        1800
  1799.     P               1970        1950        1910        1900
  1800.     Q               1071        1051        1011        1000
  1801.     R               1372        1352        1312        1300
  1802.     S               1F73        1F53        1F13        1F00
  1803.     T               1474        1454        1414        1400
  1804.     U               1675        1655        1615        1600
  1805.     V               2F76        2F56        2F16        2F00
  1806.     W               1177        1157        1117        1100
  1807.     X               2D78        2D58        2D18        2D00
  1808.     Y               1579        1559        1519        1500
  1809.     Z               2C7A        2C5A        2C1A        2C00
  1810.     1               0231        0221        N/A *       7800
  1811.     2               0332        0340        0300        7900
  1812.     3               0433        0423        N/A *       7A00
  1813.     4               0534        0524        N/A *       7B00
  1814.     5               0635        0625        N/A *       7C00
  1815.     6               0736        075E        071E        7D00
  1816.     7               0837        0826        N/A *       7E00
  1817.     8               0938        092A        N/A *       7F00
  1818.     9               0A39        0A28        N/A *       8000
  1819.     0               0B30        0B29        N/A *       8100
  1820.     ,               332C        333C        N/A *       3300
  1821.     .               342E        343E        N/A *       3400
  1822.     /               352F        353F        N/A *       3500
  1823.     ;               273B        273A        N/A *       2700
  1824.     '               2827        2822        N/A *       2800
  1825.     [               1A5B        1A7B        1A1B        1A00
  1826.     ]               1B5D        1B7D        1B1D        1B00
  1827.     `               2960        297E        N/A *       2900
  1828.     -               0C2D        0C5F        0C1F        8200
  1829.     =               0D3D        0D2B        N/A *       8300
  1830.     \               2B5C        2B7C        2B1C        2B00
  1831.     F1              3B00        5400        5E00        6800
  1832.     F2              3C00        5500        5F00        6900
  1833.     F3              3D00        5600        6000        6A00
  1834.     F4              3E00        5700        6100        6B00
  1835.     F5              3F00        5800        6200        6C00
  1836.     F6              4000        5900        6300        6D00
  1837.     F7              4100        5A00        6400        6E00
  1838.     F8              4200        5B00        6500        6F00
  1839.     F9              4300        5C00        6600        7000
  1840.     F10             4400        5D00        6700        7100
  1841.     Enter           1C0D        1C0D*       1C0A        1C00
  1842.     Ins             5200        5200*       9200        A200
  1843.     Del             5300        5300*       9300        A300
  1844.     Esc             011B        011B*       011B*       0100
  1845.     Home            4700        4700*       7700        9700
  1846.     End             4F00        4F00*       7500        9F00
  1847.     PgUp            4900        4900*       8400        9900
  1848.     PgDn            5100        5100*       7600        A100
  1849.     <Tab>           0F09        0F00        9400        A500
  1850.     <BackSpace>     0E08        0E08        0E7F        0E00
  1851.     <LeftArrow>     4B00        4B00*       7300        9B00
  1852.     <RightArrow>    4D00        4D00*       7400        9D00
  1853.     <UpArrow>       4800        4800*       8D00        9800
  1854.     <DownArrow>     5000        5000*       9100        A000
  1855.     <Gray 5>        4C00        4C35        8F00        N/A
  1856.     <Gray *>        372A        372A        7200        3700
  1857.     <Gray ->        4A2D        4A2D        8E00        4A00
  1858.     <Gray +>        4E2B        4E2B        9000        4E00
  1859.     <Space>         3920        3920*       3920*       3920*
  1860.     <F11>           8500        8700        8900        8B00
  1861.     <F12>           8600        8800        8A00        8C00
  1862.  
  1863. *These combinations, while not discreet key codes, are specially handled
  1864.  by EXC to operate properly in most instances.
  1865.  
  1866.  In addition, the <PRTSC> (print screen) mnemonic can be used in EXC to
  1867. cause a screen print.  The <PRTSC> cannot be placed in the keyboard buffer
  1868. since it does not have a key code.  KEY <PRTSC> is executed immediately.
  1869.  
  1870.  The <CTL+ALT+DEL> mnemonic causes a system warm boot.  It does not work
  1871. properly in a WINDOWS DOS session.  WINDOWS will intercept the jump to
  1872. the system BIOS and produce a "System integrity violation" message. 
  1873.  
  1874.  
  1875. APPENDIX C
  1876.  
  1877. EXCR: The script recorder for EXC.
  1878.  
  1879. EXCR.EXE is a program written to record scripts for playback with EXC.  It
  1880. is also available from Parity Solutions.  If you would like to give it a
  1881. try, order the shareware diskette on the order form at the end of this
  1882. file.  EXCR is also available on the same CompuServe forums where EXC is
  1883. distributed.
  1884.  
  1885.  
  1886.  
  1887. APPENDIX D
  1888.  
  1889.  
  1890. EXCDEMO - A demonstration version of EXC that you can distribute to 
  1891.           demonstrate your software.
  1892.  
  1893. If you are a software author or distributor and wish to distribute an auto-
  1894. mated demonstration of your software using EXC, you would have to also
  1895. distribute EXC.  Since it is only legal to distribute EXC in its shareware
  1896. form, with no serialization, the EXC registration reminder would appear
  1897. with your demonstration.
  1898.  
  1899. EXCDEMO is a revision of the current version of EXC which can be freely 
  1900. distributed with your demo with no royalty fees.  It uses a specially 
  1901. encrypted script file which you create and test with EXC.  You then encrypt 
  1902. it with EXCENCR.EXE and distribute the encrypted script with EXCDEMO.EXE and 
  1903. your program, plus a batch file to execute your demo.  There is also a small 
  1904. text file which must be included on your diskette giving copyright and promo-
  1905. tional information about EXC and EXCDEMO.
  1906.  
  1907. EXCDEMO executes with only a single copyright statement display at end-of-job 
  1908. unless an error is encountered.
  1909.  
  1910. EXCDEMO is not distributed with EXC and must be purchased separately for  
  1911. $100.  You then can distribute it as much as you like.  See the order form
  1912. to order EXCDEMO.
  1913.  
  1914.  
  1915. APPENDIX E
  1916.  
  1917.  
  1918. Definition of Shareware
  1919. by Paul Mayer, author of GRAB Plus
  1920.  
  1921. Shareware distribution gives users a chance to try software before buying
  1922. it. If you try a shareware program and continue using it, you are expected
  1923. to register. Individual programs differ on details -- some request regis-
  1924. tration while others require it, some specify a maximum trial period. With
  1925. registration, you get anything from the simple right to continue using the
  1926. software to an updated program with printed manual.
  1927.  
  1928. Copyright laws apply to both shareware and commercial software, and the
  1929. copyright holder retains all rights, with a few specific exceptions as
  1930. stated below. Shareware authors are accomplished programmers, just like
  1931. commercial authors, and the programs are of comparable quality. (In both
  1932. cases, there are good programs and bad ones!) The main difference is in
  1933. the method of distribution. The author specifically grants the right to
  1934. copy and distribute the software, either to all and sundry or to a
  1935. specific group. For example, some authors require written permission
  1936. before a commercial disk vendor may copy their shareware.
  1937.  
  1938. Shareware is a distribution method, not a type of software. You should find
  1939. software that suits your needs and pocketbook, whether it's commercial or
  1940. shareware. The Shareware system makes fitting your needs easier, because
  1941. you can try before you buy.  And because the overhead is low, prices are
  1942. low also. Shareware has the ultimate money-back guarantee -- if you don't
  1943. use the product, you don't pay for it.
  1944.  
  1945. EXC.EXE is a shareware program and is provided at no charge to the user for
  1946. a 30-day period of evaluation.  Feel free to share it with your friends,
  1947. but please do not give it away altered or as part of another system.  The
  1948. essence of "user-supported" software is to provide personal computer users
  1949. with quality software without high prices, and yet to provide incentive for
  1950. programmers to continue to develop new products.
  1951.  
  1952.  
  1953.  
  1954. APPENDIX F
  1955.  
  1956.  
  1957. Disclaimer
  1958.  
  1959. BECAUSE OF THE DIVERSE NATURE OF COMPUTER EQUIPMENT AND EXPERTISE OF USERS,
  1960. PARITY SOLUTIONS AND GARY C. CRIDER MAKE NO WARRANTY ON THE EXC PROGRAM
  1961. WHATSOEVER, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, THE WARRANTIES
  1962. OF MERCHANTABILITY AND OF FITNESS FOR ANY PURPOSE.  THE USER ASSUMES ALL RISK
  1963. OF DAMAGE TO DATA OR EQUIPMENT RESULTING DIRECTLY OR INDIRECTLY FROM THE USE
  1964. OR MISUSE OF THIS PROGRAM PRODUCT.
  1965.  
  1966. USERS ARE ADVISED TO TEST PROGRAMS AND SCRIPTS THOROUGHLY ON DATA FOR WHICH A
  1967. BACKUP EXISTS.  ANY LIABILITY OF THE AUTHOR OR PARITY SOLUTIONS IS LIMITED TO
  1968. REPLACEMENT OR REFUND OF THE REGISTRATION FEE.
  1969.  
  1970.  
  1971.  
  1972.  
  1973. APPENDIX G
  1974.  
  1975.  
  1976. Support
  1977.  
  1978.     I have tried to test the program to the fullest, but I am limited as to
  1979. systems and configurations with which to test.  I have been programming for 19
  1980. years and the one thing I know for sure is that bug free programs are very few
  1981. and far between.  I can only promise to support the program to the best of my
  1982. ability and provide fixes as expeditiously as possible.
  1983.  
  1984.     Anyone can report problems and suggest changes.  Registered users get top
  1985. priority in resolving their problems.  There are three ways you can report
  1986. problems.  The preferred method is to contact me through CIS mail (not forum
  1987. messages).  My CIS ID is 71760,3413.  This is the method that is most likely
  1988. to be most successful if you are in a hurry as I usually check my mail more 
  1989. than once per day.
  1990.  
  1991.    You can also write me at:
  1992.  
  1993.    Gary C. Crider
  1994.    Parity Solutions
  1995.    1903 Pavia Ct.
  1996.    Arlington, TX 76006
  1997.  
  1998.     The last method is to phone (817) 261-9552.  Since I am the sole technical
  1999. support and the line is also used for my network consulting business, it is
  2000. often hard to get through to me.  Please call and leave a message between 7:30
  2001. am and 6:30 pm Central time, or you may actually talk to me after 6:30 pm.  
  2002. Please don't call after 10:00 pm Central time.
  2003.  
  2004.     No matter which method you use, please give a brief description of your
  2005. problem, your registration serial number if you are registered, and your phone
  2006. number.  If I need more information, I will contact you as soon as I can.
  2007. When I have a solution, I will contact you however you prefer.  Never post
  2008. your serial number on forum messages.  CIS mail is OK.  I seldom read forum
  2009. messages and, in most cases, they are not private.
  2010.  
  2011.     At this time there is no charge for support or upgrades and no time 
  2012. limit for these.  Parity Solutions does reserve the right, however, to
  2013. imposes time limitations for free support and upgrades in the future, if it
  2014. becomes necessary.  The time limit on free support will never be less than
  2015. six months.
  2016.  
  2017.     Registered users who are dissatisfied with EXC may request a refund if
  2018. your problem cannot be resolved and is within the scope of the purpose for
  2019. which EXC was designed.  You may request the refund up to 60 days after 
  2020. registration.  If Parity Solutions chooses not to address problems specific 
  2021. to a particular hardware or software environment, you are entitled to a 
  2022. refund of the registration amount.  Refunds do not include any applicable
  2023. shipping charges or charges for diskettes, unless the diskette is defective.
  2024.  
  2025.     I work full time, have a consulting business to run in my spare time and
  2026. write programs instead of sleeping.  So please be a little patient with me.
  2027.  
  2028.     Program updates are available on CompuServe or can be requested from us 
  2029. for a $5 shipping and handling charge.  Add $1 for international shipping 
  2030. outside the North American continent.  A distribution disk of all Parity 
  2031. Solutions products will be sent to you.  Specify disk size and format.  You
  2032. may use the order form at the end of this document.
  2033.  
  2034.                  
  2035. APPENDIX H
  2036.  
  2037.  
  2038. Registration
  2039.  
  2040.  
  2041.     EXC's full capabilities are available for you to evaluate before you 
  2042. invest your hard-earned money.  The only difference in operation of a 
  2043. registered vs. a non-registered program is that the registration prompt will 
  2044. no longer appear once the program is serialized.  You are also entitled to 
  2045. support, both while you are evaluating and after you register the program.  
  2046. See the previous section on support policies.
  2047.  
  2048.     You are licensed to use this program freely for thirty (30) days. At the
  2049. end of 30 days you are expected to either register the program or quit using
  2050. it.  It is a violation of your trial period license to use EXC longer than
  2051. 30 days without registering it.
  2052.  
  2053.     Registered users will receive a unique serial number and instructions on
  2054. how to serialize the program.  Serialization can be re-applied to updated
  2055. versions and in no way hinders your use of the program.  You can compress or
  2056. decompress the program with no effect (LZEXE or PKLITE).  I use Fabrice
  2057. Bellard's LZEXE program on EXC.EXE before distribution.
  2058.  
  2059.     As a registered user, you will be able to upgrade without re-registration
  2060. or additional fees.  You will also be kept on my PRIVATE mailing list to
  2061. receive additional information on this and other Parity Solutions products.  
  2062.  
  2063.     To register your copy, please use the order form below and send $24 US 
  2064. ($95 per file server on LANs) check or money order (sorry, no credit cards 
  2065. yet) to:
  2066.  
  2067.    Gary C. Crider
  2068.    Parity Solutions
  2069.    1903 Pavia Ct.
  2070.    Arlington, TX 76006
  2071.  
  2072.     Or, you can register individual (non-network) licenses online quickly and 
  2073. easily in Compuserve.  Simply GO SWREG and register ID #753.  Your regis-
  2074. tration fee will be added to your Compuserve bill.  International exchange 
  2075. was never easier and you save the $1 international postage charge.
  2076.  
  2077.     Texas residents and companies should register by mail and include 7.75
  2078. percent sales tax on the total amount of the order.  You can still register
  2079. by CompuServe, but I then have to pay the taxes.
  2080.  
  2081.     If you send your CIS id or register via CIS:SWREG, your registration will
  2082. be sent to you via CIS mail, along with instructions on how to serialize your
  2083. copy of EXCR.  This usually involves one or two days turnaround.  If you
  2084. register online and do not receive a serial number within 3 days, please
  2085. contact me via CIS mail.
  2086.  
  2087.     Program diskettes are not normally shipped.  Normal distribution of EXC
  2088. and upgrades is via CompuServe.  If you need a diskette, please see the 
  2089. instructions under Support above, or use the order form below.  You will 
  2090. receive a serial number and instructions for serializing your copy of the 
  2091. program.
  2092.     
  2093.  
  2094. Single use license:
  2095.  
  2096.   Each license gives you or your company a single use permit for EXC.  It is
  2097.   not restricted to a single machine as long as no two users can be simul-
  2098.   taneously using the program.  As Borland says, "treat it like a book."  As an
  2099.   example, if you register EXC for your home computer, but during the day you
  2100.   use a portable or a computer at work,  you may keep EXC on both machines as
  2101.   long as no one is at home using it while you are using it at work, and vice
  2102.   versa.
  2103.  
  2104.  
  2105. LAN license:
  2106.  
  2107.   LAN licenses grant rights to all workstations on the same physical LAN.
  2108.   If internetworking, a license must exist for each file server that contains a
  2109.   copy of EXC.EXE or for each physical local area network that will be given
  2110.   rights to access EXC.EXE.  If two or more file servers exist on a single LAN
  2111.   strictly for mirroring data and fault-tolerance, these will be counted as a
  2112.   single file server for licensing purposes.  If in doubt, contact me.  We can
  2113.   work out an agreement.
  2114.  
  2115.  
  2116. Site license:
  2117.  
  2118.   Site and enterprise licensing is also available on a negotiated price
  2119.   basis.  I guarantee it will be an economical alternative to buying licenses
  2120.   for each user.
  2121.  
  2122.  
  2123.     You may freely distribute the original shareware EXC3.EXE file or
  2124. distribution diskette intact in any way you see fit other than selling it.  
  2125. Users' groups and shareware distribution services may charge a reasonable fee 
  2126. for the medium and duplication costs.  Bulletin boards may not charge 
  2127. additional fees for downloading this specific program, other than normal 
  2128. connect-time and/or membership charges.
  2129.  
  2130.     As long as it meets the above criteria, any BBS may post EXC for down-
  2131. loading, but should try to keep it up to date.  The latest version is on 
  2132. CompuServe, or can be obtained from Parity Solutions.  Parity Solutions will 
  2133. not normally upload upgrades to bulletin boards other than CompuServe.
  2134.  
  2135.     You are NOT licensed to give anyone your serial number unless you first
  2136. remove all serialization from your computer.  You may then no longer use that
  2137. serial number.  Only Parity Solutions has the authority to issue serial
  2138. numbers.  If you give or sell your licensed EXC to anyone else, please have
  2139. them send their name, address and serial number to us so that we may update
  2140. our customer database.
  2141.  
  2142.     Modification of EXC.EXE in any manner other than lossless compression,
  2143. is prohibited and unlawful.
  2144.  
  2145. =============================================================================
  2146.                            ORDER FORM FOR EXC
  2147.  
  2148. Send checks payable to: Parity Solutions                
  2149.                         1903 Pavia Court
  2150.                         Arlington, TX 76006
  2151.  
  2152. BILLING ADDRESS:                        SHIP TO (If different):
  2153.  
  2154. NAME:    _____________________________  NAME:      ___________________________
  2155.       
  2156. COMPANY: _____________________________  COMPANY: _____________________________
  2157.  
  2158. STREET:  _____________________________  STREET:  _____________________________
  2159.  
  2160.          _____________________________           _____________________________ 
  2161.         
  2162. CITY/ST: _____________________________  CITY/ST: _____________________________
  2163.  
  2164. ZIP/POSTAL CODE: _____________________  ZIP/POSTAL CODE: _____________________
  2165.  
  2166. COUNTRY: _____________________________  COUNTRY: _____________________________
  2167.  
  2168. PHONE:   _____________________________  PHONE:   _____________________________
  2169.  
  2170. CompuServe ID: _______________________(Optional)
  2171.  
  2172.    NOTE: Parity Solutions sends a serial number for each registration and
  2173.          instructions for serializing your program.  A diskette containing
  2174.          the latest releases of all Parity Solutions shareware products is
  2175.          available for $5.00 U.S.  The current release of EXC is available
  2176.          for downloading on CompuServe in the IBMSYS forum.
  2177.  
  2178.    QTY   DESCRIPTION                             PRICE EA.   TOTAL PRICE
  2179.  
  2180.    ___   EXC license and registration              $24.00    ___________
  2181.  
  2182.    ___   EXC Network license and registration       95.00    ___________
  2183.  
  2184.    ___   Parity Solutions shareware diskette         5.00    ___________
  2185.  
  2186.    ___   EXCDEMO demonstration software            100.00    ___________
  2187.  
  2188.          Postage for international orders outside    1.00    ___________
  2189.          the U.S., Canada and Mexico.
  2190.                                          Subtotal:           ___________
  2191.  You may deduct 10% from the sub-        Sales tax (Texas
  2192.  total if more than one license is       only. - 7.75%)      ___________
  2193.  ordered.                              
  2194.                                          Total Enclosed:     ___________
  2195.  
  2196. Diskette size (if ordered): __ 5.25" 360k  __ 5.25" 1.2M  __ 3.5" 760k
  2197.  
  2198. Thank you for doing business with Parity Solutions.  (817) 261-9552
  2199.  
  2200. Parity Solutions is a partnership of Gary C. Crider and Russell L. McCloud.  
  2201. Federal tax identification number 75-2468376.  
  2202. ==============================================================================
  2203.  
  2204.