STOS BASIC FAQ/INSTRUCTIONS
STOS ... The Game Creator
The Function Keys
The upper window contains a brief list of the current function key assignments. Whenever you press one of these keys, the string associated with it will be entered on the screen, just as if you had typed it yourself. You can also assign a separate set of strings to the shifted versions of these keys, which can also be displayed by pressing the shift key.
You can also access these function keys by clicking the left mouse button with the pointer over the function key description. Pressing the right hand mouse button has the same effect as pressing the shift key.
For further details see the descriptions of the commands KEY and KEYLIST.
HELP
This displays a rather complex looking dialogue box to which there are three parts.
The top section contains a list of the 4 programs held in memory at the moment. The current program is highlighted and this may be moved with the cursor keys to select one of the other three programs. You will see the top line alter to show you which program is being edited. See the section on multiple programs for further information.
The second part of the menu displays a list of the accessories loaded. To call up any accessory, press the associated function key.
The last line of the help menu displays the amount of free memory left.
To exit from the Help menu, press the HELP key again.
Editing Keys
Command | Description |
---|---|
Control + C | Stop the program being executed. |
Undo | Pressing this twice redraws the screen and reinitialises the editor. It then lists the last line that caused an error. |
Clr | Clears the editor window. |
Up Arrow | Moves the cursor up one line. |
Down Arrow | Moves the cursor down one line. |
Left Arrow | Moves the cursor left one character. |
Right Arrow | Moves the cursor right one character. |
Return | Enters the line at the current cursor position. |
Delete | Deletes the character under the cursor. |
Shift + Delete | Deletes the line under the cursor. |
Control + J | Joins two lines together. |
Backspace | Deletes the character left of the cursor and moves the cursor left one character. |
Home | Moves the cursor to the top left hand corner of the editor window. |
Esc | Enter multi-display mode. See the section on multiple programs for further information. |
Spacebar | Suspends a listing. Press the spacebar again to resume. |
Insert | Toggles between insert and replace mode. Insert mode is signified by a slightly thicker cursor. |
Loading/Saving Basic programs
LOAD filename | Load the file into memory for editing |
SAVE filename | Save the current program to disk |
FLOAD "*.BAS" | Load a file using the file selector |
FSAVE "*.BAS" | Save a file using the file selector |
Running a program
RUN | Runs the program from the first line |
RUN no | Runs the program from line no. |
RUN file$ | Load and run the program stored in file$ |
CONT | Restart a program halted by Control + C or STOP |
Entering a STOS Basic program
AUTO | Automatic line numbering |
AUTO start | Start automatic line numbering from the line number start |
AUTO start,inc | Starts from the line start and increments each successive line by the number inc. |
RENUM | Starts by setting the first line number in your program to 10, and then renumbers each succeeding line in units of 10. |
RENUM number | Sets the first program line to number and renumbers all the other lines in increments of 10. |
RENUM number,inc | Starts at line number and increments each successive line by inc. |
RENUM number,inc,start-end | Renumbers lines from start to end, beginning with line number, and incrementing each proceeding line by inc. |
LIST [first-last] | Lists the current program. |
SEARCH s$ | Search for the position of any string within a Basic program. To repeat the search, enter SEARCH on it's own. |
SEARCH s$,start-end | Will search only within the lines specified. |
CHANGE a$ TO b$ [,start-end] | Will change all occurrences of a$ to b$, a range may also be specified. |
DELETE [first-last] | Deletes some or all of the lines of a program. |
MERGE file$ | Merge a file into the current program. Existing lines will be overwritten by any new lines of the same number. |
Debugging a program
- FOLLOW
- Single step through the program. The next line can be stepped through by pressing any key.
- FOLLOW [first-last]
- As FOLLOW but only traces the given range.
- FOLLOW variable list
- This takes a list of variables separated by commas and prints them out after every instruction executed. As before, you can step through the program by pressing any key.
- FOLLOW variable list,first-last
- As before, but only traces the variables
within a given range.
- FOLLOW OFF
- Turns off the action of the FOLLOW command.
MULTIPLE PROGRAMS
STOS Basic allows you to have up to four programs in memory at any one time. These may be completely independent of each other. If you suddenly decide to change the configuration of the editor for instance, you could easily load the CONFIG.BAS program into a separate segment of the ST's memory without interfering with your current program.
If you press the HELP key and move the highlighted bar with the cursor keys to one of the other slots and press HELP again, you will see that the program area is empty. You can enter another program, and run it, independently of the program in area 1.
- MULTI n
- Displays a number of programs simultaneously. Note, n can take the values 2-4 only.
- FULL
- Expands the current program window into the full screen area.
Splitting programs in the Editor
You can also use the MULTI command to split a single program into a number of seperate sections. This can be done with the Help menu. Position the program cursos over program 1 and press the left and right arrow keys. As you can see, the text cursor is moved between four different boxes on the program line. Move the cursor to the first box and type in 1000 followed by Return. This sets the end point of the first part of the program to line 1000.
If you now exit back to the editor and type MULTI 2, thr program will be split into two windows. You can choose between these two windows by using the mouse pointer by moving into the desired window and clicking on the left hand mouse button.
Each box on the program line represents a different section of the listing. You can therefore use this technique to split a program into four separate parts. It is important to note that this has no effect on any existing segments, and you can page through each of the programs stored in memory using the Help menu as usual. All four of these programs can be split in exactly the same way without interfering with each other.
- GRAB
- Copy all or part of a program segment into the current program.
The GRAB command allows you to combine a number of subroutines stored in separate program segments into one complete program. This enables you to test each subroutine in your program independently.
The syntax of the GRAB instruction is:
- GRAB n
- Copy program number n into the current program, where n ranges from 1 to 4. Any attempt to use the number of the current program in this instruction will generate an error.
- GRAB n,first-last
- Only copies the lines between first and last into the current program.
System commands
- SYSTEM
- The system function is used to quit STOS and return to GEM.
- RESET
- Reinitialise the editor and redraw the current screen.
- NEW
- Erase the current program
- UNNEW
- Attempts to recover the last program erased by NEW.
- CLEAR
- Erase all variables and memory banks defined by the current program, also reposition the data pointer to the start of the data.
- FREE
- Return the number of free bytes in memory and force garbage collection.
- ENGLISH/FRANCAIS
- Select language to be used by STOS.
- FREQUENCY
- Switch between 50Hz and 60Hz.
- UPPER
- Change listing mode to uppercase. Lists commands in upper case and variables in lower case.
- LOWER
- Change listing mode to lower case. Lists commands in lower case and variables in upper case.
- KEYLIST
- Lists out the Function keys ready for editing
Naming conventions for variables
Variable names must NOT contain any of the following keywords:
TO, STEP, THEN, ELSE, XOR, OR, AND, GOTO, GOSUB, MOD, AS
and they must begin with a letter and be no more that 31 characters in length.
Types of variables
- Integers
- STOS uses these by default since it is faster, and STOS is designed for creating games. Each integer is stored in 4 bytes and can range from ñ2147483648
- Real numbers
- These are suffixed with the # character. They correspond directly to double precision floating point variables. Each real number is stored in 8 bytes and can range from -1.797692 E+308 to +1.197693 E+307. These numbers are accurate to 16 decimal digits.
- String variables
- These variables are always suffixed with the $ character and can range from 0-65500 characters long. They are NOT terminated with a chr$(0).
- Arrays
- Any of the above variable types can be made into an array in the usual fashion with the DIM statement and can have any number of dimensions, but each dimension is limited to a maximum of 65535 elements.
Constants
As default, all numeric constants are treated as integers. Any floating point assignments to an integer variable are automatically converted to a whole number before use.
In addition to using decimal notation, you can also use hexadecimal and binary notation. Binary numbers are signi- fied by preceding them with the character % and hexadecimal numbers are always preceded by the $ character.
Note that any numbers you type in are converted into a special internal format which is expanded back when you list the program. This will often lead to minor discrepancies between the number you entered, and the number displayed. The value of the number will however, remain completely unchanged.
Floating point constants are always distinguished from integers by the presence of a decimal point in the number. If the point is not used, then it will be taken to be an integer. Since STOS has to convert between integer and floating point, and integer numbers included in floating point arithmetic will be calculated over 25% slower.
Arithmetic operations
The following operations may be used in numeric expressions: (listed in order of priority)
^ | Power |
/ and * | Divide and multiply |
MOD | Modulo operator (Produces remainder of a division) |
+ and - | Plus and minus |
AND | Logical AND |
OR | Logical OR |
XOR | Logical XOR |
INC var | Add 1 to an integer variable. This is considerably faster that using var=var+1 |
DEC var | Subtract 1 from an integer variable. |
String operations
Most basics will allow you to join two strings together with a command, such as:
A$ = "STOS" + " Basic" PRINT A$ STOS Basic
In addition to this, STOS Basic also lets you perform subtraction with string variables as well. This operation works by removing all occurrences of the second string from the first:
PRINT "STOS BASIC" - "S" TO BAIC PRINT "STOS BASIC" - "STOS" BASIC PRINT "A String Of Ascii Characters" - " " AStringOfAsciiCharacters
Comparisons between two strings are performed on a character by character basis using the Ascii codes of the characters.
Common String Functions
LEFT$(v$,n) There are two distinct forms of these RIGHT$(v$,n) commands. The first version is identical to MID$(v$,s,n) the standard Basic uses of this function, resulting in a portion of the string being returned. The second will allow you to replace a section of a string with another. See the example below. 10 A$="** Basic" 20 LEFT$(A$,4)="STOS" 30 PRINT A$ run STOS Basic INSTR(d$,s$[,p]) Search for occurences of s$ in d$. The option of starting at character p is also included. If no match can be found, a value of 0 is returned. Array operations SORT var$(0) This allows you to sort all the elements in an array into ascending order with amazing speed. This array can be composed of either strings, integers or floating point numbers. The var$(0) indicates the starting point of the table to be sorted. This starting point must always be set to the first item in the array (item zero). MATCH(var(0),s) The MATCH function searches through a sorted table, and returns the item number in which the value s was found. If s is not found, then MATCH returns a negative number. The absolute value of this number contains the index of the first item which was greater that s. Providing the array is only one dimension, it can be of type string, integer or real. Before MATCH can be used, the array should always be sorted using the SORT command. Memory banks STOS Basic includes a number of powerful facilities for the manipulation of sprites, screens and music. The data required by these functions needs to be stored along with the Basic program. STOS Basic uses a special set of 15 sections of memory for this purpose called banks. Each bank is referred to by a unique number ranging from 1-15. Many of these banks can be used for all types of data, but some are dedicated solely to one sort of information only such as sprite definitions. Every program stored in the ST's memory has it's own separate set of banks. There are two different forms of memory bank; permanent and temporary. Permanent banks only need to be defined once, and are all subsequently saved along with your program, temporary banks are erased rom memory by the CLEAR command. Types of memory bank Each memory bank can be one of the following different types. Class Stores Restrictions Type Sprites Sprite definitions Only bank 1 (1) P Icons Icon definitions Only bank 2 (1) P Music Music Only bank 3 (1) P 3D Future 3D extension Only bank 4 (4) P Set Holds new character sets Banks 1-15 P Screen Stores a complete screen Banks 1-15 T Datascreen Stores a screen Banks 1-15 P Work Temporary workspace Banks 1-15 T Data Permanent workspace Banks 1-15 P Menu Menu lines Bank 15 (2) T Program Machine-code program Banks 1-15 (3) V Footnotes: (1) Bank is not really general purpose. It is allocated automatically by the appropriate accessory, or when a bank of this type is loaded. (2) Reserved automatically by MENU commands. Usable only by programs which don't use menus. (3) Reserved as either Work or Data. Renamed when program loaded into bank. (4) Reserved for future expansion. (P) Permanent memory bank (T) Temporary memory bank (V) Variable between permanent or temporary. LISTBANK Lists the numbers of the banks currently reserved by a program, along with their location and size. S := Start address of the bank E := End address of the bank L := Length of the bank HEXA ON/OFF Sets the LISTBANK to decimal or hexadecimal notation. RESERVE Any banks used by sprites, music, icons, 3D extensions, and the menus are allocated automatically by the system. The RESERVE command allows you to allocate any other banks which you require. Each different type of bank has it's own individual form of the RESERVE instruction. RESERVE AS SCREEN bank Reserves a temporary bank of memory for a screen. This bank is always 32K long. RESERVE AS DATASCREEN bank Reserves a permanent bank of memory 32K long for use as a screen. This screen is saved along with your program, so it's great for title screens. RESERVE AS SET bank,length Reserves a permanent bank of memory length bytes long for use as a character set. RESERVE AS WORK bank,length Reserves a temporary bank for use as a workspace length bytes long. RESERVE AS DATA bank,length Reserves a permanent bank of memory length bytes long for use as a workspace. Please note that bank may be any number between 1 and 15, but since banks 1-4 are used by the system, it's wise to leave these alone. Length is automatically rounded to the nearest 256 byte page. Copying banks When using these memory banks, it's often useful to be able to transfer the contents of one bank to another. This can be done with the BCOPY command. BCOPY #source TO #dest BCOPY copies the entire contents of bank number source to bank number dest. BGRAB prgno[,b] BGRAB copies one or more banks stored at program number prgno into the current program. Program numbers between 1-4 denote one of the four programs which can be stored in memory at anyone time. Numbers 5-16 represent an accessory. If the optional bank number b is not included, then all the banks attached to program number prgno are copied into the current program, and any other banks of memory which are linked to this program are erased. Otherwise, the bank number specifies one bank which is to be transferred into the current program. All other banks remain unaffected. ERASE b Delete the contents of memory bank b from the program's memory and free the bank. =START([prgno,]b) This function returns the start of bank b from either the current program, or the program specified. prgno can be 1-4 for each of the four programs or 5-16 for the accessories. =LENGTH([prgno,]b) This function returns the length of the bank specified. Saving and loading SAVE This instruction provides general and starightforward way of saving a STOS Basic program on the disc. Unlike the equivalent instruction found in most other versions of Basic, STOS also allows you to save a variety of other types of information. This is determined by the extension of the filename used in the SAVE command. Here is a summary of the various data types, along with their extensions. Type of information Extension Comments Basic Programs .BAS Normal basic program Accessories .ACB Load using ACCLOAD Images .PI1,PI2,PI3 Degas format screen .NEO Neochrome format Memory Banks .MBK One memory bank .MBS All current banks Basic Variables .VAR All current vars. Listings .ASC Ascii format RUN-ONLY programs .PRG GEM programs If none of these extensions is found, STOS automatically adds .BAS .ACB files are simple Basic files which may be loaded as accessories. To create them, write your program in Basic as normal, but save it with the different extension. You can load it either as an accessory using ACCLOAD or a Basic program using LOAD. Image Files. You can also save the current screen, bank or memory address as an image file in degas or neochrome format using this method. SAVE "Filename.???"[,address of screen] Memory Banks: SAVE "Filename.MBK",b SAVE "Filename.MBS" Variables: SAVE "Filename.VAR" Listings: SAVE "Filename.ASC" Blocks: BSAVE file$, start TO end Save the memory from start to end as a binary file. (All of the above saves can be re-loaded into STOS by replacing the LOAD or BLOAD with SAVE or BSAVE.) BLOAD file$,addr The file file$ will be loaded into the address specified. BLOAD file$,#bank The file file$ is loaded into the specified bank. The accessories ACCLOAD Loads any of the accessories into memory. Either specify which file to load, or use "*" to load all the accessories from disk. ACCNEW Erases all the accessories from memory. ACCNB Returns the value of zero if the program is not an accessory, else it returns a number between 4 and 15 Sprite Commands SPRITE n,x,y,p Display sprite number n on the screen at coordinates x,y using image p. n is the number of the sprite, which can range from 1-15. It is the number which will be used to identify the sprite in any subsequent calls to MOVE and ANIM instructions. x and y are the coordinates of the point on the screen where the sprite is to be drawn. Unlike normal screen coordinates, these can take negative values. The x coordinate can vary from -640 to +1280, and y coordinate from -400 to +800. This allows you to move a sprite off the screen without causing an error. p specifies which of the images in bank 1 is to be used for a particular sprite. The only limit to the number of these images is the amount of available memory. Each sprite has an invisible handle through which it can be manipulated, called a Hot Spot. Whenever we draw a sprite, we always specify the coordinates of the hot spot. Moving a sprite MOVE X n,m$ This defines a list of horizontal movements which will be subsequently performed by sprite number n. m$ contains a sequence of commands which determine the speed and direction of the sprite: "(sp,st,ct)[A]" SP is the speed of the sprite in 50ths of a second and can range from 1 (v.fast) to 32767 (v.slow) ST is the step size, i.e. how many pixels it will be moved. CT is the number of times that this particular set of commands will be obeyed. 0 indicates that the movement is to be repeated indefinately. This can range from 0 to 32767. E.G. The command MOVE X 1,"(1,5,60)(1,5,-60)" will move sprite 1, 5 pixels to the right every 50th of a second, 60 times, then move it 5 pixels to the left every 50th of a second, 60 times. Movement will then stop. The optional A can take either L to signify that, once the command list has finished, it is to be restarted or Looped. It may also be followed by a number (e.g. L100) which will cause the sprite to be restarted from this coordinate. Additionally, it can take the form of Ex which will cause the sprite to stop when it reaches point x on the screen. NOTE that the sprite must actually reach point x exactly for this to work. If the sprite passes this point without stopping on it, it will not work. e.g. MOVE X 1,"(1,2,100)E150" will work whereas MOVE X 1,"(1,2,101)E150" will not as the sprite uses points 149 and 151, but not 150. MOVE Y n,y$ Acts in the same way to MOVE X but will move the sprite along the Y coordinate. Both commands may be used together to cause a sprite to move diagonally. MOVE ON/OFF [n] Before any sprite movements you have defined by MOVE X and MOVE Y commands will be performed, they need to be initiated by the instruction MOVE ON. n specifies the sprite whose movement is to be switched on or off, and if omitted, the command affects all sprites. MOVE FREEZE [n] This command can be used to temporarily halt one or all of the sprites on the screen. This can then be restarted with the MOVE ON command. =MOVON(n) Return the state of a sprite. If the sprite is currently stationary, it will return 0 (False). =X SPRITE(n) Return the X coordinate of the sprite n. =Y SPRITE(n) Return the Y coordinate of the sprite n. LIMIT SPRITE [x1,y1 TO x2,y2] This command allows an area of the screen to be used to display the sprites rather than the entire screen. If any sprites leave this area, they will disappear from the screen. The x1,y1 coordinates define the top left coordinate of the rectangle and the x2,y2 coordinates define the bottom right. All the X coordinates specified are rounded down to their nearest multiple of 16. To cancel this command, use LIMIT SPRITE with no parameters. Animation ANIM n,m$ This enables you to page through a chain of sprite images one after another. This sequence will be executed at the same time as your sprite is being displayed, even if it is also being moved. n refers to the number of the sprite to which the animation is to be applied. m$ holds the animation control string in the same way as the movement commands do. This takes the format: "(Image,Delay)[A]" Image specifies which image is to be used by the sprite (refer to parameter p of SPRITE) to be displayed during each step of the animation. Delay specifies the amount of time that the image will be held on the screen before the next image is displayed. This delay is specified in 50ths of a second. Again, then optional parameter A can be used to specify that the animation string is to be repeated upon completion by including L. ANIM ON/OFF [n] This command is used the same way as MOVE ON/OFF to turn the animation control on or off. ANIM FREEZE [n] This command is used to temporarily suspend animation until ANIM ON is reissued. Controlling the sprite using the mouse CHANGE MOUSE m This allows you to completely redesign the shape of the mouse cursor. m gives the number of the image to be used, as follows: 1 Arrow (Default) 2 Pointing Hand 3 Clock If you specify a value greater then 3, then this is assumed to refer to sprite image m-3. =X MOUSE Return the X coordinate of the mouse. =Y MOUSE Return the Y coordinate of the mouse. =MOUSE KEY Return the state of the mouse buttons: 0 No button has been pressed 1 Left button pressed 2 Right button pressed 3 Both buttons pressed LIMIT MOUSE [x1,y1 TO x2,y2] Restricts the mouse pointer to a rectangle defined by x1,y1 as the top left hand corner and x2,y2 as the lower right hand corner and also positions the mouse in the centre of the box. LIMIT MOUSE with no parameters will cancel this command. HIDE [ON] Will hide the mouse pointer and maintain a count of how many HIDE commands have been used. The equivalent number of SHOW commands must be used to restore the mouse. HIDE ON will override the count and always hide the mouse. SHOW[ON] Will show the mouse in the same way as HIDE will hide it. Reading the joystick (Port 1) =JOY Returns a bit pattern showing which way the joystick is being moved. BIT No. Significance 0 Up 1 Down 2 Left 3 Right 4 Fire button pressed =JLEFT Returns TRUE if the joystick is being moved left. =JRIGHT Returns TRUE if the joystick is being moved right. =JUP Returns TRUE if the joystick is being moved up. =JDOWN Returns TRUE if the joystick is being moved down. =FIRE Returns TRUE if the fire button has been pressed. Detecting collisions with a sprite =COLLIDE(n,w,h) Test sprite number n for collisions with other sprites. The collision is detected from the Hot Spot of the sprite over an area w wide and h high. The return is a bit pattern with the appropriate bits 1-15 set if collision with these sprites has been detected. Detecting collision with rectangular blocks SET ZONE z,x1,y1 TO x2,y2 Defines one of 128 rectangular zones which can then be tested using the ZONE command for the presence of either the mouse or a sprite. z specifies a number from 1-128 which represents the zone to be created. x1,y1 and x2,y2 denote the top left and bottom right coordinates of the zone. =ZONE(n) This searches the zones for the presence of sprite n. n can range from 0-15 with 0 representing the mouse. This function will return 0 if no zone can be detected, or else it will return the zone number the sprite is currently in. Note, only the first zone may be found. RESET ZONE [z] Reset one or all zones. Detecting collisions with an irregular shape =DETECT (n) Return the colour directly under the Hot Spot of the sprite specified (0-15). PUT SPRITE n Place a copy of sprite n on the screen directly under the sprite's current position. This doesn't affect the sprite in any way. GET SPRITE x,y,i[,mask] Grabs an image off the screen from coordinates x,y to image i in the sprite bank. This image must already exist in the sprite bank as it's dimensions are used during the grab. The optional mask allows you to set which colour is to become transparent. This is usually colour 0 (the background), but some interesting effects can be made by altering this. Sprite Priority PRIORITY ON/OFF Determines which sprite priority system is to be used. ON is used to give priority to the sprites with the largest Y coordinate. If you are using this method, it is advisable to set the hot spot of the sprites to the bottom of the sprite. OFF is the default system which gives priority to sprite 0..1..2... ...15 The Background AUTOBACK ON/OFF ON (default) causes all graphics commands to operate on the foreground and background screens. OFF causes these operations to be performed on the foreground screen only. (Use this mode only if you are not using the sprites or the mouse.) Miscellaneous sprite commands UPDATE [ON/OFF] Turn on or off the automatic updating of the sprites. UPDATE used on it's own will redraw any sprites which have changed their position since their last update. REDRAW Redraw all the sprites regardless of whether they have changed position. OFF Turn off all the sprites. FREEZE Temporarily freeze all sprite movement and music. UNFREEZE Resume any sprite movement and music suspended by FREEZE. Music and Sound PLAY [voice,]pitch,duration Plays a pure note of pitch for the specified duration (in 50ths of a second). If voice (1-3) is omitted, then the note will be played on all three voices simultan- eously. Octave 0 1 2 3 4 5 6 7 Note Pitch C 1 13 25 37 49 61 73 85 C# 2 14 26 38 50 62 74 86 D 3 15 27 39 51 63 75 87 D# 4 16 28 40 52 64 76 88 E 5 17 29 41 53 65 77 89 F 6 18 30 42 54 66 78 90 F# 7 19 31 43 55 67 79 91 G 8 20 32 44 56 68 80 92 G# 9 21 33 45 57 69 81 93 A 10 22 34 46 58 70 82 94 A# 11 23 35 47 59 71 83 95 B 12 24 36 48 60 72 84 96 VOLUME [v,]intensity Allows the volume of one or all of the voices (1-3) to be altered from 0 to 15 CLICK ON/OFF Turn key click on or off MUSIC n Play tune number n from the music bank by interrupt. MUSIC OFF Turn the music being played off. MUSIC FREEZE Temporarily suspend the playing of the music. MUSIC ON Resume playing the music temporarily frozen. TEMPO s Change the tempo of the music from 1 (v.slow) to 100 (v.fast). TRANSPOSE df Transpose a piece of music from -90 to +90 (1 corresponds to a semi-tone). =PVOICE(v) Return the position within the specified voice, the music is currently at. VOICE ON/OFF [v] Turn one or all of the voices on or off. Predefined sound effects BOOM Generate a noise sounding like an explosion. SHOOT Create a sound like a gun firing. BELL Simple bell sound. NOISE [v,]p Produce white noise of frequency 1 (v.high) to 31 (v.low) on one or all of the voices. ENVEL t,s Activate one of the 16 envelopes (t) to the speed (s) which may range from 1 (v.fast) to 65535 (v.slow) Graphics Functions INK index Set the colour of all subsequent graphic drawing operations. (0-15 in low res, 0-3 in medium res, 0-1 in monochrome). COLOUR index,$RGB Set the colour of a specific pen to a $RGB setting. =COLOUR(index) Read the current colour setting of a specific pen. PALETTE list This allows you to set the entire palette to a list of colours, like an expanded COLOUR command. Note that the number of parameters taken varies with each if the resolutions. PLOT x,y[,index] Plot a single point in the current or specified pen colour. =POINT(x,y) Return the current colour (pen) of a specific point on the screen. DRAW [x1,y1] TO x2,y2 Draw a line between specified coordinates, or the last point plotted. Note that this line is always solid and unaffected by SET LINE for speed. For styled lines, use the POLYLINE command. BOX x1,y1 TO x2,y2 Draw a hollow box with the top left and bottom right hand coordinates being specified. RBOX x1,y1 TO x2,y2 Draw a hollow box with rounded edges. POLYLINE [x1,y1] TO x2,y2 [TO x3,y3....] Draw a polygon using the current line style. ARC x1,y1,r,sø,eø Draw an arc centre x1,y1 radius r from sø to eø. Note that angles are calculated in radians (0- 3600) and start from the 3 o'clock position and travel anticlockwise. EARC x1,y1,r1,r2,sø,eø Draw an elliptical arc as above. SET LINE mask,thickness,startpoint,endpoint Set the current line style to mask which is a 16 bit binary pattern for the line, thickness is the thickness of the line and can vary from 1 to 40. The startpoint and endpoint are the line end styles and can be either: 0 : SQUARED 1 : ARROWED 2 : ROUNDED PAINT x1,y1 Fill and enclosed area in the current colour. BAR x1,y1 TO x2,y2 Draw a filled bar. RBAR x1,y1 TO x2,y2 Draw a rounded filled rectangle. POLYGON x1,y1 TO x2,y2 [TO x3,y3....] Draw a filled polygon. CIRCLE x1,y1,r Draw a filled circle. PIE x1,y1,r,sø,eø Produce a pie chart ELLIPSE x1,y1,r1,r2 Draw an ellipse. EPIE x1,y1,r1,r2,sø,eø Produce a filled elliptical pie. SET PAINT type,pattern,border Select a fill pattern. Type can range from 0 to 4:- 0 Surface is not filled at all 1 Surface is filled with the current INK 2 Surface is filled with one of the 24 dotted patterns 3 Surface is filled with one of the 12 line patterns 4 Surface is filled with a user-defined pattern Pattern can range from 1 to 24 or 1-12 depending on the type. Border has only 0 (no border) or 1 (border) SET PATTERN address of pattern This is used to install a user defined fill pattern for the user-defined fill option of SET PAINT. The address of pattern refers to where in memory the new pattern is to be found. Each pattern is 16 points high by 16 points wide and takes up two byte words for each colour plane. The easiest way of creating them is to define a 16 by 16 sprite and then use the following routine to find the address of the sprite. if mode=0 then PLANES=4 if mode=1 then PLANES=2 if mode=3 then PLANES=1 s=1 : rem sprite to be indexed SP=leek(start(1)+4*(mode+1))+start(1)+4 SPB=SP+(S-1)*8 POS=leek(SPB)+SP+32*PLANES set paint 4,1,1 set pattern POS Another way is A$=SCREEN$(physic,1,1 to 16,16) SET PATTERN A$ FLASH index,"(colour,delay)(colour,delay)...." Set any of the 16 colours to flashing. Index is the colour number to be animated. Delay is the number of 50ths of a second which must elapse before the next colour is used. Colour is the standard RGB format. SHIFT delay[,start] This command allows you to produce colour rotation. Delay is the number of 50ths of a second which must elapse before the colour palette is rotated. The optional start allows you to specify which is the first colour in the palette to be rotated, if omitted, the value of 1 will be used. GR WRITING mode This sets up the mode which will be used whn writing graphics text. Four modes are available: 1 : Replace (Overwrite anything) 2 : Transparent (Put only the ink colour on screen) 3 : XOR (Combine with existing graphics) 4 : Inverse Transparent (Plot only colour zero) POLYMARK x1,y1[;x2,y2[;x3,y3......]] Place a polymark on the screen at the specified coordinates. SET MARK t,s Set the current polymark to the required type (t) and size (s). Type can be : 1 : Point (1 size only) 2 : + 3 : * 4 : Square 5 : Diagonal cross 6 : Diamond Size can be any one of eight, ranging in 11 point increments from 6 to 83 pixels wide. MODE n Change screen to mode (n) : 0=low res, 1=med res. =MODE Return the current mode, 0-3 DIVX/DIVY Hold the width and height of the current graphics screen according to the current mode. CLIP x1,y1 TO x2,y2 Define the tope left and bottom right of the clipping rectangle. Any graphics drawn outside this area will not be shown. CLIP OFF Disables the clipping rectangle. The Screen Multiple Screens STOS Basic holds two screens in memory at any one time. The first is called the physical screen, and is the screen which is actually displayed. There is also a separate background screen which is used by the sprite commands. BACK is a variable which holds the address of the background screen. PHYSIC Is a variable which holds the address of the physical screen currently being displayed.. If you load a different address into this variable, the screen will be immediately redrawn using the screen stored at this address. The value assigned can either be an address, or the number of the memory bank in which the screen is stored. LOGIC This is the screen which text and graphic commands operate on. Normally, this and PHYSIC hold the same address so that you can see what is being drawn to the screen. However, it is sometimes useful to have the pictures drawn on a separate screen and then displayed. This can be done by setting LOGIC to the address of an area or memory bank onto which the image can be created, and then, when it is finished, display it with PHYSIC=LOGIC. SCREEN SWAP This swaps the addresses held in the variables PHYSIC and LOGIC. This enables you to instantly switch from one screen to another. DEFAULT Returns the initial value of one of the three screens. DEFAULT BACK Returns initial value of BACK DEFAULT PHYSIC Returns initial value of PHYSIC DEFAULT LOGIC Returns initial value of LOGIC When you are using multiple screens, it is easy to lose track of the original screen addresses. This function is often used to restore these values. PHYSIC=DEFAULT PHYSIC BACK=DEFAULT BACK LOGIC=DEFAULT LOGIC Reserving a screen STOS can have any number of screens held in memory at any one time. The following instructions allow you to allocate a memory bank to hold one of these screens. RESERVE AS SCREEN n Reserves the bank number n as a temporary screen 32768 bytes long. RESERVE AS DATASCREEN n Reserves the bank number n as a permanent screen 32768 bytes long. This will be saved along with your program. Loading a screen STOS lets you load a screen directly into an address or a memory bank from either a DEGAS or NEO format. LOAD filename$,scrn Where filename$ is the name of the file on disk, complete with ".NEO",".PI1",".PI2",".PI3" extension. scrn can either be a memory bank or an address. GET PALETTE(n) Load the colour settings of the screen stored at bank n into the colour palette. CLS scr[,col[,x1,y1 TO x2,y2]] Clear the screen. The optional parameters allow you to specify the colour that the screen, or portion of the screen, is to be filled with. ZOOM scr1,x1,y1,x2,y2 TO [scr2,]x3,y3,x4,y4 Magnifies any rectangular section of the screen stored at scr1. scr1 and scr2 can be either an address or a memory bank. The coordinates specify the top left and bottom right coordinates of the area to be magnified from and to. REDUCE scr1 TO [scr2,]x1,y1,x2,y2 Compresses the entire screen stored at scr1 to a rectangle x1,y1,x2,y2 either in the background screen, or the screen stored at scr2. Note that scr1 and scr2 can be either memory banks or addresses. SCREEN COPY scr1[,x1,y1,x2,y2] TO scr2[,x3,y3] This command allows you to copy either entire screens from scr1 to scr2, or portions of the screen, as specified by the coordinates. Note, however, that the x coordinate is always rounded down to the nearest multiple of 16. These coordinates can also be negative in the ranges shown below. Areas off the screen will simply not be copied. Graphics mode X Range Y Range Low -320 to 320 -200 to 200 Medium -640 to 640 -200 to 200 High -640 to 640 -400 to 400 =SCREEN$(scrn,x1,y1 TO x2,y2) Load an area of the screen into a string. SCREEN$(scrn,x,y)= Load a screen held in a string to the screen. Scrolling the screen DEF SCROLL n,x1,y1 TO x2,y2,dx,dy This command allows you to define up to 16 zones for scrolling. n denotes the number of the zone from 1-16. x1,y1,x2,y2 denote the upper left and lower right coordinates of the zone. dx,dy hold the number of points that the zone is to be scrolled, either up, down, left or right. SCROLL n Scroll zone number n in the direction specified. Screen synchronisation The screen is updated by the hardware every 50th of a second.. Once the screen has been drawn, the electron beam turns off while it returns to the top of the screen again. This is called a vertical blank, or VBL for short. When this takes place, STOS performs a number of tasks, such as moving the sprites, playing music, shifting the colour palette, etc. Since a 50th of a second is a long time for STOS basic, this can lead to a serious lack of coordination between your program and the screen. This is where these commands come in. WAIT VBL Waits for the next vertical blank to occur. This is generally used after PUT SPRITE or SCREEN SWAP, as this is when these commands are executed. SYNCHRO Synchronise scrolling with sprites. STOS performs all sprite movements every VBL. This generally works fine, but occasionally it leads to an irritating synchronisation problem. Supposing you want to place a sprite a a fixed point on a scrolling background. Whenever the background moves, the sprite will move along with it. It should be easy enough to produce a set of MOVE X and MOVE Y commands which precisely follow the movement of the background. Unfortunately, this wouldn't quite work as the SCROLL instruction would not be executing at the same time as the sprite commands. The sprites would therefore tend to drift jerkily around the screen. STOS, however, supplies you with a command that will allow you to move all the sprites on the screen at the exact time that you want them to: SYNCHRO ON Turn off the normal sprite interrupt which moves the sprites every 50th of a second. SYNCHRO Execute all the sprite movement commands once. SYNCHRO ON Reverts the sprite movements to normal. The sprites will now be moved automatically every 50th of a second. Compacting the screen STOS comes with a handy accessory which allows you to compact part or all of the screen, "COMPACT.ACB". The following commands are also supplied: UNPACK bnk,scr Unpacks a screen stored in bank number bnk to the address or bank number scrn. PACK scr,bnk Pack the screen stored at address or bank scr into memory bank bnk. Special screen effects APPEAR x[,y] This command allows you to produce fancy fades between a picture stored in x to the current screen. The parameter y can specify which of the 79 fades you wish to use. Fades 1-72 always result in a complete image being copied, whilst fades 73- 79 leave the final screen slightly different from the one stored at x. FADE speed This command allows you to fade the colours between two screens. FADE speed Fades all the colours on the screen to black in the specified 50ths of a second. FADE speed TO bank Fades the present colours to those specified in the screen stored in bank FADE speed,c1,c2,.. Fade seperate colours to a new value. The first two should speak for themselves, the last one isn't quite so obvious. Speed is the number of VBL's which are to occur between each colour change. The list which follows is the new colours you require for colour1, colour2, colour3, etc. Any colours you don't wish to change are left blank. e.g. FADE 5,$777,$777,,$777,,$777 Will, using speed 5, fade the current pens 0,1,3 and 5 to white ($777). Colours 2 and 4 are left unchanged, as are colours 6-15. Text and Windows STOS basic allows you to print text on the screen in a number of ways. It also allows up to 13 windows each with it's own unique character set. PEN index This allows you to specify which of the pens (0-15 in low res, etc.) all subsequent text operations are to be performed in. PAPER index This, like PEN designates all future background colour. INVERSE ON/OFF This mode switches the text and background colours selected by PEN and PAPER. SHADE ON/OFF This fades out all subsequent text. UNDER ON/OFF This switches the underline mode on or off. WRITING effect This allows you to specify the writing mode of all subsequent text operations: 1 Replacement mode (default). 2 OR with existing screen. 3 XOR with existing screen. LOCATE x,y Locates the cursor at coordinates x,y. =XTEXT(x) Converts the x coordinate from graphic format to text relative to the current window. =YTEXT(y) Converts the y coordinate from graphic format to text relative to the current window. =XGRAPHIC(x) Converts the x coordinate from text format to an absolute screen coordinate. =YGRAPHIC(y) Converts the y coordinate from text format to an absolute screen coordinate. SQUARE wx,hy,b Draws a rectangle on the screen at the current cursor position specifying the width and height (minimum of 3) in character positions with any one of 15 different border types (see BORDER). HOME Sends the cursor to the top left hand corner of the current window. CDOWN Moves the cursor one space in the requested CUP direction. CLEFT CRIGHT XCURS Variables holding the current text coordinates of YCURS the cursor. SET CURS t,b Set the text cursor size specifying the top and bottom of the cursor (1-8). CURS ON/OFF Enable/disable the text cursor. CENTRE a$ Print a line of text centred on the screen. TAB(n) Used with the print instruction to move the cursor forward n spaces. Unlike the usual basic command, this produces a string of cursor rights, and can be assigned to a string if required. X$=TAB(7) =SCRN(x,y) Returns the ascii code of the character found at the text coordinates relative to the current window. Windows WINDOPEN n,x,y,w,h[,b[,s]] Create a window number n (1-13) at x,y (text coordinates of the top left corner of the window), width w and height h. The options allow you to specify one of 15 borders (see BORDER) and one of several character sets. There are 16 character sets available: 1 : 8x8 (Default for low resolution) 2 : 8x8 (Default for medium resolution) 3 : 8x16 (Default for high resolution) Sets 4-16 are your own character sets. TITLE a$ Define a title for the current window, centering it. This will remain until the BORDER command is issued with no parameter. BORDER [n] This allows you to choose one of 16 possible borders for the current window. The variable n can range from 1-16, and the borders are made up from characters 192-255 in the current character set. These may be changed if necessary. Note that if you use boder on it's own, the current border will be redrawn and the title of the window erased. WINDOW n Set the window n to the top, make it the current window and redraw it's contents. Note that if the window is already fully visible, it's quicker to use the QWINDOW command. QWINDOW n Activate window n without redrawing it. WINDON Returns the number of the currently active window. WINDMOVE x,y Move the current window to new x,y coordinates. WINDEL n Delete window n. CLW Clear the current window. SCROLL ON/OFF Switch window scrolling off. SCROLL UP/DOWN Scroll all the text in a current window up or down one line. Character Sets RESERVE AS SET n,l This reserves a bank n in memory as character set storage l bytes long. This bank is permanent and will be stored along with your program. CHARLEN(n) This returns the length of a character set specified by the number n. CHARCOPY s TO b This copies the character set s (1-16) to bank number b. ICON$(n) Generate an icon at the current cursor position. This will effectively draw icon number n from the bank defined. It may also be used in menu bars. Menu Commands STOS provides you with a number of clever facilities for creating and using menus. Although different from their GEM equivalents, they are considerably more powerful. Creating a menu MENU$(x)=title$[,paper,pen] This allows you to specify the main titles that will appear on the top line. Title$ holds the title of your menu, and you are also given the option to specify the paper and pen colours if you wish. You can define up to 10 titles this way (1- 10). MENU$(x,y)=option$[,paper,pen] This allows you to specify the options that will appear in each drop down menu. x is the menu (as specified by the MENU$(x) command, and y is the option number within the menu. Again, paper and pen options are available to you. e.g 10 menu$(1)="ACTION" 20 menu$(2)="MOUSE" 30 menu$(1,1)="QUIT" 40 menu$(2,1)="ARROW" 50 menu$(2,2)="HAND" 60 menu$(2,3)="CLOCK" MENU ON [b][,m] Activates the menu with any one of 16 borders (see BORDER). The mode is either 1 for the standard drop down menus, or 2 for pull down menus. 70 MENU ON 5,2 Generates a pull down menu with border 5. MENU OFF Permanently switches the menu bar off and erases it from memory. MENU FREEZE Temporarily freezes the menu bar and can be restarted with the MENU ON command. MENU$(x,y) OFF Disables one of the menu items. MENU$(x,y) ON Re-enables a menu item disabled with the above. MNBAR These variables hold the menu title and the menu MNSELECT options you have chosen. ON MENU This provides you with an interrupt driven method of selecting the menu bar. This will allow you to run a program as normal, but when an option is selected, it will jump to one of a list of line numbers in the same way an ON GOTO would, using the title number returned. ON MENU ON Sets the entire process in operation by activating the ON MENU command. ON MENU OFF Turns the menu off. Icons can also be included into menu bars as well. menu$(2,1)=icon$(3) menu$(2,2)=icon$(4) menu$(2,3)=icon$(5),2,4 Other Commands Control Structures GOTO line number/expression NOTE: STOS doesn't use labels for lines, equations and variables may be used, but they will not renumber. GOSUB line number/expression RETURN POP Trash the return address generated by a GOSUB statement. FOR..TO..STEP NEXT Note that multiple NEXT statements cannot be combined. WHILE...WEND REPEAT...UNTIL STOP END IF..THEN..ELSE Note that this is one line ONLY. ON...GOTO ON...GOSUB ON ERROR GOTO line This allows you to trap errors within the program by ordering the computer to jump to a specific line if one occurs. RESUME Jump back to the command that caused the error and retry. RESUME NEXT Jump to the command following the one generating the error. RESUME line Jump to a specific line. ERN and ERL Variables holding the error number and line number. ERROR n Generate an error and exits back to STOS. BREAK ON/OFF Disables or enables the Control+C checks. KEY(x)=a$ Assign a string to one of the 20 function keys (1- 20). Note that the ' character is interpreted as CHR$(13). INKEY$ Return a key press, but don't wait. SCANCODE Holds the scancode of the last key pressed. CLEAR KEY Clear out the keyboard buffer. INPUT$(n) A function which reads n characters from the keyboard and echos them to the screen before returning. FKEY Is a special form of INKEY$ which will return a value between 0 and 20 to indicate which of the function keys has been pressed. WAIT KEY Waits for a keypress. KEY SPEED r,s Sets the repeat speed (r) in delays of 50th of a second and the delay between the initial keypress and the start of the repeat sequence (d) in 50ths of a second. PUT KEY a$ Writes a string to the keyboard which will be 'typed' when the computer next has chance. Note that the ' character works the same way as pressing the return key. INPUT [prompt;]variable list LINE INPUT [prompt;]variable list PRINT and ? PRINT USING format$;variable list The format can consist of any characters with the exception of ~#+-.;^ Their meanings are as follows: ~ Insert a character from the following string. # Insert a digit from the following number. + Add a plus + or - sign to the number. - Add only a - sign to the number. . Align with decimal point. ; Align with decimal point, but don't print it. ^ Print number in exponential form. Disk Access OPEN IN #channel,filename$ OPEN OUT #channel,filename$[,attribute] Open files for input or output only. Channel can be from 1-10 and it is this channel that all data will be sent to. Filename$ is the disk filename holding the data, if output, then the existing file on the disk will be erased. The optional attribute allows you to specify the type of file to be created (see DIR FIRST$). OPEN #channel,"R",file$ Opens a random access file. OPEN #channel,"MIDI" Opens a channel to the MIDI interface. OPEN #channel,"AUX" Opens a channel to the RS232 port. OPEN #channel,"PRT" Opens a channel to the printer plugged in the parallel port. CLOSE#channel Closes a file and writes any buffered data. PRINT#channel,list Prints a list of data, like the normal print function, to the specified channel. INPUT#channel,list Like input, but allows you to read information from a channel. LINE INPUT#channel[,seperator$],list This acts like INPUT, reading data from a channel, seperated by a <Return> rather that a comma. The optional seperator$ is included if something other that a <Return> seperates the data. INPUT$(#channel,count) Inputs count characters from the file. EOF#channel A variable used to test for the end of a file. LOF#channel Return the length of a file. POF#channel The variable holding the current position of the pointer within a file. This may be altered to move the pointer. FIELD#channel,length1 AS field1$,length2 AS field2$.... Field allows you to define a record which will be used for random access files. This record can consist of up to 16 alphanumeric fields and can be up to 65535 bytes long. PUT#channel,r Writes the record created by FIELD into record position r in the file. GET#channel,r Reads the record r from the specified channel into the field set up by the FIELD command. PORT#channel Test to see if an input device is waiting for information. The Printer LLIST As List, allows you to send your listings to the printer. LDIR List the directory on the printer. LLISTBANK List the memory bank information on the printer. LPRINT Print all thet follows to the printer (see PRINT) HARDCOPY Dump the screen as would Alternate+Help. WINDCOPY Unlike hardcopy, this command prints out the text in the current window. Directories DIR [path$][/W] Lists the current directory. DIR$= Sets the current directory. =DIR FIRST$(path$,flag) This returns the first file that satisfies the pathname. The flag is a number of binary bits which indicates which types of file are to be sought. Bit 0 : Normal Read/Write files Bit 1 : Read only iles Bit 2 : Hidden files Bit 3 : Hidden system files Bit 4 : Volume labels Bit 5 : Folders Bit 6 : Files which have been written to and closed. If you aren't sure which type you want, use -1. If no file exists, then a null string is returned, elsewise a 42 character string is returned with the following format. Characters Usage 1-12 Filename 13-21 Length of file 22-32 Date file saved 33-41 Time file saved 42 File type DIR NEXT$ Returns the next file found as per the setup in DIR FIRST$ PREVIOUS Drops back one level in the subdirectories. =DRIVE= Variable holding the drive number (0-...) =DRIVE$= Varianle holding the drive letter (A-...) DRVMAP Variable holding a list of the drives connected in binary. DFREE Holds the amount of free space left on a disk. MKDIR folder$ Creates a folder RMDIR folder$ Removes an empty folder from the disk KILL file$ Erase a file, or series of files from the disk. RENAME old$ TO new$ Renames a file. Trigonometric functions DEG(x) Convert an angle expressed in radians to degrees RAD(x) Convert an angle expressed in radians to degrees SIN(x) COS(x) TAN(x) Sine, Cosine and Tan ASIN(x) ACOS(x) ATAN(x) Arc Sine, Cosing and Tan HSIN(x) HCOS(x) HTAN(x) Hyperbolic Sine, Cosine and Tan PI ã LOG(y#) Log base 10 of y# LN(y#) Natural Log of y# EXP(y#) Exponential of y# SQR(y) Square Root ABS(y) Absolute value INT(y) Integer Rounded down SGN(y) Find the sign of y MAX(x,y) Return largest value MIN(x,y) Return smallest value SWAP x,y Swap variables x and y (also strings) DEF FN name[(variable list)]=expression Define a function FN name[(variable list)] Call a user defined function. RND(y) Return a random number from 0-y inclusive LET Yes, this is still to be found! FIX(n) Set the precision of any real numbers that are to be printed out on the screen. If 0<n<16 then n denotes the number of figures after the decimal point. If n>16 the printout will be proportional and any trailing zeros will be removed. If n<0 then all floating point numbers will be expressed in exponential format. =UPPER$(n$) Convert n$ to upper case. =LOWER$(n$) Convert n$ to lower case =FLIP$(n$) Reverse the order of the letters in n$ =SPACE$(n) Creates a string full of spaces. =STRING$(a$,n) Create a string full of a$ =CHR$(n) Return ASCII character. =ASC(n) Return ASCII code. =LEN(n$) Return length of n$. =VAL(n$) Convert n$ to a number. =STR$(n) Convert n to a string. =TIME$= A variable holding the time in hours:minutes:seconds =DATE$= A variable holding the date in the format DD/MM/YYYY =FILE SELECT$(path$[,title$[,border]]) Request for a filename using the file selector. =HEX$(n,l) Convert n to a hexadecimal number. The optional l requests for it to be padded out. =BIN$(n,l) Converts n into a binary number. ROL[.B/.W/.L] x,y Rotate y left by x places. The optional .B, .W and .L tell the instruction to treat is as a byte, word or longword. ROR[.B/.W/.L] x,y Rotate Right =BTST(x,y) Test bit x of number y BSET x,y Set bit x of number y BCHG x,y Change the status of bit x in number y BCLR x,y Clear bit x of number y PEEK POKE DEEK DOKE LEEK LOKE Read or change the contents of memory locations. VARPTR(variable) Returns the address of the variable stored in memory. COPY start,finish TO destination Copy a block of memory. FILL start TO finish,longword Fill an area of memory. =HUNT(start TO finish,A$) Hunt through memory for a string. WAIT x Wait for x 50ths of a second. =TIMER= Timer counted in 50ths of a second. =NOT(x) Logical NOT operation. REM remark DATA variable list Numbers, strings, variables and formulae can be included. READ variable list RESTORE [line] TRUE Variable holding -1 FALSE Variable holding 0 Appendix A Error Messages Error Code Error name 0 Not Done A procedure has been attempted, but due to some condition, it has not been carried out. 1 Bad File Format A file to be loaded cannot be recognised by STOS as it is not of the correct format. 2 Out Of Memory STOS has no more memory left for allocation. Take out all the accessories and excess programs to free more memory. 3 This Line Does Not Exist This error occurs when you have tried to delete a line which does not exist so the delete operation is aborted. 4 This Line Already Exists The Auto function reports this error when it comes across a line which is already in your program. 5 Search Failed A string has been searched for in the current program, but it does not exist. 6 Line Too Long You have attempted to enter a line more than 700 characters long. 7 Can't Continue STOS can't continue from the previous break. 8 See Error 6. 9 Follow Too Long STOS has been told to trace too many parameters. 10 Printer Not Ready The printer is not on line. 11 Can't Renum STOS has attempted to renumber a section of your program and this action would result in a conflict of line numbers. 12 Syntax Error The syntax of the error line or statement is not correct. 13 Illegal Function Call You have tried to use a function with an illegal set of parameter. 14 Illegal Direct Mode A command input in direct mode is not recognised by STOS. 15 Direct Command Used A command which is only available in direct mode has been used in the program. 16 In/Out Error An error has occurred during an input/output operation 17 Break You have pressed Control+C. 18 Non Declared Array An array has been referenced which has not been set up with the DIM statement. 19 Type Mismatch An illegal value has been assigned to a variable. 20 Function not implemented A function entered in STOS is not recognised. 21 Overflow Error A calculation has exceeded the size of a variable. 22 For Without Next A FOR command does not have it's mandatory next listed later in the program. 23 Next Without For STOS has come across a NEXT instruction which has no FOR. 24 While Without Wend The WHILE instruction has no mandatory WEND after it. 25 Wend Without While A WEND instruction has been encountered that has no matching WHILE. 26 Repeat Without Until A REPEAT instruction exists but has no corresponding UNTIL. 27 Until Without Repeat The UNTIL instruction has no preceding REPEAT command. 28 Array Already Dimensioned An array has been re-dimensioned at the error line. 29 Undefined Line Number A GOTO, GOSUB or RESTORE has been encountered which indexes a non-existent line. 30 String Too Long A string has exceeded the limit of 65000 characters. 31 Bus Error An internal error has occurred possibly due to incorrect addressing using the PEEK and POKE commands. 32 Address Error An odd memory address or invalid address has been accessed using the PEEK and POKE commands. 33 No Data On This Line The RESTORE instruction has tried to restore a line of data. In this case, the line did not contain a DATA command. 34 No More Data The READ command cannot get any more data because it has all been read. 35 Too Many Gosubs STOS cannot store any more RETURN addresses. 36 Return Without Gosub The program has reached a RETURN but no GOSUB has been used. 37 Pop Without Gosub The POP instruction cannot be executed outside a subroutine. 38 Resume Without Error A RESUME instruction cannot be executed unless an error has occurred. 39 User function Not Defined A user function has been accessed that has not been set up with DEF FN. 40 Illegal User-Function Call The list of parameters you inpt does not match the list you specified in the DEF FN. 41 Memory Bank Already Reserved An attempt to reserve a memory bank has failed because it is already reserved. 42 Memory Bank Not Defined As Screen A command has accessed a memory bank which must be reserved as screen and thus cannot find the information required. 43 Bad Screen Address A screen address has been used which is invalid for a proper screen start address. The address must be on a 256 byte boundary. 44 Memory Bank Not Reserved A memory bank has been accessed and has not been reserved for use. 45 Resolution Not Allowed MODE cannot be used in high-resolution monitors. 46 Division By Zero 47 Illegal Negative Operand Some functions cannot process negative numbers. 48 File Not Found You have tried to open or load a file not on the current disk. 49 Drive Not Ready A disc drive is not ready for use. 50 Disc Is Write Protected 51 Disc Full 52 Disc Error 53 Bad Filename A filename has been used in an input/output procedure which is not legal. 54 Bad Time The user has attempted to set an illegal time using TIME$. 55 Bad Date The user has attempted to set up an illegal date using DATE$. 56 Sprite Error Parameters for a SPRITE command have been set which do not fall inside the legal limits. 57 Movement Declaration Error The MOVE instruction has not been set properly. 58 Animation Declaration Error The ANIM string command has not been properly set. 59 File Not Open 60 File Type Mismatch A file command has been used which does not correspond to the correct filing system. 61 Input String Too Long An incoming string is too long for a dimensioned variable. Or you may have tried to INPUT# a string more than 500 characters long. 62 File Already Open 63 File Already Closed 64 End Of File 65 See Error 61. 66 Field Too Long The size of the record you have created with FIELD is greater than 65535 bytes. It's also possible that you have used more than the maximum 16 fields. 67 Flash Declaration Error The FLASH command has been incorrectly called. 68 Window Parameter Out Of Range 69 Window Already Open 70 Window Not Opened 71 Window Too Small An attempt has been made to open a window smaller than 3x3. 72 Window Too Large 73 Character Set Not Defined 74 No More Text Buffer Space If you open over 10 windows the size of a fill screen in either mode 1 or mode 2 then the space reserved for the data in each window gets used up and causes this error. 75 Music Not Defined 76 System Window Called The system windows have been used in one of the commands. These are 0, 14 and 15. 77 System Character Set Called You have attempted to replace a system character set with a custom designed one. 78 Character Set Not Found 79 Menu Not Defined 80 Bank 15 Already Reserved This bank is already reserved and must be erased if you wish to reserve it for another purpose. 81 Bank 15 Is Reserved For Menus Menus are used in the current program and thus you cannot use this bank for anything else. 82 Illegal Instruction When STOS is running a machine code program this error will occur if it finds that the code is invalid. 83 Drive Not Connected 84 Extension Not Present This occurs when you try to run a program which incorporates new STOS Basic commands without loading the relevant extension file first. 85 Subscript Out Of Range 86 Scrolling Not Defined The SCROLL command has been used but STOS doesn't have the information necessary to scroll the screen. 87 String Is Not A Screen Block A string has been used in SCREEN$ which has not been designed as a sprite block string. Appendix B Using Assembly Language CALL address or bank CALL allows you to execute any assembly language program held in the ST's memory. address can be either the absolute location of the code, or the number of the memory bank that the code is held in. Calling a machine code program 1 Reserve some memory for your routine using the RESERVE AS DATA, e.g. RESERVE AS DATA 7,10000 2 Load the program, e.g. LOAD "file.prg",7 NOTE that the code must be in TOS relocatable format and must NOT summon any of the GEM routines. 3 Pass any input parameters using the pseudo variables DGRE(0) to DREG(7) and AREG(0) to AREG(6) 4 Call your program, e.g. CALL 7 Your assembly language program may subsequently change any 68000 registers it likes with the sole exception of A7, and it must always be terminated with a RTS. It must never call GEMDOS traps SET BLOCK, MALLOC, MFREE, KEEP PROCESS or any other memory management functions. TRAP n[,parameters] TRAP allows you to call one of the numerous 68000 TRAP functions. These traps are really just large libraries of assembly language functions. n refers to the number of the TRAP; 0,1,13,14 are the GEMDOS functions 3,4,5,6,7 are the STOS functions. The optional parameters specify the data which is to be placed on the 68000's stack before the TRAP function is executed. As a default these are assumed to be of size WORD. You can set the size directly from the TRAP instruction by using a statement such as: W.expression L.expression One useful bonus is that you can also include a string variable in the expression, such as A$. In this case, the address of the string is placed on the stack and a CHR$(0) is automatically added to the end of the variable to convert it into the correct format. Appendix F Structures of the Banks Structure of the Sprite Bank Offset Meaning 0 Sprite Bank ID code ($19861987) 4 4-byte offset to address of sprite parameter block in low resolution 8 4-byte offset to address of sprite parameter block in medium resolution 12 4-byte offset to address of sprite parameter block in high resolution 16 Number of sprites in low resolution 18 Number of sprites in medium resolution 20 Number of sprites in high resolution Typical Sprite Parameter Block Offset Meaning 22 4-byte offset to sprite data 26 Width of sprite (in units of 16) 27 Height of sprite 28 X coordinate of hotspot 29 Y coordinate of hotspot 30 Start of next sprite parameter block.... Sprite Data Structure The Sprite Data Block Data for Mask (one bit plane) Sprite Data (organised in bit planes) Structure of the Icon Bank Offset Meaning 0 Icon Bank ID code ($28091960) 4 Number of icons in bank 6 Start of data for icon 1. This is 84 bytes long, and uses the same format as the LINE-A sprites. 92 Start of data for icon 2.... Structure of the Music Bank Offset Meaning 0 Music Bank ID code ($13490157) 4 Offset from start of the bank to music number 1. Set to zero if no music with this number. 8 Offset to music number 2.... 124 Offset to music number 32 (Maximum of 32 pieces of music) 128 Length of this memory bank 132 Name of music 1 (8 letters) 140 Name of music 2 (8 letters)..... 380 Name of music 32 (8 letters) 388 Start of music 1... Inside the music definitions Offset Meaning 0 ID code that this is music data. ($19631969) 6 Offset to music in voice 1. 8 Offset to music in voice 2. 10 Offset to music in voice 3. 12 Definition of first tremelo/envelope (36 bytes long) 48 Definition of second trememlo/envelope Start of voice 1 The Music Commands Each note is stored as a teo-byte word ranging from 0-32767. The lower half of this word contains the pitch of the note (0-96). See PLAY for more details. The upper byte holds the length of the note in 50ths of a second. The Music commands are held in either two or four bytes. In order to distinguish them from normal notes, the highest bit of these commands is set to 1. Here is a list of the various commands and the numbers used to represent them in the music. Number Size Command Meaning $8000 2 bytes END Signifies the end of music for this voice $A000 2 bytes MUSIC Use pure tones for music. $A100 2 bytes NOISE ONLY Use noise for music. $A200 2 bytes STOP NOISE Turns off noise. $A3xx 2 bytes NOISE xx Plays noise with pitch xx $A400 2 bytes STOP NTREMULO Stop mixing tremulo with noise $A500 2 bytes STOP ENVEL Stop using current envelope $A600 2 bytes STOP TREMOLO Stop using current tremolo $A7xx 2 bytes VOLUME xx Set volume of sound to xx $C000 4 bytes NTREMULO Mix TREMULO with noise. Bytes 2&3 hold offset to tremulo definition $C100 4 bytes ENVEL xx Use ENVEL xx. Bytes 2&3 hold offset to envelope definition $C200 4 bytes TREMULO xx Use TREMULO xx. Bytes 2&3 hold offset to tremulo definition. $C3nn 4 bytes REPEAT nn,note Repeat music starting from note, nn times. Note held in bytes 2&3. Screen Banks The format of the screen banks is very straight forward indeed. The first 32000 bytes of this memory hold the actual screen data, and the next 16 words from numbers 32000 to 32032 contain a copy of the colour settings for this screen. Note that bytes from 32032 onwards are free, and can be used for your own purposes. Appendix G Accessing The Programmable Sound Generator PSG(r) The Atari ST incorporates a special piece of circuitry which it uses to generate a wide range of sounds. Access to this chip is via the PSG register, which may be read from, or written to. WARNING: This function is dangerous! Incorrect usage can cause serious damage to any disc in the disk drive. Here is a brief list of the various sound registers and their uses: Register Function 0 Bits 0-7 set the pitch in units of a single step for voice 1. 1 Bits 0-3 set the size of each frequency step 2 Fine control for voice 2. As register 0 3 Coarse control for voice 2. As register 1 4 Fine control for voice 3. As register 0 5 Coarse control for voice 3. As register 1 6 Bits 0-4 control the pitch of the noise generator. The higher the value, the lower the tone. 7 Control register for sound chip. Bit 0: Play pure note on voice 1 (1=ON, 0=OFF) Bit 1: Voice 2 tone ON/OFF Bit 2: Voice 3 tone ON/OFF Bit 3: Play NOISE on voice 1 ON/OFF Bit 4: Play NOISE on voice 2 ON/OFF Bit 5: Play NOISE on voice 3 ON/OFF 8 Bits 0-3 control volume of voice 1. If bit 4 is set to 1 then the envelope generator is being used, and the volume bits are ignored. Since this corresponds to a volume of 16, this explains why you need to set VOLUME to 16 before you can use the ENVEL command. 9 As register 8 but for voice 2 10 As register 8 but for voice 3 11 Bits 0-8 provide fine control of the length of the envelope 12 This register provides coarse control of the length of the envelope. 13 Bits 0-3 choose which of the 16 possible envelopes is to be used.