OFFICIAL DOC

From Atari Wiki
Revision as of 11:15, 3 July 2006 by Zorro 2 (talk | contribs)
(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

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