home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / pocketbk / developmen / oplman / OPLREF3A.DBF (.txt) < prev    next >
Psion Database  |  1995-04-11  |  156KB  |  1,912 lines

  1. OPLDatabaseFile
  2. ROM::BJ.WDR
  3. Name:
  4.  Home:
  5.  Work:
  6.  Fax:
  7. Address:
  8. Notes:Z
  9.  SERIES 3a OPL PROGRAMMERS' GUIDE
  10. 2-266    The OPL keywords -        (to find a keyword, precede it by a dot)"266    Scanning the keyboard directly+267    I/O calls: read cursor, set alarm, dial 268    Recording and playing sounds
  11. 269    Foreground and background&270    Serial/parallel ports and printing
  12. 271    OPAs and the System screen!272    Calling procedures by strings
  13. 273    Data files!274    The text and graphics windows
  14. 275    Error messages#276    File extensions and directories
  15. 277    Hexadecimals
  16. 278    Operators and expressions
  17. 279    Character set and key codes
  18. v0.92 8/8/941Comments, bugs etc to nhealey@cix.compulink.co.uk@
  19. a=ABS(x)dReturns the absolute value of a floating-point number - that is, without any +/- sign - for example:
  20. ABS(-10.099) is 10.099
  21. If x is an integer, you won't get an error, but the result will be converted to floating-point - for example ABS(-6) is 6.0. Use IABS to return the absolute value as a long integer.
  22. .ACOS    a=ACOS(x)-Returns the arc cosine (inverse cosine) of x.
  23. x must be in the range -1 to +1. The number returned will be an angle in radians. To convert the angle to degrees, use the DEG function.
  24. .ADDR
  25. a%=ADDR(variable):Returns the address at which variable is stored in memory.pThe values of different types of variables are stored in bytes starting at ADDR(variable). See PEEK for details.
  26. See also UADD, USUB.
  27. .ADJUSTALLOC$pcelln%=ADJUSTALLOC(pcell%,off%,am%)
  28. Opens or closes a gap at off% within the allocated cell pcell%, returning the new cell address or zero if out of memory. off% is 0 for the first byte in the cell. Opens a gap if the amount am% is positive, and closes it if negative.
  29. .ALERTmr%=ALERT(m1$,m2$,b1$,b2$,b3$)
  30. r%=ALERT(m1$,m2$,b1$,b2$)
  31. r%=ALERT(m1$,m2$,b1$)
  32. r%=ALERT(m1$,m2$)
  33. r%=ALERT(m1$)
  34. Presents an alert - a simple dialog - with the messages and keys specified, and waits for a response. m1$ is the message to be displayed on the first line, and m2$ on the second line.XIf m2$ is not supplied or if it is a null string, the second message line is left blank.
  35. Up to three keys may be used. b1$, b2$ and b3$ are the strings (usually words) to use over the keys. b1$ appears over an Esc key, b2$ over Enter, and b3$ over Space. This means you can have Esc, or Esc and Enter, or Esc, Enter and Space keys.MIf no key strings are supplied, the word "Continue" is used above an Esc key.EThe key number - 1 for Esc, 2 for Enter or 3 for Space - is returned.
  36. .ALLOC
  37. pcell%=ALLOC(size%)
  38. Allocates a cell on the heap of the specified size, returning the pointer to the cell or zero if there is not enough memory. The new cell is uninitialised - you cannot assume that it is zeroed.
  39. APP name
  40. ENDAfBegins definition of an OPA. name gives the name of the OPA. (Note that it does not have quote marks.)TThe APP line may be followed by any or all of the keywords PATH, EXT, ICON and TYPE.
  41. .APPEND
  42. APPEND
  43. Adds a new record to the end of the current data file. The record which was current is unaffected. The new record, the last in the file, becomes the current record.{The record added takes the current values of the field variables A.field1$, A.field2$, and so on, of the current data file.
  44. If a field has not been assigned a value, zero will be assigned to it if it is a numeric field, or a null string if it is a string field.BTo overwrite the current record with new field values, use UPDATE.p
  45. .APPENDSPRITE>APPENDSPRITE time%,bit$(),dx%,dy%
  46. APPENDSPRITE time%,bit$()
  47. Appends a single bitmap-set to the current sprite. It can be called up to 13 times for each sprite, before the sprite is drawn.
  48. time% gives the duration in tenths of seconds for the bitmap-set to be displayed before going on to the next bitmap-set in the sequence.zbit$() contains the names of bitmap files in the set, or "" to specify no bitmap. The array must have at least 6 elements: bit$(1) for setting black pixels!bit$(2) for clearing black pixels"bit$(3) for inverting black pixels
  49. bit$(4) for setting grey pixels bit$(5) for clearing grey pixels!bit$(6) for inverting grey pixels
  50. Use "" to specify no bitmap. If "" is used for all the bitmaps in the set, the sprite is left blank for the specified duration.
  51. All the bitmaps in a single bitmap-set must be the same size or `Argument' error (-2) is raised on attempting to draw the sprite. Bitmaps in different bitmap-sets may differ in size.
  52. dx% and dy%, if supplied, are the (x,y) offsets from the sprite position to the top-left of this bitmap-set, with positive for right and down. The default value of each is zero.
  53. Sprites may use a lot of memory. A sprite should generally be created, initialised and closed in the same procedure to prevent memory fragmentation. Care should also be taken in error handling to close a sprite that is no longer in use.8
  54. a%=ASC(a$)8Returns the character code of the first character of a$.:See also the entry entitled "Character set and key codes".FAlternatively, use A%=%char to find the code for char - eg %X for `X'.4If a$ is a null string ("") ASC returns the value 0.
  55. Example:.A%=ASC("hello") returns 104, the code for `h'.
  56. .ASIN    a=ASIN(x))Returns the arc sine (inverse sine) of x.
  57. x must be in the range -1 to +1. The number returned will be an angle in radians. To convert the angle to degrees, use the DEG function.v
  58. AT x%,y%
  59. Positions the cursor at x% chars across the text window and y% rows down. AT 1,1 moves to the top left corner of the window. Initially, the window is the full size of the screen, but you can change its size and position with the SCREEN command.aA common use of AT is to display strings at particular positions in the text window. For example:
  60. AT 5,2 :PRINT "message".
  61.  PRINT statements without AT display on the left of the window on the line below the last PRINT statement (unless you use `,' or `;'). Strings displayed at the top of the window scroll off as more strings are shown at the bottom of the window.
  62.  Displayed strings always overwrite anything that is on the screen - they do not cause things below them on the screen to scroll down.sAn example in the entry entitled "I/O calls: read cursor, set alarm, dial" shows a way to read the cursor position.
  63. .ATAN    a=ATAN(x).Returns the arc tangent (inverse tanget) of x.gThe number returned will be an angle in radians. To convert the angle to degrees, use the DEG function.
  64. .BACK
  65. BACKFMakes the previous record in the current data file the current record._If the current record is the first record in the file, then the current record does not change.\
  66. .BEEP
  67. BEEP time%,pitch%
  68. Sounds the buzzer. The beep lasts for time%/32 seconds - so for a beep a second long make time%=32, etc. The maximum is 3840 (2 minutes).9The pitch (frequency) of the beep is  512/(pitch%+1) KHz.,BEEP 5,300 gives a comfortably pitched beep.
  69. If you make time% negative, BEEP first checks whether the sound system is in use (perhaps by another OPL program), and returns if it is. Otherwise, BEEP waits until the sound system is free. Example - a scale from middle C:
  70. PROC scale:
  71. LOCAL freq,n%
  72. REM n% relative to middle A
  73. n%=3 REM start at middle C
  74. WHILE n%<16
  75.  freq=440*2**(n%/12.0)
  76.  REM middle A = freq 440Hz
  77.  BEEP 8,512000/freq-1.0
  78.  n%=n%+1* IF n%=4 OR n%=6 OR n%=9 OR n%=11 OR n%=13      n%=n%+1
  79.  ENDIF
  80. ENDWH
  81. ENDP{Alternatively, sound the buzzer with this statement: PRINT CHR$(7). This beeps at a fixed pitch for a fixed length of time.
  82. .BREAK
  83. BREAK
  84. Makes a program performing a DO...UNTIL or WHILE...ENDWH loop exit the loop and immediately execute the line following the UNTIL or ENDWH statement.
  85. .BUSY3BUSY str$,c%,delay%
  86. BUSY str$,c%
  87. BUSY str$
  88. BUSY OFF
  89. BUSY str$ displays str$ in the bottom left of the screen, until BUSY OFF is called. Use this to indicate `Busy' messages, usually when an OPL program is going to be unresponsive to keypresses for a while.DIf c% is given, it controls the corner in which the message appears:    c%    corner
  90. 0    top left
  91. 1    bottom left (default)
  92. 2    top right
  93. 3    bottom right
  94. delay% specifies a delay time (in half seconds) before the message should be shown. Use this to prevent `busy' messages from continually appearing very briefly on the screen._Only one message can be shown at a time. The string to display can be up to 19 characters long.
  95. .CACHE#CACHE init%,max%
  96. CACHE ON
  97. CACHE OFF
  98. CACHE creates a procedure cache of a specified initial number of bytes init% which may grow up to the maximum size max%. You should usually TRAP this.
  99. The minimum cache size is 2000 bytes, which is used if any lower value is specified. If the maximum size specified is less than the initial size, the maximum is set to the initial size. The maximum cache size cannot be changed once the cache has>been created and an error is returned if you attempt to do so.
  100. Once a cache has been created, CACHE OFF prevents further cacheing, although the cache is still searched when calling subsequent procedures. CACHE ON may then be used to re-enable cacheing.wYou can specify init% and max% up to 32,767 bytes. If you use hex, you can even exceed this figure, if you need to - eg
  101. CACHE $9000,$9000WHowever, you cannot exceed the 64k total memory limit which each Series 3a process has.
  102.     .CACHEHDR
  103. CACHEHDR addr(hdr%())
  104. The cache index begins with a header, then has one index record for each procedure cached. CAHCEHDR reads the header into array hdr%(), which must have at least 11 integer elements.+hdr%(1)    current address of the cache itself-hdr%(2)    number of procedures currently cached*hdr%(3)    maximum size of the cache in bytes*hdr%(4)    current size of the cache in bytes)hdr%(5)    number of free bytes in the cacheWhdr%(6)    total number of bytes in cached procedures which are freeable (ie. not running)Ohdr%(7)    offset from the start of the cache index to the first free index record_hdr%(8)    offset from start of cache index to most recently used procedure's record; zero if none`hdr%(9)    offset from start of cache index to least recently used procedure's record; zero if noneDhdr%(10)    address of the cache index, or zero if no cache created yet:hdr%(11)    non-zero if cacheing is on, and zero if it is offmAll offsets mentioned give the number of bytes from the start of the index to the procedure record specified.TIf no cache has yet been created, hdr%(10)=0 and the other data read is meaningless.
  105. Note that any information returned is liable to change whenever a procedure is called, so you cannot save these values over a procedure call.
  106.     .CACHEREC
  107. CACHEREC addr(rec%()),off%kRead the cache index record at offset off% into array rec%(), which must have at least 18 integer elements.
  108. Alternatively off%=0 specifies the most recently used (MRU) procedure's record, if any, and off%<0 the least recently used procedure (LRU) procedure's record, if any.Irec%(1)    offset to less recently used procedure's record or zero if on LRUIrec%(2)    offset to more recently used procedure's record or zero if on MRU)rec%(3)    usage count - zero if not runningMrec%(4)    offset in cache itself to descriptor for building the procedure frameCrec%(5)    offset in cache itself to translated code for the procedureRrec%(6)    offset in cache itself to the end of the translated code for the procedureArec%(7) number of bytes used by the procedure in the cache itselfMrec%(8-15)    leading byte counted procedure name, followed by some private dataDrec%(16)    address of the procedure's leading byte counted module nameDrec%(17)    address of the cache index, or zero if no cache created yet:rec%(18)    non-zero if cacheing is on, and zero if it is offeFor a free index record only rec%(1) is significant, giving the offset of the next free index record.
  109. The data returned by CACHEREC is meaningless if no cache exists (in which case rec%(17)=0) or if there are no procedures cached yet (when hdr%(8)=0 as returned by CACHEHDR).
  110. Note that any information returned is liable to change whenever a procedure is called, so you cannot save these values over a procedure call.
  111. The index records for cached procedures form a doubly linked list, starting from first the most recently used procedure (MRU), then from the least recently used procedure (LRU). A further singly linked list gives the offsets to free index records.NThis is an advanced command, intended for use during program development only.G
  112. .CACHETIDY    CACHETIDY
  113. Remove from the cache any procedures that have returned to their callers. This might be called after performing a large, self-contained action in the program which required many procedures.sNote that a procedure which has returned is automatically removed from the cache if you unload the module it is in.
  114. .CALL
  115. e%=CALL(s%,bx%,cx%,dx%,si%,di%)
  116. This function enables you to make operating system calls. To use it requires extensive knowledge of the Operating System and related programming techniques.
  117. The INT number is the least significant byte of s%. The AH value (the subfunction number) is the most significant byte of s%. The values of the other arguments are passed to the corresponding 8086 registers. The value of the AX register is returned.>
  118. .CHANGESPRITEFCHANGESPRITE ix%,time%,bit$(),dx%,dy%
  119. CHANGESPRITE ix%,time%,bit$()
  120. Changes the bitmap-set specified by ix% (1 for the first bitmap-set) in the current sprite, using the supplied bitmap files, offsets and duration in the same way as for APPENDSPRITE.1CHANGESPRITE can be called only after DRAWSPRITE.
  121. .CHR$
  122. a$=CHR$(x%)-Returns the character with character code x%.
  123. You can use it to display characters not easily available from the keyboard - for example, the instruction PRINT CHR$(174) displays 
  124. .:See also the entry entitled "Character set and key codes".
  125. .CLOSE
  126. CLOSEXCloses the current file (that is, the one which has been OPENed and most recently USEd).
  127. If you've used ERASE to remove some records, CLOSE recovers the memory used by the deleted records, provided it is held either in the internal memory or on a Ram SSD.<
  128. .CLOSESPRITE
  129. CLOSESPRITE id%
  130. Closes the sprite with ID id%.
  131. CLS'Clears the contents of the text window.
  132. The cursor then goes to the beginning of the top line. If you have used CURSOR OFF the cursor is still positioned there, but is not displayed.T
  133. .CMD$
  134. c$=CMD$(x%)
  135. Returns the command-line arguments passed when starting a program. Null strings may be returned. x% should be from 1 to 5. cmd$(2) to cmd$(5) are only for OPAs (OPL applications).Ecmd$(1) returns the full path name used to start the running program.Pcmd$(2) returns the full path name of the file to be used by an OPA application.
  136. cmd$(3) returns "C" for "Create file" or "O" for "Open file". If the OPA is being run with a new filename, this will return "C". This happens the very first time the OPA is used, and whenever a new filename is used to run it. Otherwise, the OPA isIbeing run with the name of an existing file, and cmd$(3) will return "O".Zcmd$(4) returns the alias information, if any. In practice this has no relevance for OPAs.Gcmd$(5) returns the application name, as declared with the APP keyword.
  137. See also GETCMD$.
  138.     .COMPRESS
  139. COMPRESS src$,dest$
  140. Copies data file src$ to another data file dest$. If dest$ already exists, the records in src$ are appended to the end of dest$.
  141. Deleted records are not copied. This makes COMPRESS particularly useful when copying from a Flash SSD. (The space used by deleted records on a Ram SSD or in internal memory is automatically freed when you close the file.)>If you want src$ to overwrite instead of append to dest$, use:
  142. TRAP DELETE dest$
  143. before the COMPRESS statement.
  144. You can use wildcards to copy more than one file at a time. But if the first name contains any wildcards, the second name must not include a filename, just the device and directory to which the files are to be copied under their original names.VExample: to copy all the data files on A: (in \OPD, the default directory) to B:\BCK\:
  145. COMPRESS "A:*.ODB","B:\BCK\"5(Remember the final backslash on the directory name.)&See COPY for copying any type of file.
  146.     .CONTINUE
  147. CONTINUE
  148. Makes a program immediately go to the UNTIL... line of a DO...UNTIL loop or the WHILE... line of a WHILE...ENDWH loop - ie to the test condition.
  149. See also BREAK.X
  150. .COPY
  151. COPY src$,dest$
  152. Copies the file src$, which may be of any type, to the file dest$. Any existing file with the name dest$ is deleted. You can copy across devices.
  153. Use the appropriate file extensions to indicate the type of file, and wildcards if you wish to copy more than one file at a time:
  154.  If src$ contains wildcards, dest$ must not specify a filename, just the device and directory to which the files are to be copied under their original names.G    
  155.  You must specify either an extension or .* on the first filename.LExample: To copy all the OPL files from internal memory (in \OPL) to B:\ME\:
  156. COPY "M:\OPL\*.OPL","B:\ME\"5(Remember the final backslash on the directory name.)
  157. See COMPRESS for more control over copying data files. If you use COPY to copy a data file, deleted records are copied and you cannot append to another data file.
  158. c=COS(x)8Returns the cosine of x, where x is an angle in radians.9To convert from degrees to radians, use the RAD function.t
  159. .COUNT
  160. c%=COUNT7Returns the number of records in the current data file.+This number will be 0 if the file is empty.
  161. .CREATE
  162. CREATE file$,log,f1,f2,...!Creates a data file called file$.x    
  163.  The filename may be a full file specification of up to 128 characters. Field names may be up to 8 letters/numbers.
  164.  The file may have up to 32 fields, as specified by f1, f2... (if viewed in the Database application, field f1 starts on the top line of the window, f2 is below it, etc.)
  165.  log specifies the logical file name - A, B, C or D. This is used as an abbreviation for the file name when you use other data file commands such as USE.MImmediately after the CREATE statement, the file is open and can be accessed.
  166. Example:
  167. CREATE "CLIENTS",B,NM$,PHON$]would create a data file in the internal memory with the name CLIENTS and the logical name B.J
  168. .CREATESPRITE
  169. id%=CREATESPRITE*Creates a sprite, returning the sprite ID.z
  170. .CURSORQCURSOR ON
  171. CURSOR OFF
  172. CURSOR id%,asc%,w%,h%
  173. CURSOR id%,asc%,w%,h%,type%
  174. CURSOR id%hCURSOR ON switches the text cursor on at the current cursor position. Initially, no cursor is displayed.
  175. You can switch on a graphics cursor in a window by following CURSOR with the ID of the window. This replaces any text cursor. At the same time, you can also specify the cursor's shape, and its position relative to the baseline of text.
  176. asc% is the ascent - the number of pixels (-128 to 127) by which the top of the cursor should be above the baseline of the current font. h% and w% (both from 0 to 255) are the cursor's height and width.BIf you do not specify them, the following default values are used:
  177. asc%    =font ascent
  178. h%    =font height
  179. w%    =2-If type% is given, it can have these effects:
  180. 1    obloid
  181. 2    not flashing
  182. 4    greylYou can add these values together to combine effects - eg if type% is 6 a grey non-flashing cursor is drawn.BAn error is raised if id% specifies a bitmap rather than a window.#CURSOR OFF switches off any cursor.sAn example in the entry entitled "I/O calls: read cursor, set alarm, dial" shows a way to read the cursor position.
  183. .DATETOSECS&s&=DATETOSECS(yr%,mo%,dy%,hr%,mn%,sc%)WReturns the number of seconds since 00:00 on 1 January 1970 at the date/time specified.0Raises an error for dates before 1 January 1970./The value returned is an unsigned long integer.
  184. (Values up to +2,147,483,647, which is 03:14:07 on 19/1/2038, are returned as expected. Those from +2,147,483,648 upwards are returned as negative numbers, starting from -2,147,483,648 and increasing towards zero.)*See also SECSTODATE, HOUR, MINUTE, SECOND.
  185. .DATIM$    d$=DATIM$RReturns the current date and time from the system clock as a string - for example:
  186. "Fri 16 Oct 1992 16:25:30"5The string returned always has the format shown here.R
  187. d%=DAYEReturns the current day of the month (1 to 31) from the system clock.
  188.     .DAYNAME$
  189. d$=DAYNAME$(x%)]Converts x%,a number from 1 to 7, to the day of the week, expressed as a three letter string.
  190. Eg d$=DAYNAME$(1) returns MON.
  191. Example:
  192. PROC Birthday:
  193.  LOCAL d&,m&,y&,dWk%
  194.   dINIT
  195.   dTEXT "","Date of birth",2
  196.   dTEXT "","eg 23 12 1963",$202
  197.   dLONG d&,"Day",1,31
  198.   dLONG m&,"Month",1,12
  199.   dLONG y&,"Year",1900,2155
  200.   IF DIALOG=0 :BREAK :ENDIF
  201.   dWk%=DOW(d&,m&,y&)
  202.   CLS :PRINT DAYNAME$(dWk%),
  203.   PRINT d&,m&,y&
  204.   dINIT
  205.   dTEXT "","Again?",$202
  206.   dBUTTONS "No",%N,"Yes",%Y
  207.  UNTIL DIALOG<>%y
  208. See also DOW.
  209. .DAYS
  210. d&=DAYS(day%,month%,year%),Returns the number of days since 01/01/1900.:Use this to find out the number of days between two dates.
  211. Example:
  212. PROC deadline:
  213.  LOCAL a%,b%,c%,deadlin&
  214.  LOCAL today&,togo%
  215.  PRINT "What day? (1-31)"     INPUT a%
  216.  PRINT "What month? (1-12)"     INPUT b%
  217.  PRINT "What year? (19??)"     INPUT c%
  218.  deadlin&=DAYS(a%,b%,1900+c%)
  219.  today&=DAYS(DAY,MONTH,YEAR)
  220.  togo%=deadlin&-today&
  221.  PRINT togo%,"days to go"
  222. See also dDATE, SECSTODATE.t
  223.     .dBUTTONSJdBUTTONS p1$,k1%,p2$,k2%,p3$,k3%
  224. dBUTTONS p1$,k1%,p2$,k2%
  225. dBUTTONS p1$,k1%2Defines exit keys to go at the bottom of a dialog.
  226. From one to three exit keys may be defined. Each pair of p$ and k% specifies an exit key; p$ is the text to be displayed above it, while k% is the keycode of the key. DIALOG returns the keycode of the key pressed (in lower case for letters).
  227. For alphabetic keys, use the % sign - %A means `the code of A', and so on. See the entry entitled "Character set and key codes" for the codes of keys (such as Tab) which are not part of the character set. If you use the code for one of these keys,9its name (eg `Tab', or `Enter') will be shown in the key.
  228. If you use a negative value for a k% argument, that key is a `Cancel' key. The corresponding positive value is used for the key to display and the value for DIALOG to return, but if you do press this key to exit, the var variables used in the0commands like dEDIT, dTIME etc. will not be set.
  229. The Esc key will always cancel a dialog box, with DIALOG returning 0. If you want to show the Esc key as one of the exit keys, use -27 as the k% argument (its keycode is 27) so that the var variables will not be set if Esc is pressed.
  230. There can be only one dBUTTONS item per dialog, and it takes up three lines on the screen. dBUTTONS must be the last dialog command you use before DIALOG itself.JSome keypresses, such as those using the Control key, cannot be specified.RThis example presents a simple query, returning `True' for Yes, or `False' for No.
  231. PROC query:
  232.  dINIT
  233.  dTEXT "","FORGET CHANGES",2
  234.  dTEXT "","Sure?",$202
  235.  dBUTTONS "No",%N,"Yes",%Y
  236.  RETURN DIALOG=%y
  237. ENDP\
  238. .dCHOICE
  239. dCHOICE var choice%,p$,list$(Defines a choice list to go in a dialog.
  240. p$ will be displayed on the left side of the line. list$ should contain the possible choices, separated by commas - for example, "Yes,No". One of these will be displayed on the right side of the line; LEFT/RIGHT move between the choices.
  241. choice% must be a LOCAL or a GLOBAL variable. It specifies which choice should initially be shown - 1 for the first choice, 2 for the second, and so on. When you finish the dialog, choice% is given a value indicating which choice was selected -)again, 1 for the first choice, and so on.
  242. .dDATE
  243. dDATE var lg&,p$,min&,max&2Defines an edit box for a date, to go in a dialog.2p$ will be displayed on the left side of the line.
  244. lg&, which must be a LOCAL or a GLOBAL variable, specifies the date to be shown initially. Although it will appear on the screen like a normal date, for example 15/03/92, lg& must be specified as "days since 1/1/1900".
  245. min& and max& give the minimum and maximum values which are to be allowed. Again, these are in days since 1/1/1900. An error is raised if min& is higher than max&.bWhen you finish using the dialog, the date you entered is returned in lg&, in days since 1/1/1900.PThe system setting determines whether years, months or days are displayed first.
  246. See also DAYS, SECSTODATE.U
  247. .dEDIT+dEDIT var str$,p$,len%
  248. dEDIT var str$,p$-Defines a string edit box, to go in a dialog.2p$ will be displayed on the left side of the line.
  249. str$ is the string variable to edit. Its initial contents will appear in the dialog. The length used when str$ was defined is the maximum length you can type in.
  250. len%, if supplied, gives the width of the edit box (allowing for the widest possible character in the font). The string will scroll inside the edit box, if necessary.gIf len% is not supplied, the edit box is made wide enough for the maximum width str$ could possibly be.
  251. See also dTEXT.<
  252. .DEFAULTWIN
  253. DEFAULTWIN mode%tChange the default window (ID=1) to enable or disable the use of grey. Initially grey cannot be used in that window. mode%=1 enables the use of grey.!mode%=0 disables the use of grey.;A side-effect of DEFAULTWIN is to clear the default window.6Using grey does use more memory than using black only.
  254. You are advised to call DEFAULTWIN once and for all near the start of your program if you need to use grey. If it fails with `Out of memory' error, the program can then exit cleanly without losing vital information.
  255. See also gGREY and gCREATE.
  256. d=DEG(x)!Converts from radians to degrees.UReturns x, an angle in radians, as a number of degrees. The formula used is: 180*x/PI
  257. All the trigonometric functions (SIN,COS etc.) work in radians, not degrees. You can use DEG to convert an angle returned by a trigonometric function back to degrees - for example:
  258. PROC xarctan:
  259.  LOCAL arg,angle
  260.  PRINT "Enter argument:";
  261.  INPUT arg
  262.  PRINT "ARCTAN of",arg,"is"
  263.  angle=ATAN(arg)
  264.  PRINT angle,"radians"
  265.  PRINT DEG(angle),"degrees"
  266. ENDP,To convert from degrees to radians, use RAD.
  267. .DELETE
  268. DELETE filename$
  269. Deletes any type of file.KYou can use wildcards - for example, to delete all the OPL files in B:\OPL:
  270. DELETE "B:\OPL\*.OPL"=See also the entry entitled "File extensions and directories"
  271. See also RMDIR.M
  272. .dFILE
  273. dFILE var str$,p$,f%kDefines a filename edit box, to go in a dialog. A `Disk' selector is automatically added on the line below.2p$ will be displayed on the left side of the line.uf% controls the type of file editor, and the kind of input allowed. You can add together any of the following values:
  274. value    meaning
  275. 1    use an edit box
  276. 2    allow directory names
  277. 4    directory names only
  278. 8    disallow existing files
  279. 16    query existing files
  280. 32    allow null string input
  281. 64    don't display extension
  282. 128    obey/allow wildcards
  283. The first of the list is the most crucial. If you add 1 into f%, you will see an file edit box, as when creating a new file. If you do not add 1, you will see the `matching file' selector, used when choosing an existing file.
  284. If performing a `copy to' operation, you might use 1+2+16, to specify a file edit box, in which you can type the name of a directory to copy to, and which will produce a query if you type the name of an existing file.kIf asking for the name of a directory to remove, you might use 4, to allow an existing directory name only.
  285. `Query existing' is ignored if `disallow existing' is set. These two, as well as `allow null string input', only work with file edit boxes, not `matching file' selectors.
  286. str$ is the string variable to edit. Its initial contents always control the initial drive and directory used. For a file edit box, any filename part of str$ is shown. 
  287. For a `matching file' selector, you can use wildcards in the filename part (such as *.tmp) to control which filenames are matched. To do this, you must add 128 to f%.w128 also allows wildcard specifications to be entered (returned in str$), for both `matching' and `new file' selectors.
  288. If str$ does not contain any drive or directory information, the path as set by SETPATH is used. If SETPATH has not been used, the \OPD directory on the default drive (usually M:, `Internal') is used.
  289. With a matching file selector (as opposed to an edit box) the value 8 restricts the selection to files which match the filename/extension in str$.
  290. Matching file selectors can also use 64, in which case files with the same extension as that in str$ are shown without this extension. (Many Series 3a file selectors are like this.)MYou can always press Tab to produce the full file selector with a dFILE item.Pstr$ must be declared to be at least 128 bytes long, or an error will be raised.
  291. .dFLOAT
  292. dFLOAT var fp,p$,min,maxCDefines an edit box for a floating-point number, to go in a dialog.2p$ will be displayed on the left side of the line.vmin and max give the minimum and maximum values which are to be allowed. An error is raised if min is higher than max.
  293. fp must be a LOCAL or a GLOBAL variable. It specifies the value to be shown initially. When you finish using the dialog, the value you entered is returned in fp.Y
  294. .DIALOG    n%=DIALOG
  295. Presents the dialog prepared by dINIT and commands such as dTEXT and dCHOICE. If you complete the dialog by pressing Enter, your settings are stored in the variables specified in dTEXT, dCHOICE etc., although you can prevent this with dBUTTONS.
  296. If you used dBUTTONS when preparing the dialog, the keycode which ended the dialog is returned. Otherwise, DIALOG returns the line no. of the item which was current when Enter was pressed. The top item (or the title line, if present), is line 1.[If you cancel the dialog by pressing Esc, the variables are not changed, and 0 is returned.}
  297.     .DIAMINIT
  298. DIAMINIT pos%,str1$,str2$...
  299. Initialises the Diamond list (discarding any existing list). str1$, str2$ etc. contain the text to be displayed in the status window for each item in the list.
  300. pos% is the initial item on to which the Diamond indicator should be positioned, with pos%=1 specifying the first item. (Any value greater than the number of strings specifies the final item.) If pos%>=1 you must supply at least this many strings.mIf pos% is not supplied or if pos%=0, or if DIAMINIT is used on its own with no arguments, no bar is defined.OIf pos%=-1 the list is replaced by the icon instead in the large status window.
  301. .DIAMPOS
  302. DIAMPOS pos%4Positions the Diamond indicator on the Diamond list.~Positioning outside the range of the items wraps around in the appropriate way. pos%=0 causes the Diamond symbol to disappear.6
  303. .dINIT
  304. dINIT title$
  305. dINIT
  306. Prepares for definition of a dialog, cancelling any existing one. Use dTEXT, dCHOICE etc. to define each item in the dialog, then DIALOG to display the dialog.xIf title$ is supplied it will be displayed at the top of the dialog, centred and with a line across the dialog below it.
  307. .DIR$#d$=DIR$(filespec$) then
  308. d$=DIR$("")
  309. Lists filenames, including subdirectory names, matching a file specification. You can include wildcards in the file specification. If filespec$ is just a directory name, include the final backslash on the end - for example, "M:\TEMP\".
  310. Use the function like this:Y    
  311.  DIR$(filespec$) returns the name of the first file matching the file specification.I    
  312.  DIR$("") then returns the name of the second file in the directory.2    
  313.  DIR$("") again returns the third, and so on.]    
  314.  When there are no more matching files in the directory, DIR$("") returns a null string..Example, listing all the .DBF files in M:\DAT:    PROC dir:
  315.  LOCAL d$(128)
  316.  d$=DIR$("M:\DAT\*.DBF")
  317.  WHILE d$<>""
  318.   PRINT d$
  319.   d$=DIR$("")
  320.  ENDWH
  321. .dLONG
  322. dLONG var lg&,p$,min&,max&:Defines an edit box for a long integer, to go in a dialog.2p$ will be displayed on the left side of the line.zmin& and max& give the minimum and maximum values which are to be allowed. An error is raised if min& is higher than max&.
  323. lg& must be a LOCAL or a GLOBAL variable. It specifies the value to be shown initially. When you finish using the dialog, the value you entered is returned in lg&.s
  324. .DO...UNTIL!DO
  325.  ...statements
  326. UNTIL conditiontDO forces the set of statements which follow it to execute repeatedly until the condition specified by UNTIL is met.IThis is the easiest way to repeat an operation a certain number of times.<    
  327.  Every DO must have its matching UNTIL to end the loop.
  328.  If you set a condition which is never met, the program will go round and round, locked in the loop forever. You can escape by pressing Psion-Esc, provided you haven't set ESCAPE OFF.
  329. If you have set ESCAPE OFF, you will have to return to the System screen, move to the program name under the RunOpl icon, and press Delete.
  330. d%=DOW(day%,month%,year%)MReturns the day of the week - from 1 (Monday) to 7 (Sunday) - given the date.Oday% must be between 1 and 31, month% from 1 to 12 and year% from 1900 to 2155.:For example, D%=DOW(4,7,1992) returns 6, meaning Saturday.
  331. .dPOSITION
  332. dPOSITION x%,y%GPositions a dialog. Use dPOSITION at any time between dINIT and DIALOG.
  333. dPOSITION uses two integer values. The first is the horizontal position, and the second, the vertical. dPOSITION -1,-1 positions to the top left; dPOSITION 1,1 to the bottom right; dPOSITION 0,0 to the centre, the usual position for dialogs.zdPOSITION 1,0, for example, positions to the right-hand edge of the screen, and centres the dialog half way up the screen.@
  334. .DRAWSPRITE
  335. DRAWSPRITE x%,y%UDraws the current sprite in the current window with top-left at pixel position x%,y%.mIf any bitmap-set contains bitmaps with different sizes, DRAWSPRITE raises an `Invalid arguments' error (-2).^Once the sprite has been drawn, no further file access is performed, even when it is animated.
  336. .dTEXT#dTEXT p$,body$,t%
  337. dTEXT p$,body$3Defines a line of text to be displayed in a dialog.
  338. p$ will be displayed on the left side of the line, and body$ on the right side. If you only want to display a single string, use a null string ("") for p$, and pass the desired string in body$. It will then have the width of the dialog to itself.-An error is raised if body$ is a null string.xbody$ is normally displayed left aligned (although usually in the right column). You can override this by specifying t%:    t%    effect
  339. 0    left align body$
  340. 1    right align body$
  341. 2    centre body$[In addition, you can add any or all of the following three values to t%, for these effects:    t%    effect
  342. $100    use bold text for body$ $200    draw a line below this item%$400    (allow this item to be selected)
  343. Only one line can be drawn across a dialog. It will be below the last item which asks for it, whether the title from dINIT or a dTEXT item.
  344. See also dEDIT.'
  345. .dTIME
  346. dTIME var lg&,p$,t%,min&,max&2Defines an edit box for a time, to go in a dialog.2p$ will be displayed on the left side of the line.
  347. lg&, which must be a LOCAL or a GLOBAL variable, specifies the time to be shown initially. Although it will appear on the screen like a normal time, for example 18:27, lg& must be specified as seconds after 00:00. PA value of 60 means one minute past midnight; 3600 means one o'clock, and so on.
  348. min& and max& give the minimum and maximum values which are to be allowed. Again, these are in seconds after 00:00. An error is raised if min& is higher than max&.bWhen you finish using the dialog, the time you entered is returned in lg&, in seconds after 00:00.6t% specifies the type of display required, as follows:
  349. t%    time display
  350. 0    absolute time no seconds
  351. 1    absolute time with seconds
  352. 2    duration no seconds
  353. 3    duration with seconds^For example, 03:45 represents an absolute time while 3 hours 45 minutes represents a duration.`Absolute times are displayed in 24-hour or am/pm format according to the current system setting.
  354. .dXINPUT
  355. dXINPUT var str$,p$LDefines a secret string edit box, such as for a password, to go in a dialog.2p$ will be displayed on the left side of the line.pstr$ is the string variable to take the string you type. Important: str$ must be at least eight characters long.
  356. Initially the dialog does not show any characters for the string; the initial contents of str$ are ignored. A special symbol will be displayed for each character you type, to preserve the secrecy of the string.~
  357. .EDIT
  358. EDIT a$
  359. Displays a string variable which you can edit directly on the screen. All the usual editing keys are available - the arrow keys move along the line, Esc clears the line, and so on.
  360. When you have finished editing, press Enter to confirm the changes. If you press Enter before you have made any changes, then the string will be unaltered.
  361. If you use EDIT in conjunction with a PRINT statement, use a comma at the end of the PRINT statement, so that the string to be edited appears on the same line as the displayed string - eg:
  362. PRINT "Edit address:",
  363. EDIT A.address$
  364. UPDATE
  365.     TRAP EDIT
  366. If the Esc key is pressed while no text is on the input line, the `Escape key pressed' error (number -114) will be returned by ERR - provided that the EDIT has been trapped.bYou can use this feature to enable someone to press the Esc key to escape from inputting a string.
  367. See also INPUT, dEDIT.@
  368. '.ELSE/.ELSEIF/.ENDIF/.ENDA/.ENDV/.ENDWH
  369. See IF/APP/VECTOR/WHILE
  370. .ENTERSEND#ret%=ENTERSEND(pobj%,m%,var p1,...)
  371. This is the same as SEND except that, if the method leaves, the error code is returned to the caller. Otherwise the value returned is as returned by the method.
  372. .ENTERSEND0$ret%=ENTERSEND0(pobj%,m%,var p1,...)ZThis is the same as ENTERSEND except that, if the method does not leave, zero is returned.
  373. e%=EOF2Finds out whether you're at the end of a file yet.UReturns -1 (true) if the end of the file has been reached, or 0 (false) if it hasn't.
  374. When reading records from a file, you should test whether there are still records left to read, otherwise you may get an error.
  375. Example:
  376. PROC eoftest:
  377. OPEN "myfile",A,a$,b%
  378.  PRINT A.a$
  379.  PRINT A.b%
  380.  NEXT
  381.  PAUSE -40
  382. UNTIL  EOF
  383. PRINT "The last record"
  384. RETURN
  385. .ERASE
  386. ERASE.Erases the current record in the current file.
  387. The next record is then current. If the erased record was the last record in a file, then following this command the current record will be null and EOF will return true.
  388. e%=ERRUReturns the number of the last error which occurred, or 0 if there has been no error.
  389. Example:
  390. PRINT "Enter age in years"
  391. age::
  392. TRAP INPUT age%    IF ERR=-1
  393.  PRINT "Number please:"     GOTO age
  394. ENDIF
  395. See also ERR$.
  396. .ERR$
  397. e$=ERR$(x%):Returns the error message for the specified error code x%.GERR$(ERR) gives the message for the last error which occurred. Example:
  398. TRAP OPEN "B:\FILE",A,field1$
  399. IF ERR
  400.  PRINT ERR$(ERR)
  401.  RETURN
  402. ENDIF
  403. See also ERR.
  404. .ESCAPE OFF
  405. ESCAPE OFF...ESCAPE ON{ESCAPE OFF stops Psion-Esc being used to break out of the program when it is running. ESCAPE ON enables this feature again.
  406. ESCAPE OFF takes effect only in the procedure in which it occurs, and in any sub-procedures that are called. Psion-Esc is always enabled when a program begins running.
  407. If your program enters a loop which has no logical exit, and ESCAPE OFF has been used, you will have to return to the System screen, move to the program name under the RunOpl icon, and press the Delete key.
  408. .EVAL
  409. d=EVAL(s$)
  410. Evaluates the mathematical string expression s$ and returns the floating-point result. s$ may include any mathematical function or operator (eg. sin(x)/(2**3)). Note that floating-point arithmetic is always performed.
  411. For example:
  412. AT 10,5 :PRINT "Calc:",
  413. TRAP INPUT n$
  414. IF n$="" :CONTINUE :ENDIF
  415. IF ERR=-114 :BREAK :ENDIF
  416. CLS :AT 10,4
  417. PRINT n$;"=";EVAL(n$)
  418. UNTIL 0pYou cannot use variables in the expression you pass to EVAL. A workaround is to use Calculator memories instead.
  419. See also VAL.
  420. .EXIST
  421. e%=EXIST(filename$)!Checks to see that a file exists.EReturns -1 (`True') if the file exists and 0 (`False') if it doesn't.
  422. Use this function when creating a file to check that a file of the same name does not already exist, or when opening a file to check that it has already been created:
  423. IF NOT EXIST("CLIENTS")
  424.  CREATE "CLIENTS",A,names$
  425.  OPEN "CLIENTS",A,names$
  426. ENDIFd
  427. e=EXP(x)UReturns the value of the arithmetic constant e (2.71828...) raised to the power of x.8
  428. .EXT    EXT name$ZGives the file extension for the System screen to use when listing files used by this OPA.+This can only be used between APP and ENDA.
  429. If you do not specify this, .ODB is used. Note that the files used by an OPA do not have to be data files, as the I/O commands give access to files of all kinds.
  430. .FIND
  431. f%=FIND(a$)
  432. Searches the current data file for fields matching a$. The search starts from the current record, so use NEXT to progress to subsequent records. FIND makes the next record containing a$ the current record and returns the number of the record found. &Capitals and lower-case letters match.
  433. You can use wildcards:
  434. ?     matches any single character#*     matches any group of characters.LTo find a record with a field containing  Dr and either BROWN or BRAUN, use:
  435. F%=FIND("*DR*BR??N*")^FIND("BROWN") will find only those records with a field consisting solely of the string BROWN."You can only search string fields.
  436. See also FINDFIELD.
  437. .FINDFIELD"f%=FINDFIELD(a$,start%,no%,flags%)
  438. FINDFIELD, like FIND, finds a string, makes the record with this string the current record, and returns the number of this record.
  439. a$ is the string to look for, as for FIND. start% is the number of the field to start looking in (1 for the first field), and no% is the number of fields to search in (starting from the field specified by the start%).{If you want to search in all fields, use start%=1 and for no% use the number of fields you used in the OPEN/CREATE command. flags% adds together two values:
  440.  0 for a case independent match, where capitals and lower-case letters match, or 1 for a case dependent match. This value should be multiplied by 16.
  441.  0 to search backwards from the current record, 1 to search forwards from the current record, 2 to search backwards from the end of the file, or 3 to search forwards from the start of the file.
  442. Important: use 
  443.  POKEB(PEEKW($1c)+7),0Ibefore using FINDFIELD. This is a bugfix to make FINDFIELD work reliably.Y
  444. .FINDLIB
  445. ret%=FINDLIB(var cat%, name$)~Find DYL category name$ (including .DYL extension) in the ROM. On success returns zero and writes the category handle to cat%.
  446. To get the handle of a RAM-based DYL, use LOADLIB which guarantees that the DYL remains loaded in RAM. FINDLIB will get the handle of a RAM-based DYL but does not keep it in RAM.E
  447. .FIRST
  448. FIRST7Positions to the first record in the current data file.^
  449. .FIX$
  450. f$=FIX$(x,y%,z%)sReturns a string representation of the number x, to y% decimal places. The string will be up to z% characters long.,Example: FIX$(123.456,2,7) returns "123.46".
  451.  If z% is negative then the string is right-justified - for example FIX$(1,2,-6) returns "   1.00" where there are two spaces to the left of the 1.Z    
  452.  If z% is positive then no spaces are added - for example FIX$(1,2,6) returns "1.00".
  453.  If the number x will not fit in the width specified by z%, then the string will just be asterisks - for example FIX$(256.99,2,4) returns "****".
  454. See also GEN$, NUM$, SCI$.
  455. .FLT    f=FLT(x&)fConverts an integer expression (either integer or long integer) into a floating-point number. Example:
  456. PROC gamma:(v)
  457.  LOCAL c
  458.  c=3E8
  459.  RETURN 1/SQR(1-(v*v)/(c*c))
  460. You could call this procedure like this: gamma:(FLT(a%)) if you wanted to pass it the value of an integer variable without having first to assign the integer value to a floating-point variable.
  461. See also INT and INTF.
  462. .FONT
  463. FONT id%,style%7Sets the text window font and style (as used by PRINT).MYou can use any of the fonts described under gFONT; initially font 4 is used.<See also the entry entitled "The text and graphics windows".i
  464. .FREEALLOC
  465. FREEALLOC pcell%LFrees a previously allocated cell at pcell%. Does nothing if pcell% is zero.
  466. .gAT    gAT x%,y%mSets the current position using absolute co-ordinates. gAT 0,0 moves to the top left of the current drawable.
  467. See also gMOVE.^
  468. .gBORDER/gBORDER flags%,width%,height%
  469. gBORDER flags%
  470. Draws a one-pixel wide border around the edge of the current drawable. If width% and height% are supplied, a border shape of this size is drawn with the top left corner at the current position.WIf they are not supplied, the border is drawn around the whole of the current drawable.
  471. flags% controls three attributes of the border - a shadow to the right and beneath, a one-pixel gap all around, and the type of corners used:
  472. flags% effect
  473. 1    single pixel shadow
  474. 2    gap for single pixel shadow
  475. 3    double pixel shadow
  476. 4    gap for double pixel shadow
  477. $100    one-pixel gap all round
  478. $200    more rounded corners
  479. You can combine the values to control the three different effects. (1, 2, 3 and 4 are mutually exclusive; you cannot use more than one of them.) For example, for rounded corners and a gap for a double pixel shadow, use flags%=$204.8Set flags%=0 for no shadow, no gap, and sharper corners.dFor example, to de-emphasise a previously emphasised border, use gBORDER with the shadow turned off:
  480. gBORDER 3 REM show border
  481. gBORDER 4 REM border off
  482. See also gXBORDER.
  483. .gBOX
  484. gBOX width%,height%pDraws a box from the current position, width% to the right and height% down. The current position is unaffected.'
  485. .gBUTTON
  486. gBUTTON text$,type%,w%,h%,st%
  487. Draws a 3-D black and grey button (a key, not an application button) at the current position in a rectangle of the supplied width w% and height h%, which fully encloses the button in all its states.
  488. text$ specifies up to 64 characters to be drawn in the button in the current font and style. You must ensure that the text will fit in the button.Ktype%=0 it draws a Series 3 style button; type%=1 draws a Series 3a button.0The meaning of state% varies according to type%:[    
  489.  For type%=0, state%=0 for a raised button and state%=1 for a depressed (flat) button.
  490.  For type%=1, state%=0 for a raised button, state%=1 for a semi-depressed (flat) button and state%=2 for a fully-depressed (sunken) button. An error is raised if the current window has no grey plane.
  491. .gCLOCK
  492. gCLOCK ON/OFF
  493. gCLOCK ON,mode%
  494. gCLOCK ON,mode%,offset%
  495. gCLOCK ON,mode%,offset%,format$
  496. gCLOCK ON,mode%,offset%,format$,font%
  497. gCLOCK ON,mode%,offset%,format$,font%,style%
  498. Displays or removes a clock showing the system time. The current position in the current window is used. Only one clock may be displayed in each window.
  499. mode% controls the type of clock. Modes 1 to 5 are for Series 3 compatibility, and produce Series 3 clocks: small (digital), medium (system setting), medium (analog), medium (digital), and large (analog) respectively. Other values are:(6  black and grey medium, system setting 7  black and grey medium, analog
  500. 8  second type medium, digital
  501. 9  black and grey extra large&10 formatted digital (described below)'You can OR the value with any of these:B  $10 shows the date (except for extra large and formatted clocks)g  $20 shows seconds in small digital, large analog, black and grey medium analog and extra large clocks@  $40 shows am/pm in small digital and black medium clocks only.
  502.   $80 specifies that a clock is to be drawn in the grey plane (only for clocks that do not contain both black and grey: ie. all except the black and grey, medium, analog clock and the extra large clock).Xformat$, font% and style% are used only for formatted digital clocks as described below.oNote: Do not use gSCROLL on a region containing a clock. The whole window may, however, be moved using gSETWIN.QNote: clocks that include grey are drawn even in windows that have no grey plane.
  503. Digital clocks display in 24-hour or 12-hour mode according to the system-wide setting in Time. The `am/pm' flag ($40) can be used with digital clocks in 12-hour mode, and with medium analog clocks.
  504. offset% specifies an offset in minutes from the system time to the time displayed. This allows you to display a clock showing a time other than the system time.)By default, mode% is 1, and offset% is 0.
  505. For the formatted digital clock (mode%=10), you can specify font% and style%, as for gFONT and gSTYLE. The defaults are the system font (value $9a) and normal style (0).
  506. For the formatted digital clock, a format string (up to 255 chars long) specifies how the clock is to be displayed. The format string contains a number of format specifiers in the form of a % followed by a letter. (Upper or lower case may be used.)
  507. To make each item as abbreviated as possible, you can use a * after the %. For example, "%*T" at 11:05 pm abbreviates `05' to `5'.8Other abbreviations are marked, appropriately, by "Abb":
  508.  %% =a % characterA %:, %/ =time and date separators, as set in the Time application( %A =`am' or `pm' text (Abb: 1st letter)F %D,%W,%M =day/week/month number as two digits, 01-31, 01-53 and 01-12J %E,%N =day/month name (Abb: shorter form, eg 1st 3 characters in English): %H,%I =hour in 24-hour or 12-hour format, 00-23 and 01-12
  509.  %S,%T =seconds/minutes, 00-59> %X =suffix string for day number, eg st in `1st', nd in `2nd'< %Y =year as a four digit number (Abb: discards the century)
  510.  %1,%2,%3 =day,month,year as ordered in the Time application. Eg Europe is Day/month/year, so %1=%D, %2=%M, %3=%Y. So to display a date in correct format use "%1/%2/%3". (Abb: see %G/%P/%U.)5 %4,%5 =day,month as ordered in the Time application.
  511.  %F,%O =toggles days/months (displayed by %1, %2 and %3) between numeric and name formats. On 9th March 1993, with European date type, "%1%F%1%F%1" gives "09Tuesday09"
  512.  %G,%P, %U =toggles %1, %2 and %3 between long form and abbreviation. On 9th March 1993, with European date type, "%F%1%G%1%G%1" gives "TuesdayTueTuesday"
  513.  %L =toggles the suffix on the day number for %1/%2/%3 (in numeric form only). On 9th March 1993, with European date type, "%G%1%L%1%L%1" gives "99th9"
  514.  %6,%7 =hour and am/pm text according to the format selected in the Time application. With am-pm format, %6=%I and %7=%A. With 24-hour format, %6=%H and %7 gives no `am/pm' characters.ISo e.g. "%4%/%5" gives a clock with just day and month in selected order.jFor specifiers that toggle, note that the toggle state is restored to the default setting for a new clock.
  515. .gCLOSE
  516. gCLOSE id%\Closes the specified drawable that was previously opened by gCREATE, gCREATEBIT or gLOADBIT.[If the drawable closed was the current drawable, the default window (ID=1) becomes current.:An error is raised if you try to close the default window.o
  517. .gCLS
  518. gCLScClears the whole of the current drawable and sets the current position to 0,0, its top left corner./
  519. .gCOPY
  520. gCOPY id%,x%,y%,w%,h%,mode%
  521. Copies a rectangle of the specified size (width w%, height h%) from the point x%,y% in drawable id%, to the current position in the current drawable.
  522. As this command can copy both set and clear pixels, the same modes are available as when displaying text. Set mode% = 0 for set, 1 for clear, 2 for invert or 3 for replace.k0, 1 and 2 act only on set pixels in the pattern; 3 copies the entire rectangle, with set and clear pixels.6The current position is not affected in either window.MgCOPY is affected by the setting of gGREY (in the current window) as follows:&with gGREY 0 it copies black to black;Nwith gGREY 1 it copies grey to grey, or black to grey if source is black only;awith gGREY 2 it copies grey to grey and black to black, or black to both if source is black only.
  523. .gCREATE@id%=gCREATE(x%,y%,w%,h%,v%)
  524. id%=gCREATE(x%,y%,w%,h%,v%,grey%)
  525. Creates a window with specified position and size (width w%, height h%), and makes it both current and foreground. Sets the current position to 0,0, its top left corner. If v% is 1, the window will immediately be visible; if 0, it will be invisible.fIf grey% is not given or is 0, the window will not have a grey plane. If grey% is 1, it will have one.EReturns id% (2 to 8) which identifies this window for other keywords.#See also gCLOSE, gGREY, DEFAULTWIN.    
  526. .gCREATEBIT
  527. id%=gCREATEBIT(w%,h%)
  528. Creates a bitmap with the specified width and height, and makes it the current drawable. Sets the current position to 0,0, its top left corner.EReturns id% (2 to 8) which identifies this bitmap for other keywords.
  529. See also gCLOSE.
  530. .gDRAWOBJECT
  531. gDRAWOBJECT type%,flags%,w%,h%
  532. Draws the scaleable graphics object specified by type%, scaled to fit in the rectangle with top left at the current graphics cursor position and with the specified width w% and height h%.
  533. The Series 3a has only one object type (set type%=0) - a `lozenge'. This is a 3-D rounded box lit from the top left, with a shadow at bottom right and a grey body. (For an example, see the text 'City' in the top left of the World application.)3For type%=0, flags% specifies the corner roundness:
  534. 0 for normal roundness
  535. 1 for more rounded.2 for a single pixel removed from each corner.;An error is raised if the current window has no grey plane.U
  536. .GEN$
  537. g$=gen$(x,y%)]Returns a string representation of the number x. The string will be up to y% characters long.GExample GEN$(123.456,7) returns "123.456" and GEN$(243,5) returns "243"
  538.  If y% is negative then the string is right-justified. For example GEN$(1,-6) returns "     1" where there are five spaces to the left of the 1.U    
  539.  If y% is positive then no spaces are added - for example GEN$(1,6) returns "1".
  540.  If the number x will not fit in the width specified by y%, then the string will just be asterisks. For example GEN$(256.99,4) returns "****".
  541. See also FIX$, NUM$, SCI$.
  542. g%=GETJWaits for a key to be pressed and returns the character code for that key.
  543. For example, if the `A' key is pressed with Caps Lock off, the integer returned is 97 (a), or 65 (A) if `A' was pressed with the Shift key down.`You can use KMOD to check whether modifier keys (Shift, Control, Psion and Caps Lock) were used.:See also the entry entitled "Character set and key codes".
  544. See also KEY.+
  545. .GET$
  546. g$=GET$QWaits until a key is pressed and then returns which key was pressed, as a string.VFor example, if the `A' key is pressed in lower case mode, the string returned is "a".dYou can use KMOD to check whether any modifier keys (Shift, Control, Psion and Caps Lock) were used.
  547. See also KEY$.3
  548. .GETCMD$
  549. w$=GETCMD$
  550. Returns new command-line arguments to an OPA, after a "change files" or "quit" event has occurred. The first character of the returned string is "C", "O" or "X". If it is "C" or "O", the rest of the string is a filename..The first character has the following meaning:E"C" - close down the current file, and create the specified new file.H"O" - close down the current file, and open the specified existing file.<"X" - close down the current file (if any) and quit the OPA.7You can only call GETCMD$ once for each system message.
  551. See also CMD$.
  552.     .GETEVENT
  553. GETEVENT var a%()
  554. Waits for an event to occur. Returns with a%() specifying the event. The data returned in a%() depends on the type of event that occurred.
  555. If the event is a key-press, (a%(1) AND $400) is guaranteed to be zero. For other events (a%(1) AND $400) is guaranteed to be non-zero.
  556. If a key has been pressed:
  557.   a%(1)= keycode (as for GET))  a%(2) AND $00ff= modifier (as for KMOD)/  a%(2)/256= auto-repeat count (ignored by GET)%If a program has moved to foreground:
  558.   a%(1)= $401%If a program has moved to background:
  559.   a%(1)= $402
  560. If the machine has switched on:
  561.   a%(1)= $4036If the Series 3a wants an OPA to change files or exit:
  562.   a%(1)= $404
  563. If the date changes:
  564.   a%(1)= $405
  565. Note: events are ignored while you are using keywords which wait for keypresses - GET, GET$, EDIT, INPUT, MENU and DIALOG. If you need to use these keywords in OPAs, use LOCK ON / LOCK OFF around them.WIf you do use GETEVENT you should allow for other events to be specified in the future.UFor a key-press event, the modifier is returned in a%(2) and is not returned by KMOD.
  566. Note: If a non-key event such as `foreground' occurs while a keyboard keyword such as GET, INPUT, MENU or DIALOG is being used, the event is discarded. So GETEVENT must be used if non-key events are to be monitored.Y(OPAs can still handle the $404 event correctly - see the LOCK command for more details.)CThe array (or string of integers) must be at least 6 integers long.
  567. See also TESTEVENT, GETCMD$.v
  568. .GETLIBH
  569. cat%=GETLIBH(num%)YConvert a category number num% to a handle. If num% is zero, gets the handle for OPL.DYL.
  570. .gFILL
  571. gFILL width%,height%,gMode%lFills a rectangle of the specified size from the current position, according to the graphics mode specified.#The current position is unaffected.3
  572. .gFONT    gFONT Id%ySets the font for current drawable to Id%. The font may be one of the predefined fonts in the ROM or a user-defined font.
  573. Id%    Description        Pixel size
  574. 1    Series 3 normal    8
  575. 2    Series 3 bold        8
  576. 3    Series 3 digits    6x6
  577. 4    Mono            8x8
  578. 5    Roman        8
  579. 6    Roman        11
  580. 7    Roman        13
  581. 8    Roman        16
  582. 9    Swiss            8
  583. 10    Swiss            11
  584. 11    Swiss            13
  585. 12    Swiss            16
  586. 13    Mono            6x6
  587. The special font number $9a is set aside to give a machine's default graphics font; this is the font used initially for graphics text.
  588. The actual font may vary from machine to machine - eg it is font 1 on the Series 3 and font 11 on the Series 3a. So gFONT 11 or gFONT $9a both set the Series 3a standard font, which gPRINT normally uses.aUser-defined fonts must first be loaded by gLOADFONT, which returns the fontId% needed for gFONT.
  589. See also gLOADFONT, FONT.
  590. .gGMODE
  591. gGMODE mode%bSets the effect of all subsequent drawing commands - gLINEBY, gBOX etc. - on the current drawable.
  592. mode% Pixels will be:
  593. 0    set    1    cleared
  594. 2    invertednWhen you first use drawing commands on a drawable, they set pixels in the drawable. Use gGMODE to change this.
  595. For example, if you have drawn a black background, you can draw a white box outline inside it with either gGMODE 1 or gGMODE 2, followed by gBOX.
  596. .gGREY
  597. gGREY mode%
  598. Controls whether all subsequent graphics drawing and graphics text in the current window draw to the grey plane, the black plane or to both. (Ordinary text as printed by PRINT is not affected by grey.)&mode%=0 for black plane only (default)
  599. mode%=1 for grey plane only
  600. mode%=2 for both planes|It is helpful to think of the black plane being in front of the grey plane, so a pixel set in both planes will appear black.
  601. To enable the use of grey in the default window (ID=1) use DEFAULTWIN 1 at the start of your program. If grey is required in other windows you must create the windows with a grey plane using gCREATE.<gGREY cannot be used with bitmaps which have only one plane. See also DEFAULTWIN and gCREATE.G
  602. .gHEIGHT
  603. height% = gHEIGHT+Returns the height of the current drawable.^
  604. .gIDENTITY
  605. id%=gIDENTITY'Returns the ID of the current drawable.
  606. The default window has ID=1.
  607. .gINFO
  608. gINFO var i%()
  609. Gets general information about the current drawable and about the graphics cursor (whichever window it is in). The information is returned in the array i%() which must be at least 32 integers long.
  610. The information is about the drawable in its current state, so eg the font information is for the current font in the current style.&The following information is returned:
  611. i%(1)        lowest character code
  612. i%(2)        highest character code
  613. i%(3)        height of font
  614. i%(4)        descent of font
  615. i%(5)        ascent of font
  616. i%(6)        width of '0' character
  617. i%(7)        maximum character width!i%(8)        flags for font (see below)
  618. i%(9-17)    name of font%i%(18)    current graphics mode (gGMODE)!i%(19)    current text mode (gTMODE)
  619. i%(20)    current style (gSTYLE) i%(21)    cursor state (ON=1,OFF=0):i%(22)    ID of window containing cursor (-1 for text cursor)
  620. i%(23)    cursor width
  621. i%(24)    cursor height
  622. i%(25)    cursor ascent"i%(26)    cursor x position in window"i%(27)    cursor y position in window i%(28)    1 if drawable is a bitmap
  623. i%(29)    cursor effects
  624. i%(30)    gGREY setting.i%(31)    reserved (Window Server ID of drawable)
  625. i%(32)    reservedDi%(8) specifies a combination of the following font characteristics:
  626. Value:    Meaning:/1        font uses standard ASCII characters (32-126)/2        font uses Code Page 850 characters (128-255)
  627. 4        font is bold
  628. 8        font is italic
  629. 16        font is serifed
  630. 32        font is monospaced/$8000    font is stored expanded for quick drawing@Use PEEK$(ADDR(i%(9))) to read the name of the font as a string.QIf the cursor is on (i%(21)=1), it is visible in the window identified by i%(22).
  631. i%(29) has bit 0 set (i%(29) AND 1) if the cursor is obloid, bit 1 set (i%(29) AND 2) if not flashing, and bit 2 set (i%(29) AND 4) if grey.pIf the cursor is off (i%(21)=0), or is a text cursor (i%(22)=-1), i%(23) to i%(27) and i%(29) should be ignored.
  632. .gINVERT
  633. gINVERT width%,height%wInverts the rectangle width% to the right and height% down from the cursor position, except for the four corner pixels.I
  634. .GIPRINT
  635. GIPRINT str$,c%
  636. GIPRINT str$hGIPRINT displays an information message for about two seconds, in the bottom right corner of the screen.
  637. For example, GIPRINT "Not Found" displays Not Found. The string you specify can be up to 64 characters. If a string is too long for the screen, it will be clipped.DIf c% is given, it controls the corner in which the message appears:    c%    corner
  638. 0    top left
  639. 1    bottom left
  640. 2    top right
  641. 3    bottom right (default)
  642. Only one message can be shown at a time. You can make the message go away - for example, if a key has been pressed - with GIPRINT "".$
  643. .gLINEBY
  644. gLINEBY dx%,dy%
  645. Draws a line from the current position to a point dx% to the right and dy% down. Negative dx% and dy% mean left and up respectively. The current position moves to the end of the line drawn.3gLINEBY 0,0 sets the pixel at the current position.
  646. See also gLINETO, gPOLY.
  647. .gLINETO
  648. gLINETO x%,y%_Draws a line from the current position to the point x%,y%. The current position moves to x%,y%.MTo plot a single point, use gLINETO to the current position (or gLINEBY 0,0).
  649. See also gLINEBY, gPOLY.x
  650.     .gLOADBITLid%=gLOADBIT(name$,write%,i%)
  651. id%=gLOADBIT(name$,write%)
  652. id%=gLOADBIT(name$)
  653. Loads a bitmap from the named bitmap file and makes it the current drawable. Sets the current position to 0,0, its top left corner. If name$ has no file extension .PIC is used. The bitmap is kept as a local copy in memory.EReturns id% (2 to 8) which identifies this bitmap for other keywords.
  654. write%=0 sets read-only access. Attempts to write to the bitmap in memory will be ignored, but the bitmap can be used by other programs without using more memory. write%=1 allows you to write to and re-save the bitmap. This is the default case.
  655. For bitmap files which contain more than one bitmap, i% specifies which one to load. For the first bitmap, use i%=0. This is also the default value. Bitmap files saved with gSAVEBIT have only one bitmap, and this argument is not needed for them.
  656. See also gCLOSE.
  657. .gLOADFONT
  658. fontId%=gLOADFONT(name$)
  659. Loads the user-defined font name$. It returns a font ID; use this with gFONT to make the current drawable use this font. If name$ does not contain a file extension, .FON is used.igFONT itself is very efficient, so you should normally load all required fonts at the start of a program.eNote that the built-in Series 3/Series 3a fonts are automatically available, and do not need loading.
  660. See also gUNLOADFONT.
  661. .GLOBAL
  662. GLOBAL variables
  663. Declares variables to be used in the current procedure (as does the LOCAL command) and (unlike LOCAL) in any procedures called by the current procedure, or procedures called by them.GThe variables may be of 4 types, depending on the symbol they end with:c    
  664.  Variable names not ending with $ % & or () are floating-point variables, for example price, xK    
  665.  Those ending with a % are integer variables, for example x%, sales92%S    
  666.  Those ending with an &  are long integer variables, for example x&, sales92&.
  667.  Those ending with a $ are string variables. String variable names must be followed by the maximum length of the string in brackets - for example names$(12), a$(3)
  668. Array variables have a number immediately following them in brackets which specifies the number of elements in the array. Array variables may be of any type, for example: x(6),y%(5),f$(5,12),z&(3)
  669. When declaring string arrays, you must give two numbers in the brackets. The first declares the number of elements, the second declares their maximum length. For example surname$(5,8) declares five elements, each up to 8 characters long.
  670. Variable names may be any combination of up to 8 numbers and alphabetic letters. They must start with a letter. The length includes the % & or $ sign, but not the () in string and array variables.~More than one GLOBAL or LOCAL statement may be used, but they must be on separate lines, immediately after the procedure name.
  671. See also LOCAL.
  672. .gMOVE
  673. gMOVE dx%,dy%WMoves the current position dx% to the right and dy% downwards, in the current drawable.RA negative dx% causes movement to the left; a negative dy% causes upward movement.
  674. See also gAT.
  675. .gORDER
  676. gORDER id%,position%hSets the window specified by id% to the selected foreground/background position, and redraws the screen.
  677. Position 1 is the foreground window, position 2 is next, and so on. Any position greater than the number of windows is interpreted as the end of the list.3On creation, a window is at position 1 in the list.#Raises an error if id% is a bitmap.
  678. See also gRANK.
  679.     .gORIGINX
  680. x%=gORIGINX\Returns the gap between the left side of the screen and the left side of the current window.4Raises an error if the current drawable is a bitmap.
  681.     .gORIGINY
  682. y%=gORIGINYPReturns the gap between the top of the screen and the top of the current window.4Raises an error if the current drawable is a bitmap.d
  683. .GOTO1GOTO label or GOTO label::
  684.  ...statements
  685. label::LGoes to the line following the label:: and continues from there. The label -&    
  686.  Must be in the current procedure|    
  687.  Must start with a letter and end with a double colon, although the double colon is not necessary in the GOTO statement:    
  688.  May be up to 8 characters long excluding the colons.D
  689. .gPATT
  690. gPATT id%,width%,height%,mode%gFills a rectangle of the specified size from the current position with repetitions of the drawable id%.
  691. As with gCOPY, this command can copy both set and clear pixels, so the same modes are available as when displaying text. Set mode% = 0 for set, 1 for clear, 2 for invert or 3 for replace.k0, 1 and 2 act only on set pixels in the pattern; 3 copies the entire rectangle, with set and clear pixels.5If you set id%=-1 a pre-defined grey pattern is used.#The current position is unaffected.[gPATT is affected by the setting of gGREY (in the current window) in the same way as gCOPY:&with gGREY 0 it copies black to black;Nwith gGREY 1 it copies grey to grey, or black to grey if source is black only;awith gGREY 2 it copies grey to grey and black to black, or black to both if source is black only.1
  692. .gPEEKLINE
  693. gPEEKLINE id%,x%,y%,d%(),ln%
  694. Reads a horizontal line from the black plane of the drawable id%, length ln%, starting at x%,y%. The leftmost 16 pixels are read into d%(1), with the first pixel read into the least significant bit.
  695. The array d%() must be long enough to hold the data. You can work out the number of integers required with ((ln%+15)/16) (using whole-number division).[If you set id% to 0, this just reads from the whole screen, not from any particular window.MIf you add $8000 to id%, the grey plane (not the black plane) will be peeked.
  696. .gPOLY
  697. gPOLY a%()?Draws a sequence of lines, as if by gLINEBY and gMOVE commands.
  698. The array is set up as follows:
  699. a%(1)    starting x position
  700. a%(2)    starting y position a%(3)    number of pairs of offsets
  701. a%(4)    dx1%
  702. a%(5)    dy1%
  703. a%(6)    dx2%
  704. a%(7)    dy2% etc.
  705. Each pair of numbers - dx1%,dy1%, for example - specifies a line or a movement. To draw a line, dy% is the amount to move down, while dx% is the amount to move to the right multiplied by two.hTo specify a movement (ie without drawing a line) work out the dx%,dy% as for a line, then add 1 to dx%.8(For drawing/movement up or left, use negative numbers.)=gPOLY is quicker than combinations of gAT, gLINEBY and gMOVE.[Example, to draw three horizontal lines 50 pixels long at positions 20,10, 20,30 and 20,50:
  706. a%(1)=20 :a%(2)=10 REM 20,10
  707. a%(3)=5 REM 5 operations
  708. REM draw right 50
  709. a%(4)=50*2   :a%(5)=0
  710. REM move down 20
  711. a%(6)=0*2+1  :a%(7)=20
  712. REM draw left 50
  713. a%(8)=-50*2  :a%(9)=0
  714. REM move down 20
  715. a%(10)=0*2+1 :a%(11)=20
  716. REM draw right 50
  717. a%(12)=50*2  :a%(13)=0
  718. gPOLY a%()
  719. .gPRINT
  720. gPRINT  list of expressions~Displays a list of expressions at the current position in the current drawable. All variable types are formatted as for PRINT.
  721. Unlike PRINT, gPRINT does not end by moving to a new line. A comma between expressions is still displayed as a space, but a semi-colon has no effect. gPRINT without a list of expressions does nothing.7See also gPRINTB, gPRINTCLIP, gTWIDTH, gXPRINT, gTMODE.H
  722. .gPRINTBlgPRINTB t$,w%,al%,tp%,bt%,m%
  723. gPRINTB t$,w%,al%,tp%,bt%
  724. gPRINTB t$,w%,al%,tp%
  725. gPRINTB t$,w%,al%
  726. gPRINTB t$,w%
  727. Displays text t$ in a cleared box of width w% pixels. The current position is used for the left side of the box and for the baseline of the text.nal% controls the alignment of the text in the box - 1 for right aligned, 2 for left aligned, or 3 for centred.
  728. tp% and bt% are the clearances between the text and the top/bottom of the box. Together with the current font size, they control the height of the box. An error is raised if tp% plus the font ascent is greater than 255.
  729. m% controls the margins.VFor left alignment, m% is an offset from the left of the box to the start of the text.VFor right alignment, m% is an offset from the right of the box to the end of the text.
  730. For centering, m% is an offset from the left or right of the box to the region in which to centre, with positive m% meaning left and negative meaning right.GIf values are not supplied for some arguments, these defaults are used:
  731. al%    left
  732. tp%    0
  733. bt%    0
  734. m%    0.See also gPRINT, gPRINTCLIP, gTWIDTH, gXPRINT.
  735. .gPRINTCLIP
  736. w%=gPRINTCLIP(text$,width%)
  737. Displays text$ at the current position, displaying only as many characters as will fit inside width% pixels. Returns the number of characters displayed.3See also gPRINT, gPRINTB, gTWIDTH, gXPRINT, gTMODE.
  738. .gRANK
  739. rank%=gRANKOReturns the foreground/background position, from 1 to 8, of the current window.4Raises an error if the current drawable is a bitmap.
  740. See also gORDER.~
  741.     .gSAVEBIT/gSAVEBIT name$,width%,height%
  742. gSAVEBIT name$
  743. Saves the current drawable as the named bitmap file. If width% and height% are given, then only the rectangle of that size from the current position is copied. If name$ has no file extension .PIC is used.vSaving a window to file when it includes grey will save both planes to the file - black bitmap first followed by grey.
  744. .gSCROLL0gSCROLL dx%,dy%,x%,y%,wd%,ht%
  745. gSCROLL dx%,dy%
  746. Scrolls pixels in the current drawable by offset dx%,dy%. Positive dx% means to the right, and positive dy% means down. The drawable itself does not change its position.rIf you specify a rectangle in the current drawable, at x%,y% and of size wd%,ht%, only this rectangle is scrolled.RThe areas dx% wide and dy% deep which are "left behind" by the scroll are cleared.%The current position is not affected.
  747. .gSETWIN-gSETWIN x%,y%,width%,height%
  748. gSETWIN x%,y%AChanges position and, optionally, the size of the current window.7An error is raised if the current drawable is a bitmap.#The current position is unaffected.
  749. If you use this command on the default window, you must also use the SCREEN command to ensure that the area for PRINT commands to use is wholly contained within the default window.
  750. .gSTYLE
  751. gSTYLE style%oSets the style of text displayed in subsequent gPRINT, gPRINTB and gPRINTCLIP commands on the current drawable.
  752. style% Text style:
  753. 0    normal
  754. 1    bold
  755. 2    underlined    4    inverse
  756. 8    double height
  757. 16    mono    32    italic
  758. You can combine these styles by adding their values - for example, to set bold, underlined and double height, use gSTYLE 11, as 11=1+2+8.?This command does not affect non-graphics commands, like PRINT.p
  759. .gTMODE
  760. gTMODE mode%kSets the way characters are displayed by subsequent gPRINT and gPRINTCLIP commands on the current drawable.
  761. mode% Pixels will be:
  762. 0    set    1    cleared
  763. 2    inverted
  764. 3    replaced
  765. When you first use "graphics text" commands on a drawable, each dot in a letter causes a pixel to be set in the drawable. This is mode%=0.
  766. When mode% is 1 or 2, graphics text commands work in a similar way, but the pixels are cleared or inverted. When mode% is 3, entire character boxes are drawn on the screen - pixels are set in the letter and cleared in the background box.9This command does not affect other text display commands.
  767. .gTWIDTH
  768. width%=gTWIDTH(text$)9Returns the width of text$ in the current font and style..See also gPRINT, gPRINTB, gPRINTCLIP, gXPRINT.
  769. .gUNLOADFONT
  770. gUNLOADFONT fontId%xUnloads a user-defined font that was previously loaded using gLOADFONT. Raises an error if the font has not been loaded.TThe built-in Series 3/Series 3a fonts are not held in memory and cannot be unloaded.
  771. See also gLOADFONT.-
  772. .gUPDATE
  773. gUPDATE ON
  774. gUPDATE OFF
  775. gUPDATE
  776. The Series 3a screen is usually updated whenever you display anything on it. gUPDATE OFF switches off this feature. The screen will then be updated as few times as possible (though note that some keywords will always cause an update.)FYou can still force an update by using the gUPDATE command on its own.
  777. This can result in a considerable speed improvement in some cases. You might, for example, use gUPDATE OFF, then a sequence of graphics commands, followed by gUPDATE.VYou should certainly use gUPDATE OFF if you are about to write exclusively to bitmaps.-gUPDATE ON returns to normal screen updating.
  778. gUPDATE affects anything that displays on the screen. If you are using a lot of PRINT commands, gUPDATE OFF may make a noticeable difference in speed.zNote that with gUPDATE OFF, the location of errors which occur while the procedure is running may be incorrectly reported.
  779. For this reason, gUPDATE OFF is best used in the final stages of program development, and even then you may have to remove it to locate some errors.
  780. .gUSE
  781. gUSE id%
  782. Makes the drawable id% current. Graphics drawing commands will now go to this drawable. gUSE does not bring a drawable to the foreground (see gORDER).~
  783.     .gVISIBLE
  784. gVISIBLE ON/OFF.Makes the current window visible or invisible.4Raises an error if the current drawable is a bitmap.A
  785. .gWIDTH
  786. width%=gWIDTH*Returns the width of the current drawable.U
  787. x%=gXJReturns the x current position (in from the left) in the current drawable.
  788.     .gXBORDER4gXBORDER type%,flags%,w%,h%
  789. gXBORDER type%,flags%
  790. Draws a border in the current drawable of a specified type, fitting inside a rectangle of the specified size or with the size of the current drawable if no size is specified.Mtype%=0 for drawing the Series 3 type border; flags% are then as for gBORDER.
  791. type%=1 for drawing the Series 3a 3-D grey and black border. A shadow or a gap for a shadow is always assumed. flags%=1,2,3,4 are as for gBORDER.
  792. When the shadow is enabled (1 or 3) only the grey and black parts of the border are drawn; you should pre-clear the background for the white parts.
  793. When the shadow is disabled (2 or 4) the outer and inner border lines are drawn, but the areas covered by grey/black when the shadow is enabled are now cleared. (This allows a shadow to be turned off simply by calling gXBORDER again.)9The following values of flags% apply to all border types:
  794. 0 for normal corners2OR with $100 leaves 1 pixel gap around the border.%OR with $200 for more rounded corners'OR with $400 for losing a single pixel.AIf both $400 and $200 are mistakenly supplied, $200 has priority.;An error is raised if the current window has no grey plane.
  795. See also gBORDER.
  796. .gXPRINT
  797. gXPRINT string$,flags%
  798. Displays string$ at the current position, with precise highlighting or underlining. The current font and style are still used, even if the style itself is inverse or underlined.RText mode 3 (replace) is used - both set and cleared pixels in the text are drawn. flags% has the following effect:
  799. flags% effect
  800. 0    normal, as with gPRINT    1    inverse
  801. 2    inverse, except corner pixels
  802. 3    thin inverse$4    thin inverse, except corner pixels
  803. 5    underlined
  804. 6    thin underlinedlWhere lines of text are separated by a single pixel, the thin options maintain the separation between lines.OgXPRINT does not support the display of a list of expressions of various types.V
  805. y%=gYKReturns the y current position (down from the top) in the current drawable.
  806. .HEX$
  807. h$=HEX$(x&)cReturns a string containing the hexadecimal (base 16) representation of integer or long integer x&..For example HEX$(255) returns the string "FF".k
  808. .HOUR
  809. h%=HOUR\Returns the number of the current hour from the system clock as an integer between 0 and 23.
  810. .IABS
  811. i&=IABS(x&)^Returns the absolute value, ie without any sign, of the integer or long integer expression x&.
  812. For example IABS(-10) is 10.ISee also ABS, which returns the absolute value as a floating-point value.
  813. .ICON
  814. ICON name$hGives the name of the bitmap file to incorporate into the OPA, for use as the icon in the System screen.
  815. If no file extension is given, .PIC is used. If you do not use ICON, the OPA is shown on the System screen with a standard OPA icon.+This can only be used between APP and ENDA.nYou should add $1000 to the argument to TYPE if the bitmap file has a Series 3a's 48x48 pixel black/grey icon.
  816. Any initial 24x24 icon in the file (for use on a Series 3) will then be ignored when the OPA is installed on a Series 3a, with two 48x48 icon patterns (black and grey respectively) being read from the OPA file instead.GIf you want to design your own icon using an OPL program, see gSAVEBIT.
  817. .IF...ENDIFWIF condition1
  818.  ...statements
  819. ELSEIF condition2
  820.  ...statements
  821.  ...statements
  822. ENDIF
  823. Does either/    
  824.  the statements following the IF condition
  825.  the statements following one of the ELSEIF conditions (there may be as many ELSEIF statements as you like - none at all if you want)
  826. or~    
  827.  the statements following ELSE (or, if there is no ELSE, nothing at all). There may be either one ELSE statement or none.HAfter the ENDIF statement, the lines following ENDIF carry on as normal.1IF, ELSEIF, ELSE and ENDIF must be in that order..Every IF must be matched with a closing ENDIF.FYou can also have an IF...ENDIF structure within another, for example:
  828. IF condition1
  829.  IF condition2
  830.  ENDIF
  831. ENDIF
  832. "condition" is an expression returning a logical value, for example a<b. If the expression returns logical true (non-zero) then the statements following are executed. If the expression returns logical false (zero) then those statements are ignored.]
  833. .INPUT!INPUT variable
  834. INPUT log.fielduWaits for a value to be entered at the keyboard, and then assigns the value entered to a variable or data file field.
  835. You can edit the value as you type it in. All the usual editing keys are available - the arrow keys move along the line, Esc clears the line and so on.
  836. If inappropriate input is entered, for example a string when the input was to be assigned to an integer variable, a ? is displayed and you can try again.
  837. However, if you used TRAP INPUT, control passes on to the next line of the procedure, with the appropriate error condition being set and the value of the variable remaining unchanged.<INPUT is usually used in conjunction with a PRINT statement:
  838. PROC exch:
  839. LOCAL pds,rate
  840.  PRINT "Pounds Sterling?",
  841.  INPUT pds
  842.  PRINT "Rate (DM)?",
  843.  INPUT rate
  844.  PRINT "=",pds*rate,"DM"
  845. UNTIL 0
  846. Note the commas at the end of the PRINT statements, used so that the cursor waiting for input appears on the same line as the messages.
  847. TRAP INPUT
  848. If a bad value is entered (for example "abc" for a%) in response to a TRAP INPUT, the ? is not displayed, but the ERR function can be called to return the value of the error which has occurred.
  849. If the Esc key is pressed while no text is on the input line, the `Escape key pressed' error (number -114) will be returned by ERR (provided that the INPUT has been trapped).aYou can use this feature to enable someone to press the Esc key to escape from inputting a value.
  850. See also EDIT. This works like INPUT, except that it displays a string to be edited and then assigned to a variable or field. It can only be used with strings.e
  851. .INT    i&=INT(x)
  852. Returns the integer (in other words the whole number) part of the floating-point expression x. The number is returned as a long integer.
  853. Positive numbers are rounded down, and negative numbers are rounded up - for example INT(-5.9) returns -5 and INT(2.9) returns 2.{If you want to round a number to the nearest integer, add 0.5 to it (or subtract 0.5 if it is negative) before you use INT.
  854. In the Calculator, you need to use INT to pass a number to a procedure which requires a long integer parameter. This is because the Calculator passes all numbers as floating-point by default.
  855. See also INTF.
  856. .INTF    i=INTF(x)
  857. Used in the same way as the INT function, but the value returned is a floating-point number. For example, INTF(1234567890123.4) returns 1234567890123.0LYou may also need this when an integer calculation may exceed integer range.
  858. See also INT.%
  859. .IOA'r%=IOA(h%,f%,var status%,var a1,var a2)xThe device driver opened with handle h% performs the asynchronous I/O function f% with two further arguments, a1 and a2.
  860. status% will usually be set to -46, which means that the function is still pending. When, at some later time, the function completes, status% is automatically changed.
  861. (For this reason, status% should usually be global - if the program is still running, status% must be available when the request completes, or the program will probably crash.)
  862. If status%>=0, the function completed without error. If <0, the function completed with error. The error number is specific to the device driver.>At the same time, a signal is sent to the running OPL program.
  863. In most cases, you cannot perform another I/O read/write function to this device until you first read the signal of this function's completion.
  864. If this is the only I/O device with a function pending, wait for the signal with IOWAITSTAT status%. (If you have other functions pending on other devices, you must use IOWAIT and IOSIGNAL.)
  865. Alternatively, you can cancel the pending function with IOW(handle%,4). The program will still receive a signal, which should be read with IOWAITSTAT or IOWAIT.dIf an OPL program is ready to exit, it does not have to wait for any signals from pending IOA calls.^
  866. .IOC'r%=IOC(h%,f%,var status%,var a1,var a2)
  867. Make an I/O request with guaranteed completion. This has the same form as IOA etc but it returns zero always (ie the return value can be ignored).tIOC allows you to assume that the request started successfully - any error is always given in the status word stat%.
  868. If there was an error, stat% contains the error code and the next IOWAIT will return immediately as if the error occurred after completion.
  869. There is seldom a requirement to know whether an error occurred on starting a function, and IOC should therefore be used in preference to IOA nearly always.
  870.     .IOCANCEL
  871. r%=IOCANCEL(h%)
  872. Cancels any outstanding asynchronous I/O request (IOC or IOA) on the specified channel, causing them to complete with the completion status word containingJ-48 ("I/O cancelled"). The return value is always zero and may be ignored.
  873. Device drivers that support truly asynchronous services provide a cancel service. The detailed effect of the cancel depends on the device driver. However, the following general principles apply:eThe cancel precipitates the completion of the request (it does not stop the request from completing).oThe cancel may or may not be effective (ie. the request may complete naturally before the cancel is processed).
  874. After a cancel, you must still process the completion of the asynchronous request (typically by immediately calling IOWAITSTAT to "use up" the signal).
  875. The IOCANCEL function is harmless if no request is outstanding (eg if the function completed just before cancellation requested).:
  876. .IOCLOSE
  877. r%=IOCLOSE(h%)!Closes a file with the handle h%.<
  878. .IOOPEN
  879. r%=IOOPEN(var h%,name$,mode%)WCreates or opens a file called name$. Defines handle h% for use by other I/O functions.
  880. For unique file creation, use
  881. IOOPEN(var h%,addr%,mode%)
  882. mode% specifies how the file is to be opened. It is formed by ORing together values which fall into the three following categories:4"Open mode" - choose one and only one of the values;6"File format" - choose one and only one of the values;6"Access flags" - any combination af values is allowed.
  883. OPEN MODE:h$0000 - Open an existing file (or device). The initial current position is set to the start of the file.5$0001 - Create a file (which must not already exist).V$0002 - Replace a file (truncate it to zero length) or create it if it does not exist.
  884. $0003 - Open an existing file for appending. The initial current position is set to the end of the file. For text format files (see $0020 below) this is the only way to position to end of file.
  885. $0004 - Creates a file with a unique name. For this case, you must use addr%, the address of a string at least 130 characters long, instead of name$.
  886. This string specifies the path of the file to be created (any file name in the string is ignored). IOOPEN then set the string to the unique file name generated (including the full path).
  887. FILE FORMAT:X$0000 - Binary. Up to 16K can be read from or written to the file in a single operation.
  888. $0020 - Text. Lines are terminated by any combination of the CR and LF ($0D, $0A) characters. The maximum record length is 256 bytes and Ctrl-Z ($1A) marks the end of the file.
  889. ACCESS FLAGS:
  890. $0100 - Update flag - Allows the file to be written to as well as read. If not set, the file is opened for reading only. You must use this flag when creating or replacing a file.u$0200 - Random access flag - the file is opened for random access (not sequential access), using the IOSEEK function.
  891. $0400 - Share flag - the file can still be opened by other processes. If not specified, the file is locked and may only be used by this program.jIf the file is opened for writing ($0100 above), this flag is ignored, since sharing is then not feasible.*
  892. .IOREAD
  893. r%=IOREAD(h%,addr%,maxLen%)
  894. Reads from the file with the handle h%. address% is the address of a buffer large enough to hold a maximum of maxLen% bytes. The value returned to r% is the actual number of bytes read or, if negative, is an error value.pThe buffer could be an array or even a single integer as required. No more than 16K bytes can be read at a time.
  895. FOR TEXT FILES:
  896. If maxLen% exceeds the current record length, data only up to the end of the record is read into the buffer; no error is returned and the file position is set to the next record.
  897. If a record is longer than maxLen%, the error value `Record too large' (-43) is returned. In this case the data read is valid but is truncated to length maxLen%, and the file position is set to the next record.
  898. A string can be used for the buffer. Pass the address UADD(ADDR(str$),1) to IOREAD. You can then POKEB the first byte of the string with the length (returned to ret%) so that the string conforms to normal OPL string format.
  899. FOR BINARY FILES:
  900. If you request more bytes than are left in the file, the number of bytes actually read (even zero) will be less than the number requested. So if ret%<maxLen%, end of file has been reached.rNo error is returned by IOREAD in this case, but the next IOREAD would return the error value `End of file' (-36).
  901. .IOSEEK
  902. r%=IOSEEK(h%,mode%,var off&)ESeeks to a position in a file that has been opened for random access.joff& may be positive to move forwards or negative to move backwards. The values you can use for mode% are:o1    Set position in a binary file to the absolute value specified in off&, with 0 for the first byte in the file.G2    Set position in a binary file to off& bytes from the end of the file.O3    Set position in a binary file to off& bytes relative to the current position.
  903. 6        Rewind a text file to the first record. off& is ignored, but you must still pass it as a argument, for compatibility with the other cases.;IOSEEK sets the variable off& to the absolute position set.Q
  904.     .IOSIGNAL
  905. IOSIGNAL=Replace a signal of an I/O function's completion. See IOWAIT.
  906. r%=IOW(h%,func%,var a1,var a2)sThe device driver opened with handle h% performs the synchronous I/O function func% with the two further arguments.z
  907. .IOWAIT
  908. IOWAITbWaits for an asynchronous I/O function (such as one requested by IOC or IOA) to signal completion.
  909. IOWAIT returns when any asynchronous I/O function completes. Check status% to see whether it was the function which you called with IOA/IOC. You must keep a count of the number of times IOWAIT returns due to other functions completing.
  910. When status% finally shows that IOWAIT has returned because of this function completing, you must then call IOSIGNAL once for each other function which completed, to replace these other signals.XIf you have no other functions pending on different I/O handles, use IOWAITSTAT instead.m
  911. .IOWAITSTAT
  912. IOWAITSTAT var stat%KWaits for a particular asynchronous function, called with IOA, to complete.P
  913. .IOWRITE
  914. r%=IOWRITE(h%,addr%,length%)LWrites length% bytes in a buffer at address% to the file with the handle h%.lWhen a file is opened as a binary file, the data written by IOWRITE overwrites data at the current position.oWhen a file is opened as a text file, IOWRITE writes a single record; the closing CR/LF is automatically added.
  915. .IOYIELD
  916. IOYIELDOEnsures that any asynchronous handler set up with IOA is given a chance to run.
  917. Some devices are unable to perform an asynchronous request if an OPL program becomes computationally intensive, using no I/O (screen, keyboard etc) at all. In such cases, the OPL program should use IOYIELD before checking its status% variable.
  918. IOYIELD is the equivalent of IOSIGNAL followed by IOWAIT - the IOWAIT returns immediately with the signal from IOSIGNAL, but the IOWAIT causes any asynchronous handlers to run.
  919. k%=KEY
  920. Returns the character code of the last key pressed, if there has been one since the last call to the keyboard. These functions count as calling to the keyboard: INPUT, EDIT, GET, GET$, KEY and KEY$.-If no key has been pressed, zero is returned.
  921. See the entry entitled "Character set and key codes" for a list of special key codes. You can use KMOD to check whether modifier keys (Shift, Control, Psion and Caps Lock) were used.?This command does not wait for a key to be pressed, unlike GET.
  922. .KEY$
  923. k$=KEY$
  924. Returns the last key pressed as a string, if there has been a keypress since the last use of the keyboard by INPUT, EDIT, GET, GET$, KEY or KEY$.;If no key has been pressed, a null string ("") is returned.
  925. See the entry entitled "Character set and key codes" for a list of special key codes. You can use KMOD to check whether modifier keys (Shift, Control, Psion and Caps Lock) were used.@This command does not wait for a key to be pressed, unlike GET$.
  926. .KEYA err%=KEYA(var stat%,var key%(1))
  927. This is an asynchronous keyboard read function. You must declare an integer array with two elements - here, key%(1) and key%(2) - to receive the keypress information.
  928. If a key is pressed, key%(1) is assigned the character code of the key. The least significant byte of key%(2) takes the key modifier, in the same way as KMOD - 2 for Shift down, 4 for Control down and so on. (KMOD cannot be used with KEYA.)NThe most significant byte of key%(2) takes the count of keys pressed (0 or 1).,KEYA needs an IOWAIT in the same way as IOA.
  929. KEYA has been included in OPL because the handle of the keyboard driver is unknown to the programmer. Otherwise it is equivalent to IOA(keyhand%,1,status%,key%()).Z
  930. .KEYC
  931. err%=KEYC(var stat%)>Cancels the previously called KEYA function with status stat%.i
  932. .KMOD
  933. k%=KMOD
  934. Returns a code representing the state of the modifier keys (whether they were pressed or not) at the time of the last keyboard access, such as a KEY function. The modifiers have these codes:                binary
  935. 2    Shift down        10
  936. 4    Control down       100
  937. 8    Psion down      1000
  938. 16    Caps Lock on     10000
  939. If there was no modifier, the function returns 0. If a combination of modifiers was pressed, the sum of their codes is returned - for example 20 is returned if Control (4) was held down and Caps Lock (16) was on.;Always use immediately after a KEY/KEY$/GET/GET$ statement.
  940. The value returned by KMOD has one binary bit set for each modifier, as shown above. By using the logical operator AND on the value returned by KMOD you can check which of the bits are set, in order to see which modifier keys were held down.
  941. Example:
  942. PROC modifier:
  943. LOCAL k%,mod%
  944. PRINT "Press a key" :k%=GET
  945. CLS :mod%=KMOD
  946. PRINT "Key code",k%,"with"    IF mod%=0
  947.  PRINT "no modifier"
  948. ENDIF
  949. IF mod% AND 2
  950.  PRINT "Shift down"
  951. ENDIF
  952. IF mod% AND 4
  953.  PRINT "Control down"
  954. ENDIF
  955. IF mod% AND 8
  956. PRINT "Psion down"
  957. ENDIF
  958. IF mod% AND 16
  959.  PRINT "Caps Lock on"
  960. ENDIF
  961. ENDP8
  962. .LAST
  963. LAST,Positions to the last record in a data file.s
  964. .LCLOSE
  965. LCLOSEcCloses the device opened with LOPEN. (The device is also closed automatically when a program ends.)
  966. .LEFT$
  967. b$=LEFT$(a$,x%)6Returns the leftmost x% characters from the string a$.OFor example if n$ has the value Charles, then b$=LEFT$(n$,3) assigns Cha to b$.    
  968. a%=LEN(a$)'Returns the number of characters in a$.DEg if a$ has the value "34 Kopechnie Drive" then LEN(a$) returns 18.bYou might use this function to check that a data file string field is not empty before displaying:
  969. IF LEN(A.client$)
  970.  PRINT A.client$
  971. ENDIF_
  972.     .LENALLOC
  973. len%=LENALLOC(pcell%)>Returns the length of the previously allocated cell at pcell%.N
  974. .LINKLIB
  975. LINKLIB cat%7Link any libraries that have been loaded using LOADLIB.h
  976. a=LN(x),Returns the natural (base e) logarithm of x..Use LOG to return the base 10 log of a number.
  977. .LOADLIB"ret%=LOADLIB(var cat%,name$,link%)
  978. Load and optionally link a DYL that is not in the ROM. If successful, this writes the category handle to cat% and returns zero. The DYL is shared in memory if already loaded by another process.
  979. .LOADM
  980. LOADM module$
  981. Loads a translated OPL module so that procedures in that module can be called. Until a module is loaded with LOADM, calls to procedures in that module will give an error.gmodule$ is a string containing the name of the module. Specify the full file name only where necessary.
  982. Example:  LOADM "MODUL2"
  983. Up to 4 modules can be in memory at any one time; if you try to LOADM a fifth module, you get an error. Use UNLOADM to remove a module from memory so that you can load a different one.
  984. By default, LOADM always uses the directory of the initial running program, or the one specified by a OPA application. It is not affected by the SETPATH command.&
  985. a%=LOC(a$,b$)
  986. Returns an integer showing the position in a$ where b$ occurs, or zero if b$ doesn't occur in a$. The search matches upper and lower case.
  987. Example: LOC("STANDING","AND") would return the value 3 because the substring AND starts at the third character of the string STANDING.
  988. .LOCAL
  989. LOCAL variables
  990. Used to declare variables which can be referenced only in the current procedure. Other procedures may use the same variable names to create new variables. Use GLOBAL to declare variables common to all called procedures.GThe variables may be of 4 types, depending on the symbol they end with:e    
  991.  Variable names not ending with $ % & or () are floating-point variables - for example: price, xK    
  992.  Those ending with a % are integer variables, for example x%, sales92%S    
  993.  Those ending with an &  are long integer variables, for example x&, sales92&.
  994.  Those ending with a $ are string variables. String variable names must be followed by the maximum length of the string in brackets - for example names$(12), a$(3)
  995. Array variables have a number immediately following them in brackets which specifies the number of elements in the array. Array variables may be of any type, for example: x(6),y%(5),f$(5,12),z&(3)
  996. When declaring string arrays, you must give two numbers in the brackets. The first declares the number of elements, the second declares their maximum length. For example surname$(5,8) declares five elements, each up to 8 characters long.
  997. Variable names may be any combination of up to 8 numbers and alphabetic letters. They must start with a letter. The length includes the % & or $ sign, but not the () in string and array variables.~More than one GLOBAL or LOCAL statement may be used, but they must be on separate lines, immediately after the procedure name.
  998. See also GLOBAL.F
  999. .LOCK
  1000. LOCK ON
  1001. LOCK OFF
  1002. Mark an OPA (OPL application) as locked or unlocked. When an OPA is locked with LOCK ON, the System screen will not send it events to change files or quit.
  1003. If, for example, you move onto the file list in the System screen and press Delete to try to stop that running OPA, a message will appear, indicating that the OPA cannot close down at that moment.
  1004. You should use LOCK ON if your OPA uses a command, such as EDIT or DIALOG, which accesses the keyboard. You might also use it when the OPA is about to go busy for a considerable length of time, or wherever a clean exit is not possible.=Do not forget to use LOCK OFF as soon as possible afterwards.
  1005. `Foreground', `background' and `Machine on' events may still occur while the OPA is accessing the keyboard, and will be discarded.
  1006. An OPA is initially unlocked.[
  1007. a=LOG(x)#Returns the base 10 logarithm of x.(Use LN to find the base e (natural) log.
  1008. .LOPEN
  1009. LOPEN device$1Opens the device to which LPRINTs are to be sent.ANo LPRINTs can be sent until a device has been opened with LOPEN."You can open any of these devices:+    
  1010.  The parallel port, with LOPEN "PAR:A")    
  1011.  The serial port, with LOPEN "TTY:A"W    
  1012.  A file on the Series 3a or an attached computer. LOPEN the file name, eg on a PC:
  1013. LOPEN "REM::C:\BAK\MEMO.TXT"
  1014. or on an Apple Macintosh:
  1015. LOPEN "REM::HD40:ME:MEMO5"MAny existing file of the name given will be overwritten when you print to it.
  1016. Only one device may be open at any one time. Use LCLOSE to close the device. (It also closes automatically when a program finishes running.)<See the entry entitled "Serial/parallel ports and printing".
  1017. .LOWER$
  1018. b$=LOWER$(a$)oConverts any upper case characters in the string a$ to lower case and returns the completely lower case string.9Eg if a$="CLARKE", LOWER$(a$) returns the string "clarke"-Use UPPER$ to convert a string to upper case.l
  1019. .LPRINT
  1020. LPRINT list of expressions}Prints a list of items, in the same way as PRINT, except that the data is sent to the device most recently opened with LOPEN.
  1021. The expressions may be quoted strings, variables, or the evaluated results of expressions. The punctuation of the LPRINT statement (commas, semi-colons and new lines) determines the layout of the printed text, in the same way as PRINT statements.>If no device has been opened with LOPEN you will get an error.ASee also the entry entitled "Serial/parallel ports and printing".*See LOPEN for opening a device for LPRINT.'See PRINT for displaying to the screen.
  1022. .MAX%m=MAX(list)
  1023. m=MAX(array(),element)0Returns the greatest of a list of numeric items.
  1024. The list can be either:F    
  1025.  A list of variables, values and expressions, separated by commas
  1026. or-    
  1027.  The elements of a floating-point array.UWhen operating on an array, the first argument must be the array name followed by ().
  1028. The second argument, separated from the first by a comma, is the number of array elements you wish to operate on - for example m=MAX(arr(),3) would return the value of the largest of elements arr(1), arr(2) and arr(3).y
  1029. .mCARD9mCARD title$,n1$,k1%
  1030. mCARD title$,n1$,k1%,n2$,k2%
  1031. etc.QDefines a menu. When you have defined all of the menus, use MENU to display them.ttitle$ is the name of the menu. From one to eight items on the menu may be defined, each specified by two arguments.
  1032. The first is the item name, and the second the keycode for a hot-key. This specifies a key which, when pressed together with the Psion key, will select the option.\If the keycode is for an upper case key, the hot-key will use both the Shift and Psion keys.oYou can display a grey line under an option by passing the negative value corresponding to the hot-key keycode.k
  1033. .MEAN'm=MEAN(list)
  1034. m=MEAN(array(),element)AReturns the arithmetic mean (average) of a list of numeric items.
  1035. The list can be either:F    
  1036.  A list of variables, values and expressions, separated by commas
  1037. or-    
  1038.  The elements of a floating-point array.UWhen operating on an array, the first argument must be the array name followed by ().
  1039. The second argument, separated from the first by a comma, is the number of array elements you wish to operate on - for example m=MEAN(arr(),3) would return the average of elements arr(1), arr(2) and arr(3).
  1040. This example displays 15.0:
  1041. a(1)=10
  1042. a(2)=15
  1043. a(3)=20
  1044. PRINT MEAN(a(),3)
  1045. .MENU!val%=MENU
  1046. val%=MENU(var init%)
  1047. Displays the menus defined by mINIT and mCARD, and waits for you to select an item. Returns the hot-key keycode of the item selected, as defined in mCARD, in lower case.7If you cancel the menu by pressing Esc, MENU returns 0.
  1048. If the name of a variable is passed is sets the initial menu and item to be highlighted. init% should be 256*(menu%)+item%; for both menu% and item%, 0 specifies the first, 1 the second and so on.WIf init% is 517 (=256*2+5), for example, this specifies the 6th item on the third menu.
  1049. If init% was passed, MENU writes back to init% the value for the item which was last highlighted on the menu. You can then use this value when calling the menu again. You only need do this if you have more than one menu in your program.
  1050. .MID$
  1051. m$=MID$(a$,x%,y%)ZReturns a string comprising y% characters of a$, starting at the character at position x%.IEg if name$="McConnell" then MID$(name$,3,3) would return the string Con.
  1052. .MIN%m=MIN(list)
  1053. m=MIN(array(),element)0Returns the smallest of a list of numeric items.
  1054. The list can be either:F    
  1055.  A list of variables, values and expressions, separated by commas
  1056. or-    
  1057.  The elements of a floating-point array.UWhen operating on an array, the first argument must be the array name followed by ().
  1058. The second argument, separated from the first by a comma, is the number of array elements you wish to operate on - for example m=MIN(arr(),3) would return the minimum of elements arr(1), arr(2) and arr(3).
  1059. .mINIT
  1060. mINITzPrepares for definition of menus, cancelling any existing menus. Use mCARD to define each menu, then MENU to display them.u
  1061. .MINUTE    m%=MINUTEBReturns the current minute number from the system clock (0 to 59).
  1062. Eg at 8.54am MINUTE returns 54.
  1063. .MKDIR
  1064. MKDIR name$
  1065. Creates a new directory. For example, MKDIR "M:\MINE\TEMP" creates a M:\MINE\TEMP directory, also creating M:\MINE if it is not already there.
  1066. .MONTH
  1067. m%=MONTHOReturns the current month from the system clock as an integer between 1 and 12./Eg on 12th March 1992 m%=MONTH returns 3 to m%.
  1068. .MONTH$
  1069. m$=MONTH$(x%)eConverts x%, a number from 1 to 12, to the month name, expressed as a three-letter mixed case string.$Eg MONTH$(1) returns the string Jan.
  1070. .NEWOBJ
  1071. pobj%=NEWOBJ(num%,clnum%)
  1072. Create a new object by category number num% belonging to the class clnum%, returning the object handle on success or zero if out of memory.
  1073. .NEWOBJH
  1074. pobj%=NEWOBJH(cat%,clnum%)
  1075. Create a new object by category handle cat% belonging to the class clnum%, returning the object handle on success or zero if out of memory.
  1076. .NEXT
  1077. NEXT6Positions to the next record in the current data file.
  1078. If NEXT is used after the end of a file has been reached, no error is reported but the current record is a null and the EOF function returns true.G
  1079. .NUM$
  1080. n$=NUM$(x,y%)
  1081. Returns a string representation of the integer part of the floating-point number x, rounded to the nearest whole number. The string will be up to y% characters wide.
  1082.  If y% is negative then the string is right-justified, for example NUM$(1.9,-3) returns "  2" where there are two spaces to the left of the 2.0    
  1083.  If y% is positive no spaces are added, eg:
  1084. NUM$(-3.7,3) returns "-4".
  1085.  If the string returned to n$ will not fit in the width y%, then the string will just be asterisks; for example NUM$(256.99,2) returns "**".
  1086. See also FIX$, GEN$, SCI$.
  1087. .ODBINFO
  1088. ODBINFO var info%()
  1089. Provided for advanced use only, this keyword allows you to use OS and CALL to access data file interrupt functions not accessible with OPL keywords.
  1090. ODBINFO returns info%() (which must have four elements) containing pointers to four blocks of data; the first corresponds to the file with logical name A, the second to B and so on.
  1091. Take extreme care not to corrupt these blocks of memory, as they are the actual data structures used by the OPL runtime interpreter.MA data block which has no open file using it has zero in the first two bytes.
  1092. Otherwise, the block of data for each file has the following structure, giving the offset to each component from the start of the block and with offset 0 for the 1st byte of the block:
  1093. Offset    Bytes    DescriptionE0    2    DBF system's file control block (handle) or zero if file not open52    2    offset in the record buffer to the current record$4    2    pointer to the field name buffer
  1094. 6    2    number of fields%8    2    pointer to start of record buffer
  1095. 10    2    length of a NULL record$12    1    non-zero if all fields are text 13    1    non-zero for read-only file,14    1    non-zero if record has been copied down
  1096. 15    1    number of text fields
  1097. 16    2    pointer to device name
  1098. OFF x%
  1099. Switches the Series 3a off.ZWhen you switch back on, the statement following the OFF command is executed, for example:
  1100. OFF :PRINT "Hello again"
  1101. If you specify an integer, x%, between 8 and 16383, the machine switches off for that number of seconds and then automatically turns back on and continues with the next line of the program (16383 is about 4 1/2 hours).sHowever, during this time the machine may be switched on by an alarm, and of course you can turn it on with ON/Esc.
  1102. Warning: be careful how you use this command. If, due to a programming mistake, a program uses OFF in a loop, you may find it impossible to switch the Series 3a back on, and may have to reset the computer.}
  1103. .ONERR,ONERR label or
  1104. ONERR label::
  1105. ONERR OFF
  1106. ONERR label:: establishes an error handler in a procedure. When an error is raised, the program jumps to the label:: instead of the program stopping and an error message being displayed.
  1107. The label may be up to 8 characters long starting with a letter. It ends with a double colon (::), although you don't need to use this in the ONERR statement.}ONERR OFF disables the ONERR command, so that any errors occurring after the ONERR OFF statement no longer jump to the label.pIt is advisable to use the command ONERR OFF immediately after the label:: which starts the error handling code.
  1108. .OPEN
  1109. OPEN file$,log,f1,f2...pOpens an existing data file file$, giving it the logical file name log, and giving the fields the names f1, f2..lYou need only specify those fields which you intend to update or append, though you cannot miss out a field.ZThe opened file is then referred to within the program by its logical name (A, B, C or D)."Up to 4 files can be open at once.
  1110. Example:
  1111. OPEN "clients",A,name$,addr$
  1112. See also CREATE, USE and OPENR.
  1113. .OPENR
  1114. This command works exactly like OPEN except that the opened file is read-only - in other words, you cannot APPEND or UPDATE the records it contains._This means that you can run two separate programs at the same time, both sharing the same file.
  1115. .OS.a%=OS(i%, addr1%)
  1116. a%=OS(i%, addr1%, addr2%)eCalls the Operating System interrupt i%, reading the values of all returned 8086 registers and flags.
  1117. The CALL function, although simpler to use, does not allow the AL register to be passed and no flags are returned, making it suitable only for certain interrupts.
  1118. The input registers are passed at the address addr1%. The output registers are returned at the address addr2% if supplied, otherwise they are returned at addr1%. Both addresses can be of an array, or of six consecutive integers.
  1119. Register values are stored sequentially as 6 integers and represent the register values in this order: AX, BX, CX, DX, SI and DI. The interrupt's function number, if required, is passed in AH.
  1120. The output array must be large enough to store the 6 integers returned in all cases, irrespective of the interrupt being called.
  1121. The value returned by OS is the flags register. The Carry flag, which is relevant in most cases, is in bit 0 of the returned value, so (a% and 1) will be `True' if Carry is set.]Similarly, the Zero flag is in bit 6, the Sign flag in bit 7 and the Overflow flag in bit 10.
  1122. For example, to find cos(pi/4):    PROC add:
  1123. local ax%,bx%,cx%,dx%,si%,di%
  1124. local result,cosArg,flags%
  1125. cosArg=pi/4
  1126. si%=addr(cosArg)
  1127. di%=addr(result)
  1128. ax%=$0100 REM AH=1 for cosine
  1129. flags%=os(140,addr(ax%))hThe OS function requires extensive knowledge of the Operating System and related programming techniques.
  1130. See also CALL.v
  1131. .PARSE$
  1132. p$=PARSE$(f$,rel$,var off%())eReturns a full file specification from the filename f$, filling in any missing information from rel$.
  1133. The offsets to the filename components in the returned string is returned in off%() which must be declared with at least 6 integers:'off%(1)    filing system offset (1 always)
  1134. off%(2)    device offset
  1135. off%(3)    path offset
  1136. off%(4)    filename offset
  1137. off%(5)    file extension offset.off%(6)    flags for wildcards in returned string"The flag values in offset%(6) are:
  1138. 0 : no wildcards
  1139. 1 : wildcard in filename
  1140. 2 : wildcard in file extension
  1141. 3 : wildcard in both
  1142. If rel$ is not itself a complete file specification, the current filing system, device and/or path are used as necessary to fill in the missing parts.'f$ and rel$ should be separate strings.
  1143. Example:(p$=PARSE("NEW","LOC::M:\ODB\*.ODB",x%());sets p$ to LOC::M:\ODB\NEW.ODB and x%() to (1,6,8,13,16,0).9
  1144. .PATH
  1145. PATH name$UGives the directory for the System screen to use when listing files used by this OPA.
  1146. If you do not use this, the normal \OPD directory will be used. The maximum length, including a final \, is 19 characters. Don't include any drive name in this path.+This can only be used between APP and ENDA.
  1147. .PAUSE
  1148. PAUSE x%DPauses the program for a certain time, depending on the value of x%:    x%    result 0    waits for a key to be pressed.*+ve    pauses for x%  twentieths of a second.C-ve    pauses for x% twentieths of a second or until a key is pressed.
  1149. So PAUSE 100 would make the program pause for 100/20 = 5 seconds, and PAUSE -100 would make the program pause for 5 seconds or until a key is pressed.
  1150. If x% is 0, a GET, GET$, KEY or KEY$ will return the key press which terminated the pause. If you are not interested in this keypress, but in the one which follows it, clear the buffer after the PAUSE with a single KEY function:
  1151. PAUSE 0 :KEY
  1152. You should be especially careful about this if x% is negative, since then you cannot tell whether the pause was terminated by a keypress or by the time running out.a
  1153. ".PEEKB/.PEEKW/.PEEKL/.PEEKF/.PEEK$
  1154. @p%=PEEKB(x%) returns the integer value of the byte at address x%.p%=PEEKW(x%) returns the integer at address x%9p&=PEEKL(x%) returns the long integer value at address x%:p=PEEKF(x%) returns the floating-point value at address x%-p$=PEEK$(x%) returns the string at address x%
  1155. Usually you would find out the byte address with the ADDR function. For example, if var% has the value 7, PEEKW(ADDR(var%)) returns 7.>The different types are stored in different ways across bytes:b    
  1156.  Integers are stored in two bytes. The first byte is the least significant byte, for example:
  1157. 1    0    =1
  1158. 0    1    =256?ADDR returns the address of the first (least significant) byte.u    
  1159.  Long integers are stored in four bytes, the least significant first and the most significant last, for example:
  1160. 0    0    1    0    =65536?ADDR returns the address of the first (least significant) byte.k    
  1161.  Strings are stored with one character per byte, with a leading byte containing the string length, eg:
  1162. 3    65    66    67    ="ABC"CEach letter is stored as its character code - for example, A as 65.vFor example, if var$="ABC", PEEK$(ADDR(var$)) will return the string ABC. ADDR returns the address of the length byte.
  1163.  Floating-point numbers are stored under IEEE format, across eight bytes. PEEKF automatically reads all eight bytes and returns the number as a floating-point. For example if var=1.3 then PEEKF(ADDR(var)) returns 1.3.
  1164. You can use ADDR to find the address of the first element in an array, for example ADDR(x%()). You can also specify individual elements of the array, for example ADDR(x%(2)).$See also the POKE commands and ADDR.-
  1165. p=PI#Returns the value of Pi (3.14... ).
  1166. ".POKEB/.POKEW/.POKEL/.POKEF/.POKE$
  1167. XPOKEB x%,y% stores the integer value y% (less than 256) in the single byte at address x%
  1168. POKEW x%,y% stores the integer y% across two consecutive bytes, with the least significant byte in the lower address, that is x%FPOKEL x%,y& stores the long-integer y& in bytes starting at address x%LPOKEF x%,y stores the floating-point value y in bytes starting at address x%@POKE$ x%,y$ stores the string y$ in bytes starting at address x%<Use ADDR to find out the address of your declared variables.VWarning: Casual use of these commands can result in the loss of data in the Series 3a.MSee PEEK for more details of how the different types are stored across bytes.
  1169. p%=POSeReturns the number of the current record in the current data file, from 1 (the first record) upwards.
  1170. A file can have up to 65534 records. However integers can only be in the range -32768 to +32767. Record numbers above 32767 are therefore returned like this:
  1171. record    value returned by POS
  1172. 32767     32767
  1173. 32768    -32768
  1174. 32769    -32767
  1175. 32770    -32766
  1176. 65534    -22To display record numbers, you can use this check:
  1177. IF POS<0
  1178.  PRINT 65536+POS
  1179. ELSE PRINT POS
  1180. ENDIF
  1181.     .POSITION
  1182. POSITION x%CMakes record number x% the current record in the current data file._If x% is greater than the number of records in the file then the EOF function will return true.R
  1183. .POSSPRITE
  1184. POSSPRITE x%,y%6Set the position of the current sprite to pixel x%,y%.
  1185. .PRINT
  1186. PRINT list of expressions^Displays a list of expressions on the screen. The list can be punctuated in one of these ways:e    
  1187.  If items to be displayed are separated by commas, there is a space between them when displayed.@    
  1188.  If they are separated by semi-colons, there are no spaces.j    
  1189.  Each PRINT statement starts a new line, unless the preceding PRINT ended with a semi-colon or comma.q    
  1190.  There can be as many items as you like in this list. A single PRINT on its own just moves to the next line.
  1191. Example:
  1192. On 1st January 1993,
  1193. PRINT "TODAY is",
  1194. PRINT DAY;".";"MONTH;".";YEAR
  1195. would display TODAY is 1.1.1993?See also LPRINT, gUPDATE, gPRINT, gPRINTB, gPRINTCLIP, gXPRINT.
  1196. r=RAD(x)#Converts x from degrees to radians.
  1197. All the trigonometric functions assume angles are specified in radians, but it may be easier for you to enter angles in degrees and then convert with RAD.
  1198. Example:
  1199. PROC xcosine:
  1200. LOCAL angle
  1201. PRINT "Angle (degrees)?:";
  1202. INPUT angle
  1203. PRINT "COS of",angle,"is",
  1204. angle=RAD(angle)
  1205. PRINT COS(angle)
  1206. ENDP+To convert from radians to degrees use DEG.\
  1207. .RAISE
  1208. RAISE x%
  1209. Raises an error.|The error raised is error number x%. This should usually be one of the errors listed in the entry entitled "Error messages".
  1210. The error is handled by the error processing mechanism currently in use - either OPL's own, which stops the program and displays an error message, or the ONERR handler if you have ONERR on.
  1211. .RANDOMIZE
  1212. RANDOMIZE x&%Gives a `seed' (start-value) for RND.
  1213. Successive calls of the RND function produce a sequence of random numbers. If you use RANDOMIZE to set the seed back to what it was at the beginning of the sequence, the same sequence will be repeated.
  1214. For example, you might want to use the same `random' values to test new versions of a procedure. To do this, precede the RND statement with the statement RANDOMIZE value. Then to repeat the sequence, use RANDOMIZE value again.
  1215. .REALLOC
  1216. pcelln%=REALLOC(pcell%,size%)
  1217. Change the size of a previously allocated cell at pcell% to size%, returning the new cell address or zero if there is not enough memory. If out of memory, the old cell at pcell% is left as it was.
  1218. If successful, pcelln% will not be the same as pcell% if the size increases and there was no free cell following the cell being grown which was large enough to accomodate the extra amount.
  1219. .RECSIZE
  1220. r%=RECSIZE;Returns the number of bytes occupied by the current record.qUse this function to check that a record may have data added to it without overstepping the 1022 character limit.
  1221. REM textzPrecedes a remark you include to explain how a program works. All text after the REM up to the end of the line is ignored.eWhen you use REM at the end of a line you need only precede it with a space, not a space and a colon.
  1222. .RENAME
  1223. RENAME file1$,file2$:Renames file1$ as file2$. You can rename any type of file.
  1224. You cannot use wildcards.'You can rename across directories - eg:
  1225. RENAME "\dat\x.dbf","\x.dbf"MIf you do this, you can choose whether or not to change the name of the file.
  1226. .REPT$
  1227. r$=REPT$(a$,x%)1Returns a string comprising x% repetitions of a$.;For example, if a$="ex", r$=REPT$(a$,5) returns exexexexex.
  1228. .RETURN
  1229. RETURN or RETURN variable
  1230. Terminates the execution of a procedure and returns control to the point where that procedure was called (ENDP does this automatically).
  1231. RETURN variable  does this as well, but also passes the value of one variable back to the calling procedure. The variable may be of any type. You can return the value of any single array element - for example RETURN x%(3).tRETURN on its own, and the default return through ENDP, causes the procedure to return the value 0 or a null string.D
  1232. .RIGHT$
  1233. r$=RIGHT$(a$,x%)*Returns the rightmost x% characters of a$.^
  1234. .RMDIR
  1235. RMDIR str$KRemoves the directory given by str$. You can only remove empty directories.
  1236. r=RNDSReturns a random floating-point number in the range 0 (inclusive) to 1 (exclusive).xTo produce random numbers between 1 and n - eg between 1 and 6 for a dice - use the following statement: f%=1+INT(RND*n)
  1237. RND produces a different number every time it is called within a program. A fixed sequence can be generated by using RANDOMIZE.
  1238. You might begin by using RANDOMIZE with an argument generated from MINUTE and SECOND (or similar), to seed the sequence differently each time.
  1239. .SCI$
  1240. s$=SCI$(x,y%,z%)wReturns a string representation of x in scientific format, to y% decimal places and up to z% characters wide. Examples:
  1241. SCI$(123456,2,8)="1.23E+05"
  1242. SCI$(1,2,8)="1.00E+00"
  1243. SCI$(1234567,1,-8)=" 1.2E+06"^If the number does not fit in the width specified then the returned string contains asterisks.5If z% is negative then the string is right-justified.
  1244. See also FIX$, GEN$, NUM$.5
  1245. .SCREEN4SCREEN width%,height%
  1246. SCREEN width%,height%,x%,y%
  1247. Changes the size of the window in which text is displayed. x%,y% specify the character position of the top left corner; if they are not given, the text window is centred in the screen.>An OPL program can initially display text to the whole screen.n
  1248. .SCREENINFO
  1249. SCREENINFO var info%();Gets information on the text screen (as used by PRINT etc.)
  1250. This keyword allows you to mix text and graphics. It is required because while the default window is the same size as the physical screen, the text screen is slightly smaller and is centred in the default window.oThe few pixels gaps around the text screen, referred to as the left and top margins, depend on the font in use.^On return, the array info%(), which must have at least 10 elements, contains this information:
  1251. info%(1) left margin in pixels
  1252. info%(2) top margin in pixels-info%(3) text screen width in character units.info%(4) text screen height in character units7info%(5) reserved (window server id for default window)!info%(6) font id (FONT and gFONT)2info%(7) pixel width of text window character cell)info%(8) pixel height of text window line
  1253. info%(9), info%(10) reserved
  1254. Initially SCREENINFO returns the values for the initial text screen. Subsequently any keyword which changes the size of the text screen font, such as FONT, will change some of these values and SCREENINFO should therefore be called again.
  1255. See also FONT.x
  1256. .SECOND    s%=SECONDDReturns the current time in seconds from the system clock (0 to 59). Eg at 6:00:33 SECOND returns 33.
  1257. .SECSTODATEHSECSTODATE s&,var yr%,var mo%,var dy%,var hr%,var mn%,var sc%,var yrday%
  1258. Sets the variables passed by reference to the date corresponding to s&, the number of seconds since 00:00 on 1 January 1970. yrday% is set to the day in the year (1-366).qs& is an unsigned long integer. To use values greater than +2,147,483,647, subtract 4,294,967,296 from the value.7See also DATETOSECS, HOUR, MINUTE, SECOND, dDATE, DAYS.
  1259. .SEND
  1260. ret%=SEND(pobj%,m%,var p1,...)
  1261. Send a message to the object pobj% to call the method number m%, passing between zero and three arguments (p1...) depending on the requirements of the method, and returning the value returned by the selected method.
  1262. .SETNAME
  1263. SETNAME name$hSets the name of the running OPA to name$ and redraws any status window, using that name below the icon.
  1264. .SETPATH
  1265. SETPATH name$
  1266. Sets the current directory for file access - for example, SETPATH "a:\docs". LOADM continues to use the directory of the initial program, or the one specified by a OPA application, but all other file access will be to the new directory.
  1267. s=SIN(angle)9Returns the sine of angle, an angle expressed in radians.9To convert from degrees to radians, use the RAD function.n
  1268. .SPACE
  1269. s&=SPACE]Returns the number of free bytes on the device on which the current (open) data file is held.,
  1270. s=SQR(x)
  1271. Returns the square root of x.F
  1272. .STATUSWIN-STATUSWIN ON,type%
  1273. STATUSWIN ON
  1274. STATUSWIN OFF0Displays or removes a `permanent' status window.
  1275. If type%=1 the small status window is shown. If type%=2 the large status window is shown. STATUSWIN ON on its own displays an appropriate status window; on the Series 3a this will always be the large status window.
  1276. The permanent status window is behind all other OPL windows. In order to see it, you must use FONT (or both SCREEN and gSETWIN) to reduce the size of the text and graphics windows.OYou should ensure that your program does not create windows over the top of it.
  1277. .STATWININFO
  1278. t%=STATWININFO(type%,var xy%())
  1279. Sets xy%(1),xy%(2), xy%(3) and xy%(4) to the top left x, top left y, width and height respectively of the specified type of status window.
  1280. type%=1 is the small status window; type%=2 is the large status window; type%=3 is the Series 3 compatibility mode status window; type%=-1 is whichever status window is current.
  1281. STATWININFO returns t%, the type of the current status window (with values as for type%, or zero if there is no current status window).v
  1282. .STD%s=STD(list)
  1283. s=STD(array(),element):Returns the standard deviation of a list of numeric items.
  1284. The list can be either:F    
  1285.  A list of variables, values and expressions, separated by commas
  1286. or-    
  1287.  The elements of a floating-point array.
  1288. When operating on an array, the first argument must be the array name followed by (). The second argument, separated from the first by a comma, is the number of array elements you wish to operate on.eFor example m=STD(arr(),3) would return the standard deviation of elements arr(1), arr(2) and arr(3).QTo convert to population standard deviation, multiply the result by SQR((n-1)/n).%
  1289. .STOP
  1290. Ends the running program.
  1291. .STYLE
  1292. STYLE style%
  1293. Sets the text window character style for all characters subsequently written to the text window. style% can be 2 for underlined, or 4 for inverse. Any other styles are ignored as they would change the size of the characters.
  1294. .SUM%s=SUM(list)
  1295. s=SUM(array(),element)+Returns the sum of a list of numeric items.
  1296. The list can be either:F    
  1297.  A list of variables, values and expressions, separated by commas
  1298. or-    
  1299.  The elements of a floating-point array.
  1300. When operating on an array, the first argument must be the array name followed by (). The second argument, separated from the first by a comma, is the number of array elements you wish to operate on.VFor example m=SUM(arr(),3) would return the sum of elements arr(1), arr(2) and arr(3).
  1301. t=TAN(angle)<Returns the tangent of angle, an angle expressed in radians.9To convert from radians to degrees, use the DEG function.
  1302. .TESTEVENT
  1303. t%=TESTEVENT
  1304. Returns `True' if an event has occurred, otherwise returns `False'. The event is not read by TESTEVENT - it may be read with GETEVENT.
  1305. .TRAP
  1306. TRAP commandHTRAP is an error handling command. It may precede any of these commands:
  1307. Data file commandsZAPPEND, UPDATE, BACK, NEXT, LAST, FIRST, POSITION, USE, CREATE, OPEN, OPENR, CLOSE, DELETE
  1308. File commands<COPY, COMPRESS, ERASE, RENAME, LOPEN, LCLOSE, LOADM, UNLOADM
  1309. Directory commands
  1310. MKDIR, RMDIR
  1311. Data entry commands
  1312. EDIT, INPUT
  1313. Graphics commands8gSAVEBIT, gCLOSE, gUSE, gUNLOADFONT, gFONT, gPATT, gCOPY
  1314. For example, TRAP FIRST.
  1315. Any error resulting from the execution of the command will be trapped. Program execution will continue at the statement after the TRAP statement, but ERR will be set to the error code.
  1316. TRAP overrides any ONERR.y
  1317. .TYPE    TYPE num%\Sets the type of an OPA, from 0 to 4, with num%. This can only be used between APP and ENDA.
  1318. A Series 3a OPA should also add $1000 to the type if it has its own 48x48 pixel, black/grey icon (see the explanation of ICON for details).0    
  1319.  TYPE 0 (like Calc): The OPA uses no files.
  1320.  TYPE 1: Only one file is used. A type 1 OPA will look the same as a type 0. The only difference is that the type 1 is using a file, of the same name as the OPA.j    
  1321.  TYPE 2 (like World): You can have more than one file, but only one can be in use (bold) at any time.
  1322. When you pick a new file to use, its name becomes bold, and the one that was previously bold reverts to normal. What has actually happened is that the running OPA has switched files - it has not closed down, and no new copy of the OPA is run.
  1323.  TYPE 3 (like Data, Word, Agenda and Sheet): You can have more than one file, and any number may be open (bold) at a given time.
  1324. When you select a new file, one of the running OPAs normally switches to this file, as with type 2 OPAs. You can, however, with Shift-Enter, start a new OPA running just for this file, without a different file exiting.
  1325.  TYPE 4 (like RunOpl): Many files can be used, and any number may be in use at a given time. When you select a new file, a new version of the OPA is always run, to use the new file.
  1326. Types 3 and 4 allow more than one file to be in use (ie have their names in bold). When this happens a separate version of the OPA runs for each bold file. With types 0, 1 and 2, only one version of the OPA can be running at any time.
  1327. Initially, the OPA's name appears beneath the icon. If you move onto this and press Enter, file-based OPAs (types 1 to 4) will use a file of this name. Types 2, 3 and 4 allow you to create lists of files below the icon (with the `New file' option).EYou can also add any of these numbers to the value you use with TYPE:
  1328.  $8000 (-32768) stops the System screen's `New file' option from working, as for the RunOpl icon (translated OPL modules).
  1329.  $4000 (16384) stops the System screen from closing the OPA, as for the Time icon. You should not use this without a very good reason.
  1330.  $100 (8192) causes the System screen to terminate the OPA (when Delete is pressed) without sending a "quit" message, as for the RunOpl icon again. This should be used only for OPAs which have no data that could be lost by sudden termination.?
  1331. .UADD
  1332. i%=UADD(val1%, val2%)
  1333. Add val1% and val2%, as if both were unsigned integers with values from 0 to 65535. Prevents integer overflow for pointer arithmetic - eg UADD(ADDR(text$),1) should be used instead of ADDR(text$)+1.LOne argument would normally be a pointer and the other an offset expression.
  1334. See also USUB.[
  1335. .UNLOADLIB
  1336. ret%=UNLOADLIB(var cat%)6Unload a DYL from memory. If successful, returns zero.{
  1337. .UNLOADM
  1338. UNLOADM module$9Removes from memory the module module$ loaded with LOADM.Amodule$ is a string containing the name of the translated module.PThe procedures in an unloaded module cannot then be called by another procedure.
  1339. Note that it considered bad practice to unload a module containing procedures that are still running - eg. for a procedure to unload its own module.
  1340. .UNTIL
  1341. See DO.
  1342. .UPDATE
  1343. UPDATE~Deletes the current record in the current data file and saves the current field values as a new record at the end of the file.BThis record, now the last in the file, remains the current record.<Use APPEND to save the current field values as a new record.
  1344. .UPPER$
  1345. u$=UPPER$(a$)eConverts any lower case characters in a$ to upper case, and returns the completely upper case string.$Use LOWER$ to convert to lower case.
  1346. USE logical name
  1347. Selects the data file with the logical name A, B, C or D. The file must previously have been opened with OPEN, OPENR or CREATE and not yet be closed.XAll the record handling commands (such as POSITION or UPDATE) then operate on this file.
  1348. u%=USR(pc%,ax%,bx%,cx%,dx%)
  1349. Executes your machine code, returning an integer. The USR code (ie the assembler code you have written) must return with a far RET, otherwise the program will crash.
  1350. The values of of ax%,bx%... are passed to the AX, BX... 8086 registers. The microprocessor then executes the machine code starting at pc%. At the end of the routine, the value in the AX register is passed back to u%.UWARNING: Casual use of this function can result in the loss of data in the Series 3a.=This example shows a simple operation, ending with a far RET:
  1351. PROC trivial:
  1352. LOCAL t%(2),u%,ax%
  1353.  t%(1)=$c032  REM xor al,al
  1354.  t%(2)=$cb    REM retf     ax%=$1ab
  1355.  u%=usr(addr(t%(1)),ax%,0,0,0)
  1356.  REM returns (ax% AND $FF00)
  1357.  PRINT u% REM 256 ($100)
  1358. ENDP See also USR$, ADDR, PEEK, POKE.K
  1359. .USR$
  1360. u$=USR$(pc%,ax%,bx%,cx%,dx%)
  1361. Executes your machine code, returning a string. The USR$ code you have written must return with a far RET, otherwise the program will crash.
  1362. The values of of ax%,bx%... are passed to the ax, bx... 8086 registers. The microprocessor then executes the machine code starting at pc%.
  1363. At the end of the routine, the value in the ax register must point to a length-byte preceded string. This string is then copied to u$.UWARNING: Casual use of this function can result in the loss of data in the Series 3a.2See USR for an example. See also ADDR, PEEK, POKE.
  1364. .USUB
  1365. i%=USUB(val1%, val2%)
  1366. Subtract val2% from val1%, as if both were unsigned integers with values from 0 to 65535. Prevents integer overflow for pointer arithmetic.
  1367. See also UADD.)
  1368. v=VAL(numeric string)DReturns the floating-point number corresponding to a numeric string.
  1369. The string must be a valid number - eg not "5.6.7" or "196f". Expressions, such as "45.6*3.1", are not allowed. Scientific notation such as "1.3E10", is OK.
  1370. Eg VAL("470.0") returns 470.
  1371. See also EVAL.R
  1372. .VAR%v=VAR(list)
  1373. v=VAR(array(),element)0Returns the variance of a list of numeric items.
  1374. The list can be either:F    
  1375.  A list of variables, values and expressions, separated by commas
  1376. or-    
  1377.  The elements of a floating-point array.
  1378. When operating on an array, the first argument must be the array name followed by (). The second argument, separated from the first by a comma, is the number of array elements you wish to operate on.[For example m=VAR(arr(),3) would return the variance of elements arr(1), arr(2) and arr(3).ATo convert to population variance, multiply the result by (n-1)/n
  1379. .VECTOR'VECTOR I%
  1380. label1,label2,...
  1381. labelN
  1382. VECTOR I% jumps to label number i% in the list - if i% is 1 this will be the first label, and so on. The list is terminated by the ENDV statement.|The list may spread over several lines, with a comma separating labels in any one line but no comma at the end of each line.
  1383. If i% is not in the range 1 to N, where N is the number of labels, the program continues with the statement after the ENDV statement.
  1384. See also GOTO.
  1385. .WEEK
  1386. w%=WEEK(day%,month%,year%)YReturns the week number in which the specified day falls, as an integer between 1 and 53.Tday% must be between 1 and 31, month% between 1 and 12, year% between 1900 and 2155.
  1387. Each week is taken to begin on the `Start of week' day, as specified in the Time application. When a year begins on a different day, it counts as week 1 if there are four or more days before the next week starts.]
  1388. .WHILE...ENDWH%WHILE expression
  1389.  ...statements
  1390. ENDWH
  1391. Repeatedly performs the set of instructions between the WHILE and the ENDWH statement, so long as expression returns logical true - non-zero.SIf expression is not true, the program jumps to the line after the ENDWH statement.1Every WHILE must be closed with a matching ENDWH.
  1392. See also DO...UNTILb
  1393. .YEAR
  1394. y%=YEARSReturns the current year as an integer between 1900 and 2155 from the system clock.
  1395. Scanning the keyboard directly
  1396. CALL($288e,ADDR(scan%())) returns with the array scan%(), which must have at least 10 elements, containing a bit set for keys currently being pressed.
  1397. The following table lists each key (according to the text printed on the physical key itself), the scan%() array element for that key and the hexadecimal bit mask to be ANDed with that array element to check whether the key is being pressed.
  1398. KEY:        scan%    mask
  1399. System    5          $200
  1400. Data        4          $200
  1401. Word        6          $200
  1402. Agenda    2          $200
  1403. Time        1          $200
  1404. World        3          $200
  1405. Calc        2          $100
  1406. Sheet        1          $100
  1407. Esc        8          $100
  1408. 1        8          $02
  1409. 2        8          $04
  1410. 3        6          $40
  1411. 4        5          $04
  1412. 5        5          $08
  1413. 6        8          $08
  1414. 7        4          $40
  1415. 8        3          $08
  1416. 9        3          $10
  1417. 0        2          $10
  1418. +        2          $08
  1419. Delete        3          $01
  1420. Tab        1          $04
  1421. Q        7          $02
  1422. W        7          $20
  1423. E        6          $20
  1424. R        5          $02
  1425. T        5          $10
  1426. Y        1          $08
  1427. U        4          $20
  1428. I        3          $04
  1429. O        3          $20
  1430. P        2          $20
  1431. -        2          $04
  1432. Enter        1          $01
  1433. Control    3          $80
  1434. A        7          $04
  1435. S        7          $10
  1436. D        6          $10
  1437. F        6          $02
  1438. G        5          $20
  1439. H        8          $40
  1440. J        4          $10
  1441. K        3          $02
  1442. L        3          $40
  1443. *        2          $40
  1444. /        2          $02
  1445. Left shift    2          $80
  1446. Z        7          $08
  1447. X        7          $40
  1448. C        6          $08
  1449. V        6          $04
  1450. B        5          $40
  1451. N        1          $40
  1452. M        4          $08
  1453. ,        4          $02
  1454. .        8          $10
  1455. Up        8          $20
  1456. Right shift    4          $80
  1457. Psion        1          $80
  1458. Menu        6          $80
  1459. Diamond    5          $80
  1460. Space        5          $01
  1461. Help        4          $04
  1462. Left        1          $10
  1463. Down        1          $20
  1464. Right        1          $02
  1465. For example, pressing Tab sets bit 2 of scan%(1), pressing Control sets bit 7 of scan%(3) and pressing both together sets both these bits.
  1466. 'I/O calls: read cursor, set alarm, dial
  1467. LOCAL a%(6)
  1468. a%(1)=x1% :a%(2)=y1%
  1469. a%(3)=x2% :a%(4)=y2%)IOW(-2,8,a%(),a%()) REM 2nd a% is ignored
  1470. READS THE CURSOR POSITION in the rectangle x1%,y1% (top left), x2%,y2% (bottom right), writing the x and y positions to a%(5) and a%(6) respectively.
  1471. This returns 0,0, not 1,1, as the top left. Set x1%,y1%,x2%,y2% to the screen top left and bottom right (as set by SCREEN), to read the cursor position in the current screen.
  1472. r%=IOOPEN(h%,"ALM:",0)
  1473. IF r%<0 :RAISE r% :ENDIF
  1474. ...#IOC(h%,2,s%,a&(),#UADD(ADDR(b$),1))
  1475. IOCLOSE(h%)
  1476. SETS AN ALARM. a&() is an array of 2 long integers - the first is the time for the alarm to go off, and the second is the time for which the event is due. (Both are given in seconds since midnight on 1/1/1970.)Nb$ is the alarm message (up to 64 characters), which has been zero-terminated.
  1477. The parameter 2 means that the day and time are shown when the alarm rings. If you use 1 instead, only the date (and no time) is shown.GIf you press the Time button, such alarms are shown as `RunOpl' alarms.
  1478. At the moment the alarm rings, either s% must still be available to take the status word set by this ALM: function, or the program must have exited. (Otherwise the status word will be written to a random area of memory.)
  1479. r%=IOOPEN(h%,"SND:",0)
  1480. IF r%<0 :RAISE r% :ENDIF$r%=IOW(h%,10,#UADD(ADDR(b$),1),a%())
  1481. IF r%<0 :RAISE r% :ENDIF
  1482. r%=IOCLOSE(h%)
  1483. IF r%<0 :RAISE r% :ENDIFiDIALS A NUMBER WITH DTMF. b$ is the number to dial (up to 24 characters), which has been zero-terminated.
  1484. a%() is an array of 2 integers. The first is the tone length (*256) plus the delay length, and the second is the pause length. All of these are specified in 1/32s of a second.
  1485. Recording and playing sounds
  1486. Sound files have a .WVE extension. They contain a 32-byte header and a byte stream of digital sound at 8000 bytes per second (12-bit sound is converted to 8-bit using A-Law encoding).)The file header has the following format:
  1487. Offset    Bytes    Contents(0    16    0-terminated text "ALawSoundFile**"
  1488. 16    2    version of this format
  1489. 18    4    number of 8-bit samples
  1490. 22    2    trailing silence in ticks
  1491. 24    2    repeats(26    6    spare bytes reserved for future useBThe number of samples is the number of bytes following the header.
  1492. The silence in system ticks is appended to each repeat on playback (in practice, you get at least 2 ticks between repeats). A system tick is 1/32s or 250 samples.fThe repeats are the number of times to repeat the sound on playback (0 and 1 are treated as the same).
  1493. You can truncate the sound file, change the repeats and the trailing silence by changing the file length and header using IOOPEN, IOW, IOSEEK, IOWRITE etc. For example, you can truncate the file to length newLen& using:
  1494. ret%=IOW(handle%,11,newLen&,#0)UThe following set of procedures perform asynchronous recording and playing of sounds:
  1495. PROC recorda:(pstat%,f$,size%)
  1496.  LOCAL n$(128)
  1497.  n$=f$+chr$(0). CALL($2186,UADD(ADDR(n$),1),size%,0,0,pstat%)
  1498. ...RECORDS ASYNCHRONOUSLY TO FILE f$. Any existing file is replaced. You can only record to RAM-based disks. (You can playback from a Flash SSD, however.)
  1499. size% specifies the maximum number of bytes to be recorded in units of 2048 bytes. For one second size%=4. This figure excludes the 32-byte header.uBefore recording, a file of length 32+size%*2048 bytes is created and there must actually be room on the disk for it.`pstat% is the address of the status word to take the completion code for asynchronous recording.
  1500. PROC recordw%:(f$,size%)
  1501.  LOCAL name$(128),p%,ret%, p%=PEEKW($1c)+6  REM address of saved flags
  1502.  name$=f$+chr$(0)+ ret%=CALL($2286,UADD(ADDR(name$),1),size%), IF PEEKW(p%) AND 1  REM carry set for error'  RETURN ret% OR $FF00 REM return error
  1503.  ENDIF
  1504. ENDP6...RECORDS SYNCHRONOUSLY TO FILE f$, in a similar way.
  1505. PROC recordc:
  1506.  CALL($2386)
  1507. ENDPTCANCELS RECORDING and truncates the file to the length recorded before cancellation.
  1508. PROC playa:(pstat%,f$,t%,vol%)
  1509.  LOCAL n$(128)
  1510.  n$=f$+chr$(0). CALL($1E86,UADD(ADDR(n$),1),t%,vol%,0,pstat%)
  1511. ENDPk...PLAYS f$ ASYNCHRONOUSLY. (f$ can be a `*' followed by just the name of the sound file. .WVE is assumed.)
  1512. The file is searched for (in order) in the ROM, then in the \WVE directories of M: (Internal disk), A: and B:. (The ROM:: .WVE files have names SYS$AL01 and SYS$AL02.)
  1513. t% is the duration to play back, in system ticks. If shorter than the sound, playback is truncated to that time. If t% is negative, in addition to truncating longer files, it pads out as necessary to that duration with silence.
  1514. If duration is zero, it plays the file without truncation or padding. (Alarms use the value -480 to truncate or pad out to 15 seconds.)
  1515. vol% is between 0 and 5 inclusive, with 0 being the loudest. On the Series 3a there are only 4 levels: 0/1, 2, 3, and 4/5. pstat% is the address of the status word to take the completion code for asynchronous playback.
  1516. PROC playw%:(f$,ticks%,vol%)
  1517.  LOCAL n$(128),p%,ret%0 p%=PEEKW($1c)+6 REM address of flags after CALL
  1518.  n$=f$+chr$(0). ret%=CALL($1F86,UADD(ADDR(n$),1),ticks%,vol%)/ IF PEEKW(p%) AND 1     REM carry set for error'  RETURN ret% OR $FF00 REM return error
  1519.  ENDIF
  1520. ...PLAYS f$ SYNCHRONOUSLY.
  1521. PROC playc:
  1522.  CALL($2086)
  1523. ENDP ...CANCELS PLAYING BACK A SOUND.Y
  1524. Foreground and background
  1525.  CALL ($6c8d) tells the Series 3a to send a "machine switch on" event to the current program, whenever the Series 3a switches on, even if this program is in the background. If required, use it just once at the start of your program.C    
  1526.  CALL($198d,0,0) brings the current program to the foreground.9    
  1527.  CALL($198d,100,0) sends it to the background again.SEach of these should be followed by gUPDATE to ensure they take effect immediately.
  1528. Note: when a program runs in the background it can stop the "automatic turn off" feature from working. However, as soon as the program waits for a keypress or an event, with GET/GET$ or GETEVENT, auto-turn off can occur.
  1529. Auto-turn off can also occur if the program does a PAUSE (of 2 or more 20ths of a second), but only if the program has used CALL($138b) ("unmark as active")
  1530. "Serial/parallel ports and printing
  1531. LOPEN opens a serial port, parallel port or file, and LPRINT then sends text to it. (You can't access the advanced page formatting and font features from OPL.)
  1532. LOPEN "TTY:A" opens the serial port with these default characteristics: 9600 baud, no parity, 8 data bits, 1 stop bit, RTS handshaking. (Note: printers often use DSR (DSR/DTR) handshaking.)+Set up the serial port with this procedure:2PROC rsset:(baud%,parity%,data%,stop%,hand%,term&)#LOCAL frame%,srchar%(6),dummy%,err%
  1533. frame%=data%-5&IF stop%=2 :frame%=frame% OR 16 :ENDIF&IF parity% :frame%=frame% OR 32 :ENDIF
  1534. srchar%(1)=baud% OR (baud%*256)"srchar%(2)=frame% OR (parity%*256)#srchar%(3)=(hand% AND 255) OR $1100
  1535. srchar%(4)=$13
  1536. POKEL ADDR(srchar%(5)),term& err%=IOW(-1,7,srchar%(1),dummy%)
  1537. IF err% :RAISE err% :ENDIF
  1538. Pass these values:
  1539. value    Baud
  1540. 3    110
  1541. 4    134
  1542. 5    150
  1543. 6    300
  1544. 7    600
  1545. 8    1200
  1546. 9    1800
  1547. 10    2000
  1548. 11    2400
  1549. 12    3600
  1550. 13    4800
  1551. 14    7200
  1552. 15    9600
  1553. 16    19200
  1554. value    parity
  1555. 0    NONE
  1556. 1    EVEN
  1557. 2    ODD
  1558. data bits: 5, 6, 7 or 8
  1559. stop bits: 2 or 1
  1560. value    handshaking
  1561. 11    ALL
  1562. 4    NONE
  1563. 7    XON
  1564. 0    RTS    3    XON+RTS
  1565. 12    DSR
  1566. 15    XON+DSR    8    RTS+DSR
  1567. !To READ from the serial port use:MIOW(-1,1,buffer,maxlen). (The -1 tells I/O keywords to use the LOPEN handle.)
  1568. The read terminates only after reading exactly maxlen bytes, UNLESS you specifying a terminating mask (term&) when setting up the port with rsset:.
  1569. The 32 bits of term& each represent an ASCII character from 1 to 31 which should terminate the read, after it is read into the buffer. For example, to terminate on Control-Z or [CR], set bits 26 and 13 - &04002000 in hex - as in:
  1570.     rsset:(11,0,8,1,0,&04002000)'You can then read up to 255 bytes with:        len%=255(    ret%=IOW(-1,1,#UADD(ADDR(buf$),1),len%)Elen% is then the length actually read, including any terminator char.
  1571. OPAs and the System screen
  1572. To make an OPA, your OPL file should begin with the APP/ENDA construction. Between APP and ENDA you may use any or all of the OPA keywords PATH, EXT, ICON and TYPE.ZA translated OPA is saved in a \APP directory, and the "Install" menu option will list it.
  1573. (If you previously translated the module without the APP...ENDA at the start, the old translated version will still be listed under the RunOpl icon, and should be deleted.)
  1574. Once installed, file-based OPAs are shown with the list of available files, if any are found. Otherwise, the name given with the APP keyword appears below the icon.
  1575. When a file-based OPA starts running it should first call CMD$(2), for the full name of the file to use, then CMD$(3), which returns "C" for "Create" or "O" for "Open".
  1576. All file-based OPAs (types 1 to 4) should create or open the file as specified; if a "Create" fails because the file exists already, or an "Open" fails because it does not, OPL raises the error, and the OPA should take suitable action.
  1577. When the System screen wants an OPA to exit or to switch files (eg when you press Delete to stop a running OPA, or select a new file for a type 2 or 3 OPA), it tells the OPA via an event.
  1578. If TESTEVENT returns non-zero, an event has occurred, and can be read with GETEVENT. All types of OPA MUST use these keywords to check both for keypresses and for events.
  1579. If the event is a System message to change files or quit, a%(1)=$404. Use GETCMD$ as soon as possible. It returns a string, whose first character is "C", "O" or "X". (If it is "C" or "O", the rest of the string is a filename.)
  1580. You should close the current file (if any) and then either create the new file ("C"), open it ("O"), or exit. You can only call GETCMD$ once for each event.
  1581. If an OPA lets you change files with its own `Open file' option, it should always use SETNAME to inform the System screen of the new filename.
  1582. Whenever creating a file, an OPA should first use PARSE$ to find the disk and directory requested. It should then use TRAP MKDIR to ensure that the directory exists.
  1583. Note: events are ignored while you are using keywords which pause the execution of the program - GET, GET$, EDIT, INPUT, PAUSE, MENU and DIALOG. Use LOCK ON / LOCK OFF around these keywords to prevent the System screen from sending messages.5
  1584. Calling procedures by strings
  1585. Procedures can be called using a string expression for the procedure name. Use an @, optionally followed by a character to show what type of value is returned - for example, % for an integer. Follow this with the string expression in brackets.+You can use upper or lower case characters.HHere are examples showing the four types of value which can be returned:'i% = @%(name$):(parameters) for integer,l& = @&(name$):(parameters) for long integer&s$ = @$(name$):(parameters) for string,f = @(name$):(parameters) for floating-point
  1586. Data files
  1587. When you change or delete records in a data file on `Internal' or on a RAM SSD, the space used by the old information is recovered when you close the file.+To prevent this data file compression, use:
  1588.     p%=PEEKW($1c)+$1e
  1589.     POKEW p%,PEEKW(p%) or 1
  1590. You could then use the COMPRESS keyword to compress the file later. (To compress a data file on Flash, you have to use COMPRESS.
  1591. To re-enable the compression:
  1592.     p%=PEEKW($1c)+$1e
  1593.     POKEW p%,PEEKW(p%) and $fffe
  1594. ?You can open a data file made by the Database application - eg:&    OPEN "\dat\data.dbf",A,a$,b$,c$,d$...
  1595.  You can use up to 32 field variables, all strings. Any further fields in a record are inaccessible, and cannot be changed by OPL.Z    
  1596.  If a record is longer than 255 characters it appears as more than one record to OPL.Y    
  1597.  If a record is longer than 1022 characters a `Record too large' error (-43) occurs.8The Database application can open an OPL data file - eg:
  1598.     \opd\example.odb%as long as it only has string fields.
  1599. The text and graphics windows
  1600. ?The text window is in fact part of the default graphics window.
  1601. The FONT keyword first sets the default graphics window as large as possible (excluding any status window), then resizes the text window to be as many whole character widths/heights as possible inside it.
  1602. You shouldn't normally mix text and graphics windows. If you need to - for example to use keywords like EDIT in a graphical program - use one of these methods:K    
  1603.  Use SCREEN to put the text window out of the way of graphics windows.
  1604.  Use gSETWIN and gORDER 1 to set the default graphics window at a suitable size and position, then SCREEN to place the text window inside it.<
  1605. Error messages
  1606. ^These are the numbers of the errors which OPL can raise, and the message associated with them:
  1607. -1     General failure
  1608. -2     Invalid arguments
  1609. -3     O/S error
  1610. -4     Service not supported
  1611. -5    Underflow (number too small)
  1612. -6    Overflow (number too large)
  1613. -7    Out of range
  1614. -8    Divide by zero8-9    In use (eg serial port being used by another program)
  1615. -10    No system memory)-13    Process table full/Too many processes
  1616. -14    Resource already open
  1617. -15    Resource not open
  1618. -16    Invalid image/device file
  1619. -17    No receiver
  1620. -18    Device table full8-19    File system not found (eg if you unplug cable to PC)
  1621. -20    Failed to start
  1622. -21    Font not loaded
  1623. -22    Too wide (dialogs)
  1624. -23    Too many items (dialogs)'-24    Batteries too low for digital audio'-25    Batteries too low to write to Flash
  1625. File and device errors
  1626. -32    File already exists
  1627. -33    File does not exist
  1628. -34    Write failed
  1629. -35    Read failed7-36    End of file (when you try to read past end of file)
  1630. -37    Disk full
  1631. -38    Invalid name0-39    Access denied (eg to a protected file on PC)
  1632. -40    File or device in use
  1633. -41    Device does not exist
  1634. -42    Directory does not exist
  1635. -43    Record too large
  1636. -44    Read only file
  1637. -45    Invalid I/O request
  1638. -46    I/O operation pending!-47    Invalid volume (corrupt disk)
  1639. -48    I/O cancelled
  1640. -50     Disconnected
  1641. -51     Connected
  1642. -52    Too many retries
  1643. -53    Line failure
  1644. -54    Inactivity timeout
  1645. -55    Incorrect parity8-56    Serial frame (usually because Baud setting is wrong)9-57    Serial overrun (usually because Handshaking is wrong)"-58    Cannot connect to remote modem
  1646. -59    Remote modem busy
  1647. -60    No answer from remote modeml-61    Number is black listed (you may try a number only a certain number of times; wait a while and try again)
  1648. -62    Not ready
  1649. -63    Unknown media (corrupt SSD)j-64    Root directory full (on any device, the root directory has a maximum amount of memory allocated to it)
  1650. -65    Write protected
  1651. -66    Media is corrupt
  1652. -67     User abandoned
  1653. -68     Erase pack failure
  1654. -69     Wrong file type
  1655. Translator errors
  1656. -70    Missing "
  1657. -71    String too long
  1658. -72    Unexpected name
  1659. -73    Name too long
  1660. -74    Logical device must be A-D
  1661. -75    Bad field name
  1662. -76    Bad number
  1663. -77    Syntax error
  1664. -78    Illegal character
  1665. -79    Function argument error
  1666. -80    Type mismatch
  1667. -81    Missing label
  1668. -82    Duplicate name
  1669. -83    Declaration error
  1670. -84    Bad array size
  1671. -85    Structure fault
  1672. -86    Missing endp
  1673. -87    Syntax Error
  1674. -88    Mismatched ( or )
  1675. -89    Bad field list
  1676. -90    Too complex
  1677. -91    Missing ,
  1678. -92    Variables too large
  1679. -93    Bad assignment
  1680. -94    Bad array index$-95    Inconsistent procedure arguments
  1681. OPL specific errors5-96    Illegal Opcode (corrupt module - translate again)J-97    Wrong number of arguments (to a function or parameters to a procedure)T-98    Undefined externals (a variable has been encountered which hasn't been declared)
  1682. -99    Procedure not found
  1683. -100    Field not found
  1684. -101    File already open
  1685. -102    File not open?-103    Record too big (data file contains record too big for OPL)1-104    Module already loaded (when trying to LOADM)2-105    Maximum modules loaded (when trying to LOADM)1-106    Module does not exist (when trying to LOADM)C-107    Incompatible translator version (OPL file needs retranslation)/-108    Module not loaded (when trying to UNLOADM)6-109    Bad file type (data file header wrong or corrupt)5-110    Type violation (passing wrong type to parameter)9-111    Subscript or dimension error (out of range in array)
  1686. -112    String too long/-113    Device already open (when trying to LOPEN)
  1687. -114    Escape key pressed!-115    Incompatible runtime version
  1688. -116    ODB file(s) not closedF-117    Maximum drawables open (maximum 8 windows and/or bitmaps allowed)
  1689. -118    Drawable not open<-119    Invalid Window (window operation attempted on a bitmap)4-120    Screen access denied (when run from Calculator)
  1690. File extensions and directories
  1691. EFiles are saved in these directories, and with these file extensions:
  1692. File type        Dir.        Ext.
  1693. Database        \DAT        .DBF
  1694. Agenda        \AGN        .AGN
  1695. World            \WLD        .WLD
  1696. Spreadsheet        \SPR        .SPR
  1697. Word            \WRD        .WRD
  1698. Printer drivers    \WDR        .WDR
  1699. Word templates    \WDR        .WRT
  1700. Sound files        \WVE        .WVE
  1701. OPL modules        \OPL        .OPL
  1702. Translated modules    \OPO        .OPO
  1703. Other OPL files    \OPD        .ODB&Programs/OPAs    \APP,\IMG    .APP,.IMG,.OPA
  1704. Groups/lists        \APP        .ALS,.GRP
  1705. Hexadecimals
  1706. To enter integer hexadecimal constants (16 bit) put a $ in front of them. For example $FF is 255 in decimal. (Don't confuse this use of $ with string variable names.)xTo enter long integer hexadecimal constants (32 bit) put a & in front of them. For example &FFFFF is 1048575 in decimal.
  1707. All hexadecimal constants are integers ($) or long integers (&). So arithmetic operations involving hexadecimal numbers behave in the usual way. For example, &3/&2 returns 1, &3/2.0 returns 1.5, 3/$2 returns 1.
  1708. Operators and expressions
  1709. ARITHMETIC OPERATORS:
  1710. +    add
  1711. -    subtract
  1712. *    multiply    /     divide
  1713. **     raise to a power$-     unary minus (in negative numbers)    %    percent
  1714. COMPARISON OPERATORS:
  1715. >    greater than
  1716. >=    greater than or equal to
  1717. <    less than
  1718. <=    less than or equal to
  1719. =    equal to
  1720. <>     not equal to
  1721. LOGICAL AND BITWISE OPERATORS:
  1722. NOTuWhen used with floating-point numbers they are logical operators; when used with integers they are bitwise operators.dA quick way of calculating NOT for integers is to add 1 to the original number and reverse its sign.
  1723. THE % OPERATOR:"60+5%    60 plus 5% of 60. Result: 63#60-5%    60 minus 5% of 60. Result: 57
  1724. 60*5%    5% of 60. Result: 3,60/5%    what number is 60 5% of. Result: 1200.B105>5%    what number, when increased by 5%, becomes 105. Result: 1003105<5%    how much of 105 was a 5% increase. Result: 5
  1725. PRECEDENCE OF OPERATORS:
  1726. Highest:    **
  1727.         - (unary minus)  NOT
  1728.         *  /
  1729.         +  -
  1730.         =  >  <  <>  >=  <=
  1731. Lowest:    AND  OR
  1732. In an expression where all operators have equal precedence, they are evaluated from left to right (with the exception of powers). You can always change precedence with brackets.
  1733. If you mix floating-point and integer values in expressions, OPL uses the simplest arithmetic possible for each part of the calculation, then finally converts the evaluted result to the same type as the variable to which it is assigned.
  1734. If you assign a floating-point value to an integer variable, the value is converted to an integer, always rounded towards zero.8
  1735. Character set and key codes
  1736. [dec] [hex] [char]
  1737. 32 20      33 21 !    34 22 "    35 23 #
  1738. 36 24 $    37 25 %    38 26 &    39 27 '
  1739. 40 28 (    41 29 )    42 2A *    43 2B +
  1740. 44 2C ,    45 2D -    46 2E .    47 2F /
  1741. 48 30 0    49 31 1    50 32 2    51 33 3
  1742. 52 34 4    53 35 5    54 36 6    55 37 7
  1743. 56 38 8    57 39 9    58 3A :    59 3B ;
  1744. 60 3C <    61 3D =    62 3E >    63 3F ?
  1745. 64 40 @    65 41 A    66 42 B    67 43 C
  1746. 68 44 D    69 45 E    70 46 F    71 47 G
  1747. 72 48 H    73 49 I    74 4A J    75 4B K
  1748. 76 4C L    77 4D M    78 4E N    79 4F O
  1749. 80 50 P    81 51 Q    82 52 R    83 53 S
  1750. 84 54 T    85 55 U    86 56 V    87 57 W
  1751. 88 58 X    89 59 Y    90 5A Z    91 5B [
  1752. 92 5C \    93 5D ]    94 5E ^    95 5F _
  1753. 96 60 `    97 61 a    98 62 b    99 63 c#100 64 d    101 65 e    102 66 f    103 67 g#104 68 h    105 69 i    106 6A j    107 6B k#108 6C l    109 6D m    110 6E n    111 6F o#112 70 p    113 71 q    114 72 r    115 73 s#116 74 t    117 75 u    118 76 v    119 77 w#120 78 x    121 79 y    122 7A z    123 7B {#124 7C |    125 7D }    126 7E ~    127 7F 
  1754. #128 80 
  1755.     129 81 
  1756.     130 82 
  1757.     131 83 
  1758. #132 84 
  1759.     133 85 
  1760.     134 86 
  1761.     135 87 
  1762. #136 88 
  1763.     137 89 
  1764.     138 8A 
  1765.     139 8B 
  1766. #140 8C 
  1767.     141 8D 
  1768.     142 8E 
  1769.     143 8F 
  1770. #144 90 
  1771.     145 91 
  1772.     146 92 
  1773.     147 93 
  1774. #148 94 
  1775.     149 95 
  1776.     150 96 
  1777.     151 97 
  1778. #152 98 
  1779.     153 99 
  1780.     154 9A 
  1781.     155 9B 
  1782. #156 9C 
  1783.     157 9D 
  1784.     158 9E 
  1785.     159 9F 
  1786. #160 A0 
  1787.     161 A1 
  1788.     162 A2 
  1789.     163 A3 
  1790. #164 A4 
  1791.     165 A5 
  1792.     166 A6 
  1793.     167 A7 
  1794. #168 A8 
  1795.     169 A9 
  1796.     170 AA 
  1797.     171 AB 
  1798. #172 AC 
  1799.     173 AD 
  1800.     174 AE 
  1801.     175 AF 
  1802. #176 B0 
  1803.     177 B1 
  1804.     178 B2 
  1805.     179 B3 
  1806. #180 B4 
  1807.     181 B5 
  1808.     182 B6 
  1809.     183 B7 
  1810. #184 B8 
  1811.     185 B9 
  1812.     186 BA 
  1813.     187 BB 
  1814. #188 BC 
  1815.     189 BD 
  1816.     190 BE 
  1817.     191 BF 
  1818. #192 C0 
  1819.     193 C1 
  1820.     194 C2 
  1821.     195 C3 
  1822. #196 C4 
  1823.     197 C5 
  1824.     198 C6 
  1825.     199 C7 
  1826. #200 C8 
  1827.     201 C9 
  1828.     202 CA 
  1829.     203 CB 
  1830. #204 CC 
  1831.     205 CD 
  1832.     206 CE 
  1833.     207 CF 
  1834. #208 D0 
  1835.     209 D1 
  1836.     210 D2 
  1837.     211 D3 
  1838. #212 D4 
  1839.     213 D5 
  1840.     214 D6 
  1841.     215 D7 
  1842. #216 D8 
  1843.     217 D9 
  1844.     218 DA 
  1845.     219 DB 
  1846. #220 DC 
  1847.     221 DD 
  1848.     222 DE 
  1849.     223 DF 
  1850. #224 E0 
  1851.     225 E1 
  1852.     226 E2 
  1853.     227 E3 
  1854. #228 E4 
  1855.     229 E5 
  1856.     230 E6 
  1857.     231 E7 
  1858. #232 E8 
  1859.     233 E9 
  1860.     234 EA 
  1861.     235 EB 
  1862. #236 EC 
  1863.     237 ED 
  1864.     238 EE 
  1865.     239 EF 
  1866. #240 F0 
  1867.     241 F1 
  1868.     242 F2 
  1869.     243 F3 
  1870. #244 F4 
  1871.     245 F5 
  1872.     246 F6 
  1873.     247 F7 
  1874. #248 F8 
  1875.     249 F9 
  1876.     250 FA 
  1877.     251 FB 
  1878. !252 FC 
  1879.     253 FD 
  1880.     254 FE 
  1881.     255 FF
  1882.  Other characters:
  1883.  0 - Carriage Return symbol
  1884.  1 - three dots (ellipsis)
  1885.  2 - Psion symbol
  1886.  5 - phone
  1887.  6 - padlock
  1888.  14 - broken dash, 16/17/24/25 - fat left/right/up/down arrows? 18-23 - pairs of left/right rounded ends, in hollow/grey/black
  1889.  26/27 - thin left/right arrows
  1890.  28 - right-pointing triangle
  1891.  29 - bell
  1892.  30 - stubby up arrow
  1893. Any of the characters in the character set can be entered directly from the keyboard - hold down the Control key and type the 3-digit code, then release the Control key. (Add preceding zeros if necessary to make a code three digits long.)
  1894. The GET and KEY functions return the character code of the key that was pressed. Some of the keys are not in the character set. They return these numbers:
  1895. Esc    27    Tab    9
  1896. Delete    8    Enter    13
  1897. Up    256    Down    257
  1898. Right    258    Left    259
  1899. Pg Up    260     Pg Dn    261
  1900. Home    262     End    263
  1901. Menu    290     Help    291
  1902. Diamond 292]The Psion key adds 512 to the value of the key pressed. For example, Psion-a is 609 (512+97).
  1903. /These values can be used with PRINT and CHR$():
  1904. 7    beep
  1905. 8    backspace
  1906. 9    tab
  1907. 10    line feed
  1908. 12    form feed (clear screen)-13    carriage return (cursor to left of window)
  1909. ROM::BJ.WDR
  1910. name:
  1911. info:
  1912.