|
|
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.