OFFICIAL DOC

From Atari Wiki
Revision as of 12:59, 15 October 2006 by Tompee (talk | contribs) (categorise)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
August 1991

No part of this publication may be copied ,  transmitted or stored 
in  a retrieval system or reproduced in any way including but  not 
limited  to photography,  photocopy,  magnetic or other  recording 
means,  without prior written permission from the publishers, with 
the  exception of material entered and executed for  the  reader's 
own use.

This version created for ST FORMAT.

THIS IS NOT PUBLIC DOMAIN. FULL COPYRIGHT REMAINS IN FORCE.


MARCH 1992

Copyright 1991 GFA Data Media (UK) Ltd

Published by:  GFA Data Media (UK) Ltd
               Box 121
               Wokingham
               Berkshire
               RG11 5XT

Special Offer to ST Format Readers

This  document  is  over  129 pages if  printed  on  A4.  We  have 
documented  all  GFA-BASIC  commands.  All  commands  are also
contained in the full GFA-BASIC REFERENCE manual which contains  
much more information than is contained in this  'brief' document.
Most commands are fully explained with an example program.


You  can obtain the FULL documentation,  normally sold  for  50.00 
pounds for only 25.00 pounds (plus 5.00 postage).  All orders must 
be returned direct to GFA,  using the special coupon in the  issue 
of ST Format that this disk was supplied with.

Also you can obtain the GFA-BASIC Compiler 3.5 and manual for only 
20.00  (plus  postage of 5.00).  (normally  30.00).  The  compiler 
manual  contains 48 pages.  You will need the compiler to  produce 
desk top accessories and link C and assembler code into your  GFA-
BASIC programs.

Or  order both the Interpreter and Compiler for only  45.00  (plus 
5.00 postage) which would normally retail for 80.00.  


Please  make  Cheques  and  Postal  Orders  payable  to   GFA-DATA 
MEDIA (UK) LTD. We also can accept VISA and ACCESS credit cards.




TECHNICAL SUPPORT

Technical  Support is only available to users who  have  purchased 
the full GFA-BASIC 3.5 Interpreter.  All technical problems should 
be sent to GFA in writing, enclosing a stamped addressed envelope, 
and  quoting  their registration card number (supplied  with  each 
purchased  product).  Sorry but we are unable to supply  technical 
support  to  users  who are unable  to  quote  their  registration 
number.

Now to the documentation:

Introduction

Welcome to GFA-BASIC.  With the GFA-BASIC interpreter you now have 
the opportunity to explore the Atari ST,  and create  professional 
programs.

We  believe that GFA is the best programming  language  available, 
not  just for the Atari ST,  but also for the  Amiga,  MS-DOS  and 
Windows 3.0/3.1.  When you have quickly mastered GFA-BASIC for the 
Atari ST,  you can transport your program to any PC running either 
MS-DOS or Windows (and soon OS/2 and Unix!).  This means that  you 
will  only  need  to learn one language for  all  these  different 
machines and operating systems. 

This  manual contains all the GFA-BASIC 3.5  command  descriptions 
and syntax. This manual is an edited version of the full reference 
manual (which is over 540 pages) and is a reference manual for the 
GFA-BASIC  commands  only.  The  full  reference  manual  contains 
example  programs for most of the commands and reference  material 
for the Atari BIOS, XBIOS and GEMDOS.

This manual is a reference manual for the GFA-BASIC  commands.  It 
does  not attempt to teach you to program,  there are other  books 
available for this purpose.  Neither does this edited manual  does 
not  document  the hardware or operating system  features  of  the 
Atari.

This is the GFA-BASIC Interpreter. There are many more products in 
the  GFA range to help you develop your programs.  Please  contact 
your  distributor or GFA for more information and prices of  these 
products.

GFA-BASIC Interpreter Reference Manual (Full version)

This  loose  leaf manual has over 540  pages,  dealing  with  each 
command  with  a full description an  example.  The  Atari  system 
routines,  GEMDOS, AES, VDI and GDOS are all described. The Line-A 
call  is  also described (although Line-A is now  declared  as  un 
supported by Atari). Just about every useful table is presented in 
this  manual,  including  GFA-BASIC  error  messages,  Bomb  Error 
messages,  TOS Error messages, Scan code table, ASCII tables, Fill 
and style patterns, and VT-52 control codes.

GFA-BASIC Compiler 

The  GFA-BASIC  Compiler will compile your interpreter  code  into 
fast stand alone programs. Desk top accessories can also be easily 
created.  The  GFA-BASIC Compiler also has options for  optimising 
code  for  either  speed or  size.  External  code,  either  C  or 
assembler  can  also be linked into your programs using  the  GFA-
BASIC Compiler. The manual (48 pages) fully explains how to create 
a desk top accessory with examples. The compiler also supports the 
Atari TT, allowing code to be compiled for either ST or TT ram.

GFA-BASIC Software Development Book

This  book  covers  in  depth  structured  programming,  debugging 
routines, Line A calls, Assembly routines, AES functions and GDOS. 
Special attention is paid to dialog boxes and their creation. This 
book  is over 341 pages and is supported by a disk containing  the 
many examples of source code discussed within the book.

GFA GEM Utility Pack

THE  GEM GUP is a framework of GFA-BASIC 3 routines that  you  can 
merge  into  your own programs.  GUP takes the  responsibility  of 
managing  the intricate GEM interface,  leaving the programmer  to 
concentrate  on  the  main  program  logic.  The  example  program 
supplied demonstrates how easy it is to create alternative  icons, 
and  use up to 5 different window types.  The  demonstration  also 
shows how to use all the GEM gadgets, including scroll bars, title 
bar, info bar, grow box, grab bar etc. GFA GUP is a quick start to 
programming GEM.  GUP is supplied with a 60 page manual and  disk, 
fully documenting all of the GEM routines. 

GFA Assembler

An integrated development tool for the Atari  ST/STE,  comprising 
editor,  macro assembler,  linker and debugger. Supports multiple 
window,  file compare,  background assembly. Editor checks syntax 
of  machine  code on entry,  hence ideal for programmers  new  to 
assembly language. Also creates files that can be loaded directly 
into GFA-BASIC.

GFA-Basic and Assembler User Book

This  book covers all that you will need to know  in  interfacing 
assembler routines into GFA-BASIC on the Atari  ST/STE.  Includes 
an introduction into assembly programming,  creation of desk  top 
accessories, graphic manipulation. Book (364 pages) plus disk.

GFA G-Shell

Professional  development  shell for  GFA-BASIC  Interpreter  and 
Compiler  on the Atari ST/STE and TT.  
GFA-GShell allows the programmer to  skip between Interpreter  and 
Compiler  and other programs,  such as an assembler  and  resource 
editor.   Supports make facility and  on line help files.  If  you 
are using GFA-BASIC Interpreter and Compiler professionally,  then 
GFA-GShell will improve your productivity.

GFA-DRAFT 3.2      

Powerful  and  comprehensive,  yet easy to use CAD  software  for 
Atari ST/STE and Atari TT.  Runs in both high and medium  resolu-
tions.  Icon and menu driven commands. There are symbol libraries 
for  electrical,  electronic users and architects.  Libraries  of 
symbols are also easy to create. 

A  program/macro interface (using GFA BASIC) will enable  you  to 
create complex forms and repetive patterns.  Exports:  HPGL,  DXF 
and  GEM  files.  Will  support almost any model  of  printer  or 
plotter.  GFA-Draft  Plus  3.2  also  supports  the  Atari  laser 
printer.


These GFA products and others are available from:

GFA Data Media (UK) Ltd
Box 121
Wokingham
Berkshire
UK RG11 5XT

Sales Line Only     Tel: 44 (0)734 794941
                    Fax: 44 (0)734 890782




Using GFA-BASIC for the first time

The GFA-BASIC program disk is not copy protected, so before you do 
anything else,  make a copy and store the original disk in a  safe 
place. 

GFA-BASIC  is started by double clicking on the program file  icon 
GFABASIC.PRG.  After  a  short  while the Editor  screen  will  be 
displayed,  which is where you can write and debug your  programs. 
Lets  now  try entering an example program.  Enter  the  following 
program lines, pressing the RETURN key at the end of each line.

DEFFILL 1,2,8
REPEAT
  WHILE MOUSEK=1
    PBOX MOUSEX,MOUSEY,MOUSEX+30,MOUSEY+30
  WEND
UNTIL MOUSEK=2

In the upper right hand corner of the editor screen you will find 
the RUN menu item. Click the RUN button or press Shift and F10 
keys together and the example program will start. A simple program 
showing the use of the mouse. Move the mouse while holding down 
the left button. End the program by pressing the right mouse 
button. Press the Return key to end the program. The program could 
also have been stopped by pressing the CONTROL, SHIFT and 
ALTERNATE keys all at the same time. You will now be returned to 
the editor.

GFA-BASIC does not need line numbers. It is bad programming 
practice to say GOTO 10. If you must use GOTO, then use:

GOTO label
...
label:

GFA-BASIC offers you the chance to create structured programs, and 
indented   in  such  a  way  to  enable  easy  documentation   and 
understanding of program flow.

How  to proceed from here.  We suggest you first  become  familiar 
with  the GFA-BASIC Interpreter's editor.  Then load some  of  the 
demonstration  programs from the disk and  run  these.  Experiment 
with these programs by changing the values of variables to see the 
effect.  The  next step really depends upon the  individual,  your 
knowledge  of the Atari,  your knowledge of programming  and  your 
program requirements.  What ever your experience or  requirements, 
GFA-BASIC  is the best documented programming  language  available 
for the Atari ST, and there are several books and development aids 
to help you.



The Editor

THE GFA-BASIC Editor has been specially designed for program 
development. Syntax errors are recognised as you type the commands 
in, and in addition the commands are indented automatically.

Only one instruction per line is allowed, but a comment may be 
added to the end of a line by beginning the comment with a ! mark.

Program lines may be up to 255 characters long, but when a line 
exceeds 80 characters, the line will scroll.


Cursor Keypad

Left arrow          moves cursor left one character
Right arrow         moves cursor right one character
Up arrow            moves cursor up one line
Down arrow          moves cursor down one line

Insert              Inserts a blank line
ClrHome             moves cursor to top left corner
Ctrl ClrHome        moves cursor to start of program listing

Help                With the help key procedures and functions can 
                    be folded and unfolded. Move the cursor to the 
                    start of a procedure or function and then 
                    press Help. The procedure will the fold down 
                    to a single line

Numeric Keypad

Ctrl 4              moves cursor left one character
Ctrl 6              moves cursor right one character
Ctrl 8              moves cursor up one line
Ctrl 2              moves cursor down one line
Ctrl 7              jumps to start of program
Ctrl 1              jump to end of program
Ctrl 9              move one page up
Ctrl 3              move one page down
Ctrl 0              Inserts a line
Ctrl .              deletes a line

The numeric keypad can be swithed to a mode where it is not 
required to press the Ctrl key. This mode is toggled on and off by 
pressing Ctrl and - on the numeric keypad. 

Delete              deletes character at cursor position
Backspace           deletes character to left of cursor
Tab                 moves cursor right eight characters
Ctrl Tab            moves cursor left eight characters
Return              moves cursor to start of next line
Enter               moves cursor to start of next line
Escape              enter Direct Mode

Further editor commands

Ctrl Delete         deletes line which cursor is on
Ctrl U              un-deletes line
Ctrl Y              deletes line which cursor is on
Ctrl N              inserts blank line
Ctrl Q              call Block menu (as F4)
Ctrl B              mark start of block
Ctrl K              mark end of block
Ctrl R              Page up
Ctrl C              Page down
Ctrl E              replace text
Shift Ctrl E        find replace text
Ctrl F              find text
Ctrl left arrow     cursor to start of line
Ctrl right arrow    cursor to end of line
Ctrl up arrow       page up
Ctrl down arrow     page down
Ctrl Clr Home       cursor to start of program
Ctrl P              delete character right of cursor
Ctrl O              undelete text deleted with Ctrl P
Ctrl Z              cursor to end of program
Ctrl Tab            cursor left eight characters
Ctrl G              move to line number display

Editor marks

Ctrl n              where n= 0 to 6 will mark a position
Alt n               will jump to marked position n, except:

Alt 7               cursor to last cursor position before RUN
Alt 8               to start of program
Alt 9               cursor to start of last search
Alt 0               cursor to position of last change

Menu Bar

Atari Logo

This leads to a GEM menu bar:

Save

A file select box will appear, and a program can be saved by 
entering a name and selecting OK.

Load 

A file select box will appear, and a program can be selected and 
loaded into the editor.

Deflist

See the DEFLIST command.

New Names

The editor will warn you if you enter a new variable name.

Editor

Returns you to the editor.



Load (F1)

Load a GFA-BASIC 3 .GFA tokenised file.

Save (Shift F1)

Save the program as a tokenised .GFA file.

Merge (F2)

Load an ASCII text file into the editor at the cursor position. 
The existing program in the editor is not erased.

Save,A (Shift F2)

Save the program in memory in ASCII format. The extension .LST 
will be added to the file name. If the file already exists the old 
file will be changed to .BAK.

Llist (F3)

This command controls the output of the print out. These Dot 
commands have no effect on the running of the program and only 
affect the printout:

.ll xx         Max line length
.pl xx         Max page length
.ff xxx        Form feed character for printer
.he text       Text to appear on first line of each page
.fo text       Text to appear on last line of each page
.lr xx         Left margin
.l-            Switch dot commands off
.l+            Switch dot commands on (default)
.n1 to .n9     Switch on line numbers up to 9 characters
.n0            Switch off line numbers
.PA            Force form feed
.P-            Do not list dot commands
.P+            List dot commands

In the header and footer text, the following can also be inserted:

\xxx           The ASCII character xxx
\d             Date
\t             Time
#              Page number

To print the symbols \ and ##, use \\ and \ respectively.

Quit (Shift F3)

Results in Do you really want to quit message. If Yes selected, 
thenyou will return to the desktop.

Block (F4)

If no block marked then message Block ??? will appear. If a block 
has been selected using the BlkSta and BlkEnd then the block menu 
will appear:

Copy

Copies the block to current cursor position. 

Move

Moves the block to current cursor position.

Write

Saves the block as an ASCII file (.LST)

Llist

Prints the block out to printer

Start

Moves the cursor to start of block

End

Moves the cursor to end of block

Del

Deletes the block

Hide

Removes the block marker

Clicking the mouse outside the Block menu or pressing a key also 
removes the block marker.

New (Shift F4)

The program currently in the editor is erased from memory.


Blk End (F5)

The line before the cursor is marked as the end of block. If the 
start of block marker is located before this line, the block is 
shown in a different colour (or dotted background on a monochrome 
screen). Also actioned with Ctrl K.

Blk Sta (Shift F5)

Marks the beginning of a block as above. Also actioned with Ctrl 
B.

Find (F6)

Enter a text string to be searched for. If the string is found, 
the search cab be continued with Ctrl F or Ctrl L. Also actioned 
with Shift Ctrl F or Shift Ctrl L.
Folded procedures and functions are not searched.

Replace (Shift F6)

This function will replace one string of text by another. Input 
the text to be replaced, then the replacement text. On finding an 
occurrence, the actual replacement can be effected with Ctrl E. 
Also activated with Shift Ctrl E.
 
Pg down (F7)

Scrolls the screen down one page. Also activated with Ctrl C.

Pg Up (Shift F7)

Scrolls the screen up one page. Also activated with Ctrl R.

Insert/Overwr (F8)

Switches between insert and overwrite.

Txt16/Text8 (Shift F8)

Only on monochrome monitor. Either 16 pixel high characters or 8 
pixel high characters will provide 23 or 48 lines on the screen 
respectively.

Flip (F9)

Flip between Edit and Output screen. Press any key to return to 
the Edit screen

Direct (Shift F9)

Switch to Direct mode, where commands will be actioned 
immediately. Some commands, such as loop commands are not 
available in direct mode. Direct mode can also be entered by 
pressing Esc key. The last 8 commands entered in direct mode are 
remembered and can be recalled using the up and down arrow keys. 
The Undo key will recall the last command. 

A procedure can be called from direct mode.

Test (F10)

Tests all loops, subroutines and conditional instructions for 
consistency without running the program.

Run (Shift F10)

The program in the editor memory is started. A running program can 
be interrupted using Ctrl Shift Alt keys together.


Clock Display

The clock can be set by clicking on the clock and entering a new 
time.

Line Numbers

Clicking on the line number box (beneath the clock) allows you to 
enter a line number. On input the cursor will jump to this line 
number. Also activated with Ctrl G.

 
COMMANDS AND FUNCTIONS
======================

The following commands and functions have been sorted by  alphabetical 
order.  Each entry describes the command syntax and the action of  the 
command.  Some  of the more complex commands have examples.  The  full 
GFA-BASIC  Interpreter Reference manual contains examples for most  of 
the commands. The advanced commands such as the operating system calls 
BIOS, GEMDOS and XBIOS are not covered here and should be consulted in 
the GFA-BASIC Interpreter Reference manual.

*
Syntax:    *y
Action:    returns the address of variables, but for strings or arrays
           the address of the descritpor is returned. (ARRPTR is the
           same as *).

+
Syntax:    a$+b$
Action:    Concatenation operator, to add strings together.

+          Arithmetic operator (a+b adds a and b).
*          a*b (a times b).
/          a/b (a divided by b).
^          a^b (a to the power b).
<>         a<>b (a not equal b).
<=         a<=b (a less than or equal to b).
>=         a>=b (a greater than or equal to b).


==
Syntax:    a==b
Action:    Comparison operator for approximately  equal 'a' and 'b' are
           numeric expressions. The == operator is used in the same way
           as a comparison with = but only 28  bits of the mantissa are
           compared i.e. about 8.5 digits.

@
Syntax:    @FRED
Action:    GOSUB PROCEDURE fred (@ is synonymous with GOSUB).

ABS
Syntax:    ABS(X)
Action:    Returns the absolute value of a number. (see also SGN).

ABSOLUTE
Syntax:    ABSOLUTE x,y
Action:    Assigns the address y to the variable x.

ACHAR
Syntax:    ACHAR code,x,y,font,style,angle
Action:    ASCII characters value 'code' are displayed at the graphics
           location x,y.
         Font can be:
           0 = 6x6 (Icon font).
           1 = 8x8 (Normal colour font).
           2 = 8x16 (Normal monochrome font).
         Larger values are taken to be the font header address of a
         GDOS font.
           Text type (bold, faint etc. 0-31) and output angle
           (0,900,1800,2700) can be specified.

ACLIP
Syntax:    ACLIP flag,xmin,ymin,xmax,ymax
Action:    To define a 'clipping' rectangle to which LINE-A screen
           output will be limited.
           Flag 0 = clipping off, non zero = on.

ACOS
Syntax:    ACOS(x)
Action:    Returns the arc-cosine (in radians) of x.

ADD(x,y)
Syntax:    z%=ADD(x%,y%)
Action:    Integer addition.

ADD
Syntax:    ADD x,y
Action:    Increase value of variable x by y.

ADDRIN
Syntax:    address of the AES Address Input block.
           With an index after this function, the appropriate 
           parameter block is accessed directly.
           ADDRIN(2)=x is the same as
           LPOKE ADDRIN+2,x

ADDROUT    address of the AES Address Output block, see above.

AFTER ticks GOSUB proc (see also EVERY).
AFTER CONT
AFTER STOP
           Procedures can be called after the expiry of a set time.
           Time in ticks (200ths of a second).
           To continue the process, use CONT, and to stop
           use STOP.

ALERT
Syntax:    ALERT a,message$,b,button$,var
Action:    Creates an alert box
           'a' chooses type of alert symbol, 0=none, 1=!, 2=?, 3=stop
           'message$' Contains main text. 
           Up to 4 lines of 30 characters/line
           lines are separated by the '|' symbol (Shift \).
           'button$'  Contains text for the buttons 'B'.
           'b' is the button to be highlighted (0,1,2,3) 
           to be selected by just pressing return.
           'var' This variable is set to the number of the button 
           selected.

Example:   ALERT 1,"Pick a|button",1,"Left|Right",a%
           ALERT 0,"You pressed|Button"+STR$(a%),0,"OK",a%   

ALINE
Syntax:    ALINE x1,y1,x2,y2,f,ls,m
Action:    Draw a line using LINE A. x1,y1 are the start coordinates 
           x2,y2 end of line. f = colour (0-15). ls = line style in 16 
           bit information, (solid, dashed, dotted ..).
           m  mode
           0  Replace
           1  Transparent
           2  Inverted
           3  Inverted transparent


AND
Syntax:    x AND y
Action:    Logical operator, performs a logical AND, results in a true 
           or false result.
AND()
Syntax:    AND(x,y)
Action:    See AND above.

APOLY TO
Syntax:    APOLY adr_pnt,num_pnt,y0 TO y1,f,m,addr,num_pattern
Action:    Similar to POLYFILL, draws a sequence of joined lines, with 
           'num_pnt' corners, and fills the resulting area with a user 
           defined pattern. 'adr_pnt' is the address of the array 
           holding the alternating x,y corner coordinates. 'num_pnt' 
           is the number of points. y0 and y1 specify the highest and 
           lowest part of the screen where filling can occur. The 
           parameters f,m,addr,num_pattern are the same as for HLINE.

APPL_EXIT
Syntax:    APPL_EXIT()
Action:    Informs the system prog has finished - this is a dummy 
           function as QUIT or SYSTEM do this automatically.

APPL_FIND
Syntax:    APPL_FIND(fname$)
Action:    Returns the ID of the sought after application. Either 
           returns the apps ID or -1 if it cant be found. fname$ is an 
           8 character filename - without extension. 
           
Example:    PRINT APPL_FIND("CONTROL") 

           prints  -1 if it cant find the  CONTROL.ACC,  or 
           returns it's ID [2].

APPL_INIT
Syntax:    APPL_INIT()
Action:    Announce the program as an application.

APPL_READ
Syntax:    APPL_READ(id,len,adr_buffer)
Action:    Instruction bytes can be read from the event buffer.
           id - id of the application from whose buffer reading is to 
           be done.
           len - number of bytes to read.
           adr_buffer - address of the buffer.

APPL_TPLAY(mem,num,speed)
APPL_TRECORD(mem,num)
           APPL_TRECORD makes a record of user activities, and TPLAY 
           plays these back at the specified speed (1 - 1000).
           * ONLY VALID on TOS 1.4 and above. *

APPL_WRITE
Syntax:    APPL_WRITE(id,len,adr_buffer)
Action:    Bytes are written to the event buffer. SEE APPL_READ.

ARECT
Syntax:    ARECT x1,y1,x2,y2,f,m,addr,num_pattern
Action:    Similar to PBOX, x1,y1 and x2,y2 are opposite corners of a 
           rectangle. The parameters f,m,addr,num_pattern are the same 
           as for HLINE.

ARRAYFILL
Syntax:    ARRAYFILL x(),n
Action:    Assigns the value 'n' to all elements of a field array
           x().

ARRPTR
Syntax:    ARRPTR(x)
Action:    Finds the address of the (6 byte long) descriptor of
           a string or field. (Same as *x)

ASC
Syntax:    ASC(x$)
Action:    Finds the ascii code of the first character of a string.

ASIN
Syntax:    ASIN(x)
Action:    Returns the arc-sine (in radians) of x.

ATEXT
Syntax:    ATEXT x,y,font,s$
Action:    Output text at x,y coordinates using A LINE.

ATN
Syntax:    ATN(x)
Action:    Returns the arc tangent of x.

BASEPAGE
Syntax:    BASEPAGE
Action:    Returns the address of the basepage of GFA-Basic.

BCHG(x,y)
BCLR(x,y)
           Allow setting and resetting of bits. 
           BCLR sets the y-th bit of x to zero.

BGET
Syntax:    BGET #i,adr,cnt
Action:    Reads from a data channel into an area of memory

           'i'   \
           'adr'  -- integer expressions.
           'cnt' /            'i'       is the channel number.
           'cnt'     bytes are read in and stored in memory
                     starting at address 'adr'
           Unlike BLOAD, several different areas of memory can be
           read from a file.

