home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / LANGUAGES / OB68_116.LZH / mini_manual < prev    next >
Text File  |  1996-07-21  |  47KB  |  1,109 lines

  1.                 OmniBasic
  2.  
  3.                   DEMO
  4.  
  5.  
  6.                  Preface
  7.  
  8. This archive or disk contains the demo version of OmniBasic plus
  9. many examples or its use.
  10.  
  11. This archive or disk may be freely distributed as long as ALL of
  12. the files are kept intact and not modified or edited in any way.
  13. If you add additional files to this archive or disk you must make
  14. that very clear. We do not want to be blamed for any mistakes
  15. other than our own.
  16.  
  17. The file 'OB_DEMO' is of particular concern to us. It is the
  18. result of years of work and much money invested. It is provided
  19. in a 'limited' form. We made a modification to limit the size of
  20. the program it will compile. It will compile all of the example
  21. programs included with the demo or a program of your own of about
  22. a page or two. We did this by reducing the size of the symbol
  23. table. Otherwise it is the same program as the one we hope you
  24. will buy after you have tried out this demo. (The demo will
  25. always be at version 1.16 while the one you buy will be the
  26. current version.)
  27.  
  28. We are concerned because we know there are people out there that
  29. will take this limitation as a challenge and try to defeat it. In
  30. so doing they will have done the very same thing as if they broke
  31. into our office and stole a copy of the program. Or gotten a copy
  32. from a legitimate buyer. In all cases having a copy of OmniBasic
  33. without paying for it is stealing. There is no justification for
  34. this. If you think we are charging too much for OmniBasic then
  35. don't buy it. Please don't use the price or any other excuse to
  36. steal it.
  37.  
  38. Thank you
  39. Computer Design Lab
  40.  
  41. Purchase OmniBasic, at the address, phone number, or Compuserve address
  42. listed below.
  43.  
  44. Several versions are available are present with more on the way. Those
  45. currently available are:
  46.  
  47. MSDOS Version................................$99.00 US
  48. OS/2 Version.................................$99.00 US
  49. Linux Version (personal use)................$149.00 US
  50. Linux Version (commercial/multi-user).......$299.00 US
  51. OS9/68000 Version (personal use)............$149.00 US
  52. OS9/68000 Version (commercial/multi-user)...$299.00 US
  53. OS9/68020 Version (personal use)............$149.00 US
  54. OS9/68020 Version (commercial/multi-user)...$299.00 US
  55. OS-9000 Version (personal use)..............$149.00 US
  56. OS-9000 Version (commercial/multi-user).....$299.00 US
  57.  
  58. Make check or money order payable to Computer Design Lab in US funds.
  59. Add $5.00 shipping/handling for US ground transportation.
  60.  
  61. OmniBasic is shipped within 24 hours of order and can be shipped
  62. overnight if required.
  63.  
  64. All versions come with a complete printed manual, reference card
  65. and technical support from CDL.
  66.  
  67. To purchase your copy of OmniBasic contact:
  68.  
  69. Computer Design Lab
  70. RR1 Box 36
  71. Rhineland, MO 65069
  72. Tel: (314) 236-4373
  73. CompuServe: 72762,3375
  74.  
  75.  
  76. Limited warranty and limitation of remedies
  77. ------- -------- --- ---------- -- --------
  78.  
  79. Computer Design Labs is not responsible for any damage to the
  80. user's computer system or data and in no event will Computer
  81. Design Labs, its officers, directors, employees or agents be
  82. responsible to the purchaser for any consequential, incidental,
  83. or indirect damages (including damages for loss of business
  84. profits, business interruption, loss of business information and
  85. the like) arising out of the use or inability to use the Computer
  86. Design Labs product, even if Computer Design Labs has been
  87. advised of the possibility of such damages.
  88.  
  89. Unless explicitly stated in writing, Computer Design Labs does
  90. not grant permission to distribute the software for profit in any
  91. form, Non-profit distribution of the software is acceptable
  92. without prior written notice, providing that the software is not
  93. modified in any way, and the complete works of the software are
  94. included in the distribution package.
  95.  
  96.  
  97.  
  98.  
  99.              OmniBasic DEMO
  100.  
  101.                VERSION 1.0
  102.  
  103.                MiniManual
  104.  
  105.  
  106.  
  107.  
  108.  
  109.             GENERAL FUNCTION and SYNTAX
  110.  
  111. OmniBasic is a C code macro BASIC compiler for use on various operating
  112. systems. This means that the user program written in BASIC (with or
  113. without the OmniBasic enhancements) is translated and compiled into C.
  114. OmniBasic incorporates many of the features of the newer structured
  115. BASICs,allows the intermixing of C code, and supports a host of
  116. language enhancements and compiler functions never before found in
  117. any BASIC implementation.
  118.  
  119. The compiler features include macro capability, C function compatibility,
  120. conditional compilation, compiler variables, object module linkage, and
  121. a full set of compiler directives to manage these features. These
  122. directives include #MACRO, #ENDM, #SET, #IF, #ENDIF as well as others.
  123.  
  124. The language enhancements include a full range of data types, structured
  125. constructs (such as IF/ENDIF, WHILE/ENDWHILE), C language intermixing,
  126. named labels (instead of line numbers), full access to operating system
  127. calls, and full support of pointer variables, vector variables (based
  128. variables), and memory buffers.
  129.  
  130. Since the output is C, the performance will be greater than interpreter or
  131. "I-code" compiler implementations. The less experienced programmer can
  132. immediately take advantage of the performance of OmniBasic even before
  133. learning the advanced features and enhancements.
  134.  
  135. The structure of OmniBasic is slightly different than standard BASIC in that
  136. labels, functions, and directives always begin in column #1 while statements
  137. must be indented at least one space (or tab). This is quite similar to
  138. the convention for some assemblers. Also as previously mentioned,
  139. OmniBasic uses labels rather than line numbers. If OmniBasic encounters
  140. a line number it will convert it to a pseudo label automatically which
  141. greatly simplifies conversion of other BASIC programs to OmniBasic.
  142. Also since the style of OmniBasic is somewhat akin to assembler,
  143. multiple statements per line are not allowed. Instead the style is
  144. to have the statement (or assembler instruction) followed by a
  145. comment on each line for maximum readability. Unlike interpreters
  146. and "I-code" compilers, comments and remarks have no effect on program
  147. size or speed so their use is strongly encouraged. If a variable is used 
  148. but not declared (diminsioned) it will be auto-declared as a simple variable
  149. of type LONG unless the name ends in "$" or _Str" in which case it will become
  150. a simple string variable of 32 characters. The auto-declare feature may be 
  151. disabled by invoking the -d command line option. Keywords may be entered in 
  152. any mix of upper and lower case while symbols are case sensitive. For example,
  153. Test and test are two different symbols.
  154.  
  155. Since the macro capability allows both BASIC and C code within the macro,
  156. macro libraries afford the effect of user-defined statements and
  157. instructions.
  158.  
  159. The syntax of the various BASIC statements are more or less standard with any
  160. other BASIC except for the requirement to indent a least one space or tab.
  161. Labels, variables, macros, and any other symbols must begin with a letter
  162. or underscore and may contain letters, numerals, or the underscore
  163. character. Also, the last character may be a '$'. The maximum length is
  164. 28 characters. Since many system and compiler symbols begin with an
  165. underscore, it is best to avoid the naming of symbols which begin with an
  166. underscore. Each statement and compiler directive is explained in detail
  167. in this manual as to syntax, function, and use.
  168.  
  169. OmniBasic allows those who would prefer to program in BASIC to have the same
  170. kind of power and utility as those who program in C and straight assembler
  171. while maintaining the simplicity and straightforwardness of BASIC. Also the
  172. linkage capability allows the combining of OmniBasic modules with assembly
  173. and "C" relocatable modules.
  174.  
  175.                  DATA TYPES
  176.  
  177. A brief description of data types is given in the DIM, TYPE, and PARAM
  178. sections and a detailed coverage of pointer variables is given in the
  179. POINTER VARIABLES section so much of what is said here may be redundant.
  180. The mechanics of declaring variables and the various attributes assigned
  181. to them is explained in the DIM, TYPE, and PARAM sections.
  182.  
  183. The first classification of a variable is whether it is a simple variable or
  184. an array variable. An array is a linear table of the data type.
  185. Multi-dimensional arrays are also allowed. OmniBasic does no bounds checking
  186. of arrays at run time. This may be an advantage or disadvantage depending
  187. on whether the bounds violation is intentional or accidental. If it is
  188. accidental it is possible to "clobber"adjacent data. Intentional violation
  189. of array bounds is certainly not an example of structured programming, but
  190. does allow the programmer to take advantage of knowing how the data is
  191. stored and to, for example, treat a string as a byte array.
  192.  
  193. The second classification of a variable is whether it is local, global, or
  194. external. Local variables are known only to the module in which it occurs.
  195. Global variables are known to all modules in a set which will be linked
  196. together. External variables refer to those which are declared to be
  197. global by another module but are referred to by the current module.
  198.  
  199. The third classification of a variable is whether or not it is a pointer
  200. variable . Pointer variables are variables in their own right and are a
  201. special form of a 32 bit unsigned integer which have a special property
  202. to index their value according to the data type which they are declared to
  203. point to. The data which is accessed by a pointer variable is treated as
  204. if it came from a standard variable of the type pointed to. There are
  205. three functions which are used with pointers. The first is ADDR() and
  206. is used to set the pointer to an address of a variable (presumably but not
  207. necessarily of the same type as the pointer). The second is BUFADR() which
  208. is used to set the pointer to the address of a memory buffer (see BUFFER,
  209. BUF(), BUFSIZ() section). The third is INDEX() which is used to index the
  210. pointer according to the function argument multiplied by the number of
  211. bytes in the data type of the pointer.
  212.  
  213. The fourth classification of a variable is whether or not it is a vector.
  214. Vectors (based variables) are similar to (but not the same as) "references"
  215. in C++. Vectors are closely related to pointers in concept. Once a vector
  216. has been declared with a DIM statement and subsequently assigned an address
  217. with a SETVEC statement, it may be used as an ordinary variable. The vector,
  218. then, has the power of a pointer without the need for pointer notation and
  219. allows array sub scripting in buffers instead of pointer arithmetic.
  220.  
  221. Another type of variable is defined by the PARAM statement which must
  222. immediately follow the occurrence of a function. The names of these
  223. variables must not conflict with regular variable names, but are unique
  224. within in the function in which declared. In other words, two are more
  225. functions may declare the same PARAM names. These parameter variables as
  226. well as labels within the function are removed from the symbol table
  227. when the function body ends. These parameter variables "accept" values
  228. passed to the function when the function is invoked (called). The
  229. number of these PARAM statements must correspond to the number of
  230. arguments of the caller.
  231.  
  232.              USING the COMPILER
  233.  
  234. Once the program is written using an editor, the program is ready to be
  235. compiled. This is accomplished by invoking the compile command as follows:
  236.  
  237. ob FileName.b {opts} {CompVar=Const...}
  238.  
  239. ob is the compiler's executable name. The compiler's executable object code
  240. is normally stored in the CMDS directory (OS9), the usr/bin directory
  241. (Linux), or as appropriate for the system being used.
  242.  
  243. If no options are given, OmniBasic will compile the source (.b) file, creating
  244. a C (.c) file. OmniBasic then invokes the C compiler which in turn compiles
  245. the C code to assembler and links the file into an executable object file.
  246. This sequence of events may be modified or enhanced by the use of command
  247. line options..
  248.  
  249. The options (opts) are as follows:
  250.  
  251. -a      Compile to assemblerfile(.a file OS9)(.s file Linux)
  252.     (do not assemble and link)
  253.  
  254. -e      Compile with no output but check for errors. This is useful at
  255.     various stages of program development. It allows the programmer
  256.    to passively check for certain errors.
  257.  
  258. -f      Function mode. This option is used to compile functions or any
  259.     non-mainline procedure      or subroutine. The file is processed to a
  260.     relocatable assembler file (.r OS9) (.o Linux)
  261.  
  262. -g      Generate symbol module for the debugger. Automatically invokes the -g
  263.     option to the       linker for later debugging purposes.
  264.  
  265. -r      Turn off remarks (comments) in -c option
  266.     
  267. -s      Symbol table dump to stdout
  268.  
  269. -v      Verbose mode. Reports detailed progress of compile process
  270.  
  271. -u      Unabridged hexadecimal symbol dump which also includes internal
  272.     compiler symbols
  273.  
  274. -c      Compile to C file (.c) See -r option
  275.  
  276. -? Display options
  277.  
  278.              WRITING and USING PROGRAMS
  279.  
  280. The default mode of the compiler is PROGRAM mode (also known as mainline).
  281. To enter FUNCTION mode it is necessary to invoke a command line option,
  282. but to enter PROGRAM mode no action is required.
  283.  
  284. The general form of a program is as follows:
  285.  
  286. * declare variables
  287.  DIM A:LONG
  288.  DIM B:LONG
  289.  
  290. * declare function
  291. #FCN Square() INT
  292.  
  293. * program code body
  294.  B=4
  295.  A=Square(B)
  296.  PRINT A+B
  297. * END statement (optional)
  298.  END
  299.  
  300. * (internal) function body
  301. Square()
  302.  PARAM X:LONG
  303.  RETURN X*X
  304.  
  305. The program is written using your favorite editor. Remember that compiler
  306. directives and labels always start in column one and that statements are
  307. always indented at least one space or tab. When you write the program
  308. remember to include a ".b" suffix to the program name.
  309.  
  310. To compile the program, enter the command to run the compiler.
  311. (In this example the program name is "test")
  312.  
  313. ob test.b
  314.  
  315. If there are no errors reported, you may run the program by typing:
  316.  
  317. test (CR)
  318.  
  319. If the program does not perform as expected, it is sometimes useful to insert
  320. PRINT statements as various points in the program to check its progress.
  321. If the user is familiar with the Debug program, it is useful to compile the
  322. program with the -g option which sets up a symbol module for the debugger.
  323. If there are errors in your program that violate some rule or syntax of
  324. the compiler, an English language indication of that error is reported.
  325. If there are any errors at all, the compiler will not pass the output to the
  326. C compiler (which will in turn invoke an assembler, optimizer and linker).
  327. It is also possible to get an error from the C compiler, assembler, or
  328. linker.Refer to the C compiler, assembler, or linker manual to resolve
  329. these. The OmniBasic compiler should "catch" most errors so that you will
  330. not see C compiler, assembler, or linker errors in most cases. If you do,
  331. you should report the error to CDL for possible resolution.
  332.  
  333.            USING and DECLARING FUNCTIONS
  334.  
  335. OmniBasic contains a large number of pre defined functions and the user may
  336. write additional functions. Either compiler functions or user functions are
  337. called and used in the same manner except that USER FUNCTIONS which do not
  338. expect a return value (void functions) may be invoked by entering the
  339. function name just as you would a statement name.
  340.  
  341. The pre defined compiler functions need not be declared. To declare a user
  342. function we use the #FCN compiler directive. We must also "tell" the
  343. compiler where to locate the function we just declared if the function is
  344. external to our program. The optional ReturnType tells the compiler what
  345. type of data to expect to be returned by the function. The three valid
  346. return types are INT, FLOAT, and VOID. The default is INT. VOID means
  347. return nothing. The function should either be in the RELS or LIB directory.
  348. The number in parens tells the compiler how many arguments will be passed
  349. (must be 1 thru 9). If a "c" (or nothing) is used for the number of
  350. arguments, it indicates a variable number of arguments may be passed. If
  351. "c" (or nothing) is used, then no checking is done as to number of
  352. arguments. For example:
  353.  
  354. an internal fuction
  355.  
  356. #FCN DoIt() <ReturnType>
  357.  
  358. or an external function:
  359.  
  360. #FCN DoIt()<ReturnType>
  361. #LIB LibName
  362.  
  363. The method used to set up functions and pass arguments is compatible with the
  364. C compiler so it is possible to use C functions or to write functions for C.
  365.  
  366. If you forget to declare a function before using it, an error will be
  367. reported by the compiler. If you forget the #LIB directive the linker will
  368. return an error in the case of an external function.
  369.  
  370. It is common practice to build "header" files which declare functions and
  371. tell the compiler where to find them. These files are then invoked with the
  372. #USE directive.
  373.  
  374. The compiler will check the number of arguments declared against the number
  375. of those given and will verify the data type (unless the number given is "c"
  376. or nothing).
  377.  
  378. Since these user functions are modular in nature, their use can result in a
  379. well structured program with good readability and if the functions are
  380. general in nature they may be used by many programs (and programmers).
  381.  
  382. Functions which are included in the program (local functions) must be
  383. declared just as external functions are with a #FCN directive. These need
  384. no or #LIB directive. Symbol names used in these local functions are not
  385. unique as in external functions, but are global within the program itself
  386. (except for PARAM variables which are local to a function).
  387.  
  388. Local functions are written the same way as external functions. The function
  389. name is not declared as a global label as in an external function, and as
  390. mentioned above, variables are global with the rest of the program.
  391.  
  392. In the case of external functions, the function must be declared in both the
  393. calling program and in the function itself.
  394.  
  395. WRITING and USING EXTERNAL FUNCTIONS
  396.  
  397. External functions are modules of previously compiled relocatable object
  398. modules (ROF's).They may also be merged with other functions into a
  399. library file.
  400.  
  401. Writing an external function with OmniBasic is the same as writing any program
  402. in OmniBasic except the function is compiled with the -f option. Execution
  403. begins in the function with the occurrence of the function name in column
  404. 1 followed by "()". The next line(s) are the PARAM statements which must
  405. correspond to the number of arguments being passed to the function.
  406.  
  407. The variables and labels in an external function are independent of the
  408. labels and variables in other functions and the calling programs unless
  409. they are declared as EXTERNAL or GLOBAL.
  410.  
  411. Normally, a function is called with a list of arguments or parameters.
  412. In OmniBasic these are passed by value. To pass arguments by reference, the
  413. arguments are passed as pointers. The pointer itself is passed by value but
  414. the data it points to is said to be passed by reference. To pass arguments
  415. to a function the calling program invokes the function in an expression
  416. with the arguments specified in order within parentheses following the
  417. function name. The compiler will put these arguments on the stack as
  418. required automatically. The function extracts these arguments from
  419. the stack when the function declaration is made as described above. The
  420. general order of a function is as follows:
  421.  
  422. * declare local function variables (not used in this example)
  423.  DIM x:BYTE
  424.  DIM y:SHORT
  425.  DIM z;LONG
  426.  
  427. FcnName()
  428.  PARAM p:LONG
  429.  PARAM q:LONG
  430.  
  431. * the body of the function goes here
  432. * finish up with a RETURN
  433.  RETURN p*q
  434.  
  435. To compile this function:
  436.  
  437. cb FcnName.b -f
  438.  
  439. The -f on the command line instructs the compiler to compile to a relocatable
  440. file to be linked in later.
  441.  
  442. Functions can also share labels and variables with the calling program by
  443. using GLOBAL labels and symbols. The calling program declares GLOBAL while
  444. the function declares EXTERNAL or vice-versa.
  445.  
  446.                  C CODE
  447.  
  448. It is possible to intermingle C code in your Basic program. This may be done
  449. on a single line basis by writing a ";" in column 1 followed by C code or on
  450. a block basis by using the #C and #ENDC compiler directives with C code
  451. between.
  452.  
  453. The C code may refer to Basic variables which have been declared but it is
  454. important to know the details of how OmniBasic handles the declaration in its
  455. C output. For example, any complex data structure in Basic results in an
  456. array of type char in the C output. Also, any pointer declaration in Basic
  457. results in a long in C. Strings in Basic are null terminated (as in C) only
  458. if the string is not "full". Members of structures are padded to an even
  459. byte boundary when the next member is a short, long or float type or if it
  460. is the last member in the structure. String declarations result in a char[],
  461. but no "extra" byte is required as in C strings. Simple integer types and
  462. float (real) do map as expected to comparable C types as do arrays of
  463. these types.
  464.  
  465. While the compiler thoroughly checks the syntax and compiles BASIC statements
  466. into C code, it does not process C statements to that degree. Since this is
  467. the case, all errors involving C syntax and symbol problems (missing,
  468. duplicate, etc.) will not show up until the C compiler processes the file.
  469. The #SET compiler directive also outputs a C version of its result (#define)
  470. so that the C compiler may apply this result to C code (if used).
  471.  
  472. An example of the use of C code in a BASIC program follows:
  473.  
  474.  REM Program to clear an entire string
  475.  REM
  476.  DIM A$:STRING[32]
  477.  DIM I:LONG
  478.  FOR I=1 TO 32
  479. ;A_Str[I-1]=0;
  480.  NEXT I
  481.  
  482. Notice that since C does not allow a "$" in a symbol name, that OmniBasic
  483. changes the "$" to "_Str". Also notice that the string in Basic is an array
  484. of type char in C with the first element addressed as 0.
  485.  
  486. Due to the power and efficiency of OmniBasic there should not be much (if any)
  487. need to intermix C code, but the ability to do so is there if you need
  488. (or want) it.
  489.  
  490. If you wish to use the C string functions on Basic strings, make sure the
  491. basic string is at least one byte short of being "full" or DIM a byte
  492. immediately following the DIM of the string and then initialize the
  493. "tacked-on" byte to 0 (null).
  494.  
  495. There are several ways to include comments or remarks in a program. The first
  496. and most obvious is the use of the REM statement which is standard BASIC.
  497. The second is to follow the statement (on the same line) with a backslash
  498. (\) followed by any comment desired. The third way is to start a line
  499. (column #1) with a "*" character followed by any comment desired.
  500.  
  501.              POINTER VARIABLES
  502.  
  503. The concept of pointer variables is foreign to BASIC (until now). Pointers
  504. are a mainstay of the programming language "C". The challenge of adding
  505. pointers to OmniBasic was to provide the power of the concept but to do so
  506. with a syntax that has a BASIC flavor rather than the cryptic style of "C".
  507.  
  508. Pointers are variables in their own right and are a special form of a 32 bit
  509. unsigned integer which have a special property to index their value
  510. according to the data type which they are declared to point to. For example
  511. pointers can be assigned values and used in expressions just like the data
  512. type long (integer). This allows the pointer to be set to any value from 0
  513. to $ffffffff and this fact alone gives the pointer concept extreme power as
  514. well as the power to cause a catastrophe if used carelessly. A more
  515. "civilized" setting of a pointer would be to set it to the address of
  516. another variable or to the address of a memory buffer (see BUFFER, BUFADR(),
  517. BUFSIZ() section). When setting a pointer to another variable it is the data
  518. type of the pointer which prevails when accessing data with the pointer (not
  519. the data type of the variable being pointed to). Most "C" compilers give a
  520. warning if a pointer is set to point to a variable with a different data
  521. type than its own. OmniBasic gives no such warning.
  522.  
  523. The functions ADDR() and INDEX() are intended solely for use with pointers
  524. although the ADDR() function could be used to find the address of a variable
  525. for any reason. Also the BUFADR() function is intended to set pointers to
  526. the base address of memory buffers. The ADDR() function returns the memory
  527. address of a variable given as the argument to the function. It is used
  528. primarily to set a pointer to the absolute address of a variable. In the
  529. case of an array, the address returned is the base address (address of the
  530. first element of the array). The ADDR() function could also be used in
  531. address calculations to determine the storage relationship of two or more
  532. variables. To reference data pointed to by a pointer the pointer variable is
  533. enclosed in square brackets i.e. [Ptr]. Data referenced by pointers must be
  534. of a compatible type with the variable or constant used with it just as if
  535. the data were to/from a standard variable (I.E. not pointed to by a
  536. pointer). The INDEX function is used to point to different elements of the
  537. object data (assuming the object is an array or is being treated as an
  538. array). In "C" arithmetic operations on pointers take into account the data
  539. type of the pointer. In OmniBasic arithmetic operations on pointers do not
  540. take the data type into account. The INDEX() function does take the
  541. pointer's data type into account however. The arguments to the INDEX()
  542. function are the pointer name and the index value. To index backward a
  543. negative index value is specified. In the following example the INDEX()
  544. function will be used on a pointer whose data type is INTEGER (32 bits or
  545. 4 bytes long). When we index the pointer by three it will point 12 bytes
  546. past its previous setting (4 bytes times 3=12). The INC and DEC statements
  547. also take into account the data size pointed to by a pointer. If Ptr is a
  548. an INTEGER pointer then, INC Ptr will add 4 to the value of Ptr since an
  549. INTEGER is 4 bytes in size.
  550.  
  551.  DIM Pointer:INTEGER ADDRESS
  552.  DIM IntVar(30):INTEGER
  553.  DIM Temp1:INTEGER
  554.  DIM Temp2:INTEGER
  555. Start
  556.  Pointer=ADDR(IntVar) \ assigns base address of IntVar to Pointer
  557.  Temp1=[Pointer] \ assigns the value of the first element to Temp1
  558.  Pointer=INDEX(Pointer,3) \ Pointer now points to the fourth element
  559.  Temp2=[Pointer] = assigns the value of the fourth element to Temp2
  560.  DEC Pointer \ Pointer now points to the third element
  561.  
  562.             COMPILER DIRECTIVES
  563.  
  564.                 #SET, #FIX
  565.  
  566.  The #SET compiler directive is used to define compiler variables and to set
  567.  them to a numeric (long integer) value. The most common use of the compiler
  568.  variable is to assign values to symbolic constants. Typically, since BASICs
  569.  do not contain this feature, all constants must be literals (200, $0f,
  570.  etc). Just as named variables such as Radius, Total, SubTotal, etc. are
  571.  helpful and named labels such as GetInput, PrintList, etc. are more useful
  572.  than line numbers, symbolic constants add much more meaning to the program
  573.  than do abstract literal numbers. Any place that literal numeric constants
  574.  are used (such as in expressions and DATA statements) symbolic constants
  575.  may be used. The #Set directive may be used to set the same variable as
  576.  many times as desired throughout the program. Thus when a compile variable
  577.  is referenced the value last assigned by a #SET directive is the value
  578.  referenced. Compiler variables are also used to control the flow of
  579.  conditional compilation by being tested with the #IF compiler directive.
  580.  The #FIX directive is a permanent #SET. The general form of the #SET
  581.  compiler directive is as follows:
  582.  
  583. #SET CompVar=OPERAND1{OPERATOR|OPERAND2}
  584.  
  585. CompVar is the desired symbol name (the naming rules are the same as for
  586. BASIC variable, labels, etc.). The name must be unique from any other
  587. compiler variable, label, BASIC variable, macro, etc. or a symbol already
  588. defined error will occur. The "=" is mandatory as is OPERAND1. OPERAND1 (and
  589. OPERAND2 if used) must be either a compiler variable (previously created and
  590. defined with a #SET directive) or a numeric literal (either a decimal
  591. integer or Hexadecimal). Hexadecimal is indicated by a leading "$". The
  592. OPERATOR must be a "+", "-", "*", "/","&", "|", "<<" or ">>" indicating
  593. addition, subtraction, multiplication, division, AND, OR, left shift, or
  594. right shift respectively. If the OPERATOR is used it must be immediately
  595. followed by OPERAND2. Examples of the use of #SET directive follow: 
  596.  
  597. #SET xyz=1 \ creates the compiler variable xyz and sets it to 1
  598.  A=A+xyz \ implied LET statement equivalent to A=A+1
  599. #SET xyz=$ff \ changes xyz to equal Hexadecimal $ff (255)
  600. Label DATA "test",xyz \ equivalent to Label DATA "test",255
  601. #SET Side=4 \ creates the compiler variable Side and sets it to 4
  602.  Area=Side*Side \ implied LET statement equivalent to Area=4*4
  603. #SET xyz=2 \ now equals 2
  604. #SET abc=xyz \ creates the compiler var abc and sets it to the value of xyz
  605. #FIX xyz=xyz+abc \ now equals 4 (permanently)
  606. #IF xyz=5 \ example of testing a compiler variable for conditional compilation
  607.  
  608. The SET directive may also be used in the body of a macro declaration such as:
  609.  
  610. #MACRO MacroName \ declares a macro named MacroName
  611. #SET CompVar=~0
  612.  DATA CompVar
  613. #ENDM \ defines end of macro declaration
  614.  
  615. MacroName
  616. MacroName
  617.  
  618. Results in the following source code generation:
  619.  
  620.  DATA 1
  621.  DATA 2
  622.  
  623.               #IF, #ELSE, #ENDIF
  624.  
  625. These compiler directives are used to provide conditional compilation which
  626. is a feature commonly found in assemblers and "C" compilers, but rarely in
  627. Basic. Conditional compilation is useful when it is necessary to maintain
  628. more than one version of a program which has many common sections but some
  629. different sections. Conditional sections may be nested up to 20 deep.
  630.  
  631. The argument to the #IF directive is a simple condition of equality. The
  632. general syntax is as follows:
  633.  
  634.  #IF CompVar=Const
  635.  
  636. CompVar is a compiler variable which my be declared by a #SET or #FIX
  637. directive or on the compiler command line. Const is a constant which my be a
  638. decimal or hexadecimal integer value or another compiler variable.
  639.  
  640. The most common way to use this feature is to assign a compiler variable at
  641. the command line. For example:
  642.  
  643. cb testprog c=1
  644.  
  645. The #ELSE directive is optional and follows the body of code after the #IF
  646. directive.
  647.  
  648. The #ENDIF directive ends the conditional section.
  649.  
  650. An example follows which would go with the command line example above:
  651.  
  652. #IF c=1
  653. print "c=1"
  654. #ELSE
  655. print "c<>1"
  656. #ENDIF
  657.  
  658. The above example is of no practical use, but shows the effect of conditional
  659. compilation.
  660.  
  661. Also note that macros may be declared inside conditional sections which
  662. effectively offers conditional macros. This is especially useful in writing
  663. I/O drivers.
  664.  
  665.                   #C, #ENDC
  666.  
  667. These directives allow the use of C code blocks within a program or function.
  668. After the #C directive, all input is simply passed through to the output
  669. file until a #ENDC directive is encountered. C code may also be used on a
  670. single line basis by writing a ";" in column 1. See section on C Code.
  671.  
  672.                  #MACRO, #ENDM
  673.  
  674. The #MACRO and #ENDM compiler directives are used to declare MACROS. The
  675. purpose of macros is to allow the programmer to create complex blocks of
  676. code and then use them as if they were a single instruction with a
  677. descriptive name. At first glance the use of a macro might appear as a
  678. subroutine. This is not the case, however, because a subroutine appears only
  679. once in a program but may be called many times, while a macro is replicated
  680. in the code each time it is used. Also the macro invocation allows
  681. the specification of up to 9 arguments which are assigned to corresponding
  682. variables in the macro. The general form of the macro declaration and
  683. invocation are as follows:
  684.  
  685. Declaration:
  686.  
  687. #MACRO MacroName
  688.  {body of macro}
  689. #ENDM
  690.  
  691. Invocation:
  692.  
  693.  MacroName Arg#1,Arg#2,Arg#3,Arg#4,Arg#5,Arg#6,Arg#7,Arg#8,Arg#9
  694.  
  695. The macro declaration begins with the #MACRO compiler directive. All compiler
  696. directives must have a "#" in character position #1 (no indentation
  697. allowed). The body of the macro may contain no tilde characters (~) except
  698. where an argument is being specified. The body of the macro willwhen
  699. invoked be expanded to enter the source input stream, so the syntax within
  700. the body must conform to compiler syntax rules. Any occurrence of the tilde
  701. character without a single digit 0-9 immediately following will result in an
  702. invalid macro argument error. Any occurrence of the tilde character
  703. immediately followed by a single digit (0-9) will be replaced when the
  704. macro is invoked with the corresponding invocation argument or in the case
  705. of ~0 with the macro invocation number. Macros may NOT be nested. This means
  706. that a macro declaration (#MACRO) may not appear in the body of a macro.
  707. This will result in a nested macro error. The macro declarations are stored
  708. in a fixed size macro buffer (20,000 bytes as of this writing) and if this
  709. limit is exceeded a macro buffer full error will occur. The macro
  710. declaration is terminated by an #ENDM compiler directive. An #ENDM directive
  711. without a prior #MACRO directive will result in an #ENDM without #MACRO
  712. error. If a macro is declared which already exists the result will be a
  713. macro already defined error.
  714.  
  715. The macro invocation begins with the MacroName followed by a space followed
  716. by up to 9 macro arguments. If the macro definition has no arguments then
  717. none should be supplied in the invocation (the macro is invoked with the
  718. MacroName only). The MacroName must NOT begin in character position #1 as it
  719. will be taken for a Label. If there are less arguments in the macro
  720. invocation than are used in the macro declaration a macro argument error
  721. will occur. Macro invocation arguments are separated by a comma. NULL
  722. arguments are specified by adjacent commas (I.E. no argument). Alpha-Numeric
  723. strings (including "_","@", and "$") are valid arguments as are single
  724. special characters such as "!", "#","%", etc. The SPACE and BACKSLASH
  725. characters are NOT permitted. Quoted strings are passed as arguments with
  726. the quotes themselves included in the argument.
  727.  
  728. Macros must be declared before they are invoked or the invocation will result
  729. in an undefined symbol error.
  730.  
  731. Macro names must not conflict with other symbol names such as variables,
  732. labels, compiler variables, etc. or a symbol already defined error will
  733. occur.
  734. #MACRO, #ENDM (cont)
  735.  
  736. The following example illustrates a simple macro declaration and invocation:
  737.  
  738. #MACRO GetName \ declares a macro named "GetName"
  739. PRINT "Enter Name"
  740.  INPUT ~1
  741.  PRINT ~2
  742. #ENDM \ defines end of macro declaration
  743.  
  744.  GetName UserName,"Thank You"
  745.  
  746. The invocation of the macro (GetName UserName) causes the generation of the
  747. following lines in the source code stream:
  748.  
  749.  PRINT "Enter Name"
  750.  INPUT UserName
  751.  PRINT "Thank You"
  752.  
  753. The tilde character in the declaration followed by the numeral 1 indicates a
  754. macro argument which is assigned a value during invocation. In this example
  755. it is assigned "UserName" because it is argument #1 and UserName is the
  756. first invocation argument. Accordingly the second argument (~2) is assigned
  757. the quoted string "Thank You". Each macro may have up to 9 such arguments
  758. which may appear any number of times in the macro declaration.
  759.  
  760. A special argument (~0) is also available in the declaration which is
  761. replaced by the invocation number. For example, the first time a macro is
  762. invoked the ~0 will be replaced with a "1", the second time with a "2" and
  763. so on. This function is particularly useful in generating labels within a
  764. macro. For Example:
  765.  
  766. #MACRO Demo \ declares a macro named "Demo"
  767. Label~0 A=A+1
  768.  IF A<200 THEN Label~0
  769. #ENDM \ defines end of macro declaration
  770.  
  771. The first invocation of the Demo macro causes the generation of the following
  772. lines in the source code stream:
  773.  
  774. Label1 A=A+1
  775.  IF A<200 then Label1
  776.  
  777. The seventh invocation of the Demo macro causes the generation of the
  778. following lines in thes ource code stream:
  779.  
  780. Label7 A=A+1
  781.  IF A<200 THEN Label7
  782.  
  783. For the advanced user, the macro declaration body may contain a series of C
  784. statements (or BASICstatements or both) with the effect of implementing
  785. new statements not included in the language. This practice will eliminate
  786. much of the "trickery" and "cheat coding" often found in BASIC programs and
  787. result in much cleaner and readable code with faster execution speed. The
  788. user may accumulate a MACRO library through freeware, shareware, and
  789. purchased software.
  790.  
  791.          #USE, #SBRTN, #LIB, #FCN #STRUCT, #ENDSTRUCT
  792.  
  793. The #USE compiler directive is used to incorporate other files into the
  794. source data stream. It is equivalent to the "include" directive in "C" and
  795. is especially useful in declaring macros and functions. The USE directive
  796. may be nested up to 20 deep. This is to say that a file called by #USE may
  797. have a #USE directive itself. The general syntax of the #USE directive is as
  798. follows:
  799.  
  800. #USE PathList
  801.  
  802. PathList is any legal path list to a file to be included in the source data
  803. stream.
  804.  
  805. The #SBRTN compiler directive may be used to declare a subroutine. If the
  806. subroutine is referenced by a GOSUB before it appears, no declaration is
  807. required. even when not required, an ordered list of subroutines at the
  808. beginning of a program is useful.
  809.  
  810. #SBRTN PathList
  811.  
  812. The #LIB compiler directive is used to declare any library files which may
  813. contain relocatable files required by the program. Library files are merely
  814. a collection of relocatable modules. The #LIB directive may also be used to
  815. invoke C compiler options. The general syntax is as follows:
  816.  
  817. #LIB PathList
  818.  
  819. The #FCN compiler directive is used to declare functions. The name of the
  820. function is declared as well as the number of arguments.The general syntax
  821. is as follows:
  822.  
  823. #FCN FcnName(NumArgs)
  824.  
  825. NumArgs is a simple integer such as 1,2,3..etc. (or none)
  826.  
  827. The #STRUCT and #ENDSTRUCT are used to declare data structures just as the
  828. TYPE statement does. The only difference is#STRUCT directive allows
  829. declarations that are not limited by line length and the structure is more
  830. clear to look at. For example:
  831.  
  832. #STRUCT UsrType
  833.  Name:STRING[20}
  834.  Address:STRING[30]
  835.  ZipCode:BYTE
  836. #ENDSTRUCT
  837.  
  838. The above example is equivalent to:
  839.  
  840.  TYPE UsrType=Name:STRING[20];Address:STRING[30];ZipCode:BYTE
  841.  
  842.  
  843.  
  844. ******************** Important! READ THIS: *******************
  845.  
  846. Subroutines in OmniBasic are actually void C functions. Unless the subroutine
  847. is referenced by a GOSUB before it appears, the compiler will "think" it is
  848. a label rather than a subroutine. Therefore a subroutine must be referenced
  849. before it appears or, alternatively it may be declared with a #SBRTN
  850. directive. Also the last statement of a subroutine must be a RETURN. Any
  851. RETURN statement before the end of a subroutine must be inside a control
  852. structure such as a FOR loop or WHILE/ENDWHILE block. Violations of these
  853. rules will result in a "nesting" error.
  854.  
  855. The RETURN statement transfers control back to the caller and is also used to
  856. return integer or floating point data to the caller in the case of integer
  857. or floating point functions. For example:
  858.  
  859.  RETURN x+y
  860.  
  861.                DIRECTIVES
  862.  
  863. #SET                    #SET CompVar=Const
  864.                 #SET CompVar=Const+Const
  865.                 #SET CompVar=Const-Const
  866.                 #SET CompVar=Const*Const
  867.                 #SET CompVar=Const/Const
  868.  
  869. #FIX                    #FIX CompVar=Const\ same as #SET but is permanent
  870.  
  871. #USE            #USE PathName
  872.  
  873. #IF                             #IF CompVar=Const\ conditional compile
  874. #ELSE                   #ELSE\ conditional compile
  875. #ENDIF                  #ENDIF\ conditional compile
  876.  
  877. #MACRO                  #MACRO MacroName
  878.                 Macro Body
  879. #ENDM           #ENDM
  880.  
  881. #FCN            #FCN (NumArgs) <return data type> <modifier(s)>
  882.                 (NumArgs is number of arguments)
  883.                 (if NumArgs="c", NumArgs is variable)
  884.                 (return data type may be INT (default), FLOAT, or VOID)
  885.                 (modifiers may be POINTER, GLOBAL, and EXTERNAL)
  886.  
  887. #ROF            #ROF PathList\ relocatable file for linker
  888.  
  889. #LIB            #LIB PathList\ library file(s) for linker
  890.  
  891. #STRUCT         #STRUCT StructName\ same function as TYPE statement
  892.  
  893. #ENDSTRUCT      #ENDSTRUCT\ terminates structure declaration
  894.  
  895. #C              #C\ marks the beginning of a C code block
  896.  
  897. #ENDC           #ENDC\ marks the end of a C code block
  898.  
  899. #SBRTN          #SBRTN\ declares a subroutine
  900.  
  901.             STATEMENTS
  902.  
  903. IF                      IF CondExp THEN LABEL
  904.             or
  905.             IF CondExp THEN
  906.                 code body
  907.             ENDIF
  908.             or
  909.             IF CondExp THEN
  910.                 code body
  911.             ELSE
  912.                 code body
  913.             ENDIF
  914.  
  915. WHILE           WHILE CondExp DO
  916.                 code body
  917.             ENDWHILE
  918.  
  919. REPEAT          REPEAT
  920.                 code body
  921.             UNTIL CondExp
  922.  
  923. LOOP            LOOP
  924.                 code body
  925.             ENDLOOP
  926.  
  927. LOOP            LOOP COUNT=IntExp
  928.                 code body
  929.             ENDLOOP
  930.  
  931. FOR             FOR Int=IntExp TO IntExp {STEP IntExp}
  932.                 code body
  933.             Next Int
  934.  
  935. EXITIF          EXITIF CondExp <THEN>
  936.             Falls thru to end of any of above structures
  937.  
  938. GOTO            GOTO Label
  939.             GOTO [IntVar]
  940.  
  941. GOSUB           GOSUB Label
  942.             GOSUB [IntVar]
  943.  
  944. RETURN          RETURN
  945.             Return from subroutine or function
  946.  
  947. ON                      ON Int GOTO
  948.             ON Int GOSUB
  949.             ON ERROR GOTO
  950.             ON ERROR
  951.  
  952. STATUS:     STATUS \ optional prefix to any input/output statement
  953.         which turns off error trapping
  954.  
  955. STATUS      STATUS\ contains status of last input/output operation
  956.         -1 indicates error
  957.  
  958. READ            READ VAR,VAR...,VAR\ reads data statements
  959.             READ #PathNum,StringVar
  960.  
  961. WRITE           WRITE #PathNum,StringVar
  962.  
  963. GET             GET #PathNum,Var\ can be simple var or whole array
  964.  
  965. PUT             PUT #PathNum,Var\ can be simple var or whole array
  966.  
  967. BUFREAD         BUFREAD #PathNum,Addr,Bytes
  968.  
  969. BUFWRITE        BUFWRITE #PathNum,Addr,Bytes
  970.  
  971. PRINT           PRINT Expr
  972.             PRINT #PathNum,Expr
  973.             PRINT USING(FormatString,Var,Var,...,Var)
  974.             PRINT #PathNum USING(FormatString,Var,Var,...,Var)
  975.             <<<<<<< left justified format field of 7 positions
  976.             >>>>>> right justified format field of 6 positions
  977.             ^^^^^ center justified format field of 5 positions
  978.  
  979. INPUT           INPUT Var
  980.             INPUT "prompt",Var
  981.             INPUT #PathNum,Var
  982.  
  983. FPRINT          Same as PRINT but sends no Line Feed
  984.  
  985. FINPUT          Same as input but sends no prompt
  986.  
  987. CREATE          CREATE #ByteVar,PathName        AccMode
  988.  
  989. OPEN            OPEN #ByteVar,PathName  AccMode
  990.  
  991. CLOSE           CLOSE #PathNum
  992.  
  993. SEEK            SEEK #PathNum,IntVal
  994.  
  995. DELETE          DELETE StringVal
  996.  
  997. LET             {LET} Var=Expr
  998.  
  999. POKE            POKE Addr,ByteVal
  1000.  
  1001. END             END
  1002.  
  1003. REM             REM\ Remark
  1004.  
  1005. SHELL           SHELL String
  1006.  
  1007. RESTORE         RESTORE Label
  1008.  
  1009. DATA            DATA Const,Const...,Const
  1010.  
  1011. BUFFER          BUFFER BufName=MemBytes\ opens buffer to size=MemBytes
  1012.             BUFFER BufName=0\ closes buffer
  1013.             (MemBytes=-1 opens largest buffer available)
  1014.  
  1015. DIM             DIM VarName[(ArraySize)}        DataType {modifier modifier}
  1016.             DataTypes        BOOLEAN, BYTE, SHORT, LONG, FLOAT, STRING,POINTER
  1017.             Modifiers        GLOBAL, EXTERNAL, ALIAS=, ADDRESS(POINTER),
  1018.             REMOTE, REGISTER, VECTOR
  1019.             DIM StringVarName{(ArraySize)}  STRING[StringSize] {modifier}
  1020.  
  1021. PARAM       Similar to DIM, immediately follows a function occurence
  1022.         with one PARAM to receive each argument to the function
  1023.  
  1024. TYPE            TYPE UserType=VarName{(ArraySize)}      DataType;VarName...etc.
  1025.  
  1026. INC             INC IntVar\ IntVar=IntVar+1
  1027.             INC PtrVar\ PtrVar=PtrVar+DataSize
  1028.  
  1029. DEC             DEC IntVar\ IntVar=IntVar-1
  1030.             DEC PtrVar\ PtrVar=PtrVar-DataSize
  1031.  
  1032. DIGITS          DIGITS NumConst\ # of digits for FLOAT (1-15) default 15
  1033.  
  1034. DECIMALS        NumConst\ # of decimal places for FLOAT (default 2)
  1035.  
  1036. BASE            BASE 0, BASE 1\ base of arrays (default  1)
  1037.  
  1038. ENDEXIT         ENDEXIT\ Terminates EXITIF CondExp THEN
  1039.  
  1040. SETVEC          SETVEC VectorVar=Addr\ Sets vector to address
  1041.  
  1042. EXCHANGE        EXCHANGE Var,Var\ vars must be same type and size
  1043.  
  1044.         FUNCTIONS and SPECIAL VARIABLES
  1045.  
  1046. EOF()                   EOF(#PathNum)\ BOOLEAN result
  1047. LEN()                   LEN(String)\ INT result
  1048. STR$()                  STR$(NumVal)\ String result
  1049. ZSTR$()                 ZSTR$(NumVal)\ String result zero padded
  1050. VAL()                   VAL(StringVal)\ INT or FLOAT result
  1051. IVAL()          IVAL(StringVal)\ INT RESULT
  1052. FVAL()          FVAL(StringVal)\ FLOAT result
  1053. LAND()                  LAND(IntVAl)\ INT result
  1054. LOR()                   LOR(IntVal)\ INT result
  1055. LXOR()                  LXOR(IntVal)\ INT result
  1056. LNOT()                  LNOT(IntVal)\ INT result
  1057. MID$()                  MID$(StringVal,Org,Bytes)\ String result
  1058. LEFT$()                 LEFT$(StringVal,Bytes)\ String result
  1059. RIGHT$()                RIGHT$(StringVal,Bytes)\ String result
  1060. MOD()                   MOD(IntVal,IntVal)\ INT result
  1061. CHR$()                  CHR$(IntVal)\ String result
  1062. ASC()                   ASC(StringVal)\ INT result
  1063. NOT()                   NOT(BoolVal)\ Boolean result
  1064. BUFADR()                BUFADR(BufName)\ INT result (address of BufName)
  1065. BUFSIZ()                BUFSIZ(BufName)\ Int result (size of BufName)
  1066. PEEK()                  PEEK(Addr)\ Byte result
  1067. ERR                             ERR\ INT result
  1068. FILSIZ()        FILSIZ(#PathNum)\ INT result
  1069. POS                             POS\ Int result
  1070. FILPOS()                FILPOS(#PathNum)\ INT result
  1071. INDEX()                 INDEX(PtrVar,IndexVal)\ INT result
  1072. SIZE()                  SIZE(VarName)\ INT result
  1073. TAB()                   TAB(IntVal)\ INT result
  1074. ADDR()                  ADDR(VarName)\ INT result
  1075. NextArg                 StringVar=NextArg\      must be used in LET statement
  1076.                 (Do once to get each arg)
  1077.                 (When LEN(StringVar)=0 then all command line
  1078.                 arguments are exhausted)
  1079. XferBytes               Total bytes transfered after I/O operation
  1080. THOUR()         THOUR(0)\ Hour BYTE result
  1081. TMIN()          TMIN(0)\ Minutes BYTE result
  1082. TSEC()          TSEC(0)\ Seconds BYTE result
  1083. TYEAR()         TYEAR(0) \ Year BYTE result
  1084. TMON()          TMON(0)\ Month BYTE result
  1085. TDAT()          TDAT(0)\ Date BYTE result
  1086. TDAY()          TDAY(0)\ DAY BYTE result 0=Sunday, 1=Monday, etc.
  1087. SQR()           SQR(FloatVal)\ Square Root FLOAT result
  1088. ABS()           ABS(NumExpr)\ Absolute Value INT or FLOAT result
  1089. INT()           INT(FloatVal)\ Integer Value of Float
  1090. SIN()           SIN(NumVal)\ FLOAT result
  1091. COS()           COS(NumVal)\ FLOAT result
  1092. TAN()           TAN(NumVal)\ FLOAT result
  1093. ASN()           ASN(NumVal)\ FLOAT result
  1094. ACS()           ACS(NumVal)\ FLOAT result
  1095. ATN()           ATN(NumVal)\ FLOAT result
  1096. LOG()           LOG(NumVal)\ FLOAT result
  1097. LOG10()         LOG10(NumVal)\ FLOAT result
  1098. HEX$()                  HEX$(NumVal)\ String result
  1099. ZHEX$()                 ZHEX$(NumVal)\ String result zero padded
  1100. BITTST()                BITTST(IntVal,IntConst)\ BOOLEAN result
  1101. BITCLR()                BITCLR(IntVal,IntConst)\ INT result
  1102. BITSET()                BITSET(IntVal,IntConst)\ INT result
  1103. BITCHG()                BITCHG(IntVal,IntConst)\ INT result
  1104. SHL()                   SHL(IntVal,IntConst)\ INT result
  1105. SHR()                   SHR(IntVal,IntConst)\ INT result
  1106. ROL()                   ROL(IntVal,IntConst)\ INT result
  1107. ROR()                   ROR(IntVal,IntConst)\ INT result
  1108. SUBSTR()                SUBSTR(Str1,Str2)\ Int result position of Str1 in Str2
  1109.