home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 September / Simtel20_Sept92.cdr / msdos / modem / fidoterm.arc / FIDOTERM.DOC < prev    next >
Text File  |  1988-02-08  |  44KB  |  1,241 lines

  1. .he The dirt on FidoTerm - Copyright Tom Jennings 1988  Pg #
  2.  
  3. Tom Jennings
  4.  
  5. Fido Software
  6. 164 Shipley
  7. San Francisco CA 94107
  8. FidoNet: 1:125/111
  9. Modem:(415)-764-1688
  10.  
  11.  
  12.                  FIDOTERM:  Version 1c  8 Feb 88
  13.  
  14.  
  15. FidoTerm is a telecommunications program for pclones runningì
  16. MSDOS 2.00 or higher. It contains a real modem programmingì
  17. language (switch statements, recursion and all that stuff) plusì
  18. is meant to be at once extremely simple and easy to use andì
  19. extremely powerful. 
  20.  
  21. Distributed with the package from Fido Software are the followingì
  22. files:
  23.  
  24. FT.EXE        the FidoTerm program
  25. FIDOTERM.PRN    this manual
  26. DIAL.SCR    a sample dialing script file
  27. F1.SCR        dial-a-number script
  28. F2.SCR        return to DOS script
  29. F3.SCR        disconnect script
  30. F4.SCR        dialing directory script
  31.  
  32. There may be more than this on the diskette; as scripts areì
  33. developed they will be made available.
  34.  
  35.  
  36. FidoTerm is ShareWare; if you like this program, and want to seeì
  37. more like it, send a donation of $20.00 or whatever you think itì
  38. is worth to you, and your name and address; you will receive aì
  39. printed manual plus a diskette containing the latest versionì
  40. ShareWare programs, plus a library of DogDo scripts you can useì
  41. as-is or modify to suit your needs.
  42.  
  43.  
  44. The real purpose of FidoTerm is threefold: a place to test theì
  45. script language "DogDo" (isn't that a nice name?) in Fido/FidoNetì
  46. version 12, to provide a companion telecomm. program toì
  47. Fido/FidoNet version 12 and Puppy, and to replace the agingì
  48. Minitel program.
  49.  
  50.  
  51. NOTE: SEAlink is not available in version 1 of FidoTerm; it willì
  52. be available in version 2. (February or March 1988)
  53.  
  54. SEAlink is a sliding-window file transfer protocol, based on andì
  55. compatible with vanilla XMODEM, which greatly speeds up fileì
  56. transfers; SEAlink was designed for FidoNet, and developed byì
  57. System Enhancement Associates (SEA), Wayne, NJ. 
  58. .pa
  59. .sh FidoTerm Commands and Features
  60.  
  61.                      FIDOTERM COMMAND SET
  62.  
  63. FT doesn't have a huge array of commands, only a few; download,ì
  64. upload, run a script, baud rate, terminal settings. Other majorì
  65. features are an ANSI screen, a LINE MONITOR screen, the abilityì
  66. to look at the last few hundred lines of "screen", and a fullì
  67. blast script language.
  68.  
  69. The script language is really the major purpose behind FidoTerm;ì
  70. who needs another XMODEM program? Most of this manual is devotedì
  71. to the script language; this first section covers the commandsì
  72. and other remaining features first.
  73.  
  74.  
  75.                       UPLOAD & DOWNLOAD
  76.  
  77. Most of FidoTerm's commands are "obvious". (Right.) Downloadì
  78. transfers a file or files from your computer to the remoteì
  79. computer, presumably a bulletin board; upload does the opposite.
  80.  
  81.  
  82.                           BAUD RATE
  83.  
  84. Baud rate, well, what can I say? Well, at least this: the twoì
  85. choices 19200 and 38400 MAY NOT WORK on your computer; pcloneì
  86. serial ports are gaurenteed to work up to 9600 baud only; someì
  87. will work at higher rates and some will not. The only way to tellì
  88. is to try.
  89.  
  90. Obviously you cannot go any faster than your modem is capable of;ì
  91. these rates are useable (if at all) when connecting two machinesì
  92. together directly with a cable.
  93.  
  94.  
  95.                              SCRIPT 
  96.  
  97. The script language itself is covered in exhaustive detailì
  98. elsewhere in this manual. There are a number of ways that you canì
  99. run a script file.
  100.  
  101. The first and most obvious is the "SCRIPT" command. When asked,ì
  102. you enter the name of the script file to run, possibly followedì
  103. by any words that the script file needs to run. The "SCRIPT"ì
  104. command searches for the script file you enter, after addingì
  105. ".SCR" to it; ie. if you enter "LOGIN" for a script filename,ì
  106. FidoTerm looks for the file "LOGIN.SCR". 
  107.  
  108. Another less obvious but maybe more useful way to run a scriptì
  109. file is using the function keys, "F1" through "F10". Pressingì
  110. "F1" executes "F1.SCR", "F2" executes "F2.SCR", and so on. 
  111.  
  112.  
  113. FidoTerm first looks for the script file to run in the currentì
  114. directory; if not found, it then searches through all the drivesì
  115. and subdirectories specified in your set PATH; put commonly usedì
  116. scripts into a PATH subdirectory, and you won't have to keepì
  117. copies all over your disk.
  118.  
  119.  
  120.                            CONTROLS
  121.  
  122. PARITY: Parity is rarely used on modern bulletin boards; it wasì
  123. once used as a magical talisman to ward off bad characters causedì
  124. by mysterious "line noise" (clicks, hiss, thunder etc you hear onì
  125. some phone lines). The idea was to steal one of the only 8 bitsì
  126. in a character for "parity", so that if the telephone companyì
  127. managed to corrupt your name into "#$$#(#*DJ" your program couldì
  128. say "aha! the parity is wrong!" Big deal. For plain old typing,ì
  129. well, you can tell text from trash all by yourself. For fileì
  130. transfers, we have things like XMODEM, which correct any errorsì
  131. during a file transmission.
  132.  
  133. OK, I'll shut up now. No parity means the 8th bit is leftì
  134. untouched; Even and Odd parity are the two parity choices; Zeroì
  135. unconditionally clears the 8th bit, the parity bit.
  136.  
  137. If you are calling something like Telnet, and it is notì
  138. responding, try typing the alphabet: ABCDEFGHI... If every otherì
  139. character is bad or missing, change parity.
  140.  
  141.  
  142. SCREEN: The default terminal type is ANSI. ANSI interprets ANSIì
  143. standard command sequences that directly address your screen toì
  144. perform "full screen" operations. There is no penalty if no ANSIì
  145. sequences are used by the sytem you call. Leave it alone.
  146.  
  147. PLAIN causes FidoTerm to ignore ANSI command sequences, and actì
  148. like a "plain" terminal, such as a Teletype Corp. ASR-33 from theì
  149. 60's. (Why?)
  150.  
  151. BUG is a nice debugging tool. It is meant to help you figure outì
  152. just what the hell is going on when you are having wierd problemsì
  153. with modem related data. It turns control characters and 8th bitì
  154. characters (parity ...) into nice printable alphabet soup, soì
  155. that you can examine, in gory detail, just what exactly is comingì
  156. in through the modem or wire.
  157.  
  158. All control codes are converted into a funny looking thing likeì
  159. this:
  160.  
  161.     \013        CR, 13 decimal
  162.     \027        ESC, 27 decimal,
  163.     \003        ETX, 3 decimal (Control-C)
  164.     \127        DEL, 127 decimal
  165.  
  166. Characters that have the 8th bit (parity) set are displayed like:
  167.  
  168.     !A        A, 169 decimal
  169.     !b        b, 98 decimal
  170.     !%        %, 165 decimal
  171.  
  172. Control characters with the 8th bit set are displayed like:
  173.  
  174.     !\027        155 decimal
  175.     !\127        255 decimal
  176.  
  177. The two magic characters themselves will display as:
  178.  
  179.     \\        backslash
  180.     \!        the suprise mark
  181.  
  182.  
  183.                           RECORD
  184.  
  185. Record opens a file you specify and from then on adds all textì
  186. you see on the screen to that file, appending it to the end ofì
  187. the file. 
  188.  
  189. The file will contain nearly everything you see, and then some;ì
  190. ANSI command sequences that FidoTerm "executes" will be in theì
  191. file and if you look at those with your editor, will look likeì
  192. trash. Screen type BUG wierdness is stored as you see it; this isì
  193. actually useful (to someone).
  194. .pa
  195.                       HOW THE SCREEN WORKS
  196.  
  197. The screen in front of you probably has 25 lines. FidoTerm takesì
  198. over the bottom line for commands and status, leaving the otherì
  199. 24 for use as the screen as you'd normally think of it. Theseì
  200. lines are what you look at, and are what the ANSI commandì
  201. sequences operate on. New text (generally) is displayed at theì
  202. bottom, and old text scrolls off the top, usually lost forever.
  203.  
  204. FidoTerm however keeps in memory an image of the screen, plusì
  205. room for a few hundred of those old lines that have "scrolled offì
  206. the top". Most of the time though, you just look at the bottom 24ì
  207. lines, since that's where all the action is.
  208.  
  209. Obviously those lines are saved so that you can look at themì
  210. after they have "gone by". You do this with the IBM styleì
  211. keyboard cursor keys. They are:
  212.  
  213.     KEY        ACTION
  214.     PgUp        go one screenful backwards
  215.     up arrow    go one line backwards
  216.     PgDn        go one screenful forwards
  217.     down arrow    go one line forwards
  218.     Home        go to the oldest line
  219.     End        return to normal
  220.  
  221. (Don't forget to turn stupid NUMLOCK off if necessary.)
  222.  
  223. When you are viewing old saved lines, FT numbers them on the leftì
  224. edge so that you can tell about how far back you are looking.
  225.  
  226. The line numbers also serve to tell you that the screen you areì
  227. seeing is old text. If characters are coming in from the modemì
  228. while you are up there viewing old text, nothing gets lost; theyì
  229. are being received as you might expect. You just don't see them,ì
  230. since you're off looking at old text, not the new text coming in.ì
  231. Once you return to normal with the "End" key (or a lot of "PgDn"ì
  232. keys) everything will be as you'd expect.
  233. .pa
  234. .sh DogDo Script Language: Script Language Programming
  235.  
  236. Script languages are a programming language, no matter whatì
  237. someone may have told you. It is therefore important to keep inì
  238. mind that bad programs run badly, and while this script languageì
  239. is very far from perfect, blaming me won't help you get the jobì
  240. done. (Though it might make you feel better.) 
  241.  
  242. FidoTerm's script language is a "machine language". 
  243.  
  244. There is a basic "machine model" that is a little engine thatì
  245. runs the script language, and has components that you manipulateì
  246. in clever ways to perform tricks that get you what you want. Allì
  247. machine languages work this way. 
  248.  
  249. All machine languages are all awful, because the machines are soì
  250. primitive, but there is always some way you "can get there fromì
  251. here". The measure of awfulness is how hard you have to work toì
  252. get from here to there. An 8080A is very awful; a 68000 isn't tooì
  253. awful. I'm afraid this is nearer the 8080 end of things.
  254.  
  255. Machine language programming is like: OK, you have before you aì
  256. barely housebroken animal of some sort that has the singularì
  257. virtue of being able to read and mindlessly follow directions. Itì
  258. has a large bucket and a Volkswagen Beetle. You also have a padì
  259. of paper and a pencil before you. There are the only things inì
  260. the whole universe at your disposal. 
  261.  
  262. Your job is to move your hated roomates belongings from yourì
  263. apartment onto the steps in front of City Hall. (You liveì
  264. somewhere trendy and too far to walk there from, say South ofì
  265. Market.) 
  266.  
  267. You cannot tell the beast "go move the pile", it's far tooì
  268. stupid. It only understands the following things:
  269.  
  270.     Load the bucket
  271.     Dump the bucket
  272.     Get in the Beetle
  273.     Get out of the Beetle
  274.     Drive the Beetle somewhere
  275.     Is the Beetle full?
  276.     Is the apartment empty?
  277.  
  278. Which you can write on a piece of paper. Oh yeah, you can onlyì
  279. write a few instructions on a piece of paper, and if there's tooì
  280. many pieces of paper the animal works slower. 
  281.  
  282. Yes, this is arbitrary as hell. Tough tootsies. Welcome toì
  283. machine language programming. Only the mentally deficient surviveì
  284. here for long.
  285.  
  286.  
  287. OK, assuming you haven't quit yet, let's get to it. Let's write aì
  288. simple set of instructions for the stupid beast to follow. Tryì
  289. this:
  290.  
  291.     Is the apartment empty? (stop)
  292.     Load the bucket
  293.     Get into the Beetle
  294.     Drive to City Hall
  295.     Dump the bucket
  296.     Drive to the apartment
  297.  
  298. Give the sheet of paper to the beastie, send it on it's way, sitì
  299. back and wait.
  300.  
  301. ...
  302.  
  303. Well, and hour later it's still not back for it's secondì
  304. bucketload. Obviously somethings wrong. It only takes 15 minutesì
  305. to drive there even at rush hour. Look at the sheet again, lineì
  306. by line, word by word. Draw on a piece of paper City Hall, yourì
  307. apartment, the Beetle, the bucket and the beast. Follow the stepsì
  308. one by one. [I'm serious!]
  309.  
  310. Well, for brevity's sake, let's skip up to City Hall. It gets outì
  311. with the bucket, dumps it in front of some protesters hanging outì
  312. on the steps, when all of a sudden the world ends. 
  313.  
  314. You seriously messed up. The beast can't drive back to theì
  315. apartment, until it gets back in the Beetle! "It's obvious!" youì
  316. say, well, sorry, we've all heard that one before and it'sì
  317. obviously not "obvious".
  318.  
  319. Since you are god, you go back to the start of time, with theì
  320. Beetle the bucket and the beast back at your apartment. Add theì
  321. missing command, and start over. (You can do this sort of thing,ì
  322. why do you think so many programmers are so arrogant?)
  323.  
  324. 1.    Is the apartment empty? (stop)
  325. 2.    Load the bucket
  326. 3.    Get into the Beetle
  327. 4.    Drive to City Hall
  328. 5.    Dump the bucket
  329. 6.    Get into the Beetle
  330. 7.    Drive to the apartment
  331.  
  332.  
  333. OK, again you sit and watch, and this time the Beetled beastì
  334. (sorry I'll stop now) comes back every ten minutes or so. 
  335.  
  336. Two days later you're still watching this, over and over, and theì
  337. apartment is still not empty. Play god and stop the world again.
  338.  
  339. Well, the instructions work, in that the animal is doing what youì
  340. told it to do, not what you meant it to do, which was to get theì
  341. damn apartment empty in a reasonable amount of time. You forgotì
  342. to think about that, huh? There's always something isn't there.
  343.  
  344. [Real Life Note #1: The instructions you wrote we're easy toì
  345. think about, understand and make work properly. They were simple,ì
  346. (a very good thing to be) but unfortunately simplisitic (not veryì
  347. good at all). You don't even have to be in a hurry to realizeì
  348. that some things can take *so* long as to be impractical, or evenì
  349. worse! almost practical. (In the latter case, there is theì
  350. tendency to put up with things that eventually drive you crazyì
  351. ...)]
  352.  
  353. OK, lets be real. We'd be happy if it took half a day to completeì
  354. the whole thing. In two wasted days so far, it looks like it didì
  355. about a tenth of the whole apartment, so we really need to speedì
  356. it up a whole lot. On a piece of paper figure this out: 
  357.  
  358.     1/10th in two days means 20 days for the whole thing
  359.  
  360. So we need to speed this up 40 times. Well ... the Beetle "looksì
  361. like" it should hold 40 bucket fulls. Maybe it will! We have aì
  362. number of choices, two of which are to either figure out if 40ì
  363. bucketfuls will really fit, and another is just do it and see.
  364.  
  365. Since we've decided on a Kludge, lets go all the way, and justì
  366. "assume". So:
  367.  
  368.  
  369. 1.    Is the apartment empty? (stop)
  370. 2.    Load the bucket
  371. 3.    Get in the Beetle
  372. 4.    Dump the bucket
  373. 5.    Get out of the Beetle
  374. 6.    Load the bucket
  375. 7.    Get in the Beetle
  376. 8.    Dump the bucket
  377. 9.    Get out of the Beetle
  378. 10.    ....
  379. ..    (repeat 40 times)
  380. ..    ....
  381. ..    Drive to City Hall
  382. ..
  383. ..    Get in the Beetle
  384. ..    Load the bucket
  385. ..    Get out of the Beetle
  386. ..    Dump the bucket
  387. ..    Get in the Beetle
  388. ..    Load the bucket
  389. ..    Get out of the Beetle
  390. ..    Dump the bucket
  391. ..    ....
  392. ..    (repeat 40 times)
  393. ..    ....
  394. ..    Drive to the apartment
  395.  
  396.  
  397. This is a whole lot longer than the last one, it ain't pretty butì
  398. who cares. Sit back, hand the beast the instructions, and seeì
  399. what happens.
  400.  
  401. Lucky you: the Beetle seems to hold 40 bucketfuls with noì
  402. problem. After just under half a day, the apartments empty! (Someì
  403. of the work was done in the previous two days.)
  404.  
  405. Since planning on having such roomates in the future you'd likeì
  406. to treat like this seems a bad idea, we chose the easiest andì
  407. simplest solution. [Always keep in mind not only the goal, butì
  408. the environment!] 
  409.  
  410. [Real Life Note #2: either of the above processes is called aì
  411. "Kludge". It's OK to do if you have to solve a problem only once,ì
  412. if you bury the evidence IMMEDIATELY afterwards. It's tempting toì
  413. get lazy and keep the kludge around for later use. (I guarenteeì
  414. you will pay for that dearly at a later date.) It's alsoì
  415. sometimes hard to tell when a kludge is appropriate and when it'sì
  416. not. These are the kind of issues you learn do deal withì
  417. eventually.]
  418.  
  419. Since this is a kludge, rip it up and throw it away. You'll beì
  420. tempted to save such a useful set of commands, but aviodì
  421. temptation. Yeah it worked perfectly, but there are lots ofì
  422. things you can't see. Like maybe: next time you'll have only aì
  423. moped (very fashionable these days) and the tires will pop, orì
  424. maybe you'll have a dump truck and won't you look silly. Or maybeì
  425. you'll have a matter transporter and the whole idea will beì
  426. stupid. Or maybe you'll have something totally upredictable.
  427.  
  428. But certainly you have a set of very unflexible instructions thatì
  429. are only good for one thing, with a very specific set of tools.
  430.  
  431.  
  432. Now you could stop here if your only desire was to get the SOBì
  433. out of your apartment; you've suceeded! But if you find theì
  434. process itself interesting (a sure sign of serious characterì
  435. flaws) check this out: how about a set of somewhat generalì
  436. purpose instructions, for emptying out *any* apartment you're in!
  437.  
  438. Let's not make some of those same stupid assumptions as before.ì
  439. We want it to be complete in a "reasonable" time, but we can'tì
  440. tell what kind of tasks we might come across int he future. Inì
  441. this case, consider this: if you go nearly as fast as is possibleì
  442. with the tools you have, well, there's not much else you can do,ì
  443. right? (Short of getting new tools.) 
  444.  
  445. So we have to change two things we just assumed before. Insteadì
  446. of "City Hall" we want to fill that in later, so call it, forì
  447. now, "there". Since we don't know if we'll have a Beetle, mopedì
  448. or shopping cart, "40 bucketfuls" probably won't work.
  449.  
  450. There were commands we didn't use before, one was: "is the Beetleì
  451. (moped, etc) full?". You have to search and see what's availableì
  452. to you and exploit everything! OK, try this:
  453.  
  454. 1.    Is the apartment empty? (stop)
  455. 2.    Is the Beetle full? (go do step 2.)
  456. 3.    Load the bucket
  457. 4.    Get into the Beetle
  458. 5.    Dump the bucket
  459. 6.    Get out of the Beetle
  460. 7.    Go do step 2.
  461. 8.    Drive to "there"
  462. 9.    Is the Beetle empty? (go do step 15.)
  463. 10.    Load the bucket
  464. 11.    Get out of the Beetle
  465. 12.    Dump the bucket
  466. 13.    Get into the Beetle
  467. 14.    Go do step 9
  468. 15.    Drive to the apartment
  469.  
  470.  
  471. Now ... this even looks better. Instead of line after line ofì
  472. repeated instructions, there are nice neat sections that do theì
  473. same thing, only better. Turns out, the Beetle will hold almostì
  474. 60 buckets, meaning we could have gotten the oroginal job done isì
  475. far less than half a day! 
  476.  
  477. Sometimes it pays to hang in there and take a problem as far asì
  478. possible. Sometimes it's an utter waste of time. Sometimes youì
  479. haven't even defined the problem right, and the solution isì
  480. doomed to failure before you start! 
  481.  
  482. [Real Life Note #3: WHAT IF: the drive from your apartment toì
  483. City Hall was really two hours. You waited an hour! surely itì
  484. should be back by now! so you fart and fiddle and just can't findì
  485. the problem. Well, if this had happened after we had repaired theì
  486. problem with the first set of instructions, we might have beenì
  487. led to believe that wasn't the problem in the first place! Thereì
  488. just is no simple solution to these kind of problems.]
  489.  
  490. [Real Life Note #4: You'd think the kludgey solution would beì
  491. smaller and faster and easier to design than an effecient andì
  492. flexible solution. Tain't so. The effecient adaptable ones areì
  493. almost always simpler and work better with less problems. Theì
  494. dismaying thing is that there are a lot of basic programmingì
  495. "mental tools" like these that you only get through experience,ì
  496. and is the thing that lots of "How To Program" books leave out. Iì
  497. wish there was an easier solution.]
  498.  
  499.  
  500. Now this is definitely not enough to explain how to write anyì
  501. reasonable program, but that wasn't the goal. The intent was toì
  502. explain the level of detail you must work with to get usefulì
  503. things accomplished with this script language or most machineì
  504. languages. 
  505.  
  506. Programming is a skill that can be learned by anybody, andì
  507. involves thinking, primarily. ("Rigorous" thinking is the phraseì
  508. I like most.) It sounds tedious to examine things step by step,ì
  509. but I think you'll find that it ends up being faster and easierì
  510. than staring at the whole thing and grumbling at me. (And willì
  511. get your script running faster too, since I swear I won't fix itì
  512. for you!) A pad of paper is the only tool I'd suggest having. 
  513.  
  514. OK, enough of that crap, what follows is the languageì
  515. description.
  516. .pa
  517.                  SCRIPT LANGUAGE PROGRAMMING
  518.  
  519. Script files are text files you create with your own editor. Allì
  520. must have the extention ".SCR". FidoTerm first looks for theì
  521. script file in the current, default directory. If not found, itì
  522. searches through each path in the the PATH environment string.
  523.  
  524. The script language consists of lines of ASCII text. Each lineì
  525. can contain one instruction. There is no built in limit onì
  526. program (script file) length, but there certainly are practicalì
  527. limits. The script is interpreted line by line, and hence isn'tì
  528. exactly a speed demon.
  529.  
  530. There are unsuprising instructions to jump around and do looping;ì
  531. these work by moving to another line in the script file. Theseì
  532. can be slow, so your scripts will benefit from keeping loops toì
  533. as few lines as possible. (There is a cache and short loops runì
  534. nice and fast.)
  535.  
  536. Script files can reference other script files. You can putì
  537. "subroutines" into scripts and execute them with CALL and RETURNì
  538. instructions, and pass parameters in and out of them, do do suchì
  539. things as dial phone numbers, search for text, etc. Eachì
  540. subroutine has it's own private workspace so that each can beì
  541. written as a seperate script. Recursion is perfectly acceptable.
  542.  
  543. There is a macro facility built in, and is pretty simple to useì
  544. and won't give you headaches. 
  545.  
  546. Of course scripts can execute any FidoTerm command.
  547.  
  548.  
  549.                SCRIPT LANGUAGE MACHINE MODEL
  550.  
  551. FidoTerm's script language is a machine language, and like allì
  552. machine languages, there is an underlying "model" machine thatì
  553. the script instructions manipulate. The buckets and Beetles, thatì
  554. is.
  555.  
  556. The script machine model has the following components at yourì
  557. disposal:
  558.  
  559. NAME        DESCRIPTION
  560.  
  561. &A        The numeric "accumulator", values 0 - 65535
  562. &C        The "clock", counts up, in seconds
  563. &T        The "trap register", 0 or 1 - 65535 seconds
  564. &E        The "error register", either 0 or 1
  565.  
  566. &R        The general purpose Recognizer
  567. &S        The "shift register", 20 characters,
  568. &1 - &8        General purpose registers
  569. stack        10 levels of data stack
  570.  
  571.  
  572. &A:    The "accumulator" (such a quaint word) is a simpleì
  573. register for storing or manipulating numbers. It can be set toì
  574. any value from 0 to 65535. It can be stored into any otherì
  575. register. There are instructions to test when the accumulator isì
  576. zero. 
  577.  
  578. &T:    The "trap register" is part of a mechanism to breakì
  579. endless loops; the "TRAP" instruction is used to set a failsafeì
  580. if a script or part of a script takes too long to execute.
  581.  
  582. &E:    The "error register" can be either 0 or 1, with 1ì
  583. generally indicating an error condition. There are instructionsì
  584. to set and test the error register.
  585.  
  586. &R:    The Recognizer can be used to store text or numbers.
  587.  
  588. &1 - &8: These are general purpose registers, and can holdì
  589. numbers or text. They are used to pass parameters to subroutines.ì
  590. Each subroutine level has it's own set of these registers. When aì
  591. subroutine is called, the initial values are those of the callingì
  592. routine.
  593.  
  594. &S:    The "shift register" is a special register that containsì
  595. the last 20 characters received from the modem, and is whatì
  596. patterns are matched against. Characters are shifted in from theì
  597. right, and the left most character "falls off" the end. You canì
  598. also store text in &S and use the "IF" instruction to do stringì
  599. comparisons.
  600.  
  601. &1 through &8 are "local variables"; they are not shared amongstì
  602. all subroutine levels. When a CALL is executed, the called scriptì
  603. "inherits" the calling scripts initial values for theseì
  604. registers, but any changes made are lost upon RETURN. 
  605.  
  606.  
  607. The stack is a general purpose "push down" stack; you PUSH itemsì
  608. onto the stack, and POP them off. Items can only be accessed fromì
  609. the top of the stack. There is room for up to ten items on theì
  610. stack. If there are (for instance) five items on the stack, toì
  611. get at the first one pushed (the "bottom" of the stack) you mustì
  612. first pop off the four on "top" of it.
  613. .pa
  614.  
  615.                         INSTRUCTION SYNTAX
  616.  
  617. All instructions are of the form:
  618.  
  619.  
  620. INSTRUCTION    OPERAND    OPERAND
  621.  
  622. Blank lines or lines beginning with a semicolon are ignored.ì
  623. Lines beginning with a colon (label statements) are ignored whenì
  624. processing instructions.
  625.  
  626. Operands are usually text strings, and all strings should beì
  627. quoted. 
  628.  
  629.  
  630.                     INSTRUCTION PROCESSING
  631.  
  632. The script processor is basically a text processor. The macroì
  633. language applies to all commands at all times. Anything to theì
  634. right of the instruction itself is expanded by the macroì
  635. processor. 
  636.  
  637. Macros are expanded from left to right, once. There are twoì
  638. special tokens the macro processor understands:
  639.  
  640.     &(one letter register name)
  641.     \(special text character)
  642.  
  643. The language chosen allows just about every disgusting trickì
  644. possible with machine language; self-modifying code, computerì
  645. GOTOs, etc. I'll dispense with the formality, and show someì
  646. generalized examples and leave it at that:
  647.  
  648.     Message "This is a string"
  649.  
  650. The MESSAGE command merely displays what it's given on theì
  651. command status line. It makes for a simple example. In this case,ì
  652. centered in the status line you'd see:
  653.  
  654.         This is a string
  655.  
  656. If the recognizer (&R) contained the string "HELLO DUDE" theì
  657. instruction:
  658.  
  659.     Message "The recognizer contains &R"
  660.  
  661. Would display:
  662.  
  663.     The recognizer contains HELLO DUDE
  664.  
  665. To display the same thing, but with quotes surrounding theì
  666. contents of the recognizer, you would use:
  667.  
  668.  
  669.     Message "The recognizer contains \"&R\""
  670.  
  671. Displayed as:
  672.  
  673.     The recognizer contains "HELLO DUDE"
  674.  
  675.  
  676. Note the \ before the quote character merely quotes what follows.ì
  677. There are some convenient exceptions:
  678.  
  679.     \r        carriage return, 13 decimal
  680.     \n        line feed, 10 decimal
  681.     \e        escape, 27 decimal
  682.     \b        backspace, 8 decimal
  683.     \c        etx (Control-C), 3 decimal
  684.     \1        SOH character, decimal 1
  685.     \127        DEL character, decimal 127
  686.     ...        ...
  687.  
  688. If you don't like that, ("C" programmers will like it though) youì
  689. can enter control characters like so:
  690.  
  691.     ^A        1 decimal, ASCII SOH
  692.     ^M        carriage return, 13 decimal
  693.     ^J        linefeed, 10 decimal
  694.     ...        ...
  695.  
  696.  
  697. The ADD instruction adds a value to the accumulator. For example:
  698.  
  699.     ADD 27
  700.  
  701. Would add 27 to the accumulator; if it had contained 3, it wouldì
  702. now contain 30. If the &2 register contained "34", the following:
  703.  
  704.     ADD &2
  705.  
  706. Would add the numeric value 34 to &A. If &2 contained "ABRACADAB"ì
  707. then it would add zero to &A.
  708.  
  709. Here are some further examples. Assume first:
  710.  
  711. &A contains 20
  712. &R contains "Text"
  713. &1 contains "764-1629"
  714. &2 contains 300
  715.  
  716. INSTRUCTION             OPERAND EXPANDED
  717. message "sample text"        sample text
  718. message &R            20
  719. message "pattern is &r, OK?"    pattern is 20, OK?
  720. message "&A&R&A"        20Text20
  721. message "Dialing &1 at &2 baud"    Dialing 764-1629 at 300 baud
  722.  
  723.  
  724. You can take this to absurd extremes. The instruction JMP <label>ì
  725. passes execution to the line following the line containingì
  726. :<label>. You can take advantage of this by using a "computedì
  727. goto". The command:
  728.  
  729.     jmp "&R"
  730.  
  731. Would attempt to jump to a line:
  732.  
  733. :TEXT
  734. .pa
  735. .sh Pattern Matching
  736.                       PATTERN MATCHING
  737.  
  738. The main purpose of FidoTerm's script language is patternì
  739. matching; looking for particular strings of characters receivedì
  740. from the modem. All of the script language instructions areì
  741. intended to work together to do this.
  742.  
  743. The single most important component of the script machine is theì
  744. Shift Register. The shift register contains the last 20ì
  745. characters received from the modem, and works like this:
  746.  
  747. Assume that with your modem and FidoTerm, you just called intoì
  748. and connected with some bulletin board system, and are about toì
  749. be asked to log in. 
  750.  
  751. As characters are received they are put into the right hand endì
  752. of the shift register; the character on the left edge of theì
  753. shift register is lost. For example, if the bulletin board signonì
  754. message you'd see on your screen was:
  755.  
  756. WELCOME TO THE ACME HOG THROWERS BBS
  757.  
  758. AT THE PROMPT ENTER YOUR NAME AND PASSWORD:
  759.  
  760.  
  761. Lots of times a simple "wait until the word XYZ" will do exactlyì
  762. what you want. This sort of thing is easy to write scripts for,ì
  763. and even in complex scripts is a very useful function. 
  764.  
  765. The problems start when you need to base different actions on aì
  766. number of possible patterns, not just one. A simple "MATCH"ì
  767. instruction just won't do it, and brute force techniques ofì
  768. searching through a screenful of text ("rummaging") has seriousì
  769. limitations.
  770.  
  771.  
  772. In FidoTerm the technique used involves a 20 character arrayì
  773. called the "shift register", referred to as "&S" in the scriptì
  774. language.
  775.  
  776. The shift register changes after each character received from theì
  777. modem; in the example above, W, E, L, C, O, M, E, etc. Part wayì
  778. through the above message being displayed, the shift registerì
  779. would look like:
  780.  
  781.     ....
  782. &S    "                 WEL"
  783. &S    "                WELC"
  784. &S    "               WELCO"
  785. &S    "              WELCOM"
  786.     ....
  787. &S    "LCOME TO THE HOG THRO"
  788.     ....
  789.  
  790. FidoTerm compares patterns you specify against the right hand endì
  791. of the shift register; this means that for each characterì
  792. received (therefore a new string each time) you can look for anyì
  793. reasonable number of possible patterns. ("Reasonable" will beì
  794. discussed later ...)
  795.  
  796.  
  797.  
  798. In this example, to do an automatic login, once we see the wordì
  799. "PASSWORD:", we can output thename and password. This is a commonì
  800. and simple case. The instruction "MATCH" will do the job.
  801.  
  802. "MATCH" compares text you specify against the contents of theì
  803. shift register. For this example we'd use "WORD:". A string matchì
  804. is used, so you only need to use enough characters to make itì
  805. unique; the string "WORD:" does not appear anywhere else in theì
  806. initial signon message. (Actually, ":" will work fine here, butì
  807. it's a good idea to use at least a couple of characters; "RD:"ì
  808. would be even better.)
  809.  
  810.     MATCH "WORD:"
  811.  
  812. To continue the example above, as characters come in from theì
  813. modem they shift through the shift register. FidoTerm isì
  814. executing the "MATCH" instruction above, and the shift registerì
  815. looks like:
  816.  
  817.     ....
  818. match                    WORD:
  819. &S=    "OUR NAME AND PASSWOR"
  820.  
  821. match                   WORD:
  822. &S=    "UR NAME AND PASSWORD"
  823.  
  824. match                    WORD:
  825. &S=    "R NAME AND PASSWORD:"
  826.  
  827. For each character received, the "MATCH" instruction is comparingì
  828. it's pattern ("WORD:") against the contents of the shiftì
  829. register. When the patterns match, the next line of the scriptì
  830. file is executed, which in this case could be an instruction toì
  831. output your name and password.
  832. .pa
  833.                 COMPLEX PATTERN MATCHING
  834.  
  835. You don't need to understand the how and whys of the shiftì
  836. register to use the "MATCH" command, and for most casual scriptì
  837. writers that will be all you need.
  838.  
  839. A good example of the limitations of such a simple system is aì
  840. script that dials phone numbers with a Hayes modem using "AT"ì
  841. commands, and responding to the many possible "result codes".ì
  842. (This example assumes a basic understanding of Hayes modemì
  843. commands.)
  844.  
  845. The dialing part is easy; you just issue the ATDT command and theì
  846. phone number. The problem arises when you try to interpret theì
  847. results of that command, such as busy, no answer, connecting atì
  848. various baud rates, errors, etc. A simple "MATCH" instructionì
  849. just won't work.
  850.  
  851. For example the US Robotics Courier HST has about a dozenì
  852. possible responses to a simple dial command; any script you writeì
  853. must be able to handle them all. That's what we'll do here.
  854.  
  855. Dialing a US Robotics Courier HST
  856.  
  857. The command we'll use, for simplicity, is:
  858.  
  859.     "AT DT 764 1629\r"
  860.  
  861. ("\r" means "carriage return, CR, decimal 13)
  862.  
  863. The modem can respond with any of the following result words:
  864.  
  865.     CONNECT            (300 baud)
  866.     RING            (incoming call)
  867.     NO CARRIER        (failed to connect)
  868.     ERROR            (bad command given)
  869.     CONNECT 1200
  870.     NO DIAL TONE
  871.     BUSY
  872.     NO ANSWER
  873.     CONNECT 2400
  874.     RINGING
  875.     VOICE
  876.     CONNECT 9600
  877.  
  878. This is where you take advantage of the shift register. Theì
  879. script fragment below handles the problem at hand and isì
  880. explained below. You will be using this SAMPLE ... IF ... GOTOì
  881. loop to do most complex string compares.
  882.  
  883.  
  884.     &T= 60
  885.     &C= 0
  886.     TRAP dial-failed
  887.     output "ATDT 764-1629\r"
  888. :get-result
  889.     sample
  890.     if "NO" dial-failed
  891.     if "ERR" dial-failed
  892.     if "12" conn-1200
  893.     if "24" conn-2400
  894.     if "96" conn-9600
  895.     if "ECT\r" conn-300
  896.     if "BU" redial
  897.     if "VO" dial-failed
  898.     if "RING\r" dial-failed
  899.     goto getresult
  900.  
  901. :dial-failed
  902.     &A= 0
  903.     return 1
  904.  
  905. :conn-300
  906.     &A= 300
  907.     goto connect
  908.  
  909. :conn-1200
  910.     &A= 1200
  911.     goto connect
  912.  
  913. :conn-2400
  914.     &A= 2400
  915.     goto connect
  916.  
  917. :conn-9600
  918.     &A= 9600
  919. :connect
  920.     $$ "b &A\r"
  921.     message "connected at &a baud"
  922.     return 0
  923.  
  924.  
  925. "SAMPLE" is a special instruction for use in SAMPLE/IF/JMP loops,ì
  926. and causes one character to shift into the shift register. (Theì
  927. "MATCH" instruction and most others do this automatically, butì
  928. "IF" doesn't.) You should have one, and only one, "SAMPLE"ì
  929. instruction before each set of "IF" instructions; if you haveì
  930. none, the shift register will not ever change, and if you haveì
  931. more than one you will miss patterns.
  932.  
  933. "IF" compares the given pattern against the current contents ofì
  934. the shift register, and branches to the specified label if aì
  935. match is made.
  936.  
  937. The patterns searched for by the "IF" instructions need to beì
  938. mentioned. You could search for the entire modem responseì
  939. ("CONNECT 1200" instead of just "12") but the script will runì
  940. faster is short strings are used. Use as few as possible is theì
  941. general rule. The "NO" pattern will match any of the following,ì
  942. which all mean no connection: NO CARRIER, NO DIAL TONE, NOì
  943. ANSWER. The 300 baud connection result code is "CONNECT", hard toì
  944. distinguish from "CONNECT 1200" because the "IF" will matchì
  945. "CONNECT" without waiting for the "1200" or whatever follows. Theì
  946. "ECT\r" means that it will only match that word at the end of aì
  947. line, that is, followed by a CR character.
  948.  
  949. A loop of this length will run pretty slowly. It really shouldì
  950. have a "timeout" check, using the &C clock, to limit the dialingì
  951. attempt to a minute or so, and this will slow it further.
  952.  
  953. To accomodate this, FidoTerm has rather huge buffers, and usingì
  954. the explicit "SAMPLE" instruction means that characters won'tì
  955. speed through the shift register faster than you can test them. 
  956.  
  957. With a loop of approximately this size, it would take a fewì
  958. thousand characters at continuous 9600 baud to cause characterì
  959. loss. In the example above, speed is not a problem; the modemì
  960. issues very little text.
  961.  
  962. SAMPLE/IF/JMP loops should be as tight as possible. This isì
  963. interpreted, so keep that in mind; keep comments out of loops,ì
  964. keep labels and operands short. Use as few "IF"s as possible.
  965.  
  966. If you need to do such a series of compares through a largeì
  967. amount of text at high speed, it is best to cut down the search,ì
  968. for example by issuing commands to reach some intermediate pointì
  969. from which you can do your multiple compares.
  970. .pa
  971.                FURTHER NOTES ON PATTERN MATCHING
  972.  
  973. The strings you provide to the "MATCH" and "IF" instructions haveì
  974. some characteristics that make for easier comparisons.
  975.  
  976. All searches are case IN-sensitive. "ANC" matches "anc", etc. Youì
  977. can specify it in your script in either way.
  978.  
  979. "?" is a wildcard character; it mean match any character.ì
  980. "CONNECT ??00" will match "CONNECT 1200", "CONNECT 2400", etc.
  981.  
  982. Control characters are treated just as any other character. "Endì
  983. of line" characters will vary with the bulletin board program orì
  984. whatever it is you call; Fido for instance is like most BBSs, andì
  985. uses a CR/LF sequence (decimal 13, decimal 10). You can searchì
  986. for "\r" or "\13" or for "\r\n" or "\13\10", but keep in mindì
  987. that other systems could use LF/CR, or other combination.
  988.  
  989. HINT: You can store strings directly in to the Shift Register andì
  990. then test it with the "IF" command. For instance, user input fromì
  991. the "INPUT" command copied into &S could be tested for aì
  992. particular value.
  993.  
  994. .pa
  995. .sh Register and Arithmetic Instructions
  996.  
  997. These are the most basic instructions to change the contents ofì
  998. the various registers. Please note that the space after the "="ì
  999. is signifigant.
  1000.  
  1001. &S= text
  1002. &1= text or number
  1003. &2= text or number
  1004. &3= text or number
  1005. ...
  1006. &8= text or number
  1007.     Set the specified register. Numbers are really textì
  1008. strings, but you can treat them either way. The string must beì
  1009. under 20 characters.
  1010.  
  1011. &A= value
  1012.     Set the accumulator to the specified value. Theì
  1013. accumulator is numeric only.
  1014.  
  1015. &B= value
  1016.     Set the baud rate register to the specified value; if theì
  1017. value is not a valid baud rate then the &B register will notì
  1018. change. 
  1019.  
  1020. &C= value
  1021.     Set the free-running clock to an initial value. The clockì
  1022. counts up continuously every second. 
  1023.  
  1024. &T= value
  1025.     Set the trap register to the specified value. Setting itì
  1026. to zero disables the trap.
  1027.  
  1028. ADD value
  1029. SUB value
  1030.     Add or subtract the value to the accumulator.
  1031.  
  1032. PUSH text
  1033.     Puts the text onto the top of data stack. There are onlyì
  1034. 10 levels so watch out. Anything can be pushed onto the stack.
  1035.  
  1036. POP register
  1037.     Take the top item off the stack and place it in theì
  1038. specified register. If you try to put non-numeric text into aì
  1039. numeric register it becomes "0". You cannot POP items not PUSHed.
  1040.  
  1041. .pa
  1042. .sh Flow Control Instructions
  1043.  
  1044. TRAP label
  1045.     This instruction is used to set a time limit on scriptì
  1046. execution, usually loops searching for a pattern. The trap usesì
  1047. the &C clock. 
  1048.  
  1049. The &T trap register is set to the specified number of seconds,ì
  1050. and the &C clock is reset. Before each script instruction isì
  1051. executed, the clock is compared against the trap time; if theì
  1052. time limit is exceeded, the script branches to the specifiedì
  1053. label in the script file that initially set the trap; thereforeì
  1054. the trap can even abort scripts running many subroutine callsì
  1055. deep. Setting the &T trap register to zero disables the trap. 
  1056.  
  1057.     &T= 0
  1058.     &C= 0
  1059.     TRAP label
  1060.     ....
  1061.  
  1062.     If at any time during script execution the &C clockì
  1063. reaches or exceeds the &T trap register, script executionì
  1064. proceeds from the specified label in the current script file.
  1065.  
  1066.  
  1067. JMP label
  1068.     Branch to the specified label unconditionally.
  1069.  
  1070. JZ label
  1071. JNZ label
  1072.     Branch to the specified label in the current script fileì
  1073. if the accumulator is zero (JZ) or not zero (JNZ). This is usedì
  1074. to test previous arithmetic instructions.
  1075.  
  1076. DJNZ label
  1077.     A basic looping instruction: "Decrement and Jump if Notì
  1078. Zero". Subtracts 1 from &A, and if the result is not zero,ì
  1079. branches to the specified label.
  1080.  
  1081. JERROR label
  1082.     Branches if the &E error register is not zero. &E isì
  1083. generally set by the MATCH instruction failing, the RETURN (fromì
  1084. subroutine) instruction.
  1085.  
  1086. CALL scriptfile parameters ...
  1087.     Execute the script file as a subroutine. The filename isì
  1088. "scriptfile.SCR". The called script file can in turn call otherì
  1089. scripts, and each executes until the end of the script file or aì
  1090. RETURN instruction is executed.
  1091.  
  1092. Each subroutine has it's own set of registers, &1 to &8.ì
  1093. Parameters can be passed to the called routine, which set theì
  1094. initial value of the local registers. The contents of the localì
  1095. registers are lost when the subroutine returns.
  1096.  
  1097.  
  1098. RETURN value
  1099.     Return to the calling subroutine (if any) and optionallyì
  1100. set the error register to the specified value.
  1101. .pa
  1102. .sh String Comparison Instructions
  1103.  
  1104. MATCH pattern limit
  1105.     Wait until the pattern is found in the incoming characterì
  1106. stream before executing the next instruction in the script. Theì
  1107. pattern can contain "?" wildcard characters. There is an implicitì
  1108. limit of 60 seconds; if a match is not found with the time limitì
  1109. the error register is set and the next instruction executed.ì
  1110. (Presumably a JERROR ... instruction.) Optionally a time limit,ì
  1111. in seconds can be specified.
  1112.  
  1113. SAMPLE
  1114.     Shifts one character into the shift register; to be usedì
  1115. in SAMPLE/IF/GOTO loops.
  1116.  
  1117. IF pattern label
  1118.     Compares the pattern against the contents of the shift register, and branches to the specified label if it matches. The pattern can contain "?" wildcard characters.
  1119. .pa
  1120. .sh Character Output Instructions
  1121.  
  1122. OUTPUT string
  1123.     Queue the string for output to the modem, simulatingì
  1124. manual keyboard entry. The speed with which characters are output 
  1125. is determined by the THROTTLE setting.
  1126.  
  1127. COPY string
  1128.     Output the string directly to the modem at maximum speed.
  1129.  
  1130. THROTTLE n (0 - 500)
  1131.     This controls the maximum speed that FidoTerm will outputì
  1132. characters queued up by the OUTPUT command. The speed isì
  1133. specified in a minimum wait between characters, in milliseconds.ì
  1134. The default is 20 milliseconds.
  1135. .pa
  1136. .sh File I/O Instructions
  1137.  
  1138. FidoTerm's file system is very simple; there can only be one fileì
  1139. open at a time. It is not a cooincidence that the file format isì
  1140. compatible with most BASICs; each record in a FidoTerm fileì
  1141. contains 8 fields, each field is a quoted string seperated byì
  1142. commas. Each record is delimited with a CR/LF. There is noì
  1143. Control-Z or other end of file terminator.
  1144.  
  1145. FOPEN filename
  1146.     Opens a file for reading or writing. The script isì
  1147. aborted if the file cannot be found, or if "UNATTENDED" is set,ì
  1148. then the error register &E is set. The file must be FCLOSEd whenì
  1149. not needed.
  1150.  
  1151. FNEW filename
  1152.     Creates a new file of the specified name. The script isì
  1153. aborted if the file cannot be created. The file will be emptyì
  1154. after creation.
  1155.  
  1156. FREAD
  1157.     Reads one record from the file, and deposits the contentsì
  1158. of the record into the eight registers &1 to &8. Each record canì
  1159. contain any number of items, but only the first 8 will be used.ì
  1160. Each should be an argument as described elsewhere, preferablyì
  1161. quoted. 
  1162.  
  1163.     Lines are read from the file one per FREAD instruction,ì
  1164. starting with the first line in the file, until the last line isì
  1165. read; all FREADs after the last line will leave all registersì
  1166. empty and set the error register &E.
  1167.  
  1168. FWRITE
  1169.     A new record is added to the end of the open file, thatì
  1170. contains the contents of the eight registers &1 to &8. Each isì
  1171. "quoted". The script is aborted if the disk becomes full, or ifì
  1172. "UNATTENDED" is set, then the error register &E is set. 
  1173. th
  1174.  
  1175. FCLOSE
  1176.     This closes the current file and allows the FOPENing ofì
  1177. another file. If any FWRITEs were done, they are written out toì
  1178. disk at this time.
  1179.  
  1180. .pa
  1181. .sh User Input Instructions
  1182. KEYBD char
  1183.     Temporarily suspend script file operation until the userì
  1184. types the specified key; CR if none specified. All characters theì
  1185. user types, including the terminating one, are outout to theì
  1186. modem. This allows the user to manually enter something such asì
  1187. password.
  1188.  
  1189. INPUT prompt
  1190.     The prompt is displayed and the user enters a line ofì
  1191. text, which is parsed into variables &1 through &8. Any extraì
  1192. text is ignored.
  1193.  
  1194. ASK question 
  1195.     The question is displayed and Y or N is input as aì
  1196. response, with &E set true if the answer is Y.
  1197.  
  1198. PAUSE prompt
  1199.     The prompt is displayed and the user must hit any key toì
  1200. continue.
  1201.  
  1202. MESSAGE message
  1203.     Output the message to the command status line.
  1204.  
  1205. .pa
  1206. .sh Special Instructions
  1207.  
  1208. These instructions generally take one operand and perform someì
  1209. hopefully useful instruction. They are generally high levelì
  1210. functions to perform common functions.
  1211.  
  1212.  
  1213. IOPORT n (1 - 2)
  1214.     Select the serial port to do business with; the defaultì
  1215. is the first port, on a pclone COM1. 
  1216.  
  1217. CD-BIT (1,2,4,8,16,32,64,128)
  1218.     Set the Carrier Detect (CD) mask bit for proper operationì
  1219. of the on-screen "ONLINE/OFFLINE" display.
  1220.  
  1221. TIME hh:mm (00:00 - 23:59)
  1222.     Wait until the specified time of day before executing theì
  1223. next line in the script file.
  1224.  
  1225. FILES filespec
  1226.     Sets &A to the number of files matching the fileì
  1227. specification.
  1228.  
  1229. DELAY milliseconds (1 - 65000)
  1230.     Delay execution of the script until time elapsed. 
  1231.  
  1232. QUIET milliseconds (1 - 65000)
  1233.     Wait for no input from the modem for the specified time.
  1234.  
  1235. DTR
  1236.     Lowers the modem control line Data Terminal Ready (DTR)ì
  1237. for 1/2 second.
  1238.  
  1239. BREAK
  1240.     Causes a 1/2 second line break.
  1241.