|
|
1.1 ! root 1: .de aH ! 2: .nr a +1 ! 3: .nr P 0 ! 4: .PH "'''APPENDIX \\na - \\\\\\\\nP'" ! 5: .SK ! 6: .HU "\\$1" ! 7: .. ! 8: .ND "September 6, 1979" ! 9: .TL "20239-7048" "40295-2" ! 10: BITE users guide. ! 11: .AU "J. P. Hawkins" JPH WH 2425 4610 8C-001 ! 12: .TM 79-2425- ! 13: .AS 1 ! 14: .I BITE ! 15: (BASIC Interpreter for Testing and Engineering) ! 16: is a BASIC language interpreter ! 17: designed for use in automated testing ! 18: controlled by PDP-11 microcomputers. ! 19: The interpreter implements an extended instruction set designed for ! 20: instrument control using the IEEE 488 Instrument Bus. ! 21: .P ! 22: This memo describes the syntax of the language and ! 23: describes useful programming techniques. ! 24: .AE ! 25: .OK "BASIC" "Interpreters" "BITE" "Automatic Testing" ! 26: .MT 1 ! 27: .SA 0 ! 28: .H 1 INTRODUCTION ! 29: .H 2 "General Description" ! 30: .I BITE ! 31: is a ! 32: .I BASIC ! 33: language interpreter designed for use with ! 34: automated test equipment. The interpreter runs on ! 35: PDP-11 mini- and micro-computers using the ! 36: UNIX* ! 37: .FS * ! 38: UNIX is a Trademark of Bell Laboratories. ! 39: .FE ! 40: operating system. ! 41: .I BITE ! 42: is distinguished from other ! 43: .I BASIC ! 44: interpreters in the following ways: ! 45: .BL 4 ! 46: .LI ! 47: .I BITE ! 48: is written in the 'C' language. ! 49: It is, therefore, portable and can be installed and used ! 50: on any system with a standard 'C' compiler. ! 51: .LI ! 52: The interpreter provides an extended set of commands and functions ! 53: for controlling and reading electronic instruments using the IEEE 488 ! 54: Buss. The extended instruction set can be expanded ! 55: by the user who is knowledgeable in 'C' programming by implementation ! 56: of "custom commands" \[ref Drake\]. ! 57: .LI ! 58: .I BITE ! 59: can be executed from a script ! 60: running on the Bourne Shell of UNIX. ! 61: Thus the string manipulation of the Shell ! 62: and the control and computational capabilities ! 63: of ! 64: .I BITE ! 65: are combined to provide a uniquely powerful system. ! 66: .LI ! 67: .I BITE ! 68: accepts ! 69: .I BASIC ! 70: language programs using the original Dartmouth ! 71: syntax with little or no modification required. ! 72: Those features described above which differ from standard ! 73: .I BASIC ! 74: are extensions of ! 75: .I BASIC ! 76: rather than exceptions to the syntax rules. ! 77: .H 2 "Micro and Mini Versions" ! 78: There are two versions of ! 79: .I BITE. ! 80: One version is designed for the PDP-11/70 UNIX environment and ! 81: the other version is a "standalone" program which runs in the PDP-11/03 ! 82: and is invoked from the LSX version of UNIX. ! 83: .BL 4 ! 84: .LI ! 85: The PDP-11/70 version has complete interface capabilities with the ! 86: Bourne Shell as described below and all math functions are available. ! 87: .LI ! 88: The other version is designed for the PDP-11/03 micro-computer. ! 89: This version contains the extended instruction set for instrument control. ! 90: Differences between this and the host version include omission of verbose ! 91: error messages, Shell and system call facilities, omission of some math ! 92: functions and reduced user working storage. The omissions of features ! 93: are due to the drastically reduced memory availability on the PDP-11/03 ! 94: as compared to that of the PDP-11/70 with memory management. ! 95: Since most core space is used up, the PDP-11/03 version is "standalone" ! 96: (operating system not resident) with a skeleton version of UNIX for ! 97: file I/O. This version must be loaded with a special loader program ! 98: .I BITEX ! 99: which is included with the software release package. ! 100: .H 2 "Scope of This memo" ! 101: In the following, the syntax of ! 102: .I BITE ! 103: is described. When a command differs in the two versions, this fact is noted ! 104: explicitly. Programming techniques, including control of ! 105: .I BITE ! 106: by the Shell, are described. ! 107: .H 1 Conventions ! 108: .VL 20 5 ! 109: .LI "This Memo" ! 110: All things enclosed in [] are optional. ! 111: .LI expr ! 112: Any algebraic expression which could be a constant, variable, math ! 113: function or a combination of same, separated by arithmetic operators ! 114: as in: a+b*3.14*(4.4+c2*sin(b+s))+a(2,2) ! 115: See "variables" and "math functions" below. ! 116: .LI Operators ! 117: +,-,*,/ or ^ for addition, subtraction, multiplication, division or ! 118: exponentiation in order of lowest to highest precedence. + and - have ! 119: the same precedence and * and / have the same precedence. ! 120: Parenthesis () around expressions forces the contents to be higher precedence ! 121: than all parts of the expression outside those parenthesis. ! 122: Note also that when the - is used as a unary it maintains its low precedence, ! 123: hence the expression -2^2 yields -4 instead of 4. In all cases a good rule ! 124: of thumb to insure precedence is to enclose the part of high precedence in ! 125: parenthesis, thereby (-2)^2 yields 4. ! 126: .LI Relationals ! 127: <, >, =, <=, >=, <> for less than, greater than, equality, less or equal, ! 128: greater than or equal and not equal. ! 129: .LI "Source Path" ! 130: When reference is made to a ! 131: .I BITE ! 132: source file (i.e. the ! 133: .I old ! 134: and ! 135: .I load ! 136: command), two directories are searched, the first being the current ! 137: directory and then /usr/lib/bites which is a "pool" where shared programs ! 138: should be stored. The /usr/lib/bites directory is analogous to the ! 139: /usr/bin directory in ! 140: UNIX. ! 141: .LI "Source Program Name" ! 142: .br ! 143: The source program name is twelve or less characters suffixed by a .b . ! 144: .LI Statement ! 145: A basic statement consists of a line number (integer value between 1 and ! 146: 32767) followed by a command, space and operand which follows the ! 147: syntax governed by the command as in: ! 148: .br ! 149: 100 print "Hello World" ! 150: .br ! 151: A statement can be typed without a line number in which case it will ! 152: execute immediately. This is true for all commands, but doesn't make ! 153: sense for some commands such as ! 154: .I for. ! 155: Immediate execution is handy ! 156: for diagnostic purposes such as: print a, to find out what the value ! 157: of 'a'. ! 158: .LI Strings ! 159: Sequences of ASCII characters delimited by double quote characters ! 160: at the beginning and the end. ! 161: .LI Variables ! 162: All variable names are either a lower case alpha character (a-z) ! 163: or a lower-case alpha character followed by an integer (0-9). ! 164: Arrays have the same name convention as regular variables and take ! 165: the form varname(expr1,expr2,expr3....expr10) where expr1-expr10 are the ! 166: dimension ! 167: attributes of the array and can take the form of any legal expression ! 168: (including another array) as in a(b(2,2),x). ! 169: .SK ! 170: .H 1 Commands ! 171: .H 2 "Standard Commands" ! 172: .VL 20 5 ! 173: .LI "bye or q" ! 174: Exit ! 175: the interpreter. ! 176: Typing the control/D key will also exit the interpreter. ! 177: .LI "call name,line#" ! 178: .br ! 179: .I "Call Overlay Subroutine." ! 180: Name is the name of a file (name.b) containing a subroutine. ! 181: The subroutine must be sequenced such that line# is the ! 182: first line# in the file. ! 183: The first line must be "line# rem name" where "name" ! 184: must match the one in the ! 185: .I call ! 186: statement. ! 187: .I Call ! 188: checks the line "line#" to see if the subroutine ! 189: has already been loaded. If it has, a "gosub line#" is ! 190: executed. ! 191: If the subroutine is not already loaded, it loads it ! 192: and then does a "gosub line#". ! 193: .LI com[mon] ! 194: Preserve ! 195: variables for subsequent ! 196: .I run. ! 197: Issue of the ! 198: .I run ! 199: command ! 200: otherwise de-allocates all variables. ! 201: .LI "con [line#]" ! 202: Continue normal execution from single step mode. ! 203: See ! 204: .I sing ! 205: command. ! 206: .LI "data (expr),(expr),(expr),........." ! 207: .br ! 208: The ! 209: .I data ! 210: statement is a string of defined constants or expressions referred ! 211: to by the "read" statement. Unlike most BASIC interpreters, the data is ! 212: stored only in the form of text strings which allows the read statement to ! 213: evaluate expressions as well as constants. ! 214: .LI "del[ete] lownum [, highnum]" ! 215: .br ! 216: Delete line-number specified if only lownum given. Delete all lines ! 217: between lownum and highnum if both are specified. ! 218: See the ! 219: .I undo ! 220: command. ! 221: .LI "dim variable(expr1,expr2,.......,expr10)" ! 222: .br ! 223: Allocate space and define the dimensional characteristics of ! 224: subscripted variable. ! 225: .LI end ! 226: Define logical end of program. Causes termination of current ! 227: .I run. ! 228: .LI expunge ! 229: Force all variable space, including subscripted variables to be freed. ! 230: Or de-allocate used variable space. ! 231: .LI f ! 232: Typing 'f' causes the currently referenced ! 233: file (if any) to be displayed. ! 234: .LI "for - next" ! 235: Cause code enclosed by this combination to be executed under the ! 236: conditions specified in the ! 237: .I for ! 238: statement as in: for variable = expr1 to expr2 [step expr]. ! 239: .LI "gosub line#" ! 240: Goto subroutine, resume from following statement after ! 241: .I return ! 242: encountered. ! 243: .LI "goto line#" ! 244: Force execution to continue starting at the line# specified. ! 245: .LI "if (expr1) relational (expr2) then line#" ! 246: .br ! 247: .br ! 248: Redirect program flow to line# if expr1 is related to expr2 by the ! 249: specified relational. ! 250: The ! 251: .I then ! 252: in the ! 253: .I if ! 254: statement can be optionally replaced with ! 255: .I goto ! 256: .I "go to" ! 257: or ! 258: .I gosub. ! 259: The ! 260: .I if ! 261: statement can also take the form: ! 262: .br ! 263: if (expr1) relational (expr2) then var = (expr) ! 264: .LI "input [_fildes]var1[,var2,var3,....]" ! 265: .br ! 266: Prompt for input and assign inputed value to variable. ! 267: If 's' is typed program is halted. ! 268: .LI "[let] variable = expr" ! 269: .br ! 270: Assign the value of expr to variable. ! 271: The let is optional. ! 272: .LI "l[ist] [lownum [, highnum]]" ! 273: .br ! 274: List the text in working storage. If lownum is given then only that number ! 275: is listed. if lownum and highnum are specified, then a listing is ! 276: displayed between the given statement numbers. ! 277: .LI "load [program name]" ! 278: .br ! 279: Same as the ! 280: .I old ! 281: command, except working storage is not cleared. ! 282: .LI "mov startnum, endnum, newnum [,increm]" ! 283: .br ! 284: The mov command causes the lines beginning with ! 285: .I startnum ! 286: and ending with ! 287: .I endnum ! 288: to be moved (ie. resequenced) to the line beginning with ! 289: .I newnum ! 290: and incremented by ! 291: .I increm. ! 292: The default value for ! 293: .I increm ! 294: is 10. ! 295: All references to the moved lines are updated. The user is responsible to ! 296: see that line numbers associated with moved lines do not conflict with ! 297: existing lines which will cause loss of program text. ! 298: .I mov ! 299: is similar to ! 300: .I reseq ! 301: (see below) except that only the specified lines are resequenced. ! 302: .LI n ! 303: List the next 23 lines. Useful for paging through a listing on a CRT. ! 304: .LI new ! 305: Clear program working storage for new program to be typed. ! 306: .LI "old [program name]" ! 307: .br ! 308: Clear user space and load program. If old is typed with no argument ! 309: it will prompt the user for a program name if not defined or load ! 310: the last defined program name. ! 311: .LI "on (expr) goto line#, line#,....." ! 312: .br ! 313: Is a selective goto with multiple line number targets. The target ! 314: branched to depends on the value of expr which is truncated. ! 315: Control is passed to the first line# specified after goto if the ! 316: value of the expression is 1. Control passes to the second line# ! 317: if the value is 2, the third if 3 and so on. ! 318: .LI "on (expr) gosub line#, line#,......" ! 319: .br ! 320: Same action as ! 321: .I on-goto, ! 322: except action taken is that of ! 323: .I gosub. ! 324: .LI pause ! 325: Causes execution to be suspended until a "newline" or "return" is typed. ! 326: This is useful for programs which need to be continuously in ! 327: .I run, ! 328: but ! 329: need to allow a time for user action i.e. unit insertion. ! 330: .LI "pr[int] [_fildes](expr's, quoted strings or tab operators)" ! 331: .br ! 332: The print statement is a limited format display statement in which ! 333: expressions are evaluated and displayed along with quoted literals. ! 334: The tab(expr) operator causes the print head to move to the absolute ! 335: column position computed by expr provided the current head position ! 336: is smaller. The specifiers must be separated by one or more commas ! 337: or semicolons. ! 338: .LI "printf (format string)[,expr1,expr2,.....,expr10]" ! 339: .br ! 340: This is an interpretive implementation of the UNIX 'C' library ! 341: routine, printf. It is, however restricted to only the floating ! 342: point format control specifiers 'f' and 'g'. Use of any of the ! 343: other specifiers such as 'o', 'd' or 's' will give erroneous results. ! 344: Print controls such as \\b (backspace), \\n (newline), \\r (return) ! 345: or \\t can also be used. The printf format was chosen in lieu ! 346: of the usual ! 347: .I "print using" ! 348: command because it was felt that ! 349: printf is not only a 'C' language standard but easier to use ! 350: than ! 351: .I "print using". ! 352: .br ! 353: Usage Example: ! 354: .br ! 355: 100 printf "Var a=%2.2f\\tVar b=%g.\\n",a,b ! 356: .LI randomize ! 357: Causes ! 358: .I rnd ! 359: statement to start at an "unpredictable" value. ! 360: .LI "read var1,var2,var3,............" ! 361: .br ! 362: The ! 363: .I read ! 364: statement causes data to be assigned to each variable in the ! 365: list from the constants or expressions contained in ! 366: .I data ! 367: statements. The ! 368: reading starts at the location of the data pointer. ! 369: The data pointer ! 370: points to the last data field accessed if a read was done or to the first ! 371: data field in the first data statement if the ! 372: .I restore ! 373: statement is issued ! 374: or the program is re-run. ! 375: .SK ! 376: .LI rem ! 377: The remark statement causes no operation in ! 378: .I BITE ! 379: but may be followed by any string of characters for the purpose of commenting ! 380: a program. Unlike compiler languages, remarks do take up program buffer space; ! 381: however, they are of paramount importance in making a program readable by ! 382: human beings and are therefore strongly recommended. ! 383: .LI "reseq [startnum [, increm]]" ! 384: .br ! 385: The resequence command causes the statement numbers and all references ! 386: to them (such as if's goto's, gosub's, etc) to be resequenced starting ! 387: at ! 388: .I startnum ! 389: and incremented by ! 390: .I increm. ! 391: If startnum and/or increm are omitted, the default values are 10 and ! 392: 10 respectively. ! 393: .LI restore ! 394: Restores the data pointer to the first field of the first ! 395: .I data ! 396: statement. ! 397: .LI return ! 398: Return from subroutine called by ! 399: .I gosub ! 400: statement. ! 401: .LI "run [program name]" ! 402: .br ! 403: Run basic program specified. If no argument is given, ! 404: .I run ! 405: attempts to ! 406: execute whatever is currently in working storage. ! 407: .LI "s line#/old-string/new-string[/]" ! 408: .br ! 409: Substitute in line line# the new-string for the old-string. The last delimiter ! 410: is optional, unless new-string is null in which case it is desired that ! 411: old-string merely be removed. ! 412: See the ! 413: .I undo ! 414: command. ! 415: .LI "sing [line#]" ! 416: Enter the single step mode starting at the line# specified or at ! 417: the first line of the program if no line# is specified. ! 418: In single step mode an instruction is executed and then the prompt '^' ! 419: is displayed. ! 420: At this time the user may enter ! 421: any command (i.e. print) or hit the "return" key to execute the next ! 422: instruction. ! 423: See the ! 424: .I con ! 425: command. ! 426: .LI size ! 427: Causes amount of storage used and remaining or free space in ! 428: decimal number of bytes. ! 429: .LI stop ! 430: Stop execution of program. ! 431: .LI "save [program name]" ! 432: .br ! 433: Save the contents of working storage in file-name specified by program name. ! 434: If no program name is given, last referenced file-name is used. If no file ! 435: name was referenced, the user is prompted for a name. ! 436: .LI undo ! 437: Undo last ! 438: .I s ! 439: command or ! 440: .I "single line deletion" ! 441: .LI ! (any shell command string) ! 442: UNIX shell command invocation allows system commands to be ! 443: executed from the interpreter. ! 444: This command is ! 445: .I "not included" ! 446: in the LSI-11/03 versions of BITE. ! 447: .SK ! 448: .H 2 "File Commands" ! 449: The file commands: append, openi, and openo are followed by one or more ! 450: file-names separated by commas, each file-name being no more that ! 451: 14 characters long. Files are assigned to designators (integer values ! 452: between 1 and 4 inclusive) in the order that they are open. ! 453: All commands ! 454: such as ! 455: .I print ! 456: and ! 457: .I input ! 458: which refer to a file use the designator ! 459: number preceded by a '_' character to refer to that file ! 460: as in: 100 print _1"hello world" or 100 input _3a(x,y) . ! 461: .VL 20 5 ! 462: .LI "append file1[,file2,.....,file4]" ! 463: .br ! 464: If file exists open for output cause new data to be appended. If file ! 465: does not exist, the named file is created. ! 466: .LI "openi file1[,file2,.....,file4]" ! 467: .br ! 468: Open file for input. File must exist. ! 469: .LI "openo file1[,file2,.....,file4]" ! 470: .br ! 471: Create named file(s) and open for output. If named files exist, the old ! 472: data is destroyed. ! 473: .LI "close _fildes" ! 474: .br ! 475: Close file associated with file designator. ! 476: .LI closeall ! 477: Close all files input and output. ! 478: .H 2 "ATS Instrument Commands (Extended Instruction Set)" ! 479: These instructions are those which were implemented for ! 480: the ! 481: .I "Production Test Set." ! 482: .VL 20 5 ! 483: .LI "buspr 'busadr(text and expressions)" ! 484: .br ! 485: Buspr is merely an extension of the print statement which allows ! 486: the print string which would otherwise be displayed on the tty ! 487: to be sent via the IBV-11 bus to the bus address specified by "busadr". ! 488: The ' preceding busadr distinguishes the following character from anything ! 489: other than a single character to be interpreted as an address. ! 490: The address character can be ! 491: .I "any ASCII character" ! 492: except ones which are possibly interpreted by the system as control ! 493: characters such as back-space. ! 494: .br ! 495: Usage Example: 100 buspr '6"F2R";r ! 496: .LI "cmd string" ! 497: Send character string over IBV-11 command lines. ! 498: .LI delay num ! 499: Causes a delay of num 60ths of a second where num is an integer. ! 500: .br ! 501: Usage Example: 100 delay 120 (delay 2 minutes or 120/60ths sec) ! 502: .LI dvminit ! 503: Initialize Digital Voltmeter. ! 504: .LI "dvms function, range" ! 505: .br ! 506: (for HP 3455A digital voltmeter) ! 507: Digital voltmeter set command, where: function is 'ac', 'dc' or 'ohms' ! 508: and range is .1, 1, 10, 100, 1k, 10k or 'aut'. i.e. ! 509: .br ! 510: Usage Example: 100 dvms dc,1k ! 511: .LI "hprintf (format string)"[,expr1,expr2,...,expr10]" ! 512: .br ! 513: (for HP 5150A Thermal Printer) ! 514: Formated print to strip printer. Syntax rules are the same as ! 515: .I printf. ! 516: Strip printer is 20 columns wide, anything past the 20th column is ! 517: truncated. ! 518: .LI "lodset lodnum,mode,value" ! 519: .br ! 520: (for POWER DESIGNS X-510 & TRANSISTOR DEVICES DLP 50-60-1000 ! 521: electronic loads) ! 522: Set load. Where lodnum an integer describing which load referred to, ! 523: mode is the manner in which the load is set and value is an expression ! 524: describing the current or resistance the load was set to depending on the ! 525: mode. Mode is a single character 'r', 'R', 'i' or 'I' where 'r' is resistance ! 526: mode (value in ohms) and 'i' is current mode (value in amperes). Small ! 527: letter causes a hunt for the value and capital causes set on first try. ! 528: .LI "relay function, relnum1[, relnum2, relnum3,...]" ! 529: .br ! 530: (for HP 6940B MULTIPROGRAMMER) ! 531: Set multiprogrammer relays. Function is m (make), b (break) or c (clear). ! 532: Function is followed by all relay numbers to be acted upon which may ! 533: be expressions or variables. The clear function when not followed by ! 534: anything, simply means open all relays. When followed by relay numbers, ! 535: clear means all relays are open EXCEPT the ones specified. ! 536: .br ! 537: Usage Example: 100 relay m,10,20,21,a,b,rnd(10) ! 538: .LI "ps psno,voltage,current limit,overvoltage" ! 539: .br ! 540: (for KEPCO ATE 75-15M, ATE 150-7M, ATE 55-1M & JQE Power supplies) ! 541: Set power supply parameters. Psno is an integer representing the ! 542: power supply number describing which power supply is to be used, ! 543: voltage, current limit and overvoltage are self explanatory. Each ! 544: one of the parameters may be a legal algebraic expression so that ! 545: they may be controlled by the program. ! 546: .br ! 547: Usage Example: 100 dvms 1,10,1,11 or 100 dvms n,v1,i1,v1+1 ! 548: .LI "scan scanner-channel" ! 549: .br ! 550: (for HP 3495A SCANNER) ! 551: Set 3495A Scanner channel to number specified. ! 552: .H 1 Functions ! 553: .H 2 "Standard Functions" ! 554: .VL 20 5 ! 555: .LI abs(expr) ! 556: Absolute value. ! 557: .LI atn(expr) ! 558: Arc-tangent. ! 559: .LI cos(expr) ! 560: Cosine. ! 561: .LI exp(expr) ! 562: Natural exponential. ! 563: .LI int(expr) ! 564: Integerize or truncate fractional part of result of expr. ! 565: .LI log(expr) ! 566: Natural log. ! 567: .LI rnd(expr) ! 568: Return random number between 0 and evaluated expr. ! 569: .LI sin(expr) ! 570: Sine. ! 571: .LI sqr(expr) ! 572: Square root. ! 573: .H 2 "Instrument Functions (Extended Set)" ! 574: .VL 20 5 ! 575: .LI btn(expr) ! 576: Button function returns non-zero if control button number (expr) is ! 577: depressed. ! 578: .LI dvmr() ! 579: Return digital voltmeter reading. ! 580: .LI error() ! 581: Return 1 if last instrument command caused instrument error, otherwise ! 582: return 0. ! 583: .SK ! 584: .H 1 "Modes of Operation" ! 585: .H 2 "Editor or Idle Mode" ! 586: When the ! 587: .I BITE ! 588: interpreter is invoked with no argument, a prompt '*' appears meaning ! 589: that the interpreter is waiting for the user to enter something from ! 590: the keyboard. ! 591: .I BITE ! 592: is then said to be in the ! 593: .I "Editor or Idle mode." ! 594: .P ! 595: Editing is accomplished as it is in any BASIC language interpreter ! 596: in that lines are entered by typing a line-number followed ! 597: by the statement and removed or deleted by merely typing the line-number. ! 598: Listing is accomplished with the ! 599: .I list ! 600: command (explained under "Standard Commands"). ! 601: In addition to the above, it is possible to list single lines by typing ! 602: the return key in which case the program is listed one line-at-a-time, ! 603: starting at the first. When the last one is reached, the sequence starts ! 604: at the first line again. ! 605: At any time it is also possible to type the '-' symbol to "backup" a ! 606: line-at-a-time. ! 607: Other editing facilities are ! 608: .I "s, delete," ! 609: and ! 610: .I reseq ! 611: also explained ! 612: under "Standard Commands". ! 613: .P ! 614: .H 2 "Run Mode" ! 615: If the ! 616: .I run ! 617: command is typed and a program ! 618: is currently in user storage, the program begins execution, ! 619: starting with the first line of the program, then executing each ! 620: line in order of line numbered sequence. The sequence of execution ! 621: is altered by program flow control statements like ! 622: .I "if, for-next" ! 623: or any statement containing a ! 624: .I goto. ! 625: .H 2 "Immediate Execution Mode" ! 626: Immediate execution is accomplished by typing a command without ! 627: preceding it with a line number. ! 628: Although this is possible with all commands, it doesn't always ! 629: make sense. ! 630: For example, using commands that control program flow in ! 631: immediate mode is unlikely and often disastrous. ! 632: .P ! 633: Immediate mode is designed so that the user may get immediate action ! 634: as in the command ! 635: .I run ! 636: or ! 637: .I "print a". ! 638: Some commands are almost always used in immediate mode such as ! 639: .I "q, delete, expunge, load, list, old, reseq, save," ! 640: etc. ! 641: .H 2 "Single Step Mode" ! 642: Single step mode is entered with the ! 643: .I sing ! 644: command and ! 645: exited with the ! 646: .I con ! 647: command. ! 648: During this mode, one may find "BUGS" in the program ! 649: by observing the program flow or sequence or examining the values ! 650: of variables at given points in the program ! 651: to see if they have the expected values. See ! 652: .I sing ! 653: or ! 654: .I con ! 655: under the "Standard Commands" section of this paper. ! 656: .H 1 "Interruption of program" ! 657: At times it becomes necessary to escape from an endless loop or ! 658: abort an ! 659: action such as ! 660: .I list ! 661: before it completes. To cause such an interruption, ! 662: the (DEL) or (RUB) key is typed. ! 663: .H 1 "Programming Techniques and Tools" ! 664: .H 2 "Program Segmentation" ! 665: In situations of limited memory space as in the case of the LSI-11/03 ! 666: it becomes impossible to fit large programs in storage at any one time ! 667: time. It then becomes necessary to write the program in pieces or segments ! 668: each of which must be loaded separately as needed. ! 669: Segmented are handled by "chaining" or "overlaying". ! 670: .H 3 "Chaining" ! 671: .P ! 672: Chaining is accomplished by insertion of the ! 673: .I run ! 674: command in the ! 675: program text. If a program is to be split into say, program1 and ! 676: program2 then by simply inserting the line "run program2" as the ! 677: last executed statement of program1, program2 is now chained to ! 678: program1. Upon completion of program2, if it is desired to reload ! 679: program1, the last executed statement should be "old program1" which ! 680: will clear user space and reload program1. ! 681: ! 682: .SK ! 683: It must be noted that execution of a ! 684: .I run ! 685: causes variables to be ! 686: wiped out. To preserve variables from one program to the next, the ! 687: statement ! 688: .I common ! 689: must be executed prior to the chaining ! 690: .I run ! 691: statement. ! 692: ! 693: The chaining process may go on indefinitely, the only expense being ! 694: some time delay for each program load. ! 695: ! 696: The chaining point must sometimes be strategically chosen so that ! 697: it will not occur during an instrument action or some time critical ! 698: part of the program. ! 699: .H 3 "Overlaying" ! 700: .P ! 701: Overlaying is best accomplished with the ! 702: .I call ! 703: command. This technique is particularly useful where core space is minimal ! 704: and lends itself to keeping programs modular. The ! 705: .I call ! 706: command has a built-in feature which prevents loading a module ! 707: which is already resident. ! 708: In a line numbered language, overlay segments are delimited by ! 709: line number boundries rather than address boundries as is true in ! 710: machine level programming. The following is an example of a simple ! 711: implementation of an overlay: ! 712: .nf ! 713: ! 714: 100 rem THIS IS THE ROOT SEGMENT OF THE PROGRAM ! 715: 110 rem The "root" segment remains resident and usually contains ! 716: 120 rem all the commonly called subroutines ! 717: 130 call pscheck,2000 \fIcall in power supply check overlay\fR ! 718: 140 call loadck,2000 \fIcall in load check overlay\fR ! 719: 150 call loadck,2000 \fIcall load check again\fR ! 720: 150 rem THE REST OF THE "ROOT" SEGMENT ! 721: | ! 722: | ! 723: | ! 724: 900 stop ! 725: 2000 rem oldstuff ! 726: 2010 rem THIS PART OF THE PROG IS DESTROYED WHEN OVERLAYS ARE CALLED ! 727: 2020 return ! 728: ! 729: 2000 rem pscheck ! 730: 2010 rem This is the power supply check routine which is called in ! 731: 2020 rem the root segment ! 732: 2030 rem the first line (2000) must appear in the program as shown ! 733: | ! 734: | ! 735: 3000 return ! 736: ! 737: 2000 rem loadck ! 738: 2010 rem This is the load check overlay. This occupies the same ! 739: 2020 rem line number space as pscheck and will therefor replace it ! 740: | ! 741: | ! 742: 3000 return ! 743: .fi ! 744: ! 745: In the above example, two overlays (pscheck and loadck) are called. ! 746: If those routines are found on disk they will be loaded and replace ! 747: the old program text starting at line 2000. ! 748: Note that loadck is called twice in succession. The second call will ! 749: not cause a load since loadck is already resident. The interpreter ! 750: believes this to be true by virtue of the ! 751: .I rem ! 752: statement with the name of the overlay at line 2000. ! 753: .SK ! 754: .H 2 "System Shell Control" ! 755: Invoked by the Bourne shell, ! 756: .I BITE ! 757: can be a powerful tool which can add mathematical capabilities to the ! 758: shell. The following shell-script invokes ! 759: .I BITE ! 760: without running it, loading the program add.b, entering a data ! 761: statement with two numbers to be added, issuing the ! 762: .I run ! 763: command ! 764: and putting the result in file "result". ! 765: .sp ! 766: .nf ! 767: : ! 768: : shell script to add two numbers ! 769: : ! 770: bite - add <<! > result ! 771: 115 data $1,$2 ! 772: run ! 773: ! ! 774: ! 775: .fi ! 776: The following is the add.b program invoked by the above shell script. ! 777: .nf ! 778: ! 779: 90 rem BASIC PROGRAM TO BE RUN BY SHELL SCRIPT ! 780: 91 rem add numbers in data statement and output to standard output ! 781: 100 read a,b \fIget the values of the 2 numbers in the data\fR ! 782: 110 print a+b \fIoutput the result\fR ! 783: 115 rem This line is replaced by a shell script line data statement ! 784: 120 bye \fIexit\fR ! 785: .fi ! 786: ! 787: .I BITE ! 788: gives the Bourne shell the complete ability to EXECUTE BASIC INSTRUCTIONS! ! 789: This is accomplished by putting all the command lines in the shell-script ! 790: and using the <<! device pass the program to BITE. ! 791: .P ! 792: Below is a shell script which adds two numbers passed to it as arguments. ! 793: Note that the statements need not be in numerical order, since ! 794: .I BITE ! 795: will order them as they are entered. ! 796: Type this program in, give it a name, say add and make it executable ! 797: via chmod. Then try it by typing "add 3.14 2.22". ! 798: .nf ! 799: ! 800: bite <<! ! 801: 100 read a,b ! 802: 110 print a+b ! 803: 120 bye ! 804: 115 data $1,$2 ! 805: run ! 806: ! ! 807: .fi ! 808: ! 809: An example of a shell-script using the immediate mode of ! 810: .I BITE ! 811: to get the sine of an angle in degrees is: ! 812: .nf ! 813: ! 814: bite <<! ! 815: print sin(((2*3.1415926)/360)*$1) ! 816: bye ! 817: ! ! 818: .fi ! 819: ! 820: By naming the above shell-script "sin", one can type "sin 45" from ! 821: the system level to get an immediate answer. ! 822: .SK ! 823: Strings can be manipulated by the Bourne shell and system ! 824: utilities then passed to a ! 825: .I "BITE program." ! 826: The following is a simple example: ! 827: .nf ! 828: ! 829: a="Now is the time" ! 830: b="for all good men" ! 831: bite <<! ! 832: print "$a $b to come to the aid of their country." ! 833: q ! 834: ! ! 835: .fi ! 836: .H 1 "Error Messages" ! 837: Diagnostic error messages are issued by the interpreter ! 838: which indicate syntax errors , system failure, illegal commands or expressions,etc. ! 839: The ! 840: .I LSI-11/03 ! 841: Version of ! 842: .I BITE ! 843: does not issue explicit error messages, but displays an error number ! 844: in which the meanings are listed below. This is done to regain ! 845: approximatly ! 846: 2 kilobytes memory in an already tight ! 847: .I LSI-11/03 ! 848: memory. ! 849: .H 2 "Standard Error Messages" ! 850: .nf ! 851: NUMBER MESSAGE TEXT ! 852: -------------------- ! 853: 0 REFERS TO A NON-EXISTING LINE NUMBER ! 854: 1 UNRECOGNIZABLE OPERATION ! 855: 2 CANNOT OPEN FILE ! 856: 3 ILLEGAL VARIABLE NAME ! 857: 4 BAD FILENAME ! 858: 5 WORKING STORAGE AREA EMPTY ! 859: 6 RUNS NESTED TOO DEEPLY ! 860: 7 UNASSIGNED VARIABLE ! 861: 8 EXPRESSION SYNTAX ! 862: 9 BAD KEYWORD IN STATEMENT ! 863: 10 IMPROPER OR NO RELATIONAL OPERATOR ! 864: 11 UNBALANCED QUOTES ! 865: 12 FILE EDITING NOT PERMITTED IN SINGLE STEP MODE ! 866: 13 MISSING OR ILLEGAL DELIMITER ! 867: 14 GOSUB WITH NO RETURN ! 868: 15 IS FATAL ! 869: 16 UNBALANCED PARENTHESIS ! 870: 17 UNKNOWN MATH FUNCTION ! 871: 18 NEXT WITH NO OR WRONG FOR IN PROGRESS ! 872: 19 CANNOT PROCESS IMAGINARY NUMBER ! 873: 20 WHAT ? ! 874: 21 BAD DIMENSION SYNTAX ! 875: 22 TOO MANY DIMENSIONS ! 876: 23 REDUNDANT DIM STATEMENT ! 877: 24 NOT ENOUGH WORKING STORAGE SPACE ! 878: 25 VARIABLE NOT DIMENSIONED ! 879: 26 WRONG NUM OF DIMS ! 880: 27 ONE OR MORE DIMS LARGER THAN ASSIGNED ! 881: 28 NEG. OR ZERO DIMENSION ILLEGAL ! 882: 29 DIVIDE BY ZERO ! 883: 30 BAD TAB SPEC. IN PRINT ! 884: 31 SYS CALL FAILED ! 885: 32 BAD FILE DECLARE SYNTAX ! 886: 33 OUT OF DATA ! 887: 34 FILE-NAME TOO LONG ! 888: 35 FILE DES. USED UP ! 889: 36 FILE NOT OPEN FOR OUTPUT ! 890: 37 FILE NOT OPEN FOR INPUT ! 891: 38 EXPRESSION YIELDS AN IMPOSSIBLE VALUE ! 892: 39 PRINTF: ARG COUNT MISMATCH ! 893: 40 PRINTF: MORE THAN 10 ARGS ! 894: 41 LINE TOO LONG FOR STRIP PRINTER ! 895: 42 MOV REQUIRES 3 LINE #'s, SPACING IS OPTIONAL ! 896: 43 BAD NAME OR LINE NUMBER AT BEGINNING OF SUBROUTINE ! 897: .H 2 "Test Set and Instrument Error Messages" ! 898: .nf ! 899: 100 MISSING ' DELIMITER BEFORE BUS ADDR ! 900: 101 PS: VOLTAGE OUT OF RANGE ! 901: 102 PS: CURRENT OUT OF RANGE ! 902: 103 PS: OVERVOLTAGE OUT OF RANGE ! 903: 104 RELAY ERR ! 904: 105 RELAY: INVALID FUNC. ! 905: 106 RELAY: INVALID NUMBER ! 906: 107 DVM: INVALID MODE ! 907: 108 DVM: INVALID RANGE ! 908: 109 LODSET: IMPROPER NUMBER OF ARGUMENTS ! 909: 110 LODSET: IMPROPER MODE ! 910: 111 LODSET: UNABLE TO SET LOAD ! 911: .H 1 Acknowledgement ! 912: .P ! 913: .I BITE ! 914: was written in the 'C' programming language by R. B. Drake ! 915: and myself. This memorandum was reviewed for accuracy and clarity by ! 916: R. B. Drake and J. D. McElroy. ! 917: The device drivers used for the extended instruction set are ! 918: a result of the efforts of R. B. Drake, R. E. Ellenbogen, L. W. Schaper ! 919: and myself. ! 920: Testing of the initial versions of ! 921: .I BITE ! 922: were made by N. P. Episcopo and D. J. Jackowski. ! 923: D. J. Jackowski performed extensive testing of ! 924: .I BITE, ! 925: made many helpful suggestions ! 926: and showed us how ! 927: .I BITE ! 928: could be used with the ! 929: .I "Bourne Shell". ! 930: N. P. Episcopo made some benchmark numerical comparisons between ! 931: .I BITE ! 932: and ! 933: .I BASIC ! 934: on ! 935: .I TSS. ! 936: Many helpful suggestions were contributed by R. Scuderi. ! 937: .fi ! 938: .SG UNIX ! 939: .SK ! 940: .PH """" ! 941: .sp 3 ! 942: .ce ! 943: .ul ! 944: REFERENCES ! 945: .VL 8 4 ! 946: .LI \[1\] ! 947: R. B. Drake "Customization of BITE", Bell Laboratories TM 78-2425- ! 948: .LI \[2\] ! 949: DEC, "introduction to BASIC", ! 950: Digital Equipment Corporation ! 951: .LI \[3\] ! 952: C. Joseph Sass, "BASIC Programming and Applications", ! 953: Allyn and Bacon, Inc. ! 954: .LI \[4\] ! 955: S. R. Bourne, "An Introduction to the UNIX Shell" ! 956: Bell Laboratories TM 78-1274-4 ! 957: .LI \[5\] ! 958: R. E. Ellenbogen & John Tardy, "Automated Testing of Power Supplies" ! 959: Bell Laboratories TM 79-2425-1 ! 960: .nr Hu 1 ! 961: .nr a 0 ! 962: .aH "SAMPLE FILE I/O PROGRAM" ! 963: The following is a sample of a program which opens a file for output, ! 964: writes values out to it, closes the file, re-opens the file for input, ! 965: reads the values from the file into an array and tabulates the ! 966: values. ! 967: ! 968: The ! 969: .I comments ! 970: to the right of the statements are there ! 971: as an aid in this document. It is improper syntax to insert comments ! 972: or remarks in any other manner than by using the ! 973: .I rem ! 974: statement. ! 975: ! 976: ! 977: .nf ! 978: 100 dim d(100) \fIdimension a 100 variable array\fR ! 979: 110 openo junk \fIopen file junk for output\fR ! 980: 120 for a = 1 to 100 \fIfor values of 'a' from 1 to 100\fR ! 981: 130 pr _1a*10 \fIoutput 10*a to file junk\fR ! 982: 140 next a \fIloop\fR ! 983: 150 closeall \fIclose file junk\fR ! 984: 160 openi junk \fIopen file junk for input\fR ! 985: 170 for x = 1 to 100 \fIfor 100 points points in array d(x)\fR ! 986: 180 input _1d(x) \fIinput next value to d(x)\fR ! 987: 190 next x \fIloop\fR ! 988: 200 closeall \fIclose file junk\fR ! 989: 210 for x = 1 to 100 \fItabulate values of elements in d(100)\fR ! 990: 220 printf "d(%4.1f)=%4.2f\\n",x,d(x) ! 991: 230 next x ! 992: ! 993: ! 994: ! 995: The output of the above program looks as follows: ! 996: ! 997: d( 1.0)=10.00 ! 998: d( 2.0)=20.00 ! 999: d( 3.0)=30.00 ! 1000: d( 4.0)=40.00 ! 1001: d( 5.0)=50.00 ! 1002: d( 6.0)=60.00 ! 1003: d( 7.0)=70.00 ! 1004: d( 8.0)=80.00 ! 1005: d( 9.0)=90.00 ! 1006: d(10.0)=100.00 ! 1007: | ! 1008: | ! 1009: d(100.0)=1000.00 ! 1010: .fi ! 1011: .SK ! 1012: .HU "SAMPLE PROGRAM TO STEP VOLTAGE ON POWER SUPPLY" ! 1013: ! 1014: ! 1015: .nf ! 1016: 100 for v = 1 to 30 step .5 \fIfor voltages of 1 - 30 in steps of .5 volts\fR ! 1017: 110 ps 1,v,1,30 \fIset power supply number 1 to 'v' volts\fR ! 1018: 120 next v \fIloop again\fR ! 1019: 130 ps 0,0,0,0 \fIshut down power supply\fR ! 1020: .fi ! 1021: ! 1022: .HU "WAIT FOR BUTTON PRESS" ! 1023: ! 1024: ! 1025: .nf ! 1026: 100 if btn(1) = 0 then 100 \fIwait for button 1 to be pressed\fR ! 1027: 110 n = 2 \fIset a button number\fR ! 1028: 120 if btn(n) = 0 then 120 \fIwait for button 2\fR ! 1029: 130 n = n + 1 \fInext button\fR ! 1030: 140 if btn(n) = 0 then 140 \fIwait for button 3\fR ! 1031: .fi ! 1032: ! 1033: ! 1034: .HU "EXERCISE SCANNER AND RELAYS" ! 1035: ! 1036: .nf ! 1037: 100 for s = 1 to 30 \fIfor 30 scanner channels\fR ! 1038: 120 scan s \fIset scanner channel s\fR ! 1039: 130 delay 30 \fIwait 1/2 second\fR ! 1040: 140 next s \fIloop\fR ! 1041: 150 rem ! 1042: 160 rem exercise ! 1043: 170 rem ! 1044: 180 relay c \fIopen all relays\fR ! 1045: 190 relay m,10,20,30 \fIclose relay 10,20 and 30\fR ! 1046: 200 relay b,10,20 \fIopen only relays 10 and 20\fR ! 1047: 210 relay c \fIopen all relays\fR ! 1048: 220 for r = 1 to 60 \fIfor relays 1 through 60\fR ! 1049: 230 relay m,r \fIclose cumulatively\fR ! 1050: 240 next r \fIloop\fR ! 1051: 250 rem now 60 relays are closed ! 1052: 260 relay c,1 \fIopen all but relay number 1\fR ! 1053: .fi ! 1054: .CS 12 2 14 0 0 4 ! 1055: .TC
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.