BIN$
Syntax:    BIN$(x[,n])
Action:    Changes value of 'x' to a string containing the binary 
           value of 'x'. The optional parameter 'n' specifies the 
           number of character positions to be used (1 to 32).

BIOS
Syntax:    BIOS(n[,x,y])
Action:    To call the BIOS routine. The optional parameter list can 
           be prefixed with W: or L: to denote word or longword 
           parameters. (if non given, default is W:)
Example:
           REPEAT
           UNTIL BIOS(11,-1) AND 4
           
           Waits for the Control key to be pressed.

           Please refer to GFA-BASIC Interpreter Manual for full  list 
           of BIOS calls. 

BITBLT
Syntax:    BITBLT s%(),d%(),p%()
Action:    Raster copying command similar to GET and PUT but
           more flexible and faster for some applications.
           's%' the description of the source raster
           'd%' the description of the destination raster
           'p%' co-ordinates of the two equally sized rectangles
                and the copying mode (see PUT).

BLOAD/BSAVE
Syntax:    BLOAD "filename" [,address]
           BSAVE "filename",address,length
Action:    Load and save memory from and to disc drive.

Example:   DEFFILL 1,2,4
           PBOX 100,100,200,200
           BSAVE "RECT.PIC",XBIOS(2),32000
           CLS
           PRINT "IMAGE STORED. Press a key to continue"
           ~INP(2)
           CLS
           BLOAD "RECT.PIC",XBIOS(2)

BMOVE
Syntax:    BMOVE scr,dst,cnt
Action:    Fast movement of memory blocks.
           'scr' is the address at which the block to be moved
           begins.
           'dst' is the address to which the block is to moved
           'cnt' is the length of the block in bytes.

BOUNDARY
Syntax:    BOUNDARY n
Action:    Uses function vsf_perimeter to switch off (or on) borders 
           on filled shapes (PBOX, PCIRCLE ..). If n is zero - no 
           border, n - non zero = border.
BOX
Syntax:    BOX x,y,xx,yy
Action:    Draws a rectangle with corners at (x,y) and (xx,yy)

BPUT
Syntax:    BPUT #n,adr,cnt
Action:    Reads from an area of memory out to a data channel.
           'n' is a channel number.
           'adr' is start address of memory to read from.
           'cnt' bytes are read from address.

BSAVE      See BLOAD

BSET(x,y)  Allows setting and resetting of bits. 
BTST(x,y)  BSET sets the y-th bit of x to 1.
           BTST results in -1 (TRUE) if bit y of x is set.

Example:   x=BSET(0,3)
           PRINT x,BSET(0,5)

BYTE(x)    Returns the lower 8 bits of the numerical expression x. 
           (See also CARD(), WORD() ).
           
BYTE{x}    As  a function eg.  y=BYTE{x} one can read the contents  of 
           the address x.  As a command one writes to address  x.  eg. 
           BYTE{x}=y. This is similar to PEEK and POKE but is not done 
           in supervisor mode.  (See also CARD{},  INT{},  LONG{}, {}, 
           FLOAT{}, SINGLE{}, DOUBLE{}, CHAR{} ).

C:
Syntax:    C:addr([ x,y,....L:x, w:y])
Action:    Calls a C or assembler program with parameters as in C. The 
           parameters can be sent as 32-bit long words or 16-bit words 
           to the subroutine.  eg.  a%=C:adr%(L:x,W:y,z) leads to  the 
           following situation on the stack:
           (sp)     ->return address (4bytes)
           4(sp)    ->x (4 bytes)
           8(sp)    ->y (2 bytes)
           10(sp)   ->z (2 bytes)
           The value returned by the call is the contents of D0.

CALL
Syntax:    CALL addr([ x,y,....L:x, w:y])
Action:    Calls a machine code or  C  subroutine   at address 'addr'. 
           When the call is made,  the return address is on the top of 
           the stack, followed by the number of parameters as a 16-bit 
           word,  then  the address of the parameter list as a  32-bit 
           word.

CARD(x)    Returns  the lower 16 bits of the numerical  expression  x. 
           (See also BYTE, WORD).

CARD{x}    Reads/writes   a  2-byte  unsigned  integer   (similar   to 
           DPEEK/DPOKE). (See also BYTE{},  INT{},  LONG{}, {}, 
           FLOAT{}, SINGLE{}, DOUBLE{}, CHAR{} ).

CASE       See SELECT.

CFLOAT(x)  Changes  the integer x into a floating point  number.  (See 
           also CINT).

CHAIN
Syntax:    CHAIN f$
Action:    Loads a GFA  Basic  program file into memory  and starts it 
           immediately it is loaded.  If no extension is given  '.GFA' 
           is assumed.

Example:   CHAIN "A:\EXAMPLE.GFA"

CHAR{x}    Reads  a string of bytes until a null byte is  encountered, 
           or writes the specified string of bytes and appends a  null 
           byte. 

Example:   PRINT CHAR{BASEPAGE+129} prints the command line.

CHDIR
Syntax:    CHDIR "directory name"
Action:    Changes the current directory. 

Example:   CHDIR "B:\TEST"

CHDRIVE
Syntax:    CHDRIVE n or n$
Action:    Sets the default disk drive 0=current, 1=A, 2=B etc.

Example:   CHDRIVE 1
           PRINT DFREE(0)
           PRINT DIR$(2)
           CHDRIVE "C:\"

CHR$(x)    Returns the character from a specified ASCII code.

Example:   PRINT CHR$(65)     !PRINTS A

CINT(x)    Changes  a  floating point number into a  rounded  integer. 
           (See also CFLOAT).

CIRCLE
HOW:       CIRCLE x,y,r[,w1,w2]
Action:    Draws a circle with centre coordinates at x,y and a  radius 
           r.  Additional  start  and  end angles w1  and  w2  can  be 
           specified to draw a circular arc.

Example:   CIRCLE 320,200,100   

CLEAR
Syntax:    CLEAR
Action:    Clears all variables and fields.

CLEARW
Syntax:    CLEARW n
Action:    Clears the contents of the window numbered 'n'

CLIP x,y,w,h [OFFSET x0,y0]
CLIP x1,y1 TO x2,y2 [OFFSET x0,y0]
CLIP #n [OFFSET x0,y0]
CLIP OFFSET x,y
CLIP OFF

           This group of commands provide 'Clipping' functions,ie. the 
           limiting of graphic display within a specified  rectangular 
           screen area.
           The  command  CLIP x,y,w,h defines the  clipping  rectangle 
           starting  at upper left coordinates x,y and extends w  wide 
           and h high.
           The  next  command  CLIP ..  TO  ..  allows  input  of  the 
           diagonally opposite corners of the clipping rectangle.
           The third variant makes it possible to dfine the limits  of 
           the  window  'n'.  The optional additional  command  OFFSET 
           x0,y0  makes  it  possible to redefine the  origin  of  the 
           graphic display. If used in its own right this command sets 
           the origin for graphic display at x0,y0.
           The command CLIP OFF turns clipping off.

CLOSE
Syntax:    CLOSE [#n]
Action:    Close a data channel or a channel to a  previously   OPENed 
           device.  If  the  channel number  is  omitted,  all  opened 
           channels are closed.

CLOSEW
Syntax:    CLOSEW n
Action:    Closes the window numbered n.

CLR
Syntax:    CLR var [ ,var ]
Action:    Deletes and sets specified variables (not arrays) to 0.

CLS
Syntax:    CLS [#n]
Action:    Clears the screen [numbered n].

COLOR
Syntax:    COLOR color
Action:    Sets the colour for drawing/text. (0-15).

COMBIN
Syntax:    z=COMBIN(n,k)
Action:    Calculates the number of combinations of n elements to  the 
           kth class without repetitions. Defined as z=n!/((n-k)!*k!).

CONT
Syntax:    CONT
Action:    Resumes execution of a program.
           Continue the execution of a program after interruption.

CONTRL     Address of the VDI control table.
           With  an  index  after  this  function,   the   appropriate 
           parameter block is accessed directly.
           CONTRL(2)=x is the same as
           DPOKE CONTRL+4,x

COS
Syntax:    COS(x)
Action:    Returns the cosine of value x (radians)
           
COSQ(x)    Returns the cosine of value x  from  an internal  table  in 
           steps  of 16th of a degree so is 10 times faster than  COS. 
           (in degrees).

CRSCOL  CRSLIN
Syntax:    CRSCOL
           CRSLIN
Action:    Returns current cursor line and column. (see also PRINT
           AT).

CURVE
HOW:       CURVE x0,y0,x1,y1,x2,y2,x3,y3
Action:    The  BEZIER-Curve starts at x0,y0,  and ends at  x3,y3.  
           The curve  at  x0,y0 is at a tangent with a line from  
           x0,y0  to x1,y1;  and  at  x3,y3 is at a tangent with 
           a  line  between x3,y3 and x2,y2.

Example:
          x0=10
          y0=10
          x1=50
          y1=110
          x2=150
          y2=200
          x3=350
          y3=300
          LINE x0,y0,x1,y1
          LINE x2,y2,x3,y3
          CURVE x0,y0,x1,y1,x2,y2,x3,y3


CVI   CVL   CVS   CVF   CVD
Syntax:    CVI(x$) .... CVD(x$)
Action:    Changes character strings into numeric variables.
      CVI  Changes a 2-byte string into an integer
      CVL     "    " 4-byte    "    "   "    "
      CVS     "    " 4-byte basic string into a floating  point number
      CVF     "    " 6-byte    "      "    "  a GFA 1 or 2    "
      CVD     "    " 8-byte    "      "    "  a GFA 3 floating point.

*******************************************************************


DATA
Syntax:    DATA [CONST[,CONST] ...]
Action:    Used as memory variables which can be read by the READ
           command. The constants are separated by commas.

Example:   For i=1 to 3
               READ A
               PRINT A
           Next i
           DATA 1,2,3,4

DATE$
Syntax:    DATE$
Action:    Returns the system date.

           DATE$=date$        Sets the system date.  (either  DD.MM.YY 
                              (UK) orMM.DD.YY (US)
                              The format depends on MODE setting.

DEC
Syntax:    DEC var
Action:    Reduces the value of 'var' by 1

DEFAULT    See SELECT

DEFBIT
DEFBYT
DEFWRD
DEFFLT 
DEFSTR 
           The  instruction  DEFxxx  sets the varaible  type  to  that 
           specified. 

Example:   DEFBIT "a-z"       defines all variables as boolean.

DEFFILL
Syntax:    DEFFILL [col],[style],[pattern] or  DEFFILLL [col],A$
Action:    Sets fill colour and pattern, or allows user-defined
           patterns.
           'style' - 0=empty, 1=filled, 2=dots, 3=lines, 4=user
           24 dotted patterns and 12 lined can by chosen.
           A user-defined fill pattern is defined in the second
           variation - DEFFILL col,A$ by defining a 16 x 16 bit
           pattern array.

DEFFN
Syntax:    DEFFN func [(x1,x2,..)]=expression
Action:    Allows  the definition of single line functions.  The  term 
           'expression' can be any numeric or string expression.
           
Example:   DEFFN test(y,a$)=x-y+LEN(a$)
           x=2
           PRINT @test(4,"abcdef")
           See also FN

DEFLINE
Syntax:    DEFLINE [style],[thickness],[begin_s,end_s]
Action:    Sets line style, width & type of line start and end.
           'style' determines the style of line:
           1 Solid line
           2 Long dashed line
           3 Dotted
           4 Dot-dashed
           5 Dashed
           6 Dash dot dot ..
           7 User defined
           'thickness' sets width in pixels (odd numbers only).
           The  start  and  end  symbols  are  defined  by  the   last 
           parameter, and can be:
           0 Square
           1 Arrow
           2 Round


DEFLIST    
Syntax:    DEFLIST x
Action:    Defines the program listing format.
           x   Command   Variable
           0   PRINT     abc
           1   Print     Abc
           2   PRINT     abc#
           3   Print     Abc#

DEFMARK
Syntax:    DEFMARK [C],[A],[G]
Action:    Sets colour,type and size of the corner points to be
           mark using the command polymark
           'C' is the colour register number
           'A' defines the type of mark. the following types
           are possible :-
           1=dot
           2=plus sign
           3=asterisk
           4=square
           5=cross
           6=hash
           all other values return the asterisk symbol
           'G' sets the size of mark

DEFMOUSE
Syntax:    DEFMOUSE n or  DEFMOUSE a$
Action:    Chooses a pre-defined mouse form or defines a new one
           the following mouse forms are available :-

           0=arrow             1=expanded (rounded) X
           2=bee               3=pointing hand
           4=open hand         5=thin crosswire
           6=thick crosswire   7=bordered crosswire

           A mouse can be defined by the command defmouse a$
           16*16 dots are available to create a shape. Also
           a 'mask' must be defined so that the cursor remains
           visible when it is the same colour as the background
           one of the 256 dots must be defined as the starting
           point to which the mouse functions will relate.

Example:
           DEFMOUSE 2
           PAUSE 1
           m$=MKI$(0)+MKI$(0)+MKI$(1)+MKI$(0)+MKI$(1)
           FOR i%=1 TO 16
              m$=m$+MKI$(65535)
           NEXT I%
           FOR i%=1 TO 16
              m$=m$+MKI$(1)
           NEXT i%
           PBOX 200,150,400,250
           DEFMOUSE m$
           REPEAT
           UNTIL MOUSEK
DEFNUM
Syntax:    DEFNUM n
Action:    Affects  output  of numbers by the PRINT  command  and  its 
           variants.  All numbers are outputted to occupy n  character 
           positions, not counting the decimal point.


DEFTEXT
Syntax:    DEFTEXT [colour],[attr],[angle],[height],[fontnr]
Action:    Defines the colour,style,rotation and size of text
           to be printed using the text command.

           'colour' colour register number (0-15).
           'attr' text style - 0=normal 1=bold 2=light 4=italic
           8=underlined 16=outlined (can be combined).
           'angle'= rotation only the following  are possible :-
           0 deg (0), 90 deg (900), 180 deg (1800), 270 deg (2700)
           'height' size of text - 4=icon, 6=8*8, 13=std, 32=enlarged.
           'fontnr' - the number of a desired character set. This font 
           must  have  been  previously  installed  (See  also   GDOS, 
           VST_LOAD_FONT, VQT_NAME).

Example:
           FOR i%|=0 TO 5
              DEFTEXT 1,2^i|,0,13
              TEXT 100,i|*16+100,"This is text attribute "+STR$(i|)
           NEXT i|


DEG(x)     Converts x from radians to degrees. See also RAD.

DELAY x    Suspends   program   operation  for  x  seconds   (with   a 
           theroetical resolution in milliseconds). See aslo PAUSE.

DELETE
Syntax:    DELETE x(i)
Action:    Removes  the ith element of array x.  All elements  with  a 
           larger  index  are  shifted down  one  position.  See  also 
           INSERT.

DFREE
Syntax:    DFREE(n)
Action:    Locates free space on a disc 'n' = drive number (0-15)

DIM
Syntax:    DIM var(indices)[,var(indices),.....]
Action:    Sets the dimensions of an array or string array.

DIM?       
Syntax:    DIM?(field())
Action:    Determines the number of elements in an array.
           Note - arrays have an element '0'.
 
DIR
Syntax:    DIR "filespec" [TO "file"]
Action:    Lists the files on a disc.  The output can be directed to a 
           file or other device.

Example:   "LST:" See also FILES.

DIR$
Syntax:    DIR$(n)
Action:    Names the active directory for drive 'n'
           'n' is drive number (1=A:, 2=B: ...).

DIV
Syntax:    DIV var,n
Action:    Divides the value of var by n. As var=var/n but 30% faster.

DIV()
Syntax:    a%=DIV(x,y)
Action:    See DIV above.


DMACONTROL
Syntax:    DMACONTROL ctrlvar
Action:    Controls the DMA sound on the STE.
           cntrlvar = 0 - stop sound
                      1 - Play sound once
                      2 - Play sound in a loop

DMASOUND
Syntax:    DMASOUND beg,end,rate[,ctrl]
Action:    Output of DMA sampled sound on the STE.
           beg  - Sample start address.
           end  - Sample end address.
           rate - Sample rate 0=6.25 kHz,  1=12.5 kHz, 2=25 kHz, 
                  3=50kHz.
           ctrl - See DMACONTROL above.
           
Example:   'Try each of the DMASOUND lines below.
           n%=360*32
           DIM a|(n%)
           'DMASOUND V:a|(0),V:a|(n%),0
           'DMASOUND V:a|(0),V:a|(n%),1
           'DMASOUND V:a|(0),V:a|(n%),2
           DMASOUND V:a|(0),V:a|(n%),3,3
           FOR i%=0 TO n%
            a|(i%)=128+SINQ(i%*i%/7200)*127
           NEXT i%
           REPEAT
           UNTIL MOUSEK
           DMACONTROL 0


DO....LOOP
Syntax:    DO
           (instructions)
           LOOP
Action:    Creates an endless loop, exit only with EXIT IF or GOTO.

DO UNTIL condition
DO WHILE condition
         
           The  commands DO and LOOP can be extended using  UNTIL  and 
           WHILE.  The  loop  DO WHILE causes a loop as  long  as  the 
           condition is true. See also LOOP WHILE, LOOP UNTIL.

DOUBLE{x}  Reads/writes  an  8-byte floating point  variable  in  IEEE 
           double precision format.  (See also BYTE{},  CARD{}, INT{}, 
           LONG{}, {}, FLOAT{}, SINGLE{}, CHAR{} )


DOWNTO     Used within a FOR..NEXT loop as a counter. Instead of using 
           step -1,  the command DOWNTO is used,  however STEP is  not 
           possible with DOWNTO. eg:
           FOR c=100 DOWNTO 1
           is the same as FOR c=100 TO 1 STEP -1


DPEEK(x)   Reads 2 bytes from address x (a word).  Works in supervisor 
           mode.

DPOKE x,y  Writes  y  as  a 2 byte word to  address  x.  To  work  in 
           supervisor mode use SDPOKE ..


DRAW
Syntax:    DRAW [TO] [x,y]
           DRAW [x1,y1][TO x2,y2][TO x3,y3][TO..]
Action:    Draws points and connects two or more points with
           straight lines. DRAW x,y is the same as PLOT x,y.
           DRAW TO x,y connects the point to the last set 
           point (set by PLOT, LINE or DRAW).

DRAW expression
DRAW(i)
SETDRAW
           These instructions give a turtle like approach to  drawing. 
           An  imaginary  pen  is  moved over  the  screen  and  draws 
           relative to the last point. The 'expression' is a LOGO type 
           of  convention  controlled by  graphic  commands.  The  pen 
           leaving  a trail over the 'paper' leaves a  graphic  image. 
           The statement below is an wxample of how these commands can 
           be used.

Example:   DRAW  "PU FD 40 PD FD 40"

           The available commands are:

FD n       ForwarD            Moves the 'pen' n pixels forward

BK n       BacKward           Moves the 'pen' n pixels backwards
           
SX x       Scale x            Scales the 'pen' movement for FD and BK

SY y       Scale y            by the specified factor.  Use SX0 or SY0 
                              to turn off scaling.

LT a       Left turn          Turns   the  'pen'  left   through   the 
                              specified angle a, given in degrees.

RT a       Right turn         As LT but turns right.

TT a       Turn To            Turns  the 'pen' to the  absolute  angle 
                              'a' in degrees. (see below)

                               0
                               |
                               |
                     270 -- zero point -- 90
                               |
                               |
                              180


MA x,y     Move Absolute      Moves  the  'pen'  to   the   absolute 
                              coordinates x,y

DA x,y     Draw Absolute      Moves  the  'pen'  to   the   absolute 
                              coordinates x,y and draws a line in  the 
                              current colour from the last position to 
                              the point x,y

MR xr,yr   Move Relative      Moves the 'pen' position in the x and  y 
                              directions   relative   to   the    last 
                              position.

DR xr,yr   Draw  Relative     Moves  the  'pen'  by   the   specified 
                              displacement   relative  to   its   last 
                              position and draws a line in the current 
                              colour  from the last position  to  this 
                              point.

The  command SETDRAW x,y,w is an abbreviation for the expression  
DRAW "MA",x,y,"TT",w.

CO  c      Colour             Sets 'c' as the character  colour  (see 
                              parameters for COLOR command).

PU         Pen Up             Lifts the 'pen' from the 'paper'.

PD         Pen Down           Lowers the 'pen' onto the 'paper'.

Additionally the following interrogation functions are available:

DRAW(0)    returns the x position.
DRAW(1)    returns the y position.
DRAW(2)    returns angle in degrees.
DRAW(3)    returns the X axis scale factor.
DRAW(4)    returns the Y axis scale factor.
DRAW(5)    returns the pen flag (-1=PD, 0=PU).

All these functions return floating point values.

Example:

           DRAW "ma 160,200 tt 0"
           FOR i&=3 TO 10
             polygon(i&,90)
           NEXT i&

           PROCEDURE polygon(n&,r&)
           LOCAL i&
           FOR i&=1 TO n&
             DRAW "fd",r&," rt ",360/n&
           NEXT i&
           RETURN

EDIT
Syntax:    EDIT
Action:    Returns to the editor.
           When used in direct mode the command allows a return
           to the editor. In a program, is the same as END but
           without the program end alert box.

ELLIPSE
Syntax:    ELLIPSE x,y,rx,ry [,phi0,phi1]
Action:    Draws an ellipse at x,y, having 'rx' as length of the
           horizontal axis and 'ry' as length of the vertical axis
           The optional angles 'phi0' & 'phi1' give start and end
           angles in tenths of a degree, to create an elliptical arc.

ELSE       See command IF.
ELSE IF     "     "    "


END
Syntax:    END
Action:    Closes all files and terminates program execution.


ENDFUNC    See command FN.

ENDIF      See command IF.

ENDSELECT  See command SELECT.


EOF
Syntax:    EOF (#n)
Action:    Determines whether the file pointer for the file with
           channel number 'n' is at End Of the File.  Returns -1 if it 
           is, otherwise 0.


EQV
Syntax:    x EQV y
Action:    The operator EQV (equivalence) produces a TRUE result  only 
           if  the  arguments of both are either TRUE or  both  FALSE. 
           (same as NOT(x XOR y)).

EQV(x,y)
Syntax:    EQV(x,y)
Action:    Sets a bit of the result if the appropraite bits in x and y 
           are both set, or both reset. eg:
           PRINT BIN$(EQV(15,6),4) prints 0110


ERASE
Syntax:    ERASE field()
Action:    Deletes an array and releases the dimensioned area.


ERR
Syntax:    ERR
Action:    Returns the error code of any error that has occurred.

ERR$
Syntax:    ERR$(x)
Action:    Returns, as a string, the GFA Basic error mesage x. 

ERROR
Syntax:    ERROR n
Action:    Simulates the occurrence of the error with the error
           code 'n' and the appropriate error message is then
           displayed.



EVEN
Syntax:    EVEN n
Action:    Determines if a number is even.   Returns  TRUE  (-1)   and 
           FALSE(0). Also see ODD


EVERY
EVERY CONT
EVERY STOP

Syntax:    EVERY ticks GOSUB proc
Action:    The command EVERY causes the procedure 'proc' to be  called 
           every 'ticks' clock units. The clock unit is defined as one 
           two-hundredth  of a second.  But a branch can only be  done 
           every  fourth clock unit,  resulting in an  effective  time 
           resolution of one fiftieth of a second.
           Using  EVERY  STOP,  the  calling of a   procedure  can  be 
           prevented.  With EVERY CONT this is again allowed. See also 
           AFTER.


EVNT_BUTTON
Syntax:    EVNT_BUTTON(clicks,mask,state[,mx,my,button,k_state])
Action:    Waits for one or more mouse clicks,  and returns the number 
           of clicks.
           INPUTS
           clicks - Maximum allowable clicks.
           mask   - Mask for the desired mouse key:
                    Bit 0 = 1 : Left Button
                    Bit 1 = 1 : Right Button
           state  - Desired status,  in order to terminate the  event. 
                    Bit allocation as for mask.
           RETURNED VALUES:
           mx     - x coordinate of mouse pointer on event termination
           my     - y coordinate of mouse pointer on event termination
           button - state of mouse button, bit allocation as for mask.

           k_state- Condition of keyboard shift keys:
                    Bit 0 = Right shift key
                    Bit 1 = Left shift key
                    Bit 2 = Control key
                    Bit 3 = Alternate key

EVNT_DCLICK
Syntax:    EVNT_DCLICK(new,get_set)
Action:    Sets the speed for double-clicks of a mouse button.
           Returns the speed.
           new - new speed (0-4)
           get_set - determine whether to set or read. 0=read,1=set.


EVNT_KEYBD
Syntax:    EVNT_KEYBD()
Action:    Waits  for  a key to be pressed and  returns  a  word-sized 
           value. The low order byte contains the ASCII code, the high 
           byte contains the keyboard scan code.


EVNT_MESAG
Syntax:    EVNT_MESAG(adr_buffer)
Action:    Waits for the arrival of a message in the event buffer. The 
           returned value is always 1.
           adr_buffer  is  the  address of a 16 byte  buffer  for  the 
           message.  If  0 is used,  then the sytem message buffer  is 
           used, ie. MENU(1) to MENU(8).


EVNT_MOUSE
Syntax:    EVNT_MOUSE(flag,mx,my,mw,mh,mcur_x,mcur_y,button,k_state)
Action:    Waits  for  the  mouse pointer to  be  located  inside  (or 
           optionally,  outside)  a specified rectangular area of  the 
           screen.
           The returned value is always 1.
           INPUTS:
           flag  - Presence inside(0) or outside(1) the desired area.
           mx,my - Coordinates of top left corner of recatngle.
           mw    - Width of rectangle.
           mh    - Height of rectangle.
           OUTPUTS:
           mcur_x   x coordinate of mouse when event occurs.
           mcur_y   y coordinate of mouse when event occurs.
           button   same as for mask in EVNT_BUTTON.
           k_state  same as for k_state in EVNT_BUTTON.


EVNT_MULTI
HOW:       EVNT_MULTI(flag,clicks,mask,state,m1_flags,m1_x,
           m1_y,m1_w,m1_h,m2_flags,m2_x,m2_y,m2_w,m2_h,adr_buffer,
           count[,mcur_x,mcur_y,button,k_state,key,num_clicks])
Action:    Waits  for the occurence of selected  events.  Returns  the 
           event  which actually occured,  with bit allocation as  for 
           'flag' below:
           INPUT:
           flag     Sets the event(s) to be waited for as follows:
                    BIT 0 keyboard           MU_KEYBD
                    BIT 1 mouse button       MU_BUTTON
                    BIT 2 first mouse event  MU_M1
                    BIT 3 second mouse event MU_M2
                    BIT 4 report event       MU_MESAG
                    BIT 5 timer              MU_TIMER
           OUTPUT:
           num_clicks: number of expected mouse clicks

           The parameters are already described for EVNT_MESAG, etc..
           With  ON  MENU,  which uses this  routine  internally,  the 
           parameters  are installed for the instruction ON  MENU  xxx 
           GOSUB.
           MENU(1) to MENU(8)  Message buffer.
           MENU(9)             Returned value.
           MENU(10)=mcur_x     x mouse position.
           MENU(11)=mcur_y     y mouse pos.
           MENU(12)=button     Mouse state button.
           MENU(13)=k_state    Shift key status.
           MENU(14)=key        ASCII and scan code.
           MENU(15)=num_clicks Number of mouse clicks.              


EVNT_TIMER
Syntax:    EVNT_TIMER(count)
Action:    The  function  waits  for a period  of  time  expressed  in 
           'count' millisecondes.
           The returned value is always 1.


EXEC
Syntax:    EXEC flg,name,cmd,env
           EXEC (flg,name,cmd,env)
Action:    Loads and executes machine code programs or compiled
           programs from disc.                 
           flg=0 - load and go.
           flg=3 - load only.
           'name' - the name of the program.
           'cmd'  - command line (see BASEPAGE).
           'env'  - environment string (usually just "").
           The named program is loaded from disc, the absolute
           addresses are relocated, a basepage is created, and if
           required the program run.


EXIST
Syntax:    EXIST ("filespec")
Action:    Determines whether a particular file is present on
           a disc. If present -1 is returned, else 0 is returned.


EXIT
Syntax:    EXIT IF Condition
Action:    Enables the exit from a loop.
           If the EXIT command is met within a loop and the exit
           condition is met, the program continues from the first
           command after the loop.
           This command allows any loop to be left ie: FOR...NEXT
           DO...LOOP,  REPEAT...UNTIL AND  WHILE...WEND.


EXP
Syntax:    EXP(X)
Action:    Calculates the value of an exponent x.


FACT
Syntax:    x=FACT(n)
Action:    Calculates  the factorial (n!) of n and returns the  result 
           in x. (0!=1).


FALSE
Syntax:    FALSE
Action:    Constant 0. This is simply another way of expressing
           the value of a condition when it is false and is equal
           to zero (see also TRUE).


FATAL
Syntax:    FATAL
Action:    Returns the value 0 or -1 according to the type of
           error.
           On normal errors the function returns 0. The value -1
           is returned on all errors where the address of the
           last executed command is no longer known.
           Normally this is an operating system error which
           would lead to the 'bomb' errors and the breakdown of
           the program.



FGETDTA
Syntax:    n%=FGETDTA()
Action:    Returns the DTA (Disk Transfer Address).


FIELD
Syntax:    FIELD #n,num AS svar$ [,num AS svar$,...]
           FIELD #n,num AT(x)[,num AT(x),...]
Action:    Divides records into fields.
           'n' is the channel number of a file previously OPENed.
           The integer expression 'num' determines the field length.
           'Svar' is a string variable containing  data for one  field 
           of a data record.
           The section 'num AS svar$' can be repeated if the
           record is to be divided into several fields. The sum of
           the fields should equal the record length.
           By using AT() instead of AS,  numeric variables can be read 
           and  written.  'num'  contains the length of  the  varaible 
           type. The brackets contain a pointer to the variable.
           eg:
           FIELD #2,4 AS a$,2 AT(*b&),8 AT(*c#),6 AS d$


FILES
Syntax:    FILES p$ [TO name$]
Action:    Lists the files on a disk.
           Like DIR but more detailed data listing.


FILESELECT
Syntax:    FILESELECT [#title$],path$,default$,name$
Action:    Creates a fileselect box on the screen.
           Title$  can  be a string of max  30  characters.  Allows  a 
           header  to  be placed in the fileselect box  (TOS  1.4  and 
           above).
           path$  is the drive and path - if none specified  then  the 
           default drive is assumed.
           default$  contains the name of the file to apppear  in  the 
           selection line. ("" for no default).
           name$ contains the selected file, either an empty string if 
           CANCEL is selected, or the file name selected.
           See also FSEL_INPUT

Example: 
                   FILESELECT #"LOAD File","A:\*.PRG","GFABASIC.PRG",name$



FILL
Syntax:    FILL x,y
Action:    Fills a bordered area with a pattern commencing at
           the co-ordinates 'x,y'.            
           Fill pattern can be chosen with the command DEFFILL.


FIX
Syntax:    FIX(x)
Action:    Returns the integer of 'x' after it has been rounded.
           Same as INT(x) for positive numbers but for negative
           numbers INT(-1.99)=-2 AND FIX(-1.99)=1.
           FIX is identical to the function TRUNC and complements
           FRAC.


FLOAT{x}   Reads/writes an 8-byte variable in Basic v3 floating  point 
           format.   (See  also  BYTE{},   CARD{},  INT{},LONG{},  {}, 
           SINGLE{}, DOUBLE{}, CHAR{} )

FN
Syntax:    FN func[(y1,y2...)]
Action:    Call  to a defined DEFFN function or a FUNCTION.  (you  can 
           also use @). See also DEFFN, FUNCTION.


FOR...NEXT
Syntax:    FOR c=b TO e [STEP s]
           instructions
           NEXT c
Action:    Creates a loop which is executed as many times as specified 
           at the beginning of the loop.


FORM INPUT
Syntax:    FORM INPUT n,a$
Action:    Enables the insertion of a character string (limited
           to 255 characters in length) during program execution.
           'n' = the maximum length of the character string.
           a$ is the name of the string variable.
      
FORM INPUT AS
Syntax:    FORM INPUT n AS a$
Action:    Similar  to FORM INPUT,  except the current value of a$  is 
           displayed, and can be edited.


***  the  following  7  commands are part  of  the  AES  FORM  Library 
commands,  and  are  similar  to  C bindings  for  calling  these  AES 
functions ***

FORM_ALERT
Syntax:    a%=FORM_ALERT(button,string$)
Action:    Creates an alert box.
           button  = number of the default button (0-3).
           string$ = string defining the message in the alert.  (in  C 
           format)  -  note that the square brackets are part  of  the 
           string:
           [i][Message][Buttons]
           where i = the required alert symbol - see ALERT.
           Message is a string max 30 characters.
           Buttons = the name of the 3 buttons.
           A good use of this command is in trapping errors:
           
Example:   ~FORM_ALERT(1,ERR$(ERR))


FORM_BUTTON
Syntax:    FORM_BUTTON(tree,obj,clicks,new_obj)
Action:    Make inputs in a form possible using the mouse.
           INPUTS:
           tree   -  address of the object tree
           obj    -  current object number
           clicks -  max expected number of mouse clicks
           OUTPUT:
           new_obj-  next object to be edited.
           Returns 0 if the FORM was exited, otherwise >0.

FORM_CENTER
Syntax:    FORM_CENTER(tree,fx,fy,fw,fh)
Action:    Centers the tree, and returns its coordinates.
           INPUT: tree  - address of the object tree.
           OUTPUTS:
           fx,fy    coordinates of top left corner
           fw,fh    form width and height.
           returns a reserved value (always 1).


FORM_DIAL
HOW:       FORM_DIAL(flag,mi_x,mi_y,mi_w,mi_h,ma_x,ma_y,ma_w,ma_h)
Action:    Release (or reserve) a rectangular screen area and draw  an 
           expanding/shrinking rectangle.
           Returns 0 if an error occured.
           flag     function
           0        FMD_START   reserve a display area.
           1        FMD_GROW    draw expanding box.
           2        FMD_SHRINK  draw shrinking box.
           3        FMD_FINISH  release reserved display area.
           mi_x,mi_y  top left corner of rectangle at min size
           mi_w,mi_h  width & height  "     "       "  "    "
           ma_x,ma_y  top left corner of rectangle at max size
           ma_w,ma_h  width & height   "     "      "  "    "


FORM_DO
Syntax:    FORM_DO(tree,start_obj)
Action:    Pass  management  of FORM over to the AES until  an  object 
           with EXIT or TOUCH EXIT status is clicked on.
           Returns  the number of the object whose clicking or  double 
           clicking  caused the function to end.  If it was  a  double 
           click, bit 15 will be set.
           tree      = address of the object tree.
           start_obj = Number of the first editable field (if there is 
           one). 


FORM_ERROR
Syntax:    FORM_ERROR(err)
Action:    Displays the ALERT associated with the error numbered err.
           
Example:   PRINT FORM_ERROR(10)

   
FORM_KEYBD
Syntax:    FORM_KEYBD(tree,obj,next_obj,char,new_obj,next_char)
Action:    Allows a form to be edited via the keyboard.
           Returns 0 if the FORM was exited, otherwise >0.
           tree     address of the object tree
           obj      number of the object to be edited
           next_obj number of the next EDITable object in the tree
           char     input character
           new_obj  object to be EDITed on the next call
           returns next_char - next character (derived from keyboard)
           
           This function is a subroutine of FORM_DO.


FRAC
Syntax:    FRAC(x)
Action:    Returns the digits after the decimal point in a number.
           'x' can be any numeric expression. if 'X' is an integer
           then a zero is returned,  therefore FRAC(x)=x-TRUNC(x)


FRE
Syntax:    f%=FRE(X) or f%=FRE()
Action:    Returns the amount of memory free (in bytes).
           The parameter 'x' is disregarded, but if present a 'Garbage 
           Collection' is carried out.  (non current strings are freed 
           from memory).


FSEL_INPUT
Syntax:    n%=FSEL_INPUT(path$,name$,[button])
Action:    Calls   the   AES  fileselect   library,   to   provide   a 
           fileselector.
           The optional parameter 'button':
           Returns  a  1 or 0 depending whether 'OK' or  'Cancel'  was 
           clicked on.
           ON ENTRY:
           path$    = initial directory path
           name$    = Default name
           ON EXIT:
           path$    = final directory path
           name$    = chosen filename.
           button   = 1 if 'OK'
                    = 0 if 'Cancel'


FSETDTA
Syntax:    ~FSETDTA(addr)
Action:    Sets the address of the DTA. (See also FGETDTA).


FSFIRST
Syntax:    FSFIRST(p$,attr)
Action:    Searches  for  the  first file on a  disk  to  fulfill  the 
           criteria specified in p$ (eg:  "C:\*.GFA").  If found,  the 
           filename and attributes are to be found in the DTA.
           The parameter 'attr' is the file atributes to search on.

FSNEXT
Syntax:    FSNEXT()
Action:    Search  for the next file which fulfills the conditions  of 
           FSFIRST.
           
Example:
           ~FSETDTA(BASEPAGE+128)
           e%=FSFIRST("\*.GFA",-1)           ! all bits set
           DO UNTIL e%
             IF BYTE{BASEPAGE+149} AND 16    !if its a folder
               PRINT "*";CHAR{BASEPAGE+158}  ! indicate by a star
             ELSE                            ! otherwise
               PRINT 'CHAR{BASEPAGE+158}     ! a space before
           '                                 ! the filename
             ENDIF
             e%=FSNEXT()                     ! continue search
           LOOP
  

FULLW
Syntax:    FULLW [#]n
Action:    Enlarges window 'n' to full screen size.
           'n' is the window number. If the window has not
           yet been opened, this takes place automatically.


FUNCTION
           The commands FUNCTION and ENDFUNC form a subroutine,  in  a 
           similar  manner to PROCEDURE.  The name of  the  subroutine 
           and,  optionally,  the  list of varaibles are  given  after 
           FUNCTION command. Calling the subroutine is done by the use 
           of  @  or FN and the function name followed by  a  list  of 
           parameters if necessary.
           If the command RETURN is met during program execution,  the 
           the value given after it or the value of the named variable 
           is  returned.  In a function,  RETURN can be  used  several 
           times, with IF or the like. A function cannot be terminated 
           without a RETURN command being before the ENDFUNC  command. 
           In a function name ending with the $ character the function 
           returns a string result.
Example:
           f1%=@fac_loop(15)
           PRINT "loop: fac(15) = ";f1%
           '
           FUNCTION fac_loop(f%)
            w=1
            FOR J%=1 TO f%
              MUL w,j%
            NEXT j%
            RETURN w
           ENDFUNC


GB         Address of the AES Parameter Block
           This  (unlike the other AES address blocks) cannot be  used 
           with index.


GCONTRL    Address of the AES control block.  With index  (GCONTRL(2)) 
           the elements can be accessed directly.


GDOS?      Returns  TRUE  (-1)  if GDOS is  resident  and   FALSE  (0) 
           otherwise.


GEMDOS
Syntax:    GEMDOS(n[,x,y])
Action:    To  call the GEMDOS routines.  The optional parameter  list 
           can be prefixed with W:  or L:  to denote word or  longword 
           parameters. (if non given, default is W:)
           
Example:
           DO UNTIL GEMDOS(17)
             ALERT 1,"Printer not ready",1,"retry|break",d%
           LOOP UNTIL d%=2


GEMSYS
Syntax:    GEMSYS n
Action:    Calls the AES routine 'n'. The parameters necessary for the 
           operation  of  the  routine must first  be  placed  in  the 
           appropriate AES parameter blocks.



GET
Syntax:    GET x1,y1,x2,y2,sections$
Action:    GET  puts  a section of the screen into a  string  variable 
           'section$'  (x1,y1 and x2,y2 are coordinates of  diagonally 
           opposite corners). See also PUT.


GET #
Syntax:    GET #n[,r]
Action:    Reads a record from a random access file.
           'n' is the channel number (1 to 99)
           'r' is number of the record to be read (1 to 65535)
           If 'r' is not given then the next record in the file
           will be read. (See also PUT #).


GETSIZE
Syntax:    bytes%=GETSIZE(x1,y1,x2,y2)
Action:    The  TT  does not have a constant screen  memory  of  32000 
           Bytes like  the ST. A screen could require much more memory 
           (153600  Bytes).  The commands GET and PUT are  limited  to 
           32000  Bytes and therefore  a function has been  introduced 
           to support the larger screen  resolutions that require more 
           than 32000 Bytes. 
           This  function will return the number of Bytes required  by 
           the   screen between the coordinates  x1,y1,x2,y2.  Several 
           GET  or PUT  commands could be used to address  the  entire 
           screen.


GINTIN     Address of the AES Integer input block.  (Can be used  with 
           index GINTIN(0)).

GINTOUT    Address of the AES Integer output block. (Can be used  with 
           index GINTOUT(0)).


GOSUB
Syntax:    GOSUB name [ (LIST OF EXPRESSIONS) ]
Action:    Branches to the procedure called 'name'.
           A procedure name can begin with a digit and contain
           letters, numbers, dots and the underline dash.
           '(list of expressions)' contains the values of any
           local variables to be passed to the procedure.
           When the interpreter comes across a GOSUB command,
           it branches to the procedure named in the gosub.
           It is possible to call further procedures whilst in
           a procedure. It is even possible to call the procedure
           one is in at the time (recursive call).


GOTO
Syntax:    GOTO label            
Action:    allows an unconditional jump to a label.
           'label' must end in a colon and can consist of letters,
           numbers, dots, dashes and can begin with a digit.


*** The following 10 functions form the Graphics library calls to  the 
AES.

GRAF_DRAGBOX
Syntax:    GRAF_DRAGBOX(iw,ih,ix,iy,rx,,ry,rw,rh[,last_ix,last_iy])
Action:    Allows  a rectangle to be moved about the screen  with  the 
           mouse.  Its  movement  is restricted to the interior  of  a 
           larger  specified rectangle.  This function should only  be 
           called  when  the left mouse button is  held  down,  as  it 
           terminates when the button is released.
           Returns 0 if an error occurs.
           INPUTS:
           iw,ih    width & height of the moving rectangle
           ix,iy    initial  coords  of  top  left  corner  of  moving 
                    rectangle
           rx,ry    coords of top left corner of limiting rectangle
           rw,rh    width & height of limiting rectangle
           OUTPUTS:
           last_ix  coords of top left corner of inside rectangle
           last_iy  when the function terminated.


GRAF_GROWBOX
Syntax:    GRAF_GROWBOX(sx,sy,sw,sh,dx,dy,dw,dh)
Action:    Draws an expanding rectangle.
           Returns 0 if error occurs.
           sx,sy    Initial coords of top left corner of rectangle
           sw,sh    Initial width & height of rectangle
           dx,dy    Final coords of top left corner
           dw,dh    Final width & height

GRAF_HANDLE
Syntax:    GRAF_HANDLE(char_w,char_h,box_w,box_h)
Action:    Returns  the ID number of the current VDI  workstation  and 
           supplies the size of a character from the system set.
           OUTPUTS:
           char_w   width in pixels of a character
           char_h   height
           box_w    width of a character cell
           box_h    height


GRAF_MKSTATE
Syntax:    GRAF_MKSTATE(mx,my,m_state,k_state)
Action:    This  function supplies the current mouse  coordinates  and 
           status of tht mouse buttons and shift keys.
           Returns a reserved value (always 1)
           OUTPUTS:
           mx,my    mouse coordinates
           m_state  mouse button status
                    bit 0 left button
                    bit 1 right button
           k_state  see k_state in function EVNT_BUTTON


GRAF_MOUSE
Syntax:    GRAF_MOUSE(m_form,pattern_adr)
Action:    This  function  allows  the  mouse  shape  to  be  changed. 
           (similar command to DEFMOUSE)
           Returns 0 if an error occurs.
           m_form   number of the mouse pointer shape
               0    = Arrow
               1    = Double curly brackets
               2    = Busy bee
               3    = Pointing finger
               4    = Open hand
               5    = Thin cross hairs
               6    = Thick cross hairs
               7    = Outlined cross hairs
               255  = User defined
               256  = Hide mouse
               257  = Show mouse

           pattern_adr = address of bit information defining the mouse 
                         pointer. 37 word-sized values as follows:
                    1 =  x coordinate of the action point
                    2 =  y     "      "   "    "      "
                    3 =  number of colour levels, always 1
                    4 =  mask colour, always 0
                    5 =  pointer colour, always 1
              6 to 21 =  Mask definition (16 words ie.16x16 bits)
             22 to 37 =  Pointer def              "


GRAF_MOVEBOX
Syntax:    GRAF_MOVEBOX(w,h,sx,sy,dx,dy)
Action:    Draws a moving rectangle with constant width & height.
           Returns 0 on error.
           INPUTS:
           w,h      width & height of rectangle
           sx,sy    Initial coords of top left corner of rectangle
           dx,dy    Final coords of top left corner


GRAF_RUBBERBOX
Syntax:    GRAF_RUBBERBOX(tx,ty,min_w,min_h[,last_w,last_h])
Action:    This function draws an outline of a rectangle while the the 
           left  mouse  button is held down.  The top left  corner  is 
           fixed,  but the width & height of the rectangle change with 
           the  position of the mouse.  This function should  only  be 
           called  when  the left mouse button is  held  down,  as  it 
           terminates when the button is released.
           Returns 0 if an error occurs.
           INPUTS:
           tx,ty         coords of top left corner
           min_w,min_h   minimum width & height of rectangle
           OUTPUTS:
           last_w        width of rectangle when function terminates
           last_h        height "     "       "     "          "


GRAF_SHRINKBOX
Syntax:    GRAF_SHRINKBOX(sx,sy,sw,sh,dx,dy,dw,dh)
Action:    Draws an shrinking rectangle.
           Returns 0 if error occurs.
           sx,sy    Final coords of top left corner
           sw,sh    Final width & height
           dx,dy    Initial coords of top left corner of rectangle
           dw,dh    Initial width & height of rectangle



GRAF_SLIDEBOX
Syntax:    GRAF_SLIDEBOX(tree,parent_obj,slider_obj,flag)
Action:    This function (really belongs to the OBJECT library)  moves 
           one rectangular object within another,  in a similar manner 
           to GRAF_DRAGBOX. The object can only be moved vertically or 
           horizontally, and must be a 'child' of the limiting object. 
           This  function  should only be called when the  left  mouse 
           button  is held down,  as it terminates when the button  is 
           released.  Commonly  used  in movement of  slider  bars  in 
           windows.
           Returns  the position of the moving rectangle  relative  to 
           the limiting one:
           Horizontally: 0 = far left    1000 = far right
           Vertically:   0 = top         1000 = bottom
           INPUTS:
           tree          address of oobject tree
           parent_obj    object number of the 'limiting rectangle'
           slider_obj       "     "    "   "   moving rectangle
           flag          direction (0=horizontal, 1=vertical)
     


GRAF_WATCHBOX
Syntax:    GRAF_WATCHBOX(tree,obj,in_state,out_state)
Action:    This  function  (really  belongs  to  the  OBJECT  library) 
           monitors  an object tree while a mouse button  is  pressed, 
           checking  whether the mouse pointer is inside  or  outside. 
           When the mouse button is released, the status of the object 
           takes one of two specified values (normal selected/normal), 
           depending  on whether the pointer was inside the object  or 
           outside.
           Returns  1 if the mouse pointer was inside the object  when 
           the button was released, or 0 if it was outside.
           INPUTS:
           tree       address of the tree
           obj        number of the object to be monitored
           in_state   Status (OB_STATE) to be given to the  object  if 
                      the mouse pointer is found within it.
           out_state  Status (OB_STATE) to be given to the  object  if 
                      the mouse pointer is found outside it.


GRAPHMODE
Syntax:    GRAPHMODE n
Action:    Sets the graphic mode 1 to 4.
           1=replace     2=transparent
           3=xor         4=reverse transparent


HARDCOPY
Syntax:    HARDCOPY
Action:    Prints the screen (same as pressing <ALT> & <HELP>).


HEX$
Syntax:    HEX$(x[,y])
Action:    Changes the value of 'x' into a string expression
           which contains the value of 'x' in hexadecimal form.
           The optional parameter y specifies the number of  character 
           positions (1 to 8) to be used.


HIDEM
Syntax:    HIDEM
Action:    Switches off the mouse pointer. (see also SHOWM).


HIMEM
Syntax:    HIMEM
Action:    Returns the address of the area of memory which is  not
           required by GFA Basic.   Normally  16384  bytes  below  the 
           screen.


HLINE
Syntax:    HLINE x1,y,x2,f,m,addr,num_pattern
Action:    Similar to ALINE,  but only horizontal lines can be  drawn. 
           x1  and x2 contain the x coordinates of the line start  and 
           end points and y the common y coordinate.  f is the  colour 
           (0-15).  m  is the graphic mode.  addr is the address of  a 
           block of memory which contains bit information for  several 
           line  styles  each of 16 bits.  Which style is used  for  a 
           given  line  depends  on  both the  y  coordinate  and  the 
           parameter  num_pattern.  They  are ANDed together  and  the 
           resulting number used as an index to the style table.


HTAB       Positions  the cursor to the  specified  column.  (Counting 
           from 0). See also VTAB


IF
Syntax:    IF condition [ THEN ]
             program block
           ELSE
             program block
           ENDIF
Action:    Divides a program up into different blocks depending
           on how it relates to the 'condition'.

ELSE IF condition
           Enables  nested  IF's  to be more clearly  expressed  in  a 
           program.

Example:   'the following code has no ELSE IF's
           DO
             t$=CHR$(INP(2))
             IF t$="l"
               PRINT "Load text"
             ELSE
               IF t$="s"
                 PRINT "Save text"
               ELSE
                 IF t$="e"
                   PRINT "Enter text"
                 ELSE
                    PRINT "unknown command"
                 ENDIF
               ENDIF
             ENDIF
           LOOP
           
           The use of ELSE IF produces shorter code:

           DO
             t$=CHR$(INP(2))
             IF t$="l"
                 PRINT "Load text"
             ELSE IF t$="s"
                 PRINT "Save text"
             ELSE IF t$="e"
                 PRINT "Enter text"
             ELSE 
                 PRINT "unknown command"
             ENDIF
           LOOP


IMP
Syntax:    x IMP y
Action:    The  operator  IMP (implication) corresponds to  a  logical 
           consequence.   The   result  is  only  FALSE  if  a   FALSE 
           expression follows a TRUE one. The sequence of the argument 
           is important.

IMP()
Syntax:    IMP(x,y)
Action:    This  function resets a bit if the appropriate bit in x  is 
           set and y is reset, otherwise the bit is set.



INC
Syntax:    INC var
Action:    Increases the value of 'var' by 1. the same as
           var=var+1 but executes aprox 3.5 times faster



INFOW
Syntax:    INFOW n,"string$"
Action:    Allocates the (NEW) information line to the window with the
           number 'n'.If the string is empty then the line is removed
           altogether. As the info line cannot be switched off and on
           when the window is opened, infow has to be used in
           front of OPENW when an information line is required.
           If the command INFOW,n,"" is used ("" = null string)
           before OPENW then the window will have no info line.


INKEY$
Syntax:    INKEY$
Action:    Reads a character from the keyboard.
           This function returns a string which is 2, 1 or 0
           characters long.
           Normal keys, return the ASCII code.
           Function keys, HELP, UNDO etc. return two characters:
           The ASCII code zero and then the key code.

Example:
           DO
               t$=INKEY$
               IF t$<>""
                   IF LEN(t$)=1
                      PRINT "Character: ";t$,"ASCII code:";ASC(t$)
                   ELSE
                      PRINT "CHR$(0)+Scan code ";CVI(t$)
                   ENDIF
               ENDIF
           LOOP


INLINE
Syntax:    INLINE var,length
Action:    Reserves an area of memory within a program.
           var is any integer variable
           length is how much memory to reserve, less than 32700 bytes
           The  reserved area always starts at an even address and  is 
           initially filled with zeros.  When implementing INLINE this 
           address  is written to the integer variable adr.  When  the 
           program is loaded or saved, the reserved area is also.

           Placing  the  cursor  on the line  containing  the  command 
           INLINE  and  pressing  the HELP key causes a  new  menu  to 
           appear with the entries: LOAD SAVE DUMP CLEAR. Load is used 
           to  load a machine code program or data into  the  reserved 
           area,  save  saves  the  reserved  area  to  disk  (default 
           filename extension .INL).  DUMP printsout the reserved area 
           in hex to the printer and CLEAR clears the araea of memory.

INP    INP&(#)   INP%(#)
OUT    OUT&      OUT%
Syntax:    INP(#n)
           OUT #n,a[,b,c...]
Action:    Reads one byte from a file previously opened with OPEN.
           Similarly  OUT#n  sends a byte to  a  file.  The  numerical 
           expression n is the channel number under which the  channel 
           was opened.
           INP  and  OUT without the # can be used  for  communicating 
           with the screen,  keyboard etc. eg INP(2) takes a character 
           from the keyboard.
           These  functions cater for 16 and 32 bit input and  output. 
           
Example:   a%=CVL(INPUT$(4,#1)) is replaced by a%=INP%(#1)


INP(n)
INP?(n)
OUT[#]n,a[,b..]
OUT?(n)

INP        reads  a  byte  from a  peripheral  device.  The  numerical 
           expression  n can accept values 0-5 (see table  below),  or 
           contains a channel number(#n). The command OUT sends a byte 
           to a peripheral device. You can send several bytes with one 
           OUT command.  
           INP?  and  OUT?  determine the input or output status of  a 
           device. TRUE(-1) is device is ready ortherwise FALSE(0).
           n        Device
           0   LST: (list)             Printer
           1   AUX: (Auxiliary)        RS232
           2   CON: (Console)          Keyboard/screen
           3   MID: (MIDI)             MIDI Interface
           4   IKB: (Intelligent kbd)  Keyboard processor 
           5   VID: (Video)            Screen


INPAUX$
INPMID$
           Using these two commands,  data can be read from the serial 
           and MIDI interfaces.
Example:
           DO
             PRINT INPAUX$;
           LOOP



INPUT
Syntax:    INPUT ["text",]x{,y,...]
           INPUT ["text";]x[,y,...]
Action:    Allows entry of data during program execution.
           If "text" is given, then a string prompt is displayed.
Example:
           INPUT a$
           INPUT "",b$
           INPUT "enter two numbers: ";x,y


INPUT$
Syntax:    INPUT$(count[,#n]))
Action:    Reads 'count' characters from the keyboard and assigns them 
           to  a  string.  Optionally,  if  the channel  number  n  is 
           specified,  the  characters are read in from  a  previously 
           OPENed channel.


INPUT #n,var1[,var2,var3,...]
LINE INPUT #n,a1$[,a2$,a3$,...]
           
           These  commands  make  it  possible to  take  data  from  a 
           previously OPENed device.  Individual variables or variable 
           lists  (where  the  vars are separated by  commas)  can  be 
           input.


INSERT
Syntax:    INSERT x(i)=y
Action:    Inserts  an  element  into  an  array.  The  value  of  the 
           expression  y  is  inserted into  the  position  x(i).  All 
           elements of the array are shifted up by one  position,  and 
           the last element lost. See also DELETE.



INSTR
Syntax:    INSTR([n,]a$,b$)      OR       INSTR(a$,b$[,n])
Action:    Searches to see if b$ is present in a$ and returns
           its position.
           'n' is a numeric expression indicating the position in a$
           at which the search is to begin.  If 'n' is not given 
           the search begins at the first character of A$.
           If b$ is found in a$ the start position is returned.
      


INT
Syntax:    INT(x)
Action:    Determines the largest integer that is less than or
           equal to 'x'.



INTIN      Address  of the VDI integer input block.  Also works  with 
           index INTIN(2).

INTOUT     Address  of the VDI integer output block.  Also works  with 
           index INTOUT(2).



INT{x}     Reads/writes a 2 byte signed integer from/to address x.
           (See also BYTE{},  CARD{},  LONG{},  {}, FLOAT{}, SINGLE{}, 
           DOUBLE{}, CHAR{} ).


KEYDEF
Syntax:    KEYDEF n,s$
Action:    Assign a string to a Function Key.  The number n (1-20)  is 
           the  function  key (for 11 and above use shift  +  function 
           key).  The  string is any string.  Whilst using  the  Basic 
           Editor,   you  must  also  hold  down  the  Alternate  key, 
           otherwise the normal menu commands would not work!



KEYGET n
KEYLOOK n
KEYTEST n

           KEYTEST is simialr to INKEY$ and reads a character from the 
           keyboard. If no key was pressed since the last input (apart 
           from Alternate,  Control, Shift and Caps Lock) the returned 
           value is zero,  otherwise its value corresponds to the  key 
           in the fashion shown below for KEYGET.

           KEYGET  waits  for a key to be pressed and then  returns  a 
           long word value corresponding to the key.  This 32 bit word 
           is constructed as follows:
           Bits 0-8    the ASCII code
           Bits 8-15   Zero
           Bits 16-23  the scan code
           Bits 24-31  status of Shift,  Control, Alternate, Caps lock 
           as follows:           
           Bit  Key
           24   Right shift
           25   Left shift
           26   Control
           27   Alternate
           28   Caps Lock

           KEYLOOK  allows  a character to be read from  the  keyboard 
           buffer,  without  changing the buffer's contents,  as  with 
           KEYGET or INKEY$.


KEYPAD n   Sets  the  usage of the  numerical  keypad.  The  numerical 
           expression n is evaluated bit by bit and has the  following 
           meaning:
           Bit Meaning             0              1
           0   NUMLOCK             On             Off
           1   NUMLOCK             Not Switchable Switchable
           2   CTRL-KEYPAD         Normal         Cursor
           3   ALT_KEYPAD          Normal         ASCII
           4   KEYDEF without ALT  Off            On
           5   KEYDEF with ALT     Off            On
           
           With  bit 0 set the keypad will act as a 'PC'  keypad  with 
           numlock off ie. it responds with cursor movements.

           With  bit 1 set the 'PC' numlock mode can be  toggled  with 
           Alternate and '-', otherwise it can't.

           With  bit 2 set,  numlock is effecively switched off  while 
           the  Control  key  is held down.  Thus  Control-4  (on  the 
           keypad) produces cursor movements.

           With bit 3 set ASCII values for characters can be typed  in 
           with the Alternate key held down.  When ALT is released the 
           character appears.

           With bit 4 set,  the character strings assigned with KEYDEF 
           to  the function keys are output when the key  is  pressed. 
           With bit 5 set, the Alternate key must aslo be held down.

           The deafult when the ST is turned on is KEYPAD 0.  with GFA 
           Basic in operation it is 46.

           

KEYPRESS n
           This  simulates the pressing of a key.  The character  with 
           the  ASCII  code contained in the lowest 8 bits of  'n'  is 
           added  to the keyboard buffer.  Additionally the status  of 
           the Shift,  Control and Alternate keys may be passed in the 
           high  order bits as defined in KEYGET.  If the  ASCII  code 
           given is zero, a scan code may be passed in bits 16-23.
Example: 
           KEYPRESS &H3B0000 presses F1.
           
Example:
           FOR i&=65 TO 90                   ! Simulates the pressing
             KEYPRESS i&                     ! of keys A-Z
           NEXT i&
           KEYPRESS 13                       !followed by Carriage Ret
           INPUT a$                          !Characters are taken up
           '                                 !to  the first CR.
           PRINT a$



KILL
Syntax:    KILL "filespec"
Action:    Deletes a file off disk (only one at a time).



L:         Enable  the passing of numerical expressions  to  Operating 
           system functions or to machine code routines.  L: is a long 
           word.
           
Example:   ~XBIOS(5,L:log_base%,L:phys_base%,-1)


LEFT$
Syntax:    LEFT$(a$[,x])
Action:    Returns the first [or first 'x'] character[s] of a string.



LEN
Syntax:    LEN(x$)
Action:    Returns the length of a string.



LET
Syntax:    [LET] var=expression
Action:    Assigns a variable with the value of an expression.



LINE
Syntax:    LINE x,y,xx,yy
Action:    Connects two points ('x,y' & 'xx,yy') with a straight
           line, and is identical to DRAW x,y TO xx,yy.



LINE INPUT
Syntax:    LINE INPUT ["text",]var$ [,var$... ]
           LINE INPUT ["text";]var$ [,var$... ]
Action:    Makes it possible to enter a string during program
           execution.
           This command is the same as INPUT except that a comma
           is taken as part of the entered string and not as a
           separator. Only <RETURN> is regarded as a separator.

LINE INPUT#  See INPUT#

 

LIST
Syntax:    LIST "filename"
Action:    stores the program currently in memory to disk in ASCII 
           format. If the 'filename' is an empty string (eg. "") then 
           the listing is shown on the screen.
           In all other cases this command is the same as the editor 
           menu option SAVE,A.            
           Programs to be joined together using the command MERGE
           must be saved using LIST (or SAVE,A from the menu bar)


LLIST
Syntax:    LLIST
Action:    Prints out the listing of the current program.  The setting 
           for the type of output is controlled by the '.' commands in 
           the editor.




LOAD
Syntax:    LOAD "filespec"
Action:    Loads a program into memory.



LOC
Syntax:    LOC(#n)
Action:    Returns the location of the file pointer for the file with 
           the channel number 'n'
           The location is given in number of bytes from the start of 
           the file.



LOCAL
Syntax:    LOCAL var [ ,var.... ]
Action:    Declares 'var' to be a local variable.
           


LOCATE
Syntax:    LOCATE row,column
Action:    Positions the cursor to the specified location.



LOF
Syntax:    LOF(#n)
Action:    Returns length of file OPENed for channel number 'n'.



LOG  LOG10
Syntax:    LOG(x)
           LOG10(x)
Action:    Determines the natural logarithm (log) or the logarithm
           base 10 (log10) of 'x'.



LONG{x}    Reads/writes a 4 byte integer from/to address x.
or         (See  also  BYTE{},   CARD{},   INT{},  FLOAT{},  SINGLE{}, 
{x}        DOUBLE{}, CHAR{} ).


LOOP       See DO

LOOP UNTIL condition
LOOP WHILE condition
           The  commands DO and LOOP can be extended using  UNTIL  and 
           WHILE. LOOP WHILE causes the program to jump back to the DO 
           command  as  long  as the condition  is  true.  LOOP  UNTIL 
           requires the condition to be false to cause the loop back.



LPEEK(x)   Reads a 4 byte integer from address x. (In supervisor mode)


LPENX      For the STE. Returns the x coordinate of a light pen.
LPENY      For the STE. Returns the y coordinate of a light pen.



LPOKE n,x  Writes a 4 byte ineger 'x' to address n.  Not in supervisor 
           mode. (Add an 'S' to do in super mode ie. SLPOKE n,x).



LPOS
Syntax:    LPOS(n)
Action:    Returns the column in which the printer head (in the printer 
           buffer) is located.


LPRINT
Syntax:    LPRINT [expressions [,][;][']] 
Action:    prints data on the printer.
           'expression' is any number of expressions separated by 
           commas or semicolons or apostrophes. If none of these is 
           given a semicolon is assumed.


LSET
Syntax:    LSET var=string
Action:    Puts the 'string' in the string variable 'var'    justified
           to the left.


L~A        Returns the base address of the LINE-A variables.

MALLOC(x)  Allocates an area of memory.  (GEMDOS 72) If x is -1,  then 
           the  function  returns the largest contiguous  free  memory 
           block.  If x is positive, then MALLOC reserves that area of 
           memory and returns its base address.  If 0 is returned then 
           there was a fault with the allocation.
           See also RESERVE, MFREE, MSHRINK.



The following 33 commands are for the handling of MATRIXES


MAT ADD
MAT ADD a(),b()
MAT ADD a(),x
MAT ADD a()=b()+c()
MAT BASE
MAT CLR a()
MAT CPY
MAT CPY a([i,j])=b([k,l])[,h,w]
MAT DET x=a([i,j])[,n]
MAT INPUT #i,a()
MAT INV a()=b()
MAT MUL
MAT MUL a(),x
MAT MUL a()=b()*c()
MAT MUL x=a()*b()
MAT MUL x=a()*b()*c()
MAT NORM a(),0
MAT NORM a(),1
MAT ONE a()
MAT PRINT
MAT PRINT [#i]a[,g,n]
MAT QDET x=a([i,j])[,n]
MAT RANG x=a([i,j])[,n]
MAT READ
MAT READ a()
MAT SET a()=x
MAT SUB
MAT SUB a(),b()
MAT SUB a(),x
MAT SUB a()=b()-c()
MAT TRANS a()[=b()]
MAT XCPY
MAT XCPY a([i,j])=b([k,l])[,h,w]

Linear operations with vectors and matrices.
All THE  MAT   functions described relate only to one and/or two-
dimensional fields with floating point variables.

System commands

MAT BASE 0
MAT BASE 1

The MAT BASE command can only sensibly be used when OPTION BASE 0 
has been activated.  In this case,  MAT BASE 1 can be used to set 
the offset for the start of the row and column indexing of one or 
two-dimensional fields with floating point variables to 1 for the 
matrix operations. MAT BASE 0 resets this offset to 0 after a MAT 
BASE 1.

The setting made with MAT BASE n affects the following commands

MAT READ
MAT PRINT
MAT CPY
MAT XCPY
MAT ADD
MAT SUB 
MAT MUL

The default is MAT BASE 1.

Generating commands

MAT CLR a()
MAT SET a()=x
MAT ONE a()

a: Name of field with numeric variables
x: aexp

MAT CLR a() corresponds to an ARRAYFILL a(),0,  i.e.  the command 
sets all elements in the field (matrix or vector) a() to a  value 
of 0.

MAT SET a()=x corresponds to an ARRAYFILL a(),x, i.e. the command 
sets  all  elements in the field a() (matrix or  vector)  to  the 
value x.


MAT ONE a() generates from a square matrix a() a uniform  matrix, 
i.e.  a square matrix in which elements  a(1,1),a(2,2),...,a(n.n) 
are all equally 1 and all other elements equally 0.

Write and Read commands

MAT READ a()
MAT PRINT [#i]a[,g,n]
MAT INPUT #i,a()

i,g,n:  iexp
a:      Name of field with numerical variables

MAT READ a() reads a previously dimensioned matrix or vector from 
DATA rows.

MAT  PRINT [#i,]a()[,g,n] outputs a matrix or a  vector.  Vectors 
are  output on one row,  the elements being separated by  commas. 
With matrix, each row is followed by a rowfeed.

The output can optionally be redirected with #i, as with PRINT.

If  g  and n are specified,  the numbers are  formatted  as  with 
STR$(x,g,n).


MAT  INPUT #1,a() reads a matrix or vector from a file  in  ASCII 
format  (the format being the reverse of MAT  PRINT,  commas  and 
rowfeeds may be varied as with INPUT #).

Copy and Transposition commands

MAT CPY a([i,j])=b([k,l])[,h,w]
MAT XCPY a([i,j])=b([k,l])[,h,w]
MAT TRANS a()[=b()]

a,b:    Name of fields with numerical variables
i,j,k,l,h,w:    iexp

MAT  CPY  a([i,j])=b([k,l])[,h,w] copies h rows with  w  elements 
each  from  matrix  b to the row and column offset  of  matrix  a 
defined by i,j, starting from the row and column offset of matrix 
b defined by l,k.


Special cases

MAT  COPY a()=b() copies the complete matrix b into matrix  a  if 
the matrix are of the same order.

Only those elements are copied in this process for which  identi-
cal  indices  are given in both the source  and  the  destination 
matrix.


MAT  COPY a(i,j)=b() copies matrix b,  starting from the row  and 
column offset defined by MAT BASE,  to the row and column  offset 
of  matrix a defined by i,j.  Only those elements are copied  for 
which  identical  indices are given in both the  source  and  the 
destination matrix.


MAT  COPY a()=b(i,j) copies matrix b,  starting from the row  and 
column  offset defined by i,j,  to the offset of matrix a defined 
by MAT BASE.  Only those elements are copied for which  identical 
indices are given in both the source and the destination matrix.


MAT COPY a(i,j)=b(k,l) copies matrix b, starting from the row and 
column offset defined by k,l, to the offset i,j of matrix a. Only 
those  elements are copied for which identical indices are  given 
in both the source and the destination matrix.


MAT  COPY  a()=b() copies h rows with w elements  each  from  the 
matrix b,  starting from the row and column offset defined by MAT 
BASE,  the row and column offset of matrix a defined by MAT BASE. 
Only  those elements are copied for which identical  indices  are 
given in both the source and the destination matrix.


MAT  XCPY  a([i,j])=b([k,l])[,h,w] works basically  in  the  same 
manner as MAT CPY a([i,j])=b([k,l])[,h,w],  except that matrix  b 
is being transposed while being copied to matrix a, i.e. the rows 
and columns of matrix b are swapped while it is copied to  matrix 
a.  Array b remains unchanged,  however.  Only those elements are 
copied  for which identical indices are given in both the  source 
and the destination matrix.


Further special cases

As with MAT CPY a(i,j)=b(k,l),w,h.

If  MAT CPY or MAT XCPY are applied to vectors,  j and l  may  be 
ignored.  Following a DIM a(n),b(m),  a() and b() are interpreted 
as row vectors, i.e. as matrix of the (1,n) or (1,m) types.

For  a  and  b to be treated as  column  vectors,  they  must  be 
dimensioned  as  matrix  of the (n,1)  or  (m,1)  type,  ie.  DIM 
a(n,1),b(n,1).

If  both  vectors are of the same order (both are row  or  column 
vectors),  MAT  CPY  must be used.  Irrespective of the  type  of 
vectors a and b, MAT CPY always treats both vectors syntactically 
as column vectors,  so that the correct syntax to be used for MAT 
CPY is always

MAT CPY a(n,1)=b(m,1)!
MAT CPY a(3,1)=b(1,1) ! interprets a() and b() as column vectors

For MAT XCPY,  one of the two vectors a and b must be  explicitly 
dimensioned as a row vector,  the other as a column  vector.

Since MAT XCPY first transposes the second vector before  copying 
it to the first.  For this reason,  MAT XCPY can only be used for 
DIM  a(1,n),b(m,1):  a()=row vector,  b()=column vector  and  DIM 
a(n,1),b(1,m): a()=column vector, b()=row vector.

Optionally,  the parameters h and w can also be used when copying 
vectors   with  MAT  CPY or  MAT  XCPY.  However,  the  following 
applies:  with MAT CPY, only the h parameter is used for w=>1. No 
copying takes place with w=0.

With MAT XCPY, only h is used for w=>1 if b is a column vector to 
be copied into a row vector after transposition. No copying takes 
place when w=0.  On the other hand,  only w is used for h=>1 if b 
is  a row vector which is to be copied to a column  vector  after 
transposition. In this case, no copying takes place if h=0.

MAT TRANS a()=b() copies the transposed from matrix b to matrix a 
if a and b are dimensioned accordingly,  i.e.  the number of rows 
from  a must correspond to the number of columns in  b,  and  the 
number of columns from a to the number of rows of n.

In the case of a square matrix,  i.e.  one with equal numbers  of 
rows and columns,  MAT TRANS a() may be used.  This command swaps 
the  rows  and  columns of matrix a and writes  the  matrix  thus 
changed back to a.

(The original matrix is lost in the process (but can be  restored 
with another MAT TRANS a()).

Operation commands

MAT ADD a()=b()+c()
MAT ADD a(),b()
MAT ADD a(),x

MAT SUB a()=b()-c()
MAT SUB a(),b()
MAT SUB a(),x

MAT MUL a()=b()*c()
MAT MUL x=a()*b()
MAT MUL x=a()*b()*c()
MAT MUL a(),x

MAT NORM a(),0
MAT NORM a(),1

MAT DET x=a([i,j])[,n]
MAT QDET x=a([i,j])[,n]
MAT RANG x=a([i,j])[,n]
MAT INV a()=b()

a,b,c: Names of numerical floating point fields
x:     aexp; scalar value
i.j,n: aexp

MAT  ADD a()=b()+c() is only defined for matrix (vectors) of  the 
same order,  e.g. DIM a(n,m),b(m,m),c(n,m) or DIM a(n),b(n),c(n). 
Array c is added to matrix b,  element by element, and the result 
is written to matrix a.

MAT ADD a(),b() is only defined for matrix (vectors) of the  same 
order,  e.g. DIM a(n,m),b(n.m) or DIM a(n),b(n). Array b is added 
to  matrix a,  element by element,  and the result is written  to 
matrix a. The original matrix a is lost in the process.

MAT  ADD a(),x is defined for all  matrix  (vectors).  Here,  the 
scalar x is added to matrix a, element by element, and the result 
is  written  to matrix a.  The original matrix a is lost  in  the 
process.

MAT  SUB a()=b()+c() is only defined for matrix (vectors) of  the 
same order,  e.g. DIM a(n,m),b(n,m),c(n,m) or DIM a(n),b(n),c(n). 
Array c is subtracted from matrix b, element by element, and the
result is written to matrix a.

MAT SUB a(),b() is only defined for matrix (vectors) of the same
order,  e.g.  DIM  a(n,m),b(n,m)  or DIM a(n),b(n).  Array  b  is 
subtracted  from  matrix a,  element by element,  and  the  result 
written to matrix a. The original matrix a is lost in the process.

MAT  SUB a(),x is defined for all  matrix  (vectors).  Here,  the 
scalar x is subtracted from matrix x, element by element, and the 
result is written to matrix a.  The original matrix a is lost  in 
the process.

MAT  MUL  a()=b()*c() is defined for matrix of  an  "appropriate" 
order. Arrays  b and c are multiplied with each other. The result 
of this multiplication is written to matrix a.  In order for  the 
result  to be defined,  the matrix on the left (matrix b in  this 
case)  must have the same number of columns as the matrix on  the 
right (c in this case) has rows. Array a, in this case, must have 
as many rows as b and as many columns as c.

Arrays are multiplied as "row by column",  i.e. element a(i.j) is 
obtained by multiplying the elements in the ith row of matrix   b 
with  the  elements in the jth column of  matrix  c,  element  by 
element, and then adding up the individual products.

With  vectors instead of matrix,  MAT MUL a()=b()*c() results  in 
the dyadic (or external) product of two vectors.

MAT  MUL  x=a()*b()  is only defined for vectors  with  an  equal 
number of elements.  The result x is the scalar product (the  so-
called interior product) of vectors a and b.  The scalar  product 
of   two   vectors  is  defined  as  the  sum   of   n   products 
a(i)*b(i),i=1,...,n.

MAT  MUL x=a()*b()*c() is defined for  qualified Vectors a and  c 
as  well  as qualified Matrix b(). 

MAT  NORM  a(),0  or MAT NORM a(),1 are defined  for  matrix  and 
vectors.  MAT NORM a(),0 normalises a matrix (a vector) by  rows, 
MAT NORM a(),1 by columns.  This means that after a normalisation 
by  rows (by columns) the sum of the squares of all  elements  in 
each row (column) is identical at 1.

MAT  DET x=a([i,j])[,n] calculates the determinants of  a  square 
matrix of the (n,n) type.  The row and column offsets are  preset 
to  a(0,0)  or a(1,1),  depending on MAT BASE 0 or  MAT  BASE  1, 
assuming  that  OPTION BASE 1 is enabled.  It is  also  possible, 
however, to calculate the determinant of a square part matrix. To 
do this, the row and column offsets of a() must be specified as i 
and j, and the number of elements in the part matrix as n. A part 
matrix of the (n,n) type is then created internally starting from 
the "position" ith row, jth column.

MAT  QDET  x=a([i,j])[,n]  works in the same manner  as  MAT  DET 
x = a([i,j])[,n],  except  that it has been optimised  for  speed 
rather  than accuracy.  Both will normally produce identical  re-
sults.  With "critical" matrix,  whose determinant is close to 0, 
you should always use MAT DET, though.


MAT RANG x=a([i,j])[,n] outputs the rank of a square  matrix.  As 
with  MAT  DET or MAT QDET,  you can select any  row  and  column 
offset.  The  number  of  elements in the  part  matrix  must  be 
specified with n.  This creates  a part matrix of the (n,n)  type 
internally, starting from the "position ith row, jth column.


MAT  INV  b()=a() is used to determine the inverses of  a  square 
matrix. The inverse of matrix a() is written to matrix b(), hence 
b() must be of the same type as a().



MAX
Syntax:    MAX(x [,y,z,...])  or  MAX(a$[,y$,z$....])
Action:    Returns the greatest value (or largest string) from
           a list of expressions.


MENU(x)    Returns the information about an event in the variable 
           'x' (-2 to 15). In the case where an item in a menu is 
           selected, the index of that item is found in MENU(0).
           MENU(-2) is the address of the message buffer.
           MENU(-1) is the address of the menu object tree.
           The  Message Buffer lies in the the variables  MENU(1) 
           to MENU(8) and the AES Integer Output Block in MENU(9) 
           to MENU(15).
           The Identification number of the event is in  MENU(1). 
           The  other  elements of the  message  bufffer  contain 
           various  values,  depending on the type of event  that 
           occured.
           
           MENU(1)=10         A Menu Item was selected.
               MENU(0)        Menu item index in the item list
               MENU(4)        Object number of the menu title
               MENU(5)        Object  number of the  chosen  menu 
                              item
                     
           MENU(1)=20         A window redraw is required
               MENU(4)        ID number (handle) of the window
               MENU(5),(6)    Coordinates  of top left corner  of 
                              the window
               MENU(7),(8)    Width & height of the window area

           MENU(1)=21         A window was clicked (activated)
               MENU(4)        ID number (handle) of the window

           MENU(1)=22         The  close  box  of  a  window  was 
                              clicked on
               MENU(4)        ID number (handle) of the window

           MENU(1)=23         The full box was clicked on
               MENU(4)        ID number (handle) of the window

           MENU(1)=24         One of the four arrow boxes,  or  a 
                              slider  bar area was  clciked.  The 
                              movement of a slider is detected as 
                              below,  MENU(1)=24  only  when  the 
                              grey area is clicked on.
               MENU(4)        ID number (handle) of the window
               MENU(5)        The  area  of the window  that  was 
                              clicked:
                              0: Above the vertical slider   
                              1: Below  "     "       "
                              2: Up arrow
                              3: Down arrow
                              4: Left of the horizontal slider
                              5: Right "  "      "        "
                              6: Left arrow
                              7: Right arrow

           MENU(1)=25         The horizontal slider was moved
               MENU(4)        ID number (handle) of the window
               MENU(5)        Position of the moved slider (1  to 
                              1000)

           MENU(1)=26         The vertical slider was moved
               MENU(4)        ID number (handle) of the window
               MENU(5)        Position of the moved slider (1  to 
                              1000)

           MENU(1)=27         The size of the window was  changed 
                              (using the size box)
               MENU(4)        ID number (handle) of the window
               MENU(5),(6)    New x and y coordinates of top left
               MENU(7),(8)    New width & height

           MENU(1)=28         The window's position was changed
               same parameters as above

           MENU(1)=29         A new GEM window was activated. 
               MENU(4)        ID number (handle) of the window

           MENU(1)=40         An  Accessory  was  selected.  This 
                              value  can only be received  by  an 
                              accessory,  which should chech  the 
                              value  in MENU(5) to see if  it  is 
                              that one being referred to.
               MENU(5)        ID of the accessory

           MENU(1)=41         An accessory was closed. This value 
                              can   only  be  received  from   an 
                              accessory.
               MENU(5)        ID of the accessory

           The varaible MENU(9) contains bit information on which 
           kind  of  event  has occurred.  If  the  bit  for  the 
           appropriate  event is set,  the variables  MENU(9)  to 
           MENU(15)  and  GINTOUT(0) to GINTOUT(6)  will  contain 
           information as follows:
               Bit 0  Keyboard
               Bit 1  Mouse button
               Bit 2  Mouse has entered/left rectangle 1
               Bit 3  Mouse has entered/left rectangle 2
               Bit 4  A message arrived in the message buffer
               Bit 5  Timer event


           MENU(10) x position of mouse when event terminated          
           MENU(11) y position of mouse when event terminated                      
           MENU(12) Mouse buttons pressed:
                    0 = none
                    1 = left
                    2 = right
                    3 = both buttons
               See also ON MENU BUTTON 

           MENU(13) supplies  the  status of the  keyboard  shift 
                    keys in a bit pattern:
                    Bit 0 = right shift
                    Bit 1 = left shift
                    Bit 2 = control
                    Bit 3 = alternate
               See also ON MENU KEY

           MENU(14) Gives  information about a pressed  key.  The 
                    low order byte contains the ASCII  code,  and 
                    the high order byte, the keyboard scan code

           MENU(15) Returns  the  number  of  mouse  clicks  that 
                    caused the event


MENU
Syntax:    MENU m$()
Action:    Displays  a menu bar.  The string array m$()  contains 
           the   headings,   entries  and  reserved   space   for 
           accessories  for the menu bar.  The  following  format 
           must be adhered to:
           m$(0)        Name of the accessory menu heading
           m$(1)        Name of the first entry in the first menu
           m$(2)        A line of minus signs
           m$(3)-m$(8)  Reserved  space  for  accessories.  These 
                        elements need only be 1 character long.
           m$(9)        An empty string,  which marks the end  of 
                        the first menu.
           All further menu entries have the following format:
           1. Heading of the menu
           2. List of menu entries
           3. An empty string which marks the end of the menu.

           After the last entry, a further empty string signifies 
           the end of the entire pull down menu.

           eg:

DIM entry$(20)
DATA "  Desk  ","  Test  "
DATA ----------,1,2,3,4,5,6,""
DATA "  File  ","  Load  ","  Save  "
DATA --------,"  Quit  ",""
DATA "  Titles  ","  Entry 1  ","  Entry 2  ",""
DATA End
i%=-1
REPEAT
  INC i%
  READ entry$(i%)
UNTIL entry$(i%)="End"
entry$(i%)=""
MENU entry$()
ON MENU GOSUB evaluate
'
REPEAT
  ON MENU
UNTIL MOUSEK AND 2
'
PROCEDURE evaluate
  MENU OFF
  ' MENU(0) contains array index of selected item
  m%=MENU(0)
  PRINT entry$(m%)
  '
  ALERT 0,"Tick before item ?",0,"YES|NO",a%
  IF a%=1
    MENU m%,1
  ELSE
    MENU m%,0
  ENDIF
  '
  ALERT 0,"Lightened characters | (Not selectable)",0,"YES|NO",a%
  IF a%=1
    MENU m%,2
  ELSE
    MENU m%,3
  ENDIF
RETURN


MENU x,y
Action:    The  x-th  entry of a menu can be  given  certain  (y) 
           attributes:
               0  remove tick from in front of menu entry
               1  install tick     "    "    "   "    "
               2  make menu entry non selectable (light text)
               3  make menu entry selectable (normal text)
               See MENU example.



MENU KILL
Action:    Deactivates  a menu,  but does not remove it from  the 
           screen. Also turns off the ON MENU GOSUB options.

MENU OFF
Action:    Returns  a menu title to 'normal' display.  (After  an 
           item  is  chosen from a menu,  the title is  shown  in 
           reverse video).


MENU_BAR
Syntax:    a%=MENU_BAR(tree%,flag)
Action:    Displays/erases a menu bar (from a resource file)
           Returns 0 if an error occurred.
           tree = address of the menu object tree
           flag - 1 display bar
                - 2 erase bar
           See also MENU x$ and MENU KILL

MENU_ICHECK
Syntax:    a%=MENU_ICHECK(tree,item,flag)
Action:    Deletes/displays a tick against a menu item.
           tree = address of the menu object tree
           item = object number of the menu item
           flag - 1 delete tick
                - 2 display tick
           See also MENU x,0 and MENU x,1



MENU_IENABLE
Syntax:    a%=MENU_IENABLE(tree,item,flag)
Action:    Enables/disables a menu entry.
           tree = address of the menu object tree
           item = object number of the menu entry
           flag - 1 disable
                - 2 enable
           See also MENU x,2 and MENU x,3


MENU_REGISTER
Syntax:    a%=MENU_REGISTER(ap_id,m_text$)
Action:    Give a desk accessory a name,  and insert it into  the 
           accessory menu entries.  (provided the number of  Accs 
           is less than 6).
           Returns  the  object number of  the  appropriate  menu 
           item:
           0-5 for a valid result
           -1  no more entries possible
           ap_id   = ID number of the accessory
           m_text$ = name for the Accessory



MENU_TEXT
Syntax:    a%=MENU_TEXT(tree,item,new_text$)
Action:    Changes the text of a menu item.
           Returns 0 on error.
           tree = address of the menu object tree
           item = object number of the menu item
           new_text$  the  new text for the menu entry  (may  not 
                      exceed the old text length)  


MENU_TNORMAL
Syntax:    a%=MENU_TNORMAL(tree,title,flag)
Action:    Switches the menu title to normal/inverse video.
           Returns 0 on error.
           tree = address of the menu object tree
           item = object number of the menu item
           flag - 1 inverse video
                - 2 normal video
           See MENU OFF


MFREE
Syntax:    a%=MFREE(y)
Action:    (GEMDOS  73)  Releases the storage  location  reserved 
           with MALLOC.  The parameter 'y' specifies the start of 
           the  area of memory to be released.  Returns 0  if  no 
           error occurred, otherwise negative result.



MID$
Syntax:    MID$(a$,x[,y]) (as a function)
Action:    Returns 'y' characters in a string from the positon 'x' 
           of the string 'a$'.  If x is larger than the length of 
           a$,  then a null string is returned.  If y is omitted, 
           then the function returns the whole of the string from 
           position x onwards.


MID$
Syntax:    MID$(a$,x[,y]) (as a command)
Action:    MID$ used as a command,  makes it possible to  replace 
           part   of  a  string  variable  a$  with  the   string 
           expression  b$.  So with  MID$(a$,x,y)=b$,  characters 
           from b$ will overwrite those in a$, starting at the x-
           th postion of a$.  The optional parameter y determines 
           how many characters of b$ are used.  If y is  omitted, 
           then as many characters as possible of a$ are replaced 
           with those from b$.  The length of a$ is unchanged, so 
           that  no charatcers will be written beyond the end  of 
           a$
           eg:
           a$="GFA SYSTEMTECHNIK"
           MID$(a$,5)="BASIC "
           would result in a$ being "GFA BASIC TECHNIK"



MIN
Syntax:    MIN(expression [ ,expression... ])
Action:    Returns the smallest value (or smallest string) from
           a list of expressions.



MKDIR
Syntax:    MKDIR "directory name"
Action:    Creates a new directory.
           'directory name' is the name of the new directory.




MKI$ MKL$ MKS$ MKF$ MKD$
Syntax:    MKI$(N)
           MKL$(N)
           MKS$(N)
           MKF$(N)
           MKD$(N)
Action:    Transforms a number into a character string.
           MKI$ 16-bit number into a 2-byte string.
           MKL$ 32-bit number into a 4-byte string.
           MKS$ a number into an atari basic 4-byte format.
           MKF$ a number into GFA Basics own 6-byte format.
           MKD$ a number into a Mbasic compatible 8-byte format.

           Every number that is to be stored in a random access
           file must first be transformed with on of the above
           functions.
           The example above shows that GFA Basic stores numbers
           internally in the 6-byte format which can also be
           created using the MKF$ function.
           See also CVI,CVL,CVD,CVF



MOD
Syntax:    a=x MOD y    or   a=MOD(x,y)
Action:    Produces the remainder of the division of x by y.
           The   command   in  brackets   operates   in   integer 
           arithmetic.



MODE
Syntax:    MODE n
Action:    With MODE the representation of decimal point and  the 
           'thousands comma' are interpreted by PRINT USING  (and 
           also by STR$ with 3 parameters).
           Also selects the format of date representation used by 
           DATE$, SETTIME, and FILES.
           
           MODE  USING     DATE$
           0     #,###.##  16.05.1988
           1     #,###.##  05/16/1988
           2     #.###,##  16.05.1988
           3     #.###,##  05/16/1988




MONITOR
Syntax:    MONITOR [x]
Action:    Calls a monitor resident in memory.  This  instruction 
           causes  an illegal instruction vector.  (address  16). 
           The parameter x is passed via the register D0.



MOUSEX  
MOUSEY  
MOUSEK
MOUSE mx,my,mk
Syntax:    MOUSE x,y,k
           x=MOUSEX
           y=MOUSEY
           k=MOUSEK
Action:    Determines the mouse position (x,y) and the status of
           the mouse buttons:
           k=0 no buttons pressed
           k=1 left button
           k=2 right button
           k=3 both buttons


MSHRINK
Syntax:    a%=MSHRINK(y,z)
Action:    (GEMDOS  74)  Reduces  the  size  of  a  storage  area 
           previously  allocated  with MALLOC.  y  specifies  the 
           address of the area,z gives the required size.
           Returns 0 if no error,  -40 if incorrect address, or -
           67 if size wrong.
           See also RESERVE MALLOC MFREE



MUL
Syntax:    MUL var,n
Action:    Multiplies the value 'var' by 'n'.
           same as var=var*n but executes 30% faster.

MUL()      Same as for MUL. but integers only.



MW_OUT
Syntax:    MWOUT mask,data
           This  command  controls the  STE-Internal  Micro-Wire-
           Interface,  and  is  currently  used  for  controlling 
           sound. 

               MWOUT &H7FF,x

               x=&X10 011 ddd ddd       Set Master Volume
                          000 000       -80 dB
                          010 100       -40 dB
                          101 xxx         0 dB

           The  value of the last 5 Bits is eqivalent to HALF  of 
           the volume in dB.

               x=&X10 101 xdd ddd       Set Right Channel Volume
                           00 000       -40 dB
                           01 010       -20 dB
                           10 1xx         0 dB

               x=&X10 100 xdd ddd       Set Right Channel Volume
               
               The last 4 Bits*2 = dB

               x=&X10 010 xxd ddd       Set Treble
               x=&X10 001 xxd ddd       Set Bass
                            0 000       -12dB
                            0 110       0 dB (flat)
                            1 100       +12 dB

               x=&X10 000 xxx xdd       Set Mix
                               00       -12dB
                               01       Mix GI Sound (normal ST)
                               10       Not Mix
                               11       Reserved

Example: MWOUT &H7FF,&X10000000010 Switches the ST's sound off.


    
NAME
Syntax:    NAME "oldfile" AS "newfile"
Action:    Renames an existing file. The contents of the file are
           not affected.



NEW
Syntax:    NEW
Action:    Deletes the program currently in memory and clears all
           variables.

NOT
Syntax:    NOT x
Action:    Negates a given logical expression.


The following 19 commands belong to the AES Object library.

OBJC_ADD
Syntax:    a%=OBJC_ADD(tree,parent,child)
Action:    Adds  an object to a given tree and  pointers  between 
           the existing objects and the new object are created.
           Returns 0 on error.
           tree     address of the object tree
           parent   object number of the parent object
           child    object number of the child to be added.


OBJC_CHANGE
Syntax:    a%=OBJC_CHANGE(tree,obj,res,cx,cy,cw,ch,new_status,re_draw)
Action:    Changes the status of an object.
           Returns 0 on error.
           tree     address of the object tree
           obj      number of the object to be changed
           res      reserved (always 0)
           cx,cy    coordinates  of top left corner  of  clipping 
                    rectangle
           cw,ch    width & height of clipping rectangle
           new_status   new object status
           re_draw  1 = redraw object
                    0 = don't redraw


OBJC_DELETE
Syntax:    a%=OBJC-DELETE(tree,del_obj)
Action:    An  object is deleted from an object tree by  removing 
           the  pointers.  The object is still there and  can  be 
           restored by repairing the pointers.
           Rteurns 0 on error.
           tree     address of the object tree
           del_obj  Object number of the object to delete.



OBJC_DRAW
Syntax:    a%=OBJC_DRAW(tree,start_obj,depth,cx,cy,cw,ch)
Action:    Draws  whole objects or part of objects on  screen.  A 
           clipping rectangle is specified,  to which the drawing 
           is limited.
           Returns 0 on error.
           tree     address of the object tree
           start_obj  number of the first object to be drawn
           depth    Number of object levels to be drawn
           cx,cy    coordinates  of top left corner  of  clipping 
                    rectangle
           cw,ch    width & height of clipping rectangle


OBJC_EDIT
Syntax:    a%=OBJC_EDIT(tree,obj,char,old_pos,flag,new_pos)
Action:    Allows  input  and  editing in  G_TEXT  and  G_BOXTEXT 
           object types.
           Returns 0 on error.
           tree     address of the object tree
           obj      number of the object to be changed
           char     input character (incl. scan code)
           old_pos  current cursor position in input string
           flag     funtion:
                    0 ED_START     -reserved-
                    1 ED_INIT      string is formatted & cursor on
                    2 ED_CHAR      Character processed &  string 
                                    redisplayed
                    3 ED_END       Text cursor switched off
           new_pos  returns  new  pos  of  text  cursor  to  this 
                    variable.


OBJC_FIND
Syntax:    a%=OBJC_FIND(tree,start_obj,depth,fx,fy)
Action:    Determines  the  object,  if  any,  which  is  at  the 
           coordinates specified in fx,fy.
           Returns the object number, or -1 if no object found.
           tree     address of the object tree
           start_obj  number of the object from where to search
           depth    Number of object levels to be searched
           fx       x coordinate (usually MOUSEX)
           fy       y coordinate (usually MOUSEY)


OBJC_OFFSET
Syntax:    a%=OBJC_OFFSET(tree,obj,x_abs,y_abs)
Action:    Calculates  the  absolute screen  coordinates  of  the 
           specified object.           
           Returns 0 on error.
           tree     address of the object tree
           obj      object number 
           x_abs,y_abs  returns  the  x,y  coordinates  to  these 
                        variables.



OBJC_ORDER
Syntax:    a%=OBJC_ORDER(tree,obj,new_pos)
Action:    re-positions an object within a tree.
           Returns 0 on error.
           tree     address of the object tree
           obj      object number 
           new_pos  new level number



OB_ADR
Syntax:    adr%=OB_ADR(tree,obj)
Action:    Gets the address of an individual object.
           Returns 0 on error.
           tree     address of the object tree
           obj      object number


OB_FLAGS
Syntax:    a%=OB_FLAGS(tree,obj)
Action:    Gets the status of the flags for an object.
           Returns 0 on error.
           tree     address of the object tree
           obj      object number
           OB_FLAGS     Bit No.
           Normal       -
           Selectable   0
           Default      1
           Exit         2
           Editable     3
           Rbutton      4
           Lastob       5
           Touchexit    6
           Hidetree     7
           Indirect     8           


OB_H
Syntax:    h%=OB_H(tree,obj)
Action:    Returns the height of an object
           Returns 0 on error.
           tree     address of the object tree
           obj      object number


OB_HEAD
Syntax:    h%=OB_HEAD(tree,obj)
Action:    Points to the object's first child, or -1 if none.


OB_NEXT
Syntax:    n%=OB_NEXT(tree,obj)
Action:    Points to the following object on the same level,  or, 
           if it is the last object on that level,  to the parent 
           object, or -1 if none.
           

OB_SPEC
Syntax:    a%=OB_SPEC(tree,obj)
Action:    Returns the address of the the data structure for  the 
           object.


OB_STATE
Syntax:    s%=OB_STATE(tree,obj)
Action:    returns the status of an object:
           OB_STATE     Bit No.
           Normal       -
           Selected     0
           Crossed      1
           Checked      2
           Disabled     3
           Outlined     4
           Shadowed     5


OB_TAIL
Syntax:    t%=OB_TAIL(tree,obj)
Action:    Points to the objects last child, or -1 if none.


OB_TYPE
Syntax:    t&=OB_TYPE(tree,obj)
Action:    Returns the type of object specified.


OB_W
Syntax:    w%=OB_W(tree,obj)
Action:    Returns the width of an object


OB_X
OB_Y
Syntax:    x (or y) =OB_X or OB_Y(tree,obj)
Action:    Rteurns   the  relative  coordinates  of  the   object 
           relative  to  its parent (or the screen if it  is  the 
           parent)


OCT$
Syntax:    OCT$(x[,n])
Action:    Changes the value 'x' into a string containing the
           value of 'x' in octal form (prefix &O),  the  optional 
           parameter n, giving the number of characters to print.


ODD
Syntax:    ODD(n)
Action:    Determines whether a number is odd. (see also even)



ON BREAK Syntax:    ON BREAK
           ON BREAK CONT
           ON BREAK GOSUB name
Action:    ON BREAK CONT makes it impossible to stop a program
           by pressing break ( <ALT><SHIFT><CNTRL> ).
           ON BREAK reactivates it.
           ON BREAK GOSUB makes it possible to jump to the procedure 
           'name' by the above key combination.


ON ERROR  
Syntax:    ON ERROR
           ON ERROR GOSUB name
Action:    Performs the procedure 'name' when an error occurs.
           The program is not interrupted and no error message
           is given.
           See also RESUME


ON...GOSUB
Syntax:    ON x GOSUB proc1,proc2......
Action:    Depending on the result of 'x'  one of several   given 
           procedures is processed.
           'proc1' ..  is a list of procedure names separated  by 
           commas. The result of 'x' denotes which procedure is
           carried out. 
           Eg: If result = 1 then the first procedure in the 
           procedure list is processed.
           If result = 2 then the second procedure in the procedure
           list is processed.
           If result = 3 then the third procedure in the procedure
           list is processed and so on.
           If the value is not in the  range then no procedure
           will be executed.



ON MENU
Syntax:    ON MENU[t]
Action:    This  command  handles  EVENTs.   Prior  to  use,  the 
           required  action should be specified with an  ON  MENU 
           xxx GOSUB command. For constant supervision of events, 
           ON MENU is usually found in a loop.
           The parameter t is the time in thousandths of a second 
           to elapse before the ON MENU command is terminated.          




ON MENU xxx GOSUB
Syntax:    ON MENU BUTTON clicks,but,state GOSUB proc
Action:    Sets up the action to be taken when one or more  mouse 
           clicks  are  received.   With  a  subsequent  ON  MENU 
           command,  the  named procedure will be branched to  if 
           the condition imposed by the parameters are met.
           clicks   -   sets  the maximum number of  clicks  that 
                        will generate a response.
           button   -   The expected button combination:    
                        0 - any
                        1 - left
                        2 - right
                        3 - both
           state    -   Specifies which button state (up or down) 
                        will cause the event. 0 = up, 1 = down
           proc     -   The procedure to branch to.


Syntax:    ON MENU GOSUB proc
Action:    The  procedure  to  which control will  be  passed  on 
           selection of  a  menu  entry  is  determined.   If  an 
           accessory is currently open, the procedure will not be 
           called.
           See also MENU(0)


Syntax:    ON MENU IBOX n,x,y,b,h GOSUB proc
Action:    Monitors  the mouse coordinates,  and branches to  the 
           named  procedure  if the mouse  enters Y
           k=MOUSEK
Action:    Determines the mouse position (x,y) and the status of
           the mouse buttons:
           k=0 no buttons pressed
           k=1 left button
           k=2 right button
           k=3 both buttons




Syntax:    ON MENU KEY GOSUB proc
Action:    Monitors the keyboard,  and branches to proc if a  key 
           was pressed during an ON MENU loop.
           See MENU(13) & MENU(14) for the keys.



Syntax:    ON MENU MESSAGE GOSUB proc
Action:    Brances  to proc if a message arrives in  the  message 
           buffer during an ON MENU loop. 
           See MENU(x) for the messages.
           

Syntax:    ON MENU OBOX n,x,y,w,h GOSUB proc
Action:    Monitors  the mouse coordinates,  and branches to  the 
           named  procedure  if the mouse  leaves  a  rectangular 
           screen area. It is possible to wait for two such boxes 
           to  be left (n can be 1 or 2 ).  x and y are  the  top 
           left  coordinates of the rectangle,  w & h  being  its 
           width and height.  Continuous monitoring is done  with 
           ON MENU.


OPEN
Syntax:    OPEN mode$,#n,name$[,len]
Action:    Opens a data channel to a file or a peripheral device.
           'mode' must always be written in quotes and is one
           of the following :-
           'O' (output) opens a write file creating a new file if 
           needed.
           'I' (input) opens a read file.
           'A' (append) enables data to be annexed to an existing 
           file.
           'U' (update) read/write, but file must be opened by 'o' 
           first.
           'R' stands for random access file.
           Instead  of  a filename,  a periphral  device  can  ne 
           specified.  The  expression  'len' is used  only  with 
           Random Access mode.
           the following can be used instead of filenames :-
           'CON:'  for the console. 
           'LST:'  or 'prn:' for the printer.
           'AUX:'  for the serial interface.
           'MID:'  for midi.
           'VID:'  for the console in transparent mode
                   (commands are produced but not executed).
           'IKB:'  for direct access to the keyboard controller.
           'STD:'. (This is the same as 'Stdin','Stdout' resp. in 
           C-programs.) So you can use  a shell to redirect the 
           output of a GFA-BASIC program.

           GFABASIC TEST >DUMMY

           This line starts GFA BASIC and the program TEST.PRG 
           Any output via 'STD:' is redirected to the file  DUMMY. 
           IMPORTANT: CONTROL-C will cause a hang- up when given 
           while reading/writing DUMMY. the default for input/output
           is the keyboard/console.
           The  numerical  expression 'n'  contains  the  channel 
           number (0-99), and the variable name$, the access path 
           and filename.



OPENW
Syntax:    OPENW nr[,x a  rectangular 
           screen  area.  It  is possible to wait  for  two  such 
           boxes  to be entered (n can be 1 or 2 ).  x and y  are 
           the top left coordinates of the rectangle, w & h being 
           its  width and height.  Continuous monitoring is  done 
           with ON MENU.



OPTION BASE 
Syntax:    OPTION BASE 0 (default)
           OPTION BASE 1
Action:    This  command  can determine whether an  array  is  to 
           contain a zero element or not. ie. with OPTION BASE 0, 
           doing a DIM a%(10) will allow a%(0) to exist.


OR
Syntax:    x OR y
Action:    The  command OR (disjunction) checks whether at  least 
           one of two logical expressions x and y is  TRUE.  Only 
           if  x  and y are both FALSE will the result  FALSE  be 
           produced.


OR()
Syntax:    OR(x,y)
Action:    The  result of OR contains bits set in the  places  in 
           which bits are set in either x or y or both.



OTHERWISE  See SELECT



OUT
Syntax:    OUT [#]n,a[,b..]
Action:    Transfers a byte[s] with the value 'a' to a peripheral
           device or file 'n'.
           See OPEN for valid peripherals.
           See also INP

OUT#       See INP#


OUT?
Syntax:    OUT?(n)
Action:    Determines the output status of a periphery.
           This function returns 0 if a character can be output.
           (see also INP?)


PADT(i)
Syntax:    a=PADT(i)
Action:    Reads the paddle buttons on the STE


PADX(i)
PADY(i)
Syntax:    a=PADX(i)  or  PADY(i)
Action:    Reads the x or y position of the paddles on the STE. i 
           can be 0 or 1.



PAUSE
Syntax:    PAUSE x
Action:    Interrupts a program for exactly  x/50 seconds.
           See also DELAY.



PBOX
Syntax:    PBOX x,y,x1,y1
Action:    Draws  a filled rectangle with the coordinates of  the 
           two opposite corners specified by x,y and x1,y1.
           See also BOX,PRBOX, RBOX.


PCIRCLE
Syntax:    PCIRCLE x,y,r[,w1,w2]
Action:    Draws a filled circle with centre coordinates  at  x,y 
           and a radius r.  Additional start and end angles w1 and 
           w2 can be specified to draw a circular arc.



PEEK  DPEEK  LPEEK 
Syntax:    PEEK(x)
           DPEEK(x)
           LPEEK(x)
Action:    Returns the contents of the memory at address 'x'
           PEEK  returns a 1 byte at address x
           DPEEK  returns a 2 byte number from x and x+1
           LPEEK  returns a 4 byte number from x, x+1, x+2 & x+3
           for DPEEK and LPEEK, 'x' must be an even number.





PELLIPSE
Syntax:    PELLIPSE x,y,rx,ry [,phi0,phi1]
Action:    Draws a filled ellipse at x,y, having 'rx' as length of the
           horizontal axis and 'ry' as length of the vertical axis
           The optional angles 'phi0' & 'phi1' give start and end
           angles in tenths of a degree, to create an elliptical arc.


PI
Syntax:    PI
Action:    Returns the value of PI. The value of PI is
           3.141592653.....etc.



PLOT
Syntax:    PLOT x,y
Action:    Plots a point on the screen coordinates 'x,y'.
           This command is the same as draw x,y.



POINT
Syntax:    POINT x,y
Action:    Checks if a graphic dot (at 'x,y') has been set and
           returns its colour value.



POKE  DPOKE  LPOKE
Syntax:    POKE x,n
           DPOKE x,n
           LPOKE x,n
Action:    Writes 1, 2 or 4 bytes into memory at an address which
           starts at 'x'.
           The value of 'x' must be an even number for DPOKE and
           LPOKE.
           


POLYLINE   POLYFILL  POLYMARK
Syntax:    POLYLINE n,x(),y()[OFFSETx_off,y_off]
           POLYFILL n,x(),y()[OFFSETx_off,y_off]           
           POLYMARK n,x(),y()[OFFSETx_off,y_off]
Action:    POLYLINE  draws  a polygon with  n  corners.  The  x,y 
           coordinates for the corner pointa are given in  arrays 
           x()   and  y().   The  first  and  last   points   are 
           automatically connected. The optional parameter OFFSET 
           can be added to these coordinates. 
           POLYFILL fills the polygon with the pattern previously 
           defined by DEFFILL.
           POLYMARK  marks  the  corner  points  with  the  shape 
           defined by DEFMARK.



POS
Syntax:    POS(n)
Action:    Returns the column in which the cursor is positioned.
           'n', a hypothetical argument, is optional.
           See also CRSCOL, CRSLIN, TAB, HTAB, VTAB.



PRBOX
Syntax:    PRBOX x,y,x1,y1
Action:    Draws a filled rectangle with rounded corners.
           See also BOX, PBOX, RBOX.


PRED
Syntax:    a$=PRED(b$)
Action:    Supplies  the character with the ASCII code  one  less 
           than  that  of the first character  of  the  specified 
           string.
           See also SUCC.


PRED()
Syntax:    i%=PRED(n%)
Action:    Returns the next lower number of the integer argument.
           See also SUCC().



PRINT  
Syntax:    PRINT 
           PRINT expression
Action:    Displays information on the screen. 
           'expr' can be any number of expressions which must be
           separated by commas, semicolons or apostrophes.
           ; -items are printed one after an other in one line.
           , -items are printed at intervals of 16 columns.
           ' -each apostrophe causes a space to be printed.




PRINT AT
Syntax:    PRINT AT(column,row);expression
Action:    Prints  'expression'  at a specified row  and  column. 
           NB. These start at 1, not 0.




PRINT USING
Syntax:    PRINT USING format$,expression[;]
           PRINT AT(column,row);USING format$,expression[;]
Action:    Prints formatted digits and character strings.
           format$ is a string expression which sets the printing
           format using a list of expressions separated by commas.

           #    reserves space for a digit.
           .    position of the decimal point.
           +    executes a plus sign.
           -    reserves space for a minus sign.
           *    zeros before the comma are replaced by * otherwise
                the same as #.
           $    prefix $.
           ,    insertion of a comma.             
           ^    execution in exponent form  E+
           !    indicates that the first character of a string is
                issued.
           &    the whole string is issued.
        \..\    as many characters as the length of \..\ is issued
                (including back-slashes).
           -    prints the proceeding character.



PRINT TAB
Syntax:    PRINT TAB(n)
Action:    Prints  spaces  until  POS(0)  reaches  n.  If  POS(0) 
           already exceeds n then a Line Feed/Carriage Return  is 
           executed first.



PRINT#
Syntax:    PRINT #n,expression
           PRINT #n,USING format$,expression
Action:    Outputs data to a specified channel n  (0-99).  PRINT# 
           USING allows formatted data to be output.


PROCEDURE
Syntax:    PROCEDURE proc[(var1,var2,...)]
Action:    Marks the beginning of a procedure.
           Basic will only process a procedure when it is called
           by the command GOSUB   (or   by  simply   naming   the 
           procedure, or using  @proc. If it comes across the command
           procedure during 'normal' running of the program, it
           considers it to be the end of the program.
           Not  only  the  values  of  variable,   but  also  the 
           variable's  address can be passed to procedures  using 
           the VAR command in the Procedure's header.



PSAVE
Syntax:    PSAVE f$
Action:    Saves the current program to disk with the name f$, it 
           is saved with protection,  and cannot be  subsequently 
           listed    on   re-loading;    PSAVEd   programs    RUN 
           automatically on loading.
           See also SAVE



PTSIN      Address of the VDI point input table
PTSOUT     Address of the VDI point output table
           These two commands can be used with index,  to address 
           the array directly. eg. PTSIN(0).



PTST()
Syntax:    a=PTST(x,y)
Action:    Corresponds to the POINT command.  Returns the  colour 
           of the pixel at x,y.


PUT
Syntax:    PUT x,y,section$[,mode]
Action:    Places a graphics block on the screen at x,y which
           has been previously grabbed by GET, and stored in 
           section$.
           'mode' (optional) sets the way the image is placed.
           0 -                All points are cleared
           1 - s AND d        Only points set in both remain set.
           2 - s AND (NOT d)  Sets  only points which are  set  in 
                              the   source   and  clear   in   the 
                              destination.
           3 - s              Overwrite (default GRAPHMODE 1)
           4 - (NOT s)AND d   
           5 - d
           6 - s XOR d
           7 - s OR d
           8 - NOT(s OR d)
           9 - NOT(s XOR d)
           10  NOT d
           11  s OR(NOT d)
           12  NOT s
           13  (NOT s)OR d
           14  NOT(s AND d)
           15  1              All points set.
           The important ones are:
           3   Repalce
           4   XOR
           7   Transparent
           13  Inverse Transparent.



PUT #
Syntax:    PUT #n[,r]             
Action:    Writes a record to a random access file.
           'n' data channel number (0 to 99).
           'r' is an integer expression between 1 and the number
           of records in the file (max 65535) and denotes the
           record number of the record to be written.
           See also GET #, RECORD #




QSORT
Syntax:    QSORT a(s) [OFFSET o] [WITH i()] [,n[,j%()]]
           QSORT x$(s) WITH i() [,n[,j%()]]
Action:    Sorts  the elements of an array.  's' can be  a  minus 
           sign or a plus sign,  indicating an ascending  sort(+) 
           or a descending sort(-),  the default being ascending. 
           The  parameter 'n' specifies that only the  first  'n' 
           elements  are to be sorted.  (Depends on OPTION  BASE) 
           whether 0 or 1. If n=-1, then all elements are sorted.
           When  a further array is specified,  then  that  array 
           will be sorted along with the first array.
           OFFSET   determines  how  many  characters   off   the 
           beginning shall not be considered.
           During sorting of string arrays a sorting criteria can 
           be  specified in an array of at least 256 elements  by 
           using WITH.  Without using this option, a normal ASCII 
           sort is used.
           eg:
           DIM a$(256)
           FILES "*.*" TO "liste"
           OPEN "i",#1,"liste"
           RECALL #1,a$(),-1,x%
           CLOSE #1
           QSORT a$() OFFSET 13,x%
           OPEN "o",#1,"con:"
           STORE #1,a$(),x%
           CLOSE
           Saves the directory as 'LISTE', then reloads the file, 
           sorts the array, not on name but on file length.
           DIM x%(20)
           PRINT "Unsorted:        ";
           FOR i%=0 TO 10
             x%(i%)=RAND(9)+1
             PRINT x%(i%);"  ";
           NEXT i%
           PRINT
           '
           QSORT x%(),11
           PRINT "Ascending sort:  ";
           FOR i%=0 TO 10
             PRINT x%(i%);"  ";
           NEXT i%
           PRINT
           '
           QSORT x%(-),11
           PRINT "Descending sort: ";
           FOR i%=0 TO 10
             PRINT x%(i%);"  ";
           NEXT i%
           PRINT
         


QUIT
Syntax:    QUIT[n]
Action:    Terminate the program and leave GFA Basic.
           Returns  a  two byte integer to  the  calling  routine 
           (normally the desktop).

  

RAD
Syntax:    RAD(degrees)
Action:    Converts  from  degrees  to  radians.  (equivalent  to 
           x*PI/180).
           See also DEG
           


RAND
Syntax:    RAND(y)
Action:    Produces a 16 bit random integer in the range 0 to  y-
           1. Where y is an integer max value &HFFFF.


RANDOM
Syntax:    RANDOM(x)
Action:    Returns a random integer between 0 (inclusive) and
           'x' (exclusive).



RANDOMIZE
Syntax:    RANDOMIZE [y]
Action:    Initialises  the  random number  generator  [with  the 
           value y].



RBOX
Syntax:    RBOX x,y,x1,y1
Action:    Draws a rectangle with rounded corners from the two
           diagonally opposite corner points 'x,y' and 'x1,y1'
           See also BOX, PBOX, PRBOX.



RCALL
Syntax:    RCALL addr,reg%()
Action:    Calls  an assembler routine (similar to  C:  or  CALL) 
           with pre-allocated values in the registers.
           The integer array reg% must have 16 elements and holds 
           the values.  At the end of the routine, the values are 
           also returned in the array.
           Data registers d0 to d7    --->reg%(0) to reg%(7)
           Address registers a0 to a6 --->reg%(8) to reg%(14)
           User Stack Pointer (a7)    --->reg%(15)




RC_COPY
Syntax:    RC_COPY s_adr,sx,sy,sw,sh TO d_adr,dx,dy[,m]
Action:    Copies  rectangular screen sections between  areas  of 
           memory.
           s_adr    source address
           sx,sy    top left corner of source rectangle
           sw,sh    width & height  "   "        "
           d_adr    destination address
           dx,dy    destination x and y coordinates
           m        optional mode (see PUT for modes).



RC_INTERSECT
Syntax:    y%=RC_INTERSECT(x1,y1,w1,h1,x2,y2,w2,h2)
Action:    Detects whether two rectangles overlap. The rectangles 
           being  specified  by the coordinates of the  top  left 
           corner(x,y)  and their width & height  (w,h).  
           Returns TRUE (-1) if they do overlap and the variables 
           x2,y2,w2,h2 contain the size of the common rectangle.



READ
Syntax:    READ var[,var1, ...] 
Action:    Reads values from a DATA command and assigns them to a
           variable 'var'. Reading is taken from the last point a 
           RESTORE was done (if any).



RECALL
Syntax:    RECALL #i,x$(),n[TO m],x
Action:    Inputs n lines from a text file to the array x$().  If 
           n=-1  all  available lines are read.  x  contains  the 
           number of lines read.


RECORD
      


RELSEEK
Syntax:       RELSEEK [#]N,X
Action:   Moves tINT
           '
           QSORT x%(-),11
           PRINT "Descending sort: ";
           FOR i%=0 TO 10
             PRINT x%(i%);"  ";
           NEXT i%
           PRINT
         


QUIT
Syntax:    QUIT[n]
Action:    Terminate the program and leave GFA Basic.
           Returns  a  two byte integer to  the  calling  routine 
           (normally the desktop).

  

RAD
Syntax:    RAD(degrees)
Action:    Converts  from  degrees  to  radians.  (equivalent  to 
           x*PI/180).
           See also DEG
           


RAND
Syntax:    RAND(y)
Action:    Produces a 16 bit random integer in the range 0 to  y-
           1. Where y is an integer max value &HFFFF.


RANDOM
Syntax:    RANDOM(x)
Action:    Returns a random integer between 0 (inclusive) and
           'x' (exclusive).



RANDOMIZE
Syntax:    RANDOMIZE [y]
Action:    Initialises  the  random number  generator  [with  the 
           value y].



RBOX
Syntax:    RBOX x,y,x1,y1
Action:    Draws a rectangle with rounded corners from the two
           diagonally opposite corner points 'x,y' and 'x1,y1'
           See also BOX, PBOX, PRBOX.



RCALL
Syntax:    RCALL addr,reg%()
Action:    Calls  an assembler routine (similar to  C:  or  CALL) 
           with pre-allocated values in the registers.
           The integer array reg% must have 16 elements and holds 
           the values.  At the end of the routine, the values are 
           also returned in the array.
           Data registers d0 to d7    --->reg%(0) to reg%(7)
           Address registers a0 to a6 --->reg%(8) to reg%(14)
           User Stack Pointer (a7)    --->reg%(15)




RC_COPY
Syntax:    RC_COPY s_adr,sx,sy,sw,sh TO d_adr,dx,dy[,m]
Action:    Copies  rectangular screen sections between  areas  of 
           memory.
           s_adr    source address
           sx,sy    top left corner of source rectangle
           sw,sh    width & height  "   "        "
           d_adr    destination address
           dx,dy    destination x and y coordinates
           m        optional mode (see PUT for modes).



RC_INTERSECT
Syntax:    y%=RC_INTERSECT(x1,y1,w1,h1,x2,y2,w2,h2)
Action:    Detects whether two rectangles overlap. The rectangles 
           being  specified  by the coordinates of the  top  left 
           corner(x,y)  and their width & height  (w,h).  
           Returns TRUE (-1) if they do overlap and the variables 
           x2,y2,w2,h2 contain the size of the common rectangle.



READ
Syntax:    READ var[,var1, ...] 
Action:    Reads values from a DATA command and assigns them to a
           variable 'var'. Reading is taken from the last point a 
           RESTORE was done (if any).



RECALL
Syntax:    RECALL #i,x$(),n[TO m],x
Action:    Inputs n lines from a text file to the array x$().  If 
           n=-1  all  available lines are read.  x  contains  the 
           number of lines read.
           The  optional parameter TO will read in the  start  of 
           the file to the named elements of the array.
           eg.
           DIM a$(20)
           FOR n=0 TO 19
             a$(n)="Line # "+STR$(n)
           NEXT n
           OPEN "o",#1,"test"
           STORE #1,a$()
           CLOSE
           DIM b$(20)
           OPEN "i",#1,"test"
           RECALL #1,b$(),12 TO 15,x
           'or RECALL #1,b$(),-1,x
           CLOSE
           PRINT x
           FOR n=0 TO 20
             PRINT b$(n)
           NEXT n

See Also:  STORE



RECORD
Syntax:    RECORD #n,r
Action:    Sets  the  number of the next record to br read  or  stored 
           with GET or PUT.

Example:   RECORD #1,15

See Also:  FIELD,GET#, PUT#, SEEK


      
RELSEEK
Syntax:    RELSEEK [#]n,x
Action:    Moves the random access file pointer forward (+X) or
           backwards (-X) 'X' number of bytes.


REM
Syntax:    REM remark
Action:    Whatever follows a REM coomand on a particular line
           is ignored by Basic. ' is synonoymous with REM.

Example:   REM This is a comment



RENAME
Syntax:    RENAME old$ AS new$
Action:    Renames a file.



REPEAT...UNTIL
Syntax:    REPEAT
           UNTIL end
Action:    Creates a pre-defined loop. The section of the program
           between repeat and until is repeated continuously until 
           the condition is fulfilled.

Example:   REPEAT 
           UNTIL MOUSEK       'Waits for mouse key to be pressed.



RESERVE
Syntax:    RESERVE n
Action:    Increases or decreases the memory used by basic
           'n' is a numeric expression which determines how big
           FRE(0) should be after this command. (see HIMEM, EXEC)

Example:   RESERVE 2560
           EXEC 0,"\PROGRAM.PRG","",""
           RESERVE
           
           2560  bytes  are  reserved and PROGRAM.PRG  is  loaded  and 
           started. After running the reserved space is restored.

           Memory can be reserved in blocks of 256 bytes.
           If  n  is  negative then the whole of the  free  memory  is 
           reserved.


RESTORE
Syntax:    RESTORE [label]
Action:    Positions the data pointer for READ. 
           Places the data pointer at the beginning, or behind the
           label names 'label'
           'label' can be any list of characters and can contain
           digits, letters, underscore and full stops.  Unlike
           other variable names it can begin with a digit.


RESUME
Syntax:    RESUME    RESUME NEXT    RESUME label
Action:    The  RESUME command is only meaningful with  error  capture 
           (ON ERROR GOSUB) where it allows a reaction to an error.

           RESUME repeats the erroneous command.  
           RESUME NEXT resumes program execution after an incorrect 
           command.
           RESUME 'label' branches to the 'label'.
           If a fatal error occurs only RESUME 'label' is possible

Example:   ON ERROR GOSUB error_trap
           ERROR 5
           PRINT "and again..."
           ERROR 5
           PRINT "is not reached."
           '
           PROCEDURE error_trap
               PRINT "OK, error intercepted"
               RESUME NEXT
           RETURN



RETURN
Syntax:    RETURN
Action:    Terminates a sub-routine


Syntax:    RETURN x
Action:    If  the command RETURN is reached during program  ececution 
           and  is  within a FUNCTION...ENDFUNC  execution,  then  the 
           value given after it is returned.


RIGHT$
Syntax:    RIGHT$(string[,n])
Action:    Returns the last characters or 'n' number of characters
           (from the right) of a character string 'string'
Example:   PRINT RIGHT$"Hello GFA",3)   'PRINTS GFA
           


RINSTR
Syntax:    RINSTR(a$,b$)
           RINSTR(a$,b$,[x])
           RINSTR([x],a$,b$)
Action:    Operates in same way as INSTR except that search begins  at 
           the right end of a$.


        
RMDIR
Syntax:    RMDIR "directory name"
Action:    Deletes empty directories



RND
Syntax:    RND [(x)]
Action:    Returns a random number between 0 and 1

           The optional parameter (x) is disregarded, and  returns
           a random number between 0 (inclusive) and 1 (exclusive)

ROL
Syntax:    ROL(x,y)
           ROL&(x,y)
           ROL|(x,y)
Action:    Rotates a bit pattern left.


ROR
Syntax:    ROR(x,y)
           ROR&(x,y)
           ROR|(x,y)
Action:    Rotates a bit pattern right.


ROUND
Syntax:    ROUND(x[,n])
Action:    Rounds off the numeric expression x.

Example:   y=ROUND(-1.2)
           PRINT y,ROUND(1.7)


RSET
Syntax:    RSET a$=b$
Action:    Moves a string expression, right justified to a string.
See Also:  LSET,MID$


The  following  commands  are part  of  the  Resource  Library.  These 
routines provide the creation of a graphical user interface.  The full 
descriptions  of  these  functions  are  beyond  the  scope  of  these 
abreviated  manual.  A full description is contained within  the  full 
GFA-BASIC Reference manual and also the GFA-BASIC Software Development 
Book.


RSRC_FREE
Syntax:    ~RSRC_FREE(0)
Action:    This  function  releases  the  memory  space  reserved   by 
           RSRC_LOAD. 
           Returns 0 if an error.


RSRC_GADDR
Syntax:    ~RSRC_GADDR(type,index,addr)
Action:    This   function  determines  the  address  of  a   resource 
           structure   after  it  has  been  loaded  with   RSRC_LOAD. 
           Depending  on the version of GEM,  this function  may  only 
           work for Object trees and Alert boxes.
           Returns 0 if an error.

           Type:0   OBJECT TREE
                1   OBJECT
                2   TEDINFO
                3   ICONBLK
                4   BITBLK
                5   STRING
                6   image data
                7   obspec
                8   te_ptext
                9   te_ptmplt
               10   te_pvalid
               11   ib_pmask
               12   ib_pdata
               13   pb_ptext
               14   bi_pdata
               15   ad_frstr
               16   ad_frimg

           Index:   The   number  of  the  object  whose  address   is 
                    required, counting objects of that type one by one 
                    from the beginning of the resource file.

           addr:    The required address.

Example:   ~RSRC_GADDR(0,0,TREE%)



RSRC_LOAD
Syntax:    RSRC_LOAD(name$)
Action:    This  function reserves memory and loads a  resource  file. 
           Then  internal  pointers are set and  the  co-ordinates  of 
           characters converted into pixel format.

Example:   ~RSRC_LOAD("TEST.RSC")


   
RSRC_OBFIX
Syntax:    RSRC_OBFIX(tree,obj)
Action:    This function converts the coordinates of an object  within 
           a  tree,  from character coordinates to pixel  coordinates, 
           taking  into account the current screen resolution.  It  is 
           automatically called by RSRC_LOAD,  but must be used if the 
           object is created direct in memory by POKE.

           tree:    address of the object tree
           obj:     object number 



RSRC_SADDR
Syntax:    RSRC_SADDR(type,index,addr)
Action:    This function sets the address of an object.
           Returns 0 if an error.

           type:    type of structure
           index:   the number of the object
           addr     address



RUN
Syntax:    RUN(a$)    
Action:    Runs the program in memory,  or if a file name is  supplied 
           will load and then run the appropriate program.

Example:   RUN "A:\PROGRAM.GFA"



SAVE   
PSAVE  
Syntax:    SAVE a$
           PSAVE a$
Action:    Saves a program file (psave is with list protection)
           'file name' is the name of the program.
           Programs which are saved with psave are not listed but
           run straight after the command 'load' is given.


SEEK
Syntax:    SEEK [#]n,x
Action:    Sets the file pointer on the byte number 'x' of file #n
           'n' is an integer expression between 0 and 99 which
           refers to the channel number.  'x' has a value (total)
           either greater or smaller than the length of the file
           addressed.



SCRP_READ
Syntax:    SCRP_READ(path$)
Action:    This  function reads data,  left there by another  program, 
           from a small internal buffer,  thus allowing  communication 
           between GEM programs. Returns 0 if an error.
Example:   SCRP_READ(a$)
See Also:  SCRP_WRITE



SCRP_WRITE
Syntax:    SCRP_WRITE(path$)
Action:    This  function writes data,  into a small internal  buffer, 
           thus allowing communication between GEM programs. 
Example:   SCRP_WRITE("A:\PROGRAM.TXT")
See Also:  SCRP_READ



SDPOKE
Syntax:    SDPOKE x,y
Action:    Allows  DPOKE  to  operate  in  supervisor  mode,  so  that 
           protected address (0 to 2047) can be modified.



SEEK
Syntax:    SEEK #n,pos
Action:    Absolute  positioning  of data pointer  within  file.  This 
           allows  the realisation of indexed sequential file  access. 
           The  numerical expression n contains the channel number  of 
           the file.


SELECT
Syntax:    SELECT x
           CASE y [TO z] or CASE y [,z,...]
           CASE TO y
           CASE y TO
           DEFAULT
           ENDSELECT
           CONT
Action:    A conditional command which enables execution of  specified 
           program segments depending on an integer.

           The maximum of a CASE is 4 characters (eg CASE "A,B,C,D"

           The  CONT command provides a method of jumping over a  CASE 
           or DEFAULT command.

Example:   REPEAT
               a%=ASC(INKEY$)
               SELECT a%
               CASE 65 TO 90
                    PRINT "CAPITAL LETTER"
               CASE 97 TO 122
                    PRINT "LOWER CASE LETTER"
               DEFAULT
                    PRINT "NOT CAPITAL OR LOWER CASE"
               ENDSELECT
           UNTIL a%=27
           

SETCOLOR
Syntax:    SETCOLOR i,r,g,b      
           SETCOLOR i,n
Action:    Defines the colours red, green and blue for the colour
           register 'i'.
           'r,g,b' are the levels of the three primary colours
           from 0 to 7.
           Another way of defining colours is to use the value 'n'
           where n=r*256+g*16+b
See Also:  COLOR,VSETCOLOR



SETDRAW    See DRAW command.

SETMOUSE
Syntax:    SETMOUSE mx,my,[,mk]
Action:    The  SETMOUSE command permits the positioning of the  mouse 
           cursor under program control. Tje optional parameter mk can 
           simulate the mouse button being pressed or released.

Example:   FOR i%=0 TO 300
               HIDEM
               SETMOUSE i%,i%
               PLOT MOUSEX,MOUSEY
               SHOWM
               PAUSE 2
           NEXT i%                   


SETTIME
Syntax:    SETTIME time$,date$
Action:    Sets the time and the date.
           
           time$ is a string expression which contains the
           time.  hours, minutes and second can be displayed. The
           colons are optional as two digits have to be entered.
           The seconds can also be left out.             
           
           date$ is a character string expression for the
           date.  It must always contain:  day, month and year,
           each separated by a full stop.

Example:   PRINT DATE$,TIME$
           SETTIME "17:30:30","27.10.1952"
           PRINT DATE$,TIME$



SGET
Syntax:    SGET screen$
Action:    Fast reading of the entire screen area into a string
           variable. 
Example:   PCIRCLE 100,100,50
           SGET b$
           ~INP(2)
           CLS
           ~INP(2)
           SPUT b$
See Also:  SPUT, GET, PUT and BMOVE



SGN
Syntax:    SGN(x)
Action:    Ascertains whether 'x' is positive, negative or 0
           'x' can be any numeric expression.  SGN(x) is the
           mathematic sign function.


The  following  commands  are part of the  Shell  Library  and  enable 
an  application  to  call  another,   preserving  both  the   original 
application and its environment.
The full descriptions of these functions are beyond the scope of these 
abreviated  manual.  A full description is contained within  the  full 
GFA-BASIC Reference manual.



SHEL_ENVRN
Syntax:    SHEL_ENVRN(addr,search$)
Action:    This function determines the values of variables in the GEM 
           environment.
           Returns 1.

           search$: The string to be sought
           addr:    address of the byte following the string

Example:   PRINT SHEL_ENVRN(a%,"PATH")
           PRINT CHAR{a%-4}

           ' Displays: PATH=A:\


SHEL_FIND
Syntax:    SHEL_FIND(paths$)
Action:    This  function  searches for a file and supplies  the  full 
           file specification.  First the path on the current drive is 
           searched, then the root directory of drive A:.

           Returns 0 if file not found, or 1 if found.

           On entry:
           path$:   String contains sought after filename.

           On exit:
           path$:   Contains  the full file specification if the  file 
                    was found, otherwise it is unchanged.





SHEL_GET
Syntax:    SHEL_GET(num,x$)
Action:    This  function  reads data from  the  GEMDOS  environmental 
           string  buffer (into which the file DESKTOP.INF is read  on 
           start up).

           Returns 0 if an error.

           num:     number of bytes to be read
           x$:      string to contain data

Example:   SHEL_GET(500,x$)
           PRINT x$



SHEL_PUT   
Syntax:    SHEL_PUT(len,x$)
Action:    This  function  writes data into the  GEMDOS  environmental 
           string buffer.

           Returns 0 if an error.

           x$:      String containing the data to be written
           len:     number of bytes to be written

Example:   'Register GFA-BASIC
           ~SHEL_GET(2000,a$)
           q%=INSTR(a$,CHR$(26))
           IF q%
               a$=LEFT$(a$,q%-1)
               IF INSTR(a$,"GFABASIC.PRG")=0
                    a$=s$+"#G 03 04 A:\GFABASIC.PRG@*.GFA
                              +MKI$(&HDOA)+CHR$(26)
                    ~SHEL_PUT(LEN(a$),a$)
               ENDIF
           ENDIF

           '  Registers that all .GFA files cause GFABASIC.PRG  to  be 
           loaded when clicked on.



SHEL_READ
Syntax:    SHEL_READ(cmd_string$,tail_string$)
Action:    This function allows the program to identify the command by 
           which   it   was  invoked  and  supplies   the   name,   eg 
           GFABASIC.PRG, and the command line if any.

           cmd_string$        string  variable to contain the  command 
                              line.

           tail_string$       string variable to contain name.




SHEL_WRITE
Syntax:    SHEL_WRITE(prg,grf.gem.cmd$,nam$)
Action:    This  function informs the AES that another application  is 
           to  be  started after the current one  has  terminated.  In 
           contrast to p_exec (GEMDOS 75), however the current program 
           does not remain in memory.

           prg:     0 Back to desktop
                    1 Load new program
           grf:     0 TOS program
                    1 Graphic application
           gem:     0 not a GEM application
                    1 GEM application
           cmd$     command line string
           nam$     name of next application

Example:   ~SHEL_WRITE(1,1,1,"","GFABASIC.PRG")
           

SHL
Syntax:    SHL(x,y)
           SHL&(x,y)
           SHL|(x,y)
Action:    Shifts a bit pattern left



SHOWM
Syntax:    SHOWM
Action:    Makes the mouse pointer appear.
See Also:  HIDEM



SHR
Syntax:    SHR(x,y)
           SHR&(x,y)
           SHR|(x,y)
Action:    Shifts a bit pattern right


SIN
Syntax:    SIN(x)
Action:    Returns the sine value of 'x'



SINGLE{}
Syntax:    SINGLE{x}
Action:    Reads/writes  a  4  byte floating point  variable  in  IEEE 
           single precision format.


SINQ
Syntax:    SINQ(degrees)
Action:    Returns the extrapolated sine of a numeric expression.



SLPOKE
Syntax:    SLPOKE x,y
Action:    Allows  LPOKE  to  operate  in  supervisor  mode,  so  that 
           protected address (0 to 2047) can be modified.


SOUND
Syntax:    SOUND chn,vol,note,octave[,dur]
           SOUND chn,vol,note,#period[,dur]
Action:    GENERATES MUSICAL NOTES
           'chn' is a 1, 2, or 3 and selects the sound channel.
           'vol' selects the volume.
           'note' is a value of 1 to 12 and selects notes:
               1=C,
               2=C#
               3=D
               4=D#
               5=E
               6=F
               7=F#
               8=G
               9=G#
               10=A
               11=A#
               12=B
           'octave' is between 1 and 8, and determines octave.
           'dur' is the time in 1/50ths of a second that GFA Basic
           has to wait before execution of the next command.
           A further possibility to choose the pitch is to enter
           'period'  prefixed by '#' instead of 'note' and 'octave'.  
           The period can be calculated from the
           frequency with:                      

           Period = TRUNC(125000/frequency +0.5)



SPACE$
Syntax:    SPACE$(x)
Action:    Creates a character string containing 'x' spaces.
 


SPC
Syntax:    SPC(n)
Action:    Produces 'n' spaces in a print command



SPOKE    SDPOKE    SLPOKE
Syntax:    SPOKE x,n    SDPOKE x,    SLPOKE x,n
Action:    Writes 1, 2 or 4 bytes into an area of memory which
           begins with the address 'x'


SPRITE
Syntax:    SPRITE A$[,x,y]
Action:    Puts the sprite defined in a$ at (X,Y) or, if no
           coordinates are given, deletes it.
             A$ = MKI$(X POSITION)
              + MKI$(Y POSITION)
              + MKI$(0=NORMAL OR 1=XOR MODE)
              + MKI$(SCREEN COLOUR MOSTLY 0)
              + MKI$(SPRITE COLOUR MOSTLY 1)
              + BIT PATTERN OF SCREEN AND SPRITE

           Unlike defmouse, the bit patterns for screen and sprite
           are not stored in separate blocks but in alternate
           words (16 bits).
           If the same sprite is put onto the screen in another
           position then the first sprite is deleted.


SPUT
Syntax:    SPUT var
Action:    Fast copying of a 32000 byte string into the screen
           area. 
See Also:  SGET, PUT, GET and BMOVE



SQR
Syntax:    SQR(X)
Action:    Calculates the square root of 'X'.



SSORT
Syntax:    SSORT a(s) {OFFSET o][WITH i()][,n[,j%()]]
           SSORT x$(s) WITH i() [,n[,j%{}]]
Action:    Sorts the elements in an array by its size using the Shell-
           Metzner method. 
           
           a()      array or string array
           i()      integer array
           j%       4byte integer array
           x$()     string array
           s        + or - or no sign



STE?
Syntax:    STE?
Action:    Returns -1 for STE otherwise 0



STICK
Syntax:    STICK m
           STICK(p)
Action:    The function STICK(p) returns the position of a joystick.
           STICK 0 causes port 0 to supply mouse information.
           STICK 1 causes port 1 to read the joystick.

Example:   STICK 1
           REPEAT
               direction%=STICK(0)
               fire%=STRIG(0)
               SELECT direction%
               CASE 4
                    PRINT "LEFT"
               CASE 8
                    PRINT "RIGHT"
               CASE 2
                    PRINT "DOWN"
               CASE 1
                    PRINT "UP"
               ENDSELECT
           UNTIL fire!
           WHILE STRIG(0)
           WEND



STOP
Syntax:    STOP
Action:    Stops execution of a program.
           Unlike the END command it does not close any files and
           by typing CONT the program will resume from the line
           following the STOP command.



STORE
Syntax:    STORE #i,x$()[,n[TO m]]
Action:    Fast save of a string array as a text file. The instruction 
           STORE  is  used for sending the contents of an array  to  a 
           file or data channel (elements seperated by CR/LF).

See Also:  RECALL



STR $
Syntax:    STR$(X)
Action:    Transforms the value 'X' into a character string.



STRING$
Syntax:    STRING$(N,string)  OR  STRING$(N,C)
Action:    Produces a string formed by repeating 'string' or
           CHR$(C) 'N' times. 'N' is a number from 0 to 32767.



SUB
Syntax:    SUB VAR,N
Action:    Deducts 'N' from 'VAR'. Same as VAR=VAR-N but executes
           almost twice as fast.
Example:   x=57
           SUB x,3*5
           PRINT x  'PRINTS 42


SUB()
Syntax:    SUB(x,y)
Action:    Corresponds to x-y

Example:   PRINT SUB(5^3,4*20+3)   'PRINTS 42
           


SUCC()
Syntax:    SUCC(n)
Action:    Determines the next higher number.
See Also:  PRED()



SWAP
Syntax:    SWAP var1,var2
Action:    Exchanges the values of 'var1' and 'var2'.
           The variables must be of the same type.
           When swapping array fields the dimensions are also swap
           ped.


SWAP()
Syntax:    SWAP(n)
Action:    Swaps the high and low words of a varaible.




SYSTEM
Syntax:    SYSTEM
Action:    Causes a return to the desktop, same as quit.




TAB
Syntax:    TAB(n)
Action:    Sets the tabulator to the nth column.
           Tab can only be used in conjunction with the print
           command.
           If the current position is already past 'N' then the
           tab function is set for the next line.


TAN
Syntax:    TAN(X)
Action:    Returns the tangent of 'X' (X is the angle in radians).



TEXT
Syntax:    TEXT X,Y, [ L, ]string
Action:    Puts a text onto the screen at graphics coordinates
           'X,Y'. The graphics can first be defined by using
           the command DEFTEXT.



TIME$
Syntax:    TIME$
Action:    Returns the system time as a string.
           Format: hh:mm:ss and is updated every two seconds.

Example:   PRINT TIME$



TIME$=     
Syntax:    TIME$=a$
Action:    The time can be set.

Example:   TIME$="20:15:30"



TIMER
Syntax:    t%=TIMER
Action:    TIMER suuplies the elapsed time in 1/200 seconds since  the 
           system was started.

Example:   t%=TIMER
           FOR i%=1 TO 2500
           NEXT i%
           PRINT (TIMER-t%)/200;" Seconds"



TITLEW
Syntax:    TITLEW n,"title"
Action:    Gives the window number 'n', the new title 'title'.




TOPW
Syntax:    TOPW #1
Action:    Activates the windows number n.




TOUCH
Syntax:    TOUCH[#]n
Action:    Updates the date and time stamps od a file,  giving it  the 
           current system time and date.

Example    OPEN "u",#1,"TEST.TXT"
           TOUCH #1
           CLOSE #1



TRACE$
Syntax:    TRACE$
Action:    The  variable TRACE$ contains the command which is next  to 
           be processed.

See Also:  TRON,TROFF




TRIM$
Syntax:    TRIM$(a$)
Action:    Removes spaces at the beginning of a string expression.




TROFF
Syntax:    TROFF
Action:    Switches the trace function off.



TRON
Syntax:    TRON
Action:    Switches the trace function on. This causes each command to 
           be listed on the screen.



TRON#
Syntax:    TRON #1    
Action:    Switches the trace function on. This causes each command to 
           be listed to the relevant channel number.



TRONproc
Syntax:    TRON tr_proc
Action:    A  procedure  can be specified which is called  before  the 
           execution of each command.



TRUE
Syntax:    TRUE
Action:    Constant 0. This is simply another way of expressing
           the value of a condition when it is true and is equal
           to zero. (see also FALSE).



TRUNC
Syntax:    TRUNC(X)
Action:    Returns the integer portion of 'X'.




TT?
Syntax:    TT?
Action:    Returns -1 for 68020 or 68030 processeor, otherwise 0.



TYPE
Syntax:    TYPE(ptr)
Action:    Determines the type of the variable at which a pointer
           is set.
           
           'ptr' is an integer expression (usually *var).
           TYPE(ptr) returns a code according to the type of
           variable to which 'ptr' is pointing.
           
               0=var  
               1=var$  
               2=var%  
               3=var!  
               4=var()  
               5=var$()
               6=var%()  
               7=var!().

           On errors -1 is returned.



UPPER$
Syntax:    A$="basic"
           PRINT UPPER$(A$)
           PRINT UPPER$("1a")
Action:    Transforms all lower case letters of a string to upper
           case. Any non letter characters are left unchanged.



V:
Syntax:    V:x
Action:    Returns the address of a variable or strings or elements of 
           an array.



VAL
Syntax:    VAL(X$)
Action:    Transforms 'X$' into a number, as far as possible.
           In the case of a purely alphabetical string the value
           0 is returned.


VAL?
Syntax:    VAL?(X$)
Action:    Determines the number of characters starting at the
           beginning of a string that can be converted into a
           numerical value with VAL.



VAR
Syntax:    name([a,b,...] VAR x,y..a(),b(),...)
Action:    Declaration  part of the parameter list for a PROCEDURE  or 
           FUNCTION.

Example:   sum(13,12,a)
           sum(7,9,b)
           PRINT a,b
           '
           PROCEDURE sum(x,y,VAR z)
               z=x+y
           RETURN



VARIAT()
Syntax:    VARIAT(n,k)
Action:    Returns the number of permutations of n elements to the kth 
           order without repitition.

Example:   PRINT VARIAT(6,2)       'prints 30

See Also:  FACT(), COMBIN()




VARPTR
Syntax:    VAPTR(var)
Action:    Determines the address or starting address of a
           variable 'var'.



VDIBASE
Syntax:    VDIBASE
Action:    Dangerous pokes!
           Determines the address above the area used by basic
           and the required tables and variables.
           This is the point from which this version of gem keeps
           parameters for the vdi (text style, clipping etc.).
           By use of peek and poke in this area, various effects
           (and nasty crashes!) can be obtained.



VDISYS
Syntax:    VDISYS[opcode [,c_int,c_pts[,subopc]]]
Action:    The  VDI function with function code opcode is  called.  If 
           opcode is not specified,  then the function code must, like 
           other  parameters,  be  placed in the  control  block  with 
           DPOKE.

           The  depth  of  this command is betond the  scope  of  this 
           abbreviated manual.



VOID
Syntax:    VOID exp
Action:    This command performs a calculation and forgets the
           result. Sounds silly but there are occasions when this
           command is required, eg. forced garbage collection
           (fre(0)), waiting for a keystroke (inp(2)), or calling
           various bios, xbios, gemdos or c: routines which have
           no parameters.



VQT_EXTENT
Syntax:    VQT_EXTENT(text$[,x1,y1,x2,y2,x3,y3,x4,y4])
Action:    Returns  the corner coordinates of a rectangle  which  will 
           surround the text in text$.  The coordinates can either  be 
           found in the variables x1,y1 to x4,y4, or in PTSOUT(7). The 
           corner pointers are numbered in a clockwise direction.

Example:   INPUT text$
           CLS
           ATEXT 100,25,2,text$
           ~VQT_EXTENT(text$,x1,y1,x2,y2,x3,y3,x4,y4)
           BOX x4+100,y4+25,x2+00,y2+25



VQT_NAME
Syntax:    VQT_NAME(i,font_name$)
Action:    Supplies  the handle of the font with  the  indentification 
           number  i and places the name of the loaded  character  set 
           into the string variable font_name$.




VSETCOLOR
Syntax:    VSETCOLOR colour,red,green,blue
           VSETCOLOR colour,composite
Action:    Due to an error in TOS, SETCOLOR does not correspond to the 
           registers used by COLOR. VSETCOLOR is used to overcome this 
           problem.

           Low Resolution
           SETCOLOR     0 1 2 3 4 5 6 7 8  9 10 11 12 13 14 15
           VSETCOLOR    0 2 3 6 4 7 5 8 9 10 11 14 12 15 13  1

           Medium Resolution
           SETCOLOR     0 1 2 3
           VSETCOLOR    0 2 3 1

           High Resolution
           SETCOLOR 0,even = VSETCOLOR 0,0
           SETCOLOR 0,odd  = VSETCOLOR 0.&H777

           The  term  composite  is calculated the same  way  as  with 
           SETCOLOR: ie rgb=(r*256)+(g*16)+b



VST_LOAD_FONTS
Syntax:    VST_LOAD_FONTS(x)
Action:    Loads   the   additional  character   sets   specified   in 
           ASSIGN.SYS, and the number of loaded fonts is returned.

Example:   RESERVE 25600
           num_fonts%=VST_LOAD_FONTS(0)
           face%=VQT_NAME(num_fonts%,fonts$)
           FOR i%=1 to num_fonts%
               DEFTEXT,,,,face%
               TEXT 80,80,"This is the "+font$+" font."
               ~INP(2)
           NEXT i%
           ~VST_UNLOAD_FONTS(0)
           RESERVE


VST_UNLOAD_FONTS
Syntax:    VST_UNLOAD_FONTS(x)
Action:    Removes   the   character  set   previously   loaded   with 
           VST_LOAD_FONTS from memory.



VSYNC
Syntax:    VSYNC
Action:    Enables synchronization with the screen by waiting
           until the next vertical sync pulse is received - helps
           avoid flickering of the screen during animation when  using 
           GET and PUT.

Example:   t%=TIMER
           FOR i%=1 TO 100
               VSYNC
           NEXT i%
           PRINT SUB(TIMER,t%)/200
           ' PRINTS the time for 100 scans of screen.


VTAB
Syntax:    VTAB line
Action:    VTAB  positions the cursor to the specified column or  line 
           number . Note that the cursor columns and lines are counted 
           from 1, not 0.

See Also:  HTAB, PRINT AT, TAB


The  following  VDI  Workstation  routines  and  functions  are   only 
available  if  GDOS  has been booted and a valid  ASSIGN.SYS  file  is 
available.  In depth documentation on the VDI routines are beyond  the 
scope of this abbreviated manual.  Further information can be found in 
the full GFA-BASIC Interpreter Manual or Software Development Book.



V_CLRWK
Syntax:    V_CLRWRK()
Action:    This  function clears the output buffer.  For  example  the 
           screen or the printer buffer is cleared.



V_CLSVWK
Syntax:    V_CLSVWK(id)
Action:    Closes a virtual workstation opened with V_OPNVWK.



V_CLSWK
Syntax:    V_CLSWK()
Action:    Closes the current workstation opened with V_OPNWK().



V_OPNVWK
Syntax:    V_OPNVWK(id,1,1,1,1,1,1,1,1,1,2)
Action:    Opens  a virtual screen driver and supplies the handle  for 
           the specified device id.



V_OPNWK
Syntax:    V_OPNWK(id)
Action:    Supplies the handle for the specified device id.



V_UPDWK
Syntax:    V_UPDWK()
Action:    Sends buffered graphic instructions to the attached device.



V~H
Syntax:    V~H
Action:    Returns the internal VDI handle of GFA-BASIC.

           V~H=x    'Sets internal VDI handle

           V~H=-1   'Sets VDI handle to value from V_OPNVWK()


W:
Syntax:    W:x
Action:    Allows  passing of numerical expressions to  the  operating 
           system and C routines as a word (2-byte).

See Also:  L:



WAVE
Syntax:    WAVE voice,env,form,per,del
Action:    Produces noises from the three sound channels.
           WAVE 0,0 switches off all sound channels.

           voice:   Any  channel  or combination of  channels  may  be 
                    activated  simultaneously.  The value of voice  is 
                    256 * by the period.

                    1 Channel 1
                    2 Channel 2
                    4 Channel 3
                    8 Noise (Channel 1)
                   16 Noise (Channel 2)
                   32 Noise (Channel 3)

           env:     Specifies  the channels for which the wnvelope  is 
                    to be active.

                    1 Channel 1
                    2 Channel 2
                    3 Channel 3

           form:    Envelope shape

                    0 - 3     As 9
                    4 - 7     As 15
                    8         Falling sawtooth
                    9         Falling linear
                    10        Triangle falling
                    11        Falling linear, then to max
                    12        Rising sawtooth
                    13        Rising linear and holding
                    14        Triangle, then rising
                    15        Linear rising, then to zero

           per:     Period of the waveform multiplied by 125000.

           del:     Delay in 1/59ths second before the next  GFA-BASIC 
                    command is executed.

Example:   SOUND 1,15,1,4,20
           SOUND 2,15,4,4,20
           SOUND 3,15,8,4,20
           WAVE 7,7,0,65535,300
           '  A tone is generated from each channel then modulated  by 
           '  WAVE.

See Also:  SOUND




WHILE....WEND
Syntax:    WHILE condition
           WEND
Action:    Creates a conditional loop between while and wend until
           the 'condition' is fulfilled. This is checked at the
           beginning of the loop and so it is possible that the
           loop is never executed.


The following functions are all functions of the Window Library


WINDTAB
Syntax:    WINTAB
           WINTAB(i,j)
Action:    Gives the address of the Window Parameter Table. This table 
           contains  the  data  that determines the  appearance  of  a 
           window.

           Window Parameter Table:

           Offset
           0        Handle of Window 1
           2        Attributes for Window 1
           4        x coordinates of Window 1
           6        y coordinates of Window 1
           8        Width of Window 1
           10       Height of Window 1
           12-22    Parameters for Window 2
           24-34    Parameters for Window 3
           36-46    Parameters for Window 4
           48       -1
           50       0
           52-58    Coordinates and size of Desktop
           60-63    Coordinates of the joint of the four windows
           64-65    Origin for graphic instructions (CLIP OFFSET)

           Window Attibute element:

           Bit
           0        Window Title
           1        Close box 
           2        Full box
           3        Move box
           4        Information line
           5        Sizing box
           6        Up arrow
           7        Down arrow
           8        Vertical slider
           9        Left arrow
           10       Right arrow
           11       Horizontal slider
           

Example:   OPEN #1,100,120,200,70,&HFFF
           ' corresponds to:
           DPOKE WINTAB+2,&HFFF
           DPOKE WINTAB+4,100
           DPOKE WINTAB+6,120
           DPOKE WINTAB+8,200     
           DPOKE WINTAB+10,70
           OPENW 1
           ' or
           WINTAB(1,1)=&HFFF
           WINTAB(1,2)=100
           WINTAB(1,3)=120
           WINTAB(1,4)=200     
           WINTAB(1,5)=70
           OPENw 1

WIND_CALC
Syntax:    WIND_CALC(w_type,attr,ix,iy,iw,ih,ox,oy,ow,oh)
Action:    This function computes the total size of the work area from 
           the size of the window.
           Returns 0 if an error.

           w_type:            0 Compute total size
                              1 Compute work area size

           attr:              Bit
                              0   Title bar with name
                              1   Close box
                              2   Full size box
                              3   Move bar
                              4   Info line    
                              5   Size box
                              6   Up arrow
                              7   Down arrow
                              8   Vertical slider
                              9   Left arrow
                              10  Right arrow
                              11  Horizontal slider

           ix,iy              top left coorinates
           iw,ih              width and height
           
           ox,oy              Calculated top left coordinates
           ow,oh              Calculated width and height



WIND_CLOSE
Syntax:    WIND_CLOSE(handle)
Action:    Closes the specified window.



WIND_CREATE
Syntax:    WIND_CREATE(attr,wx,wy.ww.wh)
Action:    Allocates  a  new window,  specifying  the  attributes  and 
           maximum size. The handle of the window is returned.

           attr:              Bit
                              0   Title bar with name
                              1   Close box
                              2   Full size box
                              3   Move bar
                              4   Info line    
                              5   Size box
                              6   Up arrow
                              7   Down arrow
                              8   Vertical slider
                              9   Left arrow
                              10  Right arrow
                              11  Horizontal slider

           wx                 Max x position of left edge
           wy                 Max y position of top edge
           ww                 Max width of window
           wh                 Max height of window
                                 

WIND_DELETE
Syntax:    WIND_DELETE(handle)
Action:    Deletes a window allocation and frees reserved memory.



WIND_FIND
Syntax:    WIND_FIND(fx,fy)
Action:    Determines  the  id  number of a window  within  which  the 
           specified coordinates lie.

           fx:                x coordinates
           fy:                y coordinates



WIND_GET
Syntax:    WIND_GET(handle,code,w1,w2,w3,w4)
Action:    Supplies information about a window determined by the code.

           handle:            Id number of the window

           code:              depending upon the code,  information is 
                              supplied in w1,w2,w3,w4.


           code: 4            supplies size of window work area
                    w1:       x coordinates
                    w2:       y coordinates
                    w3:       width
                    w4:       height

           code: 5            supplies  total  size of  entire  window 
                              including borders  

                    w1:       x coordinates
                    w2:       y coordinates
                    w3:       width
                    w4:       height

           code: 6            supplies total size of previous window
  
                    w1:       x coordinates
                    w2:       y coordinates
                    w3:       width
                    w4:       height
                    
           code: 7            supplies  the  total  max  size  of  the 
                              window.  

                    w1:       x coordinates
                    w2:       y coordinates
                    w3:       width
                    w4:       height
                    
           code: 8            supplies the position of the  horizontal 
                              slider  
               
                    w1:       1=far left  1000=far right
           
           code: 9            supplies the position of the  vertical 
                              slider  
               
                    w1:       1=top  1000=bottom               
           
           code: 10           supplies  the  id  number  of  the   top 
                              (active) window
  
                    w1:       id number of active window

           code: 11           supplies  the coordinates of  the  first 
                              rectangle  in the  specified  rectangle 
                              list.
          
                    w1:       x coordinates
                    w2:       y coordinates
                    w3:       width
                    w4:       height

           code: 12           supplies  the  coordinates of  the  next 
                              rectangle   in  the  specified   windows 
                              rectangles list

                    w1:       x coordinates
                    w2:       y coordinates
                    w3:       width
                    w4:       height
                    

           code: 13           reserved

           code: 15           supplies  the  size  of  the  horizontal 
                              slide bar compared to its max possible

                    w1:       -1 = minimum size
                               1 = small
                               1000 = full width

           code: 16           supplies the size of the vertical  slide 
                              bar compared to its max possible
                    
                    w1:       -1 = minimum size
                               1 = small
                               1000 = full height

WIND_OPEN
Syntax:    WIND_OPEN(handle,wx,wy,ww,wh)
Action:    Draws  on  the  screen a  window  previously  created  with 
           WIND_CREATE.


WIND_SET
Syntax:    WIND_SET(handle,code,w1,w2,w3,w4)
Action:    Changes  the parts of a window according to  the  specified 
           function code.

           code: 1            Sets  new  windows  components  as  with 
                              WIND_CREATE.

                    w1:       new window element

           code: 2            Gives a window a new title
                    
                    w1:       Hi word
                    w2:       Low word of address of title string

           code: 3            Specifies a new information line
                    w1:       Hi word
                    w2:       Low  word  of  address  of   information 
                              string

           code: 5            Sets the window size
                    
                    w1:       x coordinates
                    w2:       y coordinates
                    w3:       width
                    w4:       height

           code: 8            Positions the horizontal slider
               
                    w1:       1=far left  1000=far right

           code: 9            Positions the vertical slider
               
                    w1:       1=top  1000=bottom

           code: 10           Sets top (active) window

                    w1:       id number

           code: 14           Sets a new desk top Menu tree

                    w1:       Low word
                    w2:       High word of address of new tree
                    w3:       id  number  of the first  object  to  be 
                              drawn

           code: 15           Sets the size of the vertical slide bar

                    w1        -1=minimum size
                              1= small
                              1000 max size

           code: 16           Sets  the size of the horizontal  slider 
                              bar
                    
                    w1        -1=minimum size
                              1= small
                              1000 max size

WIND_UPDATE
Syntax:    WIND_UPDATE(flag)
Action:    Coordinates  all functions concerned with  screen  redraws, 
           in particular with drop down menus.

           flag: 0            screen redraw completed
                 1            screen redraw starting
                 2            application loses mouse control
                 3            application takes on mouse control


WORD()
Syntax:    WORD(x)
Action:    Extends  a  word to long word length (32 bits)  by  copying 
           bits  15  to bit positions 16 to 31,  thus  preserving  the 
           sign.


WORK_OUT()
Syntax:    WORK_OUT(x)
Action:    Determines  the  values found in INTOUT(0)  to  INTOUT(44), 
           PTSOUT(0)  and PTSOUT(1) after returning from the  function 
           OPEN_WORKSTATION.



WRITE
Syntax:    WRITE [ expressions ][ ; ]
           WRITE #n [ expressions ][ ; ]
Action:    Stores data in a sequential file to be read with input.
           Unlike the PRINT command the numbers are separated by
           commas and the strings are enclosed in quotes.



WRITE#     
Syntax:    WRITE#n,expression
Action:    Saves  data  to sequential file,  for  later  reading  with 
           INPUT#.

Example:   OPEN "o",#1,"TEST.DAT"
           WRITE #1,"Version ",3,".6"
           CLOSE #1
           OPEN "i",#1,"TEST.DAT"
           INPUT #1,v1$,v2$,v3$
           CLOSE #1
           PRINT v1$+V2$+v3$



W_HAND
Syntax:    W_HAND(#n)
Action:    Returns  the GEM handle of the window whose channel  number 
           is n.

Example:   OPENW 2
           PRINT W_HAND(#2)
           ~INP(2)
           CLOSE #2


W_INDEX
Syntax:    W_INDEX(#hd)
Action:    Returns the window number of the specified GEM handle.
           Reverse of W_HAND().




XBIOS

The XBIOS function is used to call XBIOS system routines.

~XBIOS(0,t%,l:p%.l:v%)

           Initialises  the mouse handling routine but not  compatible 
           with GEM.

           t%  0    Switches mouse off
               1    Switches mouse into relative mode
               2    Switches mouse into absolute mode
               4    Mouse in keyboard mode
           p%       Address of information structure
           v%       Address of the mouse handling routine

r%=XBIOS(2)

           Returns the base address of the physical screen memory.

           r%       Address of the physical screen memory

r%=XBIOS(3)

           Returns  the  address  of the logical  screen  memory  when 
           writing to the screen.

           r%       Address of the logical screen memory

r%=XBIOS(4)

           Returns the current screen resolution

           r%  0    320 x 200
               1    640 x 200
               2    640 x 400
               
~XBIOS(5,l:l%,l:p%,r%)

           Enables the resolution to be changed from low res and  high 
           res when using a colour monitor. Can not be used with GEM.

           l%       New address of logical screen memory
           p%       New address of the physical screen memory
           r%       New screen resolution (see XBIOS(4))
           
~XBIOS( 6,L:adr%)

           Allows all colour registers to be reset at one time.

           adr%     Address of a table of 16 words, which contains new 
                    pallete data.

r%=XBIOS(7,n%,c%)

           Sets or gets a colour register.

           r%       For  c%=-1 the previous specified colour  register 
                    is returned.
           n%       Colour register
           c%       New colour, at c%=-1 see r%

r%=XBIOS(8,L:b%,L:f%,d%,sec%,t%,side%,n%)
           
           Reads sectors of a disk

           r%       0 if no error
           b%       address of the area from which sectors are read
           f%       unused
           d%       drive number (0=A, 1=B etc)
           sec%     sector number
           t%       track number
           side%    disk side (0 or 1)
           n%       number of sectors to be read

r%=XBIOS(9,L:b%,L:f%,d%,sec%,t%,side%,n%)
           
           Writes sectors to a disk

           r%       0 if no error
           b%       address of the area to which sectors are written
           f%       unused
           d%       drive number (0=A, 1=B etc)
           sec%     sector number
           t%       track number
           side%    disk side (0 or 1)
           n%       number of sectors to be written

r%=XBIOS(10,L:b%,L:f%,d%,sec%,t%,side%,i%,L:m%,v%)

           A trace of the disk formats
           
           r%       0 if no error
           b%       address of an area for intermediate memory
           f%       unused
           d%       drive number (0=A, 1=B etc)
           sec%     sectors per track
           t%       track number to be formatted
           side%    disk side (0 or 1)
           i%       Interleave factor (normaaly 1)
           m%       Magic number &H87654321
           v%       value in sectors of format (normally &HE5E5

~XBIOS(12,n%,L:adr%)
           
           Outputs the contents of a block of memory to MIDI.

           n%       number of bytes -1
           adr%     address of the source storage area

~XBIOS(13,n%,L:adr%)

           Sets the MFP interrupt vector on the ST.  This can only  be 
           used from assembly language or C and is not available  from 
           GFA-BASIC.

           n%       Interrupt number
           adr%     new address of the interrupt

r%=XBIOS(14,d%)

           Returns  the  address of the I/O table used by  the  serial 
           interface.

           r%       Address  of  the data buffer for  the  serial  I/O 
                    table
           d%       0:        RS232
                    1:        IKBD
                    2:        MIDI

~XBIOS(15,b%,h%,ucr%,rsr%,tsr%,scr%)

           Configures  the  serial interface.  The  parameters  remain 
           unchanged with a value of -1.

           b%       Baud rate
           h%       hand shake mode
                    0: no handshake
                    1: XON/XOFF
                    2: RTS/CTS
                    3: both
           ucr%     USART control register of MFP
           rsr%     receiver status register of MFP
           tsr%     transmitter status register of MFP
           scr%     synchronous character register of MFP

r%=XBIOS(16,L:us%,L:sh%,L:cl%)

           Changes the keyboard translation tables.

           r%       address of the KEYTAB structure
           us%      address of the table for keys without shift
           sh%      address of the table for keys with shift
           cl%      address of the table for keys with Cap-lock

r%=XBIOS(17)

           Returns a random number

           r%       number with 24 bit accuracy (0 to 16777215)

~XBIOS(18,L:b%,L:s%,d%,f%)

           Creates a boot sector for the disk in memory

           b%       address  of  a 512 byte buffer for  producing  the 
                    boot sector
           s%       serial number that forms part of the boot sector
                    -1: previous serial retained
                    >24 bits: random number returned
           d%       disk type (tracks/sides)
                    0:40 tracks,single sided (180K)
                    1:40 tracks,double sided (360K, IBM)
                    2:80 tracks, single side (360K)
                    3:80 tracks, double sided (720K)
           f%       0:non executable boot sector
                    1:executable
                    -1:leave unchanged

r%=XBIOS(19,L:b%,L:f%,d%,sec%,t%,side%,n%)

           Verifies the disk contents

           b%       address of the memory area with which a comparison 
                    is made.
           f%       not used
           d%       disk drive number
           sec%     start sector
           t%       track number
           side%    disk side
           n%       number of sectors

~XBIOS(20)

           Calls  the  hardcopy routine and thus dumps the  screen  to 
           printer.

r%=XBIOS(21,c%,s%)

           Configure cursor.

           r%       when c%=5 returns the cursor blink rate
           c%       0: Hide cursor
                    1: Show cursor
                    2: blink cursor
                    3: solid cursor
                    4: blink rate set in s%
                    5: see r%
           s%       when c%=4, blink rate set to s%

~XBIOS(22,L:t%)

           Sets date and time

           t%       Bits 0-4:   seconds
                         5-19:  minutes           
                         11-15: hours
                         16-20: day
                         21-24: month
                         25-31: year - 1980

r%=XBIOS(23)

           returns date and time 

           r%       see XBIOS(22) for bit settings


~XBIOS(24)

           re   installs   the  original  keyboard   allocation   (see 
           XBIOS(16))

XBIOS(25,n%,L:adr%)

           writes bytes from memory to the keyboard processor (IKBD)

           n%       number bytes-1 to be sent
           adr%     address where the data to be sent is stored

~XBIOS(26,i%)

           Disables an MFP interrupt.

           i%       interrupt number (0-15) to be disabled

~XBIOS(27,i%)

           enables an MFP interrupt.

           i%       interrupt number (0-15) to be enabled

~XBIOS(28,d%,reg%)

           reads and writes from and to the sound chip register

           r%       returns register value when reading
           d%       value to be writen (8 bits)
           r%       register number (0-15),  bit 7 defines write  mode 
                    when set.

~XBIOS(29,b%)

           sets the bit of port A on the register of the sound chip to 
           zero

           b%       bit pattern wicj is OR'ed with existing contents.

~XBIOS(30,b%)

           sets the port A bit of the sound chip register to 1

           b%       bit  pattern  which  is ANDed  with  the  existing 
                    contents.

XBIOS(31,t%,c%,d%,L:adr%)

           Sets the MFP timers

           t%       number of the timer (0 to 3)
           c%       control register
           d%       data register
           adr%     address of the timer interrupt routine

~XBIOS(32,L:adr%)

           Starts a sound sequence, whic is processed in the interrupt

           adr%     address of the staorage area

r%=XBIOS(33,c%)

           sets or reads the printer parameters

           r%       current configuration when c%=1
           c%       Bit       set            reset
                    0         Dot Matrix     Daisy Wheel
                    1         Monochrome     Colour
                    2         Atari          Epson
                    3         Parallel       RS-232
                    4         Continuous     Single sheet
               
r%=XBIOS(34)

           returns  address of table with vectors to the keyboard  and 
           MIDI processor.

           r%       returned address

r%=XBIOS(35,a%,w%)

           sets and reads keyboard repeat rate

           r%       current data
                    bits      0-7  repeat rate
                              8-15  time of repeat delay
           a%       repeat delay
           w%       repeat rate

~XBIOS(36,L:adr%)

           Hardcopy routine returns parameter block address

           adr%     address  of  a parameter block  for  the  hardcopy 
                    routine.

~XBIOS(37)

           waits for next vertical blank interrupt.

~XBIOS(38,L:adr%)

           calls an assembler routine in supervisor mode

           adr%     address of assembler routine

~XBIOS(39)

           turns off AES if not in ROM

r%=XBIOS(64,b%)

           contols and interrogates the blitter

           r%       b%=-1          current blitter status
                                   bit 1 : blitter there
XOR
Syntax:    x XOR y
Action:    Logical exclusive OR operator


XOR()
Syntax:    XOR(x,y)
Action:    Sets those bits in x that are different in x and y.


_DATA
Syntax:    _DATA
           _DATA=
Action:    Specifies the position of the DATA pointer.  _DATA is 0  if 
           the next READ would result in an out of data message.


~
Syntax:    ~function
Action:    Similar to VOID. Forget the returned value

End of File