Timex Floppy Disk Drive System
User manual
For SPECTRUM users
Note: the '^' character represents the up 
arrow symbol in Spectrum/Timex character set (Symbol Shift + H).
First Edition 1984
(C) T.O.S., Copyright TIMEX PORTUGAL Ltd.
TMX PORTUGAL Ltd. Apartado 2
2825 Monte da Caparica
TIMEX DISK OPERATING SYSTEM
------------------------------------------------------------------------------
CHAPTER - CONTENTS -
------------------------------------------------------------------------------
1 INTRODUCTION
------------------------------------------------------------------------------
1.1 Introducing TOS
1.2 About this manual
------------------------------------------------------------------------------
2 SETTING UP
------------------------------------------------------------------------------
2.1 Unpacking and Setting up
2.2 About the diskettes
2.3 Expanding the system
------------------------------------------------------------------------------
3 TOS - Part I
------------------------------------------------------------------------------
3.1 Using TOS commands 
3.2 Getting started
3.3 CAT * - to catalogue disk contents
3.4 Filenames - what is in a filename
3.5 FORMAT *
3.6 LOAD * / SAVE *
3.7 Using LOAD * / SAVE *
3.8 MERGE *
3.9 TEMPLATES
3.10 ATTR *
3.11 ERASE *
3.12 LET *
3.13 MOVE *
3.14 Using MOVE *  ERASE *  LET *
3.15 START- to create start up files.
------------------------------------------------------------------------------
4 DIRECTORIES PATHNAMES - TOS Part II
------------------------------------------------------------------------------
4.1 The tree structure
4.2 TOS DIRECTORIES
4.3 The PATHNAME
4.4 Using TOS PATHNAMES
4.5 DIM *
4.6 GOTO * / ^ / : LIST *
4.7 GOSUB * / DRAW *
4.8 Using the Demo disk
4.9 ATTR * LET *  MOVE * ERASE * LOAD * SAVE *
4.10 Using two or more drives.
------------------------------------------------------------------------------
5 RANDOM ACCESS and SEQUENTIAL FILES
------------------------------------------------------------------------------
5.1 Files
5.2 Channels
5.3 OPEN #*
5.4 LIST *#
5.5 RANDOM and SEQUENTIAL access files
5.6 RESTORE *
5.7 CLOSE #*
5.8 Fast and slow channels
------------------------------------------------------------------------------
6 SERIAL COMMUNICATION PORTS
------------------------------------------------------------------------------
6.1 The SCP's
6.2 FORMAT *  a Serial Communication Port - configure
6.3 File transfer via Serial ports
6.4 OPEN #* and CLOSE #* commands with the SCP's
6.5 CLOSE #*
6.6 LIST *#
6.7 RESTORE *
------------------------------------------------------------------------------
APPENDICES
------------------------------------------------------------------------------
APPENDIX A - TOS COMMAND SUMMARY
APPENDIX B - ERROR REPORTS
APPENDIX C - UTILITY PROGRAMMES
APPENDIX D - RS232C LINK UPS
APPENDIX E - ERROR TRAPPING
APPENDIX F - MACHINE CODE TIPS
------------------------------------------------------------------------------
CHAPTER 1
------------------------------------------------------------------------------
INTRODUCING the TIMEX OPERATING SYSTEM (TOS)
------------------------------------------------------------------------------
The addition of disk drives to the SPECTRUM creates an immensely powerful 
system, and TOS - the disk operating system especially developed by Timex - 
gives you the power from within your BASIC programme that you have always wanted, 
but never believed would be available.
The secret lies in the controller which, controls the operation of the disk 
drives, and it is here that the TOS operating system resides. The controller is 
a separate computer having its own Z8OA Central Processor, as well as its own 
internal memory and input/output facilities. Every time a TOS command is issued 
it passes straight to the controller which then executes the instruction, 
Placing no overhead on the SPECTRUM, and of course is not dependent an any 
hardware limitations of the SPECTRUM, such as available memory.
The disks are the lastest in micro floppies, using very high density recording 
medium, giving on the standard floppy 160K free an each side of the disk 
providing 320K of disk space per drive.
The controller and TOS have been especially designed around the need to 
communicate. The controller has two serial communication ports which can be be 
configured to suit almost any type of protocol you are likely to need. This 
means that apart from being able to communicate with TOS users, you will be set 
to 'talk' to other users, on a variety of computers with a standard RS232C 
serial port. Other peripherals such as modems, printers, plotters or any device 
that can be coupled to a serial port can also be connected to these.
1.2 ABOUT THIS MANUAL
The manual has three separate sections.
The first contains enough information for you to set up and begin working with 
TOS.
The second goes through some of the more subtle ways of applying TOS in relation 
to the use of tree directory structures, random access and sequential files, and 
concludes with a chapter on the use of channels and serial communication ports.
The third part is a series of appendices for more specialised reference, and a 
quick reference guide to TOS.
Information about the utility programmes included an your demo disk are 
explained in this section.
------------------------------------------------------------------------------
CHAPTER 2
------------------------------------------------------------------------------
2.1 UNPACKING AND SETTING UP
------------------------------------------------------------------------------
Unpacking your system you will find: Disk drive unit
                                     Controller
                                     Power supply
                                     Manual
                                     Diskette
Set up the system as follows:
-Switch the power OFF to your SPECTRUM computer.
-Plug the interface into the rear edge-connector of the SPECTRUM.
-Connect the "D" plug of the controller to the interface.
-Connect the ribbon cable from the controller onto the disk drive.
There is a white mark on the ribbon plug witch should be pointing upwards, 
placing the red edge of the cable on your left as you look at the socket. The 
plug at the end of the cable must always be connected to drive A.
-Connect the power supply up as follows:
Check that the ON/OFF switch at the rear is off "0"
Plug the power leads into the disk drive and controller
Connect the mains plug
-Before turning on and inserting your diskette please read the section "about 
the diskettes".
-If you are using more than one disk drive refer to the section following on "Expanding 
the system".
If you are using a printer that normally plugs onto the SPECTRUM rear 
edge-connector you will need to connect the optional "T" connector between your 
SPECTRUM and the interface. The interface uses all the address lines on the port 
and needs to have more lines than are available from plugging into the back of 
the normal printer connecting plug.
If you are using a printer that has a standart RS232C interface, it may be 
connected to one of the two serial communications ports on the controller. Such 
leads are avaiable from Timex to plug into the controller in the relevant 
appendix of this manual.
------------------------------------------------------------------------------
2.2 ABOUT THE DISKETTES
------------------------------------------------------------------------------
The diskettes are made of a flexible mylar sheet coated with magnetic material, 
and are onclosed in a plastic casing, which has a shutter to protect the 
recording media. This shutter is automatically opened when the disk is inserted 
in the drive, and is the point where the read/write head of the disk drive is 
positioned. The disks have two sides, and are double density, and when used with 
this system have a formatted (meaning usable) capacity of 160K per side, giving 
in all 320K per drive.
The disks are very reliable, but some basic precautions use must be taken:
-Do not expose the disks to heat or direct sunlight
-Keep away from strong magnetic fiels, e.g. transformers.
-Do not open the shutter or finger the magnetic surfacve
-Keep away dust that could reach the recording surface.
The disks can be write protected by using the small plastic tabs. You can 
protect either side A or B or both by switching the two tabs on the disk. The 
creation of a hole by moving the tab will write protect the revelant side of the 
disk. Where the tab blanks off this hole the disk is not write protect.
------------------------------------------------------------------------------
2.3 EXPANDING THE SYSTEM
------------------------------------------------------------------------------
The basic configuration with a single disk drive can be upgraded to a total of 
four disk drives: A,B,C,D. The first one is A and each additional drive is 
assigned a letter as far as D.
Using more than two drives necessitates the use of a second power supply and a 
second cable from the controller to the drives.
The initialisation of the disk drives from the factory is for use as A drive. 
You will need to configure further disk drives yourself, as B, C, or D, 
depending on your system. You do this as follows:
-Unscrew the 4 screws on the base of case which hold the drive assembly in 
position. Remove the drive assembly from the case. The blue capped IC (integrated 
circuit) in a socket near the edge-connector of the drive marked R1 is only 
needed in drive A, for other drives it has to be removed. There is a jumper 
marked J01 which has to be connected corresponding to the drive designation 
using the following values: A=0, B=1, C=2, D=3. As you configure a new drive 
remember to label it with the drive letter an the front to the drive for easy 
identification. From the outside of the drive you can check the designation by 
looking into the rear edge connector. Under the word 'interface' You will see 
the small connector in one of 4 Positions, the leftmost position corresponds to 
A, and the right hand Pins for D.
Figure ..1.
If you are in doubt or difficulty contact your dealer.
------------------------------------------------------------------------------
CHAPTER 3
------------------------------------------------------------------------------
3.1 USING TOS COMMANDS
------------------------------------------------------------------------------
The way of accessing the TOS commands is familiar to those used to the SPECTRUM 
BASIC's use of keywords. All the TOS commands use existing keywords, but they 
are followed by an *(asterisk), so that LOAD becomes LOAD *.
TOS is a disk operating system: TOS commands are designed so that you can LOAD 
and SAVE with the Disk Drives in a way similar to that of cassettes.
The beauty of TOS is that it does not interfere with the existing instructions 
relative to the cassette, so that you are still free to use your cassette and 
disk drives at the same time, and even from within the same programme. You need 
not change your existing programmes when using TOS, but you will need to use 
LOAD * and SAVE * to transfer the programmes to and from the disks (in much the 
same way you would for a cassette). The syntax is essentially the same apart 
from the '*', which is there to activate TOS.
Instructions can either be executed directly from the keyboard or from within 
the programme like any other BASIC instruction. TOS therefore becomes an 
extension of the SPECTRUM BASIC, with all the disk and file handling facilities 
of TOS acting as extended BASIC functions.
The next section deals with the TOS instructions. There are two ways 
instructions can be executed: either directly from the keyboard (referred to as 
commands), or from within a programme (referred to as statements). Throughout 
the manual - in relation to TOS - the terms command and statement will be used 
in this context.
The term 'file' includes all types of programmes and data files, and no special 
distinction is made unless applicable.
Knowledge of the SPECTRUM keyboard and SPECTRUM BASIC is assumed. Any doubts may 
be clarified by referring to the SPECTRUM manuals
------------------------------------------------------------------------------
3.2 GETTING STARTED
------------------------------------------------------------------------------
The disk that comes with the system contains the demonstration programmes on 
side A and side B has nothing on it. If you look at the disk you will see that 
side A has been write protected using the plastic tab. Side B is not write 
protected, and is for you to use. The only copy of TOS you have is on side A, so 
make sure that the disk remains write protected. Side B will have to be 
formatted to be used, and is explained in section 3.4.
With the system set up you can now switch on the current using the power switch 
on the back of the power supply in the '1' Position.
Insert the disk labelled TOS in the drive and the system will 'BOOT'. The red 
light on the drive will flicker until finally it goes off. TOS is then ready for 
use. There is the controller reset button, which resets the whole system or the 
reset button on the interface, to reset the SPECTRUM.
When you reset the controller TOS will be 'BOOTED'. There will not be the normal 
message an the screen that appears when you turn on the SPECTRUM by itself when 
not using TOS.
There is a special kind of boot, described in section 3.15 that allows the 
automatic execution of a start up programme on your SPECTRUM.
CAUTION Do not power up the system with the disk inserted in the drive. It you 
stock the system, the power supply should be on the top Never prevent air 
circulation to the power supply.
------------------------------------------------------------------------------
3.3 CAT * - catalogue disk directory contents
------------------------------------------------------------------------------
Unless a cassette is labelled properly there is no way of knowing what 
programmes it contains without loading the programmes into the computer. TOS has 
a special directory of each file on the disk, together with information about 
where it is located on the disk, the size of the file, and other information, 
some of which is useful only to the operating system, but some of which is 
displayed as part of the listing appearing on the screen as a result of 
executing the CAT * instruction.
Using side A of your demo disk type in the command: (Side A is accessed by 
placing the disk into the drive door with side A facing upwards)
CAT * followed by enter
A listing of the disk directory contents will appear. Notice that you can stop 
the SCROLLING at any time using the S key and resume using the Q key. Try it. 
This is common to many TOS commands.
:DEMO
Level 0 Drive A
Name     Typ    Size Alloc S P
-------------------------------
HELP     BAS   11087   11K   P
MATHS    DIR    3187    4K   P
FUN      DIR    6651    9K    P
UTIL     DIR    3075    7K   P
FILING   DIR    1070    2K   P
MAX 140K  CUR 33K  REM 107K
0 OK, O:1
------------------------------------------------------------------------------
3.4 FILENAMES - what is in a filename
------------------------------------------------------------------------------
Referring the directory output from the CAT * instruction of the previous page, 
you will see the columns contain the filename, the extension (type) of file, the 
file size in bytes, the disk allocation and finally two columns headed S and P, 
these are to indicate it the file is currently open, and if it is write 
protected.
The filename is a string of up to 8 characters, optionally followed by another 
string of up to 3 characters to indicate the file type. The filename and the 
extension must be separated by a .(dot). TOS treats the filename as a BASIC 
string and therefore it must be surrounded by matching quotes. It is possible to 
use symbols as well as digits and characters, although the symbol must be a 
single character not >= or keywords. The following symbols are used by TOS and 
must not be used: ".", "^", "?", "+".
TOS will automatically convert any file name to the upper case equivalent
examples:
"HELP.BAS"    equivalent to: "hElp.Bas" or "help.bas"
"UTILITY.DIR"
The file type is useful for reference, the only extensions that have special 
meaning to TOS are the DIR and SCP extensions, used to identify the name of a 
directory or a communication channel.
TOS stores files in directories, but also allows a directory to be stored within 
another directory. The route to a file or the pathname, may be just the name of 
the file, but can include the name of the directories on the route to the file. 
Being able to specify pathnames in this way is a very powerful feature of TOS, 
and a chapter of the manual is devoted to it.
The size of the file is the number of bytes the programme will use in RAM 
(Random Access Memory) of the SPECTRUM plus 5 or 7 bytes for use of the system.
The disk is divided into tracks, which are in turn divided into sectors. These 
tracks and sectors are termed 'soft sectored', because they are written to the 
disk by software. This process of placing these tracks and sectors on the disk 
is called Formatting, and must be done before the disk can be used.
The disk allocation of a file relates to the number of sectors used. TOS 
allocates always a minimum of 1KB(1024 bytes) to a file.
The last two columns headed S & P indicate whether the file is open, and whether 
or not it is write protected.
Open meaning, that the file is currently open to be accessed from a programme. 
The P indicates that a file is write protected, this refers to the software 
facility within TOS, not the setting of the plastic tab or. the casing of the 
disk.
------------------------------------------------------------------------------
3.5 FORMAT * - prepare new disk to operate under TOS
------------------------------------------------------------------------------
Any disk has to have the sectors and tracks recorded onto it before it is used, 
most systems have other information placed on the disk as well. The way TOS 
operates is by being written itself to each side of a disk.
When the system is 'booted' up TOS is there and is transferred into the 
controllers memory.
This Process of preparing the disks for use in this way is called FORMATTING.
The syntax is:
FORMAT *"drive name" TO "disk name"
CAUTION: FORMAT * DESTROYS ALL OF THE DISK CONTENTS !
The only way to prevent a disk from being FORMATTED is to use the protection 
tabs on the disk .
This is the only TOS instruction where the Drive name, and disk name must be 
specified. The names of the four drives are A,B,C,D. Where only one drive exists 
it must be drive A.
The demonstration disk side A has all the demonstration programmes and the 
operating system TOS on the disk on side A. CAT *, the directory command, will 
show that there are files there. Side B is not FORMATTED, so will need doing 
straight away.
Side B is accessed by placing the disk into the drive door with side B facing 
upwards.
RESET : On the controller to reset TOS
Remark: Red light of disk A flashes on for a while then stops
Remark: The sign that TOS is being read from the disk, all o.k.
Remark: Turn disk over to side B
Enter : CAT *
Remark: Disk keeps spinning, but stops with error report
Remark: Error report: Hardware fault on disk DEMO
Remark: This occurs because the disk is not FORMATTED
The disk must have a name to be used for the FORMAT *, let it be Test. Follow 
the instructions to see how it is done.
Remark: turn disk over to side A
Remark: FORMAT *  will clear all data from a disk, be careful
Enter : FORMAT *"A" TO "test"
Remark: TOS responds: Format disk in drive A (Y/N) ?
Enter : Y
Remark: Change disk and press ENTER
Remark: turn to side B
Enter : ENTER
Remark: This allows formatting with a one disk system
Remark: It takes about 30 secs to format
Remark: It stops through 40 tracks and then writes TOS across.
The system is written to the disk and uses up 16K of space on the disk. There is 
another 4k used by the directory for the disk. You can notice that the system is 
written to the disk last and takes place while the light is flickering at the 
very end.
To format the disk B the principle is exactly the same, except the drive name is 
disk B. If the disk name was 'NEWDRIVE', then the command would appear like this!
FORMAT *"B" TO "NEWDRIVE"
In this case there must be a system disk in drive A for the system to work, and 
there would be no delay for disk change, which is there to allow the change of 
disk needed to format a disk in a single drive system.
------------------------------------------------------------------------------
3.6 LOAD * / SAVE * - transfer between disk and RAM (memory)
------------------------------------------------------------------------------
LOAD * and SAVE * are similar to the standard LOAD and SAVE instructions of the 
SPECTRUM, except that a name must be specificied, and TOS treats all characters 
as upper case. LOAD *"" will produce an error report.
The LOAD "" of the SPECTRUM is useful when the name of the programme is not 
known. In TOS the CAT * command displays the directory of the files on the disk, 
making is easy to find the programme needed.
The same options of LINE, CODE, SCREEN$ and DATA exist
The syntax for SAVE * and LOAD *  is the following:
SAVE *  pathname LOAD-OPTION [n]
LOAD * pathname LOAD-OPTION
When the path in SAVE *refers to an existing file TOS prompts:
<> already exists
Supersede (Y/N) ?
A "Y" will overwrite the file <> whilst "N" will ignore the command. If the [n] 
option is used then TOS will carry out the command without prompting.
The OPTIONS are:
SAVE * pathname LINE number                   -save with auto run
LOAD * / SAVE * pathname SCREEN$              -save a screen
LOAD * / SAVE * pathname CODE start,length   -save machine code
LOAD * / SAVE * pathname DATA array name ()  -save string array or numeric array
Try the following:
Remark: Using the demonstration disk in drive A SIDE A
Enter : CAT *
Remark: All the files in the directory displayed.
Enter : LOAD *"HELP.BAS"
Remark: The optional typ is separated by a .(dot)
Remark: To stop a programme use BREAK- [capshift space]
Enter : Press ENTER and then LIST
Remark: The programme listing appears on the screen.
Example Programme to generate a screen:
(linked to the exercise following)
10 REM TOS.BAS
20 PAPER 3
30 FOR I=1 TO 704
40 PRINT "$"
50 NEXT I
60 PAPER 6
70 PRINT AT 5,13;" TOS "
80 PRINT AT 13,12;" TIMEX "
90 PRINT AT 15,7;" OPERATING SYSTEM "
100 STOP
------------------------------------------------------------------------------
3.7 USING LOAD * / SAVE *
------------------------------------------------------------------------------
Using side B of your demonstration disk:
Enter : SAVE *"tos.bas" LINE 10
RESET : Using the reset button on the interface.
Enter : CAT *
Remark: The programme TOS.BAS should now be in the directory.
Remark: The SPECTRUM memory is clear.
Enter : LOAD *"TOS.BAS"
Remark: The Programme automatically runs.
Remark: The programme was saved using lower case.
Enter : SAVE *"TOS.SCR" SCREEN$
Remark: The screen memory image is saved as bytes in memory.
Remark: CAT * will confirm the screen has been saved.
RESET : Using the reset button on the interface.
Enter : LOAD *"TOS.SCR" SCREEN$
Remark: The screen memory address 16384, with 6912 bytes loaded.
Enter : SAVE *"TOS.COD" CODE 16384,6912
Remark: Save option of CODE start address,length
RESET : on interface
Enter : LOAD *"TOS.COD" CODE 16384,6912
Remark: Exactly equivalent to load with screen$-now you know why
Enter : CAT *
Remark: New screen !
Enter : SAVE *"TOS.SCR" SCREEN$
Remark: TOS prompts You.(answer no)
Enter : SAVE *"TOS.SCR" SCREEN$ n
Remark: No prompting ! "TOS.SCR" is overwritten.
The use of Arrays in BASIC is the main way of creating Data storage. TOS 
provides additional file handling capabilities in sequential and random access 
files. Data can still be saved in arrays using TOS.
The syntax for a string array named p$ which is to be saved as the date file 'name.dat' 
is:
SAVE *"name.dat" DATA P$() to load: LOAD *"name.dat" DATA p$()
Were the array numeric the syntax would only differ in the name for the array 
which would have no '$' after it.
Using the file type to indicate the type of data in the file, the right 
Load-option can more easily be chosen, avoiding the likelyhood of data type 
mismatch. E.g. a SCREEN$ type cannot be loaded using LOAD *'filename'.
------------------------------------------------------------------------------
3.8 MERGE * - merge one programme on another
------------------------------------------------------------------------------
The syntax is MERGE * pathname
This merges a new programme and its variables, specified by the pathname with 
the old programme in the SPECTRUM memory.
The new file must contain a BASIC programme and overwrites any of the programme 
lines or variables in the old programme with line numbers that conflict with the 
ones of the new programme. It is not possible to merge bytes or arrays .
RESET : On the interface
Remark: Use side B of Demo disk
Type  : 40 PRINT "#";
Enter : SAVE * "TOS.OVL"
Enter : CAT *
Remark: Programme 'TOS.BAS' and 'TOS.OVL' are on disk
Remark: Going to overlay TOS.OVL onto TOS.BAS
Enter : LOAD *"TOS.BAS"
Enter : MERGE *"TOS.OVL"
Enter : Press ENTER
Remark: Line 40 is changed by the MERGE *
Enter : RUN
------------------------------------------------------------------------------
3.9 TEMPLATES - masks for any name / character
------------------------------------------------------------------------------
A template is similar to the 'Joker' in a pack of cards, because it can be 
anything. A template will allow a selection over a number of files, by for 
example selecting all those beginning with a particular character, or all those 
with a BAS type extension.
There are two templates characters or wildcards in TOS as follows:
+ (plus) replaces all the name, or type
? (question mark) replaces a character
A pathname with at least one of these characters is called a TEMPLATE
Selection of files could be done like this:
"+.+"        -name and type masked
"+.BAS"      -any name with BAS type
"+"          -any file with no type
"C???????.+" -any 8 letter file starting with C
"C+"         -File starting with C and no type
Templates are very useful for checking directories using CAT * to find a 
particular type or group of files. They can be used with the following 
instructions:
CAT * / LET * / ATTR * / MOVE * / ERASE *
Instructions needing a specific argument such as GO TO * cannot use TEMPLATES. 
Go to anywhere is meaningless!
------------------------------------------------------------------------------
3.10 ATTR * - protect / unprotect file
------------------------------------------------------------------------------
The ATTR * instruction sets the file attribute to 'protected' or 'unprotected' 
and to 'visible' or 'invisible' as required.
The syntax is:
ATTR * pathname p  -to Protect a file
ATTR * pathname u  -to Unprotect a file
ATTR * pathname i  -to Hide a file
ATTR * pathname v  -to Unveil a file
Templates are allowed to lock or unlock ranges of files. This protection is 
useful to prevent inadvertent erasure or altering of a file.
Files that are made invisible with this command will not be displayed when a CAT 
* is executed. 'Visibility' can be retrieved by using the ATTR * pathname v 
command.
Try the following:
Remark: use side B of the demo disk
Enter : CAT *
Remark: last col of directory is protect state
Remark: Programme 'TOS.OVL' is on the disk.
Enter : ATTR *"TOS.OVL"P
Remark: P does not appear in protect column straight away.
Enter : CAT *
Remark: Now the P appears showing the file is protected.
Enter : ATTR *"+.+"U
Remark: Unprotects all files
Enter : CAT *
Remark: All files are now unprotected nothing in last column.
Enter : ATTR *"+.+"p
Remark: All files are now Protected an side B of Demo disk.
Enter : ATTR *"+.+"i
Enter : CAT *
Remark: No files displayed by the CAT * command
Enter : ATTR *"+.+"v
Enter : CAT *
Remark: All files visible once more
------------------------------------------------------------------------------
3.11 ERASE * - erase file
------------------------------------------------------------------------------
When files are no longer needed the best thing to do is delete them the 
instruction for this in TOS is ERASE *.
The syntax is:
ERASE * pathname [n]
Templates can be used. ERASE * will not delete a protected file. TOS prompts you 
with the following response before taking action unless the [n] parameter is 
given, then it will be carried out without TOS asking, no prompt:
Erase < > Y/N ? (< > represents the file name)
Y will execute the command
N will stop the file from being erased
------------------------------------------------------------------------------
3.12 LET * - change name
------------------------------------------------------------------------------
This instruction to rename a file in TOS is: LET *
The syntax is:
LET * old Pathname TO new-pathname
TO is a keyword, and cannot be the characters TO separately.
Protected files can be renamed, where the protection is at the file level with 
the software. If the directory has been write protected, renaming would still be 
possible. However if the disk has been software write protected TOS will prevent 
renaming. Setting the hardware protection tab also prevents name changes.
TOS gives on error message explaining the protection level.
Trying to rename an open file or using templates will generate error messages 
from TOS.
------------------------------------------------------------------------------
3.13 MOVE * - copy source to destination
------------------------------------------------------------------------------
Creating copies of disks and programmes is an essential part of using a disk 
system. Important work, and programmes should be backed up.
If you are using a single disk system, you will need to use the utility 
programme, which is on your demo disk in order to create a copy of an entire 
disk. Details are in the appendix - Utility programmes.
A disk copy may be made where there are two drives by using the copy command and 
specifiying the target directory, into which the files are to be copied. This is 
dealt with in section covering directories in CHAPTER 4
The syntax is:
MOVE * source-name TO destination-name
Try the following:
------------------------------------------------------------------------------
3.14 USING - MOVE * / ERASE * / LET *
------------------------------------------------------------------------------
Remark: Using side B of the demo disk.
RESET : on the interface
Enter : CAT *
Remark: P in the last column indicates file is protected
Remark: Can a protected file be renamed?
Enter : LET *"tos.ovl" TO "renamed"
Remark: No obvious change - directory needs refreshing
Enter : CAT *
Remark: The name is now RENAMED with no type
Remark: The file is still protected with the name change
Enter : MOVE *"renamed" TO "tos.ovl"
Enter : CAT *
Remark: Now the original copied from the renamed is back
Remark: copying creates a duplicate of the file
Enter : ERASE *"renamed"
Remark: protected files cannot be erased
Enter : ATTR *"renamed"u
Remark: Unprotect the file
Enter : ERASE *"renamed"
Enter : CAT *
Remark: That did it
Enter : ATTR *"+.+"p
Enter : ERASE *"+.+"
Remark: TOS lists all the protected files not erasable
Enter : ATTR *"+.+"u
Enter : ERASE *"+.+"n
Remark: TOS erases all files without Prompt of Y/N
Remark: The Demo disk side B - all programmes erased
------------------------------------------------------------------------------
3.15 Start - creating start up files.
------------------------------------------------------------------------------
TOS allows you to create a start up file which is automatically loaded into your 
SPECTRUM and run every time you reset it (power up or RESET button on the 
interface).
To use this feature you must SAVE * your start up Programme with the auto run 
facility and call it 'START'. Now every time a reset is executed TOS will look 
for, a Programme named 'Start' in drive A if it exists then the SPECTRUM will 
run it.
Remark: To be able save the programme displace the disk protection tab.
Enter : Using side A of your diskette
Enter : 10 LOAD *"HELP.PAS"
Remark: SAVE *"start" LINE 10
Enter : Creating a programme named 'START'
Reset : CAT *
Remark: Using reset button an interface.
Remark: Help.bas runs automatically.
If you have a programme named 'START' and you want to temporarly avoid its 
execution use BREAK while pressing the reset button on the interface. If you 
don't wish to use it at all simply erase it.
Try the following 'START' programme:
10 CAT *
20 INPUT "Name of file to LOAD ? ";a$
30 LOAD *a$
------------------------------------------------------------------------------
CHAPTER 4
------------------------------------------------------------------------------
4.1 TREE STRUCTURE
------------------------------------------------------------------------------
A Tree structure has a stem linked directly to the root. There are branches 
which are directly linked to the root, but there are branches which grow out of 
other branches, and so on.
The path from a leaf to the root, may involve passing through several branches, 
on the way to the root.
The path may be very complex if the branch that the leaf is connected to is 
itself connected to other branches, but may also be very simple if there is a 
direct connection to the root via the stem.
The directory structure of TOS is analogous to the tree structure:
- There is a root directory which contains other directories.
- A directory may contain files and /or directories.
- Directories can be nested one within another.
- From any directory to a file (or directory) there is a specific route called, 
the PATHNAME
- A PATHNAME is a specified route of moves from a source directory through the 
tree structure to a file together with the filename.
- The PATHNAME can be the filename itself, when the file is within the source 
directory and no move is needed to reach it.
Note: Source directory does not mean root directory, but any directory which is 
the source of the path, in the PATHNAME.
The advantage of being able to name directories in this way means that the 
possiblity exists for grouping information or programmes into convenient 
divisions. When many files exist on a disk it is only necessary to CAT * that 
directory containing the file, thus avoiding the need to have several screens of 
files displayed.
Grouping file types under one directory, will make accessing them easier. For 
example if the BASIC programmes are in one directory and the machine language 
programmes are in another, then accessing and using the programmes is easier and 
leaves less chance of errors trying to LOAD * a programme with the wrong 
Load-Option. Including the extension type, whether BAS to represent BASIC or 
.COD to represent CODE or whichever extension is convenient to identify the file 
type, is useful, especially when large numbers of files are on the disk.
------------------------------------------------------------------------------
4.2 Introducing TOS with DIRECTORIES
------------------------------------------------------------------------------
It is important to identify the difference between the directory and the file. 
The directory contains the reference to where the file is rather like an index 
to a book does. TOS is organised in a hierarchic structure meaning that it is 
possible to have files and /or directories inside directories. The directories 
appearing just like any other files inside a directory, but they always have a 
DIR type extension to the name.
There are two special files with the extension SCP, these are serial 
communication ports, and are: CH_A.SCP and CH_B.SCP, these may also appear in 
the directory listing and are dealt with in the last chapter.
The structure of your system with the demonstration disk is, shown below:
Figure ..2.
TOS Provides various ways of moving around the directory structure as well as 
methods of creating, erasing, protecting, copying, and renaming a directory.
------------------------------------------------------------------------------
4.3 THE PATHNAME
------------------------------------------------------------------------------
The TOS use of PATHNAME allows access to any file on whichever disk, or 
directory that it is in.
The directory which is the one that TOS is currently at, is termed the default 
or current directory. When a command like CAT * is performed it uses as its 
argument the current directory name, and produces the listing of that directory.
The tree structure that TOS uses should be considered as an inverted tree, with 
the root at the top, and the branches coming down. This is so that moving 'up' 
the tree, involves moving back upwards to the root. Moving down involves moving 
through named directories towards the lower branches. Moving downwards the 
branches, provide alternative routes. This is why TOS will insist or, having 
directory names specified on the way down, but will accept '^' (an up arrow) as 
an instruction to move up, because on the way up there is only one way to go.
------------------------------------------------------------------------------
4.4 Using TOS PATHNAMES
------------------------------------------------------------------------------
TOS can use pathnames in the majority of the instructions such as LOAD *, SAVE 
*, MERGE * CAT *, ERASE *, MOVE *, ATTR *, DIM *, LET *. These instructions 
function in much the same way as they would using a filename, but have the 
additional options available through the added ability to work through the 
pathname, and so operate across the boundary of the directory.
There are several points to note about pathnames as follows:
-The pathname is a compound name, defining a path from the current directory to 
a file (or a directory).
-Directory names on the path must be separated by a colon (:).
-The root directory may be represented by a colon (:).
-Any pathname can be defined from the root directory by starting the pathname 
with a colon.
-Any pathname not starting with a colon will be from the current directory.
-The Pathname is treated as a BASIC string and is within quotation mark, and can 
be represented by string variables.
Referring to figure 2 of the directory structure in the demo disk, the pathname 
can be studied in relation to the following examples:
FILE -------------------- PATHNAME --------------
Calendar.bas       ":DEMO:FUN:CALENDAR.BAS"
Hi-lo.bas           ":DEMO:FUN:GAMES:HI-LO.BAS"
Roots.bas           ":DEMO:MATHS:ROOTS.BAS"
The pathname consists of a 'Path' through the directories together with a target 
'filename'. TOS helps you to know where you are by printing cut the 'path' to 
the current directory at the head of the directory listing. How ever far down a 
directory tree you go this information is always in the directory, together with 
the level of nesting of GO SUB * level of the directory.
------------------------------------------------------------------------------
4.5 DIM *
------------------------------------------------------------------------------
There are times that it is necessary to create files that are not for storing 
programmes or screens, but some other kind of information. The DIM * instruction 
is provided by TOS for this purpose.
The svntax is:
DIM * pathname
DIM * creates a file or a directory. The use of the path means that files can be 
created outside the current directory.
To create a directory the DIR extension must be included, letting TOS know it is 
a directory, otherwise a file would be created.
Using DIM * it is possible to create up to 16 directories an each side of the 
disk, that includes the directory corresponding to the disk itself. This means 
15 now ones can be created, the structure is entirely up to the user. Attempting 
to create more then 15 will generate the error report: cannot create more 
directories.
Directories may be nested withing each other or directly under the disk's main 
directory, at the same level.
DIM * cannot be used to create an SCP (Serial Communication Port). Trying to do 
so would product an error report of wrong type.
DIM * cannot be used to create a file that already exists.
It a file 'newfile' exists then DIM *"newfile" would generate the error: NEWFILE 
already exists.
A similar conflict would occur trying to DIM *"newdir.dir" that already existed.
Creating a file of the same name as a directory is not allowed.
Attempting to open a file "newdir", without any type extension would still 
produce the error: NEWDIR already exists.
The pathname can be a string variable, and the DIM * instruction used as a 
programme statement as in the following example:
Two directories are opened using a direct command as follows:
DIM *"NEWDIR.DIR":DIM *"NEWDIR:DIR1.DIR"
10 REM Create files
20 LET a$=""
30 FOR i=1 TO 8
40 LET a$=a$+STR$ i
50 DIM *"newdir:dir1:"+a$
60 NEXT i
Remark: Use side B of disk, SAVE * the above programme
Enter : SAVE *"CREATE"
Enter : RUN
Enter : CAT *"newdir:dir1"
Remark: In directory "dir1" are:1, 12, 123, 1234,......,12345678
Remark: All the files are created with size zero
------------------------------------------------------------------------------
4.6 GO TO * / ^ / : / LIST *
------------------------------------------------------------------------------
The default directory can be changed to another directory by usin the GO TO * 
instruction.
The syntax is:
GO TO * Pathname
A special instruction exists to move up through the directory structure which 
is;
GO TO *"^" -move up one directory level
GO TO *"^^" -move up two directory levels
Any number of levels can be moved up in this way, but there is a short form of 
returning to the top (the root) which uses a colon and is as follows:
GO TO *":" -goes to the root directory
The Place you are in TOS is always stated at the top of the directory. TOS 
allows that information to be displayed by itself using the LIST * command, 
along with your directory location.
GO TO * and LIST * may be used as a programme statements.
The pathname may be a string variable.
Remark: Using side A of your demo disk.
Enter : CAT *":"
Remark: The physical resources of your system are displayed starting with the 
name of the disk In drive A followed by the two SCP's.
Remark: Another way to display the root is,
Enter : GO TO *":"
Enter : CAT *
Remark: Suppose You just wanted to know the size of the file 'HI-LO.BAS'
Enter : CAT *"DEMO:FUN:GAMES:HI-LO.BAS"
Enter : CAT *
Remark: Your current directory is still the same.
Remark: If you wanted to make 'GAMES' current directory
Enter : GO TO *"DEMO:FUN:GAMES"
Remark: To know information about "HI-LO"
Enter : CAT *"HI-LO.BAS"
TOS allows you to change your current directory to another drive without knowing 
the disk name. The syntax is:
GO TO *"DRIVE NAME"d
Where the 'DRIVE NAME' can be A, B, C, or D. Specifiyng a pathname is not 
allowed when using this facility. Refer to Section 4.9 
------------------------------------------------------------------------------
4.7 GO SUB * / DRAW *
------------------------------------------------------------------------------
It is very useful to go to a directory perform whatever instructions are needed 
and return back to the source directory.
TOS allows this using the GOSUB * instruction followed by the DRAW * 
instruction. The process is very similar to a subroutine call in BASIC. TOS uses 
a directory stack, which holds information on the level of nesting of these 
calls. TOS allows 8 levels of nesting of subroutine calls to directories in this 
way.
The syntax is:
GO SUB * [pathname]
The pathname between brackets means that it is optional.
GO SUB * is used in conjunction with DRAW * which causes a jump back to the 
original directory. The level of GO SUB * nesting is displayed at the head of 
the directory listing produced by CAT *.
It does not matter which directory is current it will always be level 0, unless 
a GO SUB * has been executed. The level refers to the level of nesting on the 
stack. Every time a DRAW a is executed, the level drops by 1. An error will 
result from trying to DRAW * from level 0: cannot return from level 0.
The advantage of using GO SUB a instead of the straight GO TO a instruction is 
that TOS automatically keeps track of your route and will DRAW * you to where 
you started, and the way back requires no argument, just DRAW *. GO TO * would 
require the path specified for the route back. You can also use '^' to move up 
levels of directories.
LIST * displays the contents of the directory stack, hence for all the levels 
the following information:
PATHNAME, LEVEL, and DRIVE ()
Remark: Using side A of your demo diskette
Remark: You want to save your current directory in the stack for later use but 
you want to remain in that directory.
Enter : GO TO *":DEMO:FUN" or GO TO *"DEMO:FUN" it you are still at the 'ROOT'
Remark: Makes 'FUN' your current directory
Enter : LIST *
Enter : GO SUB *
Remark: No pathname. Current directory saved an stack.
Enter : LIST *
Remark: The current directory is the some but the directory level has been 
incremented.
Enter : GO TO *":DEMO:MATHS"
Enter : CAT *
Enter : DRAW *
Enter : LIST *
Remark: You got bock to your first directory.
Like with the GO TO * command this instruction also permits the usage of the d 
Parameter (GO SUB *"drivename"d) which will enable you to change drives without 
specifying the disk name.
------------------------------------------------------------------------------
4.8 DEMO DISK
------------------------------------------------------------------------------
The Demo disk contains programmes on side A that should be used for the 
following study of the directory structure.
The pathname making use of nested directories will be used, together with the 
proceeding set of instructions.
Remarks on how compound pathnames differ from pathnames with no 'path' in 
relation to the instructions introduced in chapter 3 will be dealt with at the 
end of the next section.
Try the following:
Remark: Using side A of the Demo disk
Enter : GO TO *":"
Remark: go to the root directory
Enter : CAT *
Remark: DEMO.DIR
Remark: CH_A.SCP
Remark: CH_B.SCP
Enter : GO SUB *"DEMO"
Remark: Going down the tree, but can easily returns
Enter : LIST *
Remark: Tells us where we are
Enter : CAT *
Remark: See what is available:
Remark: Help.bas only Programme, rest are directories
Enter : LOAD *":DEMO:HELP.BAS" or simply LOAD *"help.bas"
Remark: using a compound pathname in LOAD *
Remark: Running help, you find it is a TOS summary
Remark: A programme can be stopped using BREAK
Enter : CAT *
Remark: using LOAD * did not change the LEVEL from 1
Enter : GOSUB *"FUN"
Enter : CAT *
Remark: level 2, & pathname on top of directory
Remark: What about a game!
Enter : GOSUB *"GAMES"
Enter : CAT *
Remark: play dice!
Enter : LOAD *"DICE.BAS"
Remark: When wou have had enough BREAK {CAPSHIFT SPACE}
Remark: How to go and got help again
Enter : LOAD *":DEMO:HELP.BAS"
Remark: After finishing see where we are
Enter : CAT * or LIST *
Remark: We did not move from the current directory
Enter : DRAW * followed by LIST *
Remark: each DRAW * moves down 1 level
Enter : Using GO TO *"^^" or : would got back to root
Remark: use GO TO * instead of GO SUB * doing it again
------------------------------------------------------------------------------
4.9 ATTR * / LET * / MOVE * / ERASE * / LOAD * / SAVE *
------------------------------------------------------------------------------
The way these commands operate with files, is similar to the way they operate 
using directories, however there are differences, based on the fact that a 
directory can contain a file. This means that operating on a directory will 
affect the file. Some instructions cannot be used in the same way with 
directories.
ATTR *: can be used to protect, unprotect, veil or unveil directories in a 
similar way that it can be used with files. As an example;
ATTR *"Newdir:dir1:+.+"v
Will unprotect all the files in 'dir1'
LET *: Directories can be renamed just like files, but only when there are not 
any files currently open. As an example:
LET *":Disk1" TO ":Work"
will rename directory 'Disk1' to 'Work'.
MOVE *: The copying function cannot be used to copy a directory. However the 
files from within can be copied freely from one directory to another. A utility 
backup programme exists which will perform the function of a disk Copy When 
needed. This programme is on the disk that you received with TOS, and its 
functioning is explained in the appendix C.
A file can be copied from one directory to another like this:
MOVE *"create" TO "newdir:create"
MOVE * can also be used with SCP's, copying to then and from them just like 
other files. You can even copy from one SCP to the other, which could be useful 
for echoing the input from CH_A to CH_B could be used in testing a device 
equipped with an RS232C interface, like a video terminal or other computer.
MOVE *":CH_A" TO ":CH_B"
A File can be 'sent' to an SCP using MOVE * as follows:
MOVE *"Tos.bas" TO ":ch_b"
CAT *: Can be used simply by adding the full pathname as follows:
CAT *"newdir:dir1" to list all the files on "dir1"
ERASE * can be used in much the same way as with files, except you cannot erase 
the names defined in the root, like the actual name of the disk and the SCP's. 
Erasing a directory will erase all the files within it, but if a directory 
contains another directory it cannot be erased. All files have to be closed 
before a directory can be erased, or indeed even a file that is open cannot be 
erased. If there are files within a directory that are write protected, then the 
directory cannot be erased until they have been unprotected. You can ERASE * 
unprotected files inside protected directories.
There is an option using ERASE * that allows files to be erased without offering 
the Y/N prompt that is normal. This is using the n option, which works like 
this:
ERASE *"+.+"n -no prompting
ERASE *"+.+" -will give Y/N choice for each file
LOAD * / SAVE * can be used in exactly the same way as with a single file except 
including the full pathname. This way you are able to save or load programmes 
from any of the directories in the system, from the current directory.
SAVE *":NEWDIR:DIR1:CREATE" -saves the programme in dir1
LOAD *":NEWDIR:DIR1:CREATE" -to load it
Try the following:
Remark: Using disk B. With the program 'CREATE' we generated 8 files with 
numeric names in section 4.5
Enter : ERASE *"NEWDIR"
Remark: Can not ERASE * a directory that contains directories.
Enter : GO TO *"NEWDIR"
Enter : CAT *"DIR1"
Remark: Create another directory and copy all files into it
Enter : DIM *"DIR2.DIR"
Enter : MOVE *"DIR1:+.+" TO "DIR2"
Enter : CAT *"DIR2"
Remark: All the files in dir1 copied to dir2
Remark: Protect/ unprotect dir1 and files then erase them!
Enter : ATTR *"DIR1"P
Enter : ATTR *"DIR1:+.+"P
Enter : CAT *: CAT *"DIR1"
Enter : ERASE *"DIR1"
Enter : ATTR *"DIR1"U
Remark: The directory is unprotected, but files are Protected
Enter : ERASE *"DIR1:+.+"
Remark: Files need to be unprotected for erasure
Enter : ATTR *"DIR1:+.+"U
Enter : ERASE *"DIR1:123456??"
Enter : ERASE *"DIR1:??3+"
Remark: Study selective erasure using templates
Enter : ERASE *"DIR1:+.+"
Remark: Renaming a file/dir
Enter : LET *"DIR2:12" TO "DIR2:RENAMED"
Enter : CAT *"DIR2"
Remark: Rename a directory
Enter : LET *"DIR2" TO "DIRNEW"
Enter : CAT *"DIRNEW"
Enter : ERASE *"DIRNEW"
Enter : CAT *
Remark: Erasing a directory will erase the files within it
Enter : ERASE *"DIR1"
Enter : GO TO *"^" -Make test your current directory
Enter : ERASE *"DIRNEW": CAT *
Enter : ERASE *"CREATE"
Remark: Side B of demo disk now empty : Use side B for CHAPTER 5 examples.
------------------------------------------------------------------------------
4.10 USING TWO OR MORE DRIVES
------------------------------------------------------------------------------
As you know the ROOT represents the physical resources of your system. You can 
connect up to 4 drives (A to D) as wall as the two communications ports (CH_A 
and CH_S)-see section 2.3. Knowing the names of your disks (to do that you CAT * 
the ROOT) you can access other drives just by specifying a pathname starting at 
the ROOT or at your current directory.
To access the other drives treat them as if they were directories placed 
immediately under the ROOT. So if you wished to move 'say' to the disk in drive 
B you could type:
GO SUB * or GO TO *":Name of drive B disk'
Try the following example;
Remark: For users with more than one drive
Remark: Using side A of demo disk and a blank disk in drive B
Enter : FORMAT *"B" TO 'NEW'
Enter : Y
Remark: Formatting drive B
Enter : CAT *":"
Remark: You now have two disksEnter : DIM *":NEW:MATHS.DIR"
Enter : MOVE *"MATHS:+.+" TO ":NEW:MATHS"
Enter : CAT *":NEW:MATHS"
Enter : GO SUB *
Remark: Use of GO SUB * without a pathname.
Enter : GO TO *"NEW:MATHS"
Enter : CAT *
Remark: Your current directory is MATHS in drive B
Enter : DRAW *
Enter : CAT *
Remark: Return to previous directory
Enter : LOAD *":NEW:MATHS:ROOTS.BAS"
Remark: Now try changing your, current directory to MATHS in disk B and LOAD 
*"LINEAR.BAS"
Try the following to understand the way of changing drives without knowing the 
names of the disks.
Enter : GO TO *":DEMO"
Remark: Your directory is now drive A
Enter : GO TO *"B"d
Enter : CAT *
Remark: Your current directory is now 'NEW' in drive B.
Remark: Try to go back to drive A using GO SUB *"A"d
------------------------------------------------------------------------------
CHAPTER 5
------------------------------------------------------------------------------
5.1 FILES
------------------------------------------------------------------------------
A file may be thought of as a collection of pieces of information bound to the 
same name. Until now the concept of a file as a whole unit has been used. A 
BASIC programme is an example of a such a file. Using the SPECTRUM in the 
traditional way, data for example would be contained in an array, to access any 
data the whole file would be loaded and accessed as a whole.
A feature of TOS is that it permits the reading of a part of a file without the 
need to read the whole file. This feature is especially useful in preparing 
large data files where individual records from the file are to be accessed, as 
needed for example, in data base, stock control applications, and other business 
applications. This allows the creation of files of any size no longer limiting 
your applications to the size of the SPECTRUM memory.
------------------------------------------------------------------------------
5.2 CHANNELS
------------------------------------------------------------------------------
TOS accesses (reads or writes) files through channels. A channel is a number 
associated with a file that you use to refer to it in the instructions PRINT * 
(which writes) and INPUT * (which reads). A Channel also acts as a data buffer 
(through which date flows) with some memory containing information on the file, 
such as its name, size, etc.
TOS provides you with 16 channels. To access a file, choose a free channel (one 
that is not being used to access another file) and associate it with the file.
To open a file use the OPEN #* instruction. The PRINT * and INPUT * instructions 
refer to output and input to a file through the channel number - which becomes 
exclusive to this file until you close it with the CLOSE #* instruction.
Closing a channel frees it, and disassociates it from the file, preventing 
further access to the file.
------------------------------------------------------------------------------
5.3 OPEN #*
------------------------------------------------------------------------------
The OPEN #* instruction opens a file, that is, prepares it to be accessed (read 
or written). Essentially, this operation consists of associating a channel with 
a file and establishing the access mode. In all subsequent access operations the 
file is referred to by the number of the channel you associated with it.
You cannot access a file that is not open. Note however, that we are referring 
to read and write operations using the INPUT * and PRINT * instructions.
You can access a closed file as a whole with instructions like SAVE *, LOAD * 
and MOVE *, but INPUT * and PRINT * are the only instructions that allow access 
to a specific part of a file.
The syntax of the OPEN #* instruction is
OPEN #* channel; pathname; mode; [rec-length]
The '#' is printed by the SPECTRUM as part of the OPEN keyword.
The OPEN parameters have the following meaning:
CHANNEL : Number of the channel you want to associate with the file. This 
channel must not be associated with another file, and must be in the range of 1 
to 16. It can be a numeric expression.
PATHNAME : Pathname designating the file. Can also designate an SCP, but not a 
directory. Can be a string expression.
MODE : Letter (upper or lower Case) defining the access mode. There are four 
possibilities:
I : Input only (You can only read the file)
0 : Output only (You can only write in the file)
R : Random access (You can only read or write the file)
A : Append (You can only write in the file. New information is appended to the 
Previous one)
REC-LENGTH : This is an optional parameter if the mode is I, 0 or A and defines 
the number of bytes (characters) of each record of the file. Must be a number in 
the range 1 to 256. Can be a numeric expression. If this parameter is omitted, 
the last semicolon must not be Present.
Examples:
100 INPUT "File name?"; f$
110 INPUT "Channel number?"; n
120 DIM *f$
130 OPEN #*n;f$;i
140 REM the file is now open and ready to be read
2000 DIM *"Workfile"
2020 OPEN #*15; "Workfile";r;150
2050 REM the file WORKFILE is now ready to be read or written to with a record 
length of 150
The mode parameter defines the access mode (input, output, random or append). 
The last parameter defines the record length. If omitted, we say that the file 
is open, as a stream file; if present, we say that the file is open as a record 
file. If you specify the r mode you cannot omit this parameter.
This describes what the file structure is expected to be. If the file is open as 
a stream file, you can read or write a variable number of characters up to 256. 
If you open the file as a record file, you can only read or write a fixed number 
of characters the number you specified in the record-length parameter of the 
OPEN #* instruction.
Stream files are better suited to deal with information that has no special 
structure. Record films have an underlying record structure and are particularly 
useful when dealing with data bases, where a record holds information of a fixed 
length.
Stream files can only be read or written sequentially. When you perform 
consecutive INPUT * instructions on a stream file, you read the characters one 
after the other.
Record files can be read or written in a random manner, you specify - using the 
'AT' statement - the number of the record you want to read with the PRINT * and 
INPUT * instructions,
A file is accessed using a file pointer, understanding the concept is important. 
In stream files the basic information unit is the character. In record files the 
basic information unit is the record (which can have up to 256 charaters). If 
you want to access a particular character in a certain record, you must read the 
entire record. Whichever the basic information unit is, an open file always has 
a pointer pointing to it. In stream files this file pointer points to the 
character which will be read or written next. In record files, the file pointer 
points to the number of the record that will be read or written next. Record 
files can also be accessed sequentially, record after record.
When the OPEN #* instruction is executed, the file pointer is initialised to 
different values, according to the mode parameter. If the file is open in input 
or output (stream or record files) or random (record files), the file pointer is 
initialised to 1, even if the file is empty.
If the file is open in the append mode, the file pointer is initialized with the 
file size plus 1 (stream files) or with the number of records contained in the 
file plus 1 (record files), corresponding to the number of the character or 
record that is going to be written next.
If you open a file in output only mode, all its previous contents will be 
destroyed. Using the append mode the data is attached to the end of the file 
without overwriting it.
A record file will be overwritten by specifying a record number lower than the 
last one on the file. The changes made to a file become effective when you close 
it with the CLOSE #* instruction.
You can also open and read or write SCP's, but the concepts just described vary. 
These are described in the next chapter devoted to SCP's.
The following you cannot do with the OPEN #* instruction:
-Specify a channel already in use,
-specify a channel outside the range 1 to 16. Or a record outside the range 1 to 
256.
-specify a directory as the argument
-Specify a pathname using a template
-Specify a random access file without a record length.
-Specify the opening of a file in write mode, that is using, output, random or 
append modest to a file or disk which is write protected.
------------------------------------------------------------------------------
5.4 LIST *#
------------------------------------------------------------------------------
If a file or SCP is open the CAT * instruction displays an '0' under the 'S' 
field. To know in which channel(s) the file is open, its mode, type (stream or 
record), use the LIST *# instruction, which displays information on open files, 
and whose syntax is:
LIST *# [channel number]
The channel number is optional. If you specify it, TOS will only display 
information on that channel. If you omit it, TOS will display information on all 
open channels.
Try entering:
DIM *"TOS.SCR"
OPEN #*3;"tos.scr";i
This instruction opens the file 'TOS.SCR' in channel 3 in the stream input mode.
Now enter:
LIST *#
The fist line listed is the pathname of the file, starting at the root. Next 
comes a header and the corresponding information. Last line tells you how many 
free channels you have left. The information on the open file includes:
Ch  : Channel number 1 to 16
T   : Channel type: slow (s) or fast (f)
M   : Mode: I, 0, R, or A (one of the four modes in which you can open a file)
Typ : File type: stream (STR) or record (REC)
Rln : Record length (the number you specified in the OPEN #* instruction. If the 
file type is stream, the value shown is 1)
Pointer : File pointer (this is the number of the character or record that is 
going to be read or written next, if the file is open as a stream or record file 
respectively. The first character or record is number 1)
Size : The size of a file in bytes. In input only, this value is fixed. In all 
other modes this value may grow according to what you write in the file.
Now enter:
DIM *"TOS.BAS" :SAVE *"SCREEN.SCR" SCREEN$
OPEN #*7;"tos.bas";r;20
OPEN #*16;"screen.scr";a
followed by;
LIST *#
This lists information an all open channels.
Please note:
1) Channel 3 is fast (T field) and 7 and 16 are slow.
2) File "TOS.BAS" is open as a record file with record length (Rln) of 20 bytes 
(characters) and the file pointer is initialised to 1.
3) File "SCREEN.SCR" is open as a stream in append mode, which is why the file 
pointer is initialised to 6918 (one plus the size, that is, the number of the 
character that will be written next).
Finally, 3 channels open leave 13 channels free.
If there is no channel open, the LIST *# will print:
16 channels free
No channels open
If you specify the number of a channel that is not open, TOS will generate the 
error message:
Channel not open
If you specify a channel number outside the 1 to 16 range, you will get the 
error message:
Illegal channel number
The LIST *# will still work if the channel is open to an SCP, with a few 
exceptions (see chapter on SCP's).
------------------------------------------------------------------------------
5.5 RANDOM ACCESS and SEQUENTIAL files
------------------------------------------------------------------------------
This section describes the use of random and sequencial access files.
Files can be used to store and retrieve information other than BASIC or machine 
code programs. For example, they can be used to keep a record of your bank 
account, your appointments or just a sequence of results from a calculation.
The new commands that allow you to use files from within a BASIC program work 
just like PRINT and INPUT but act on files instead of the screen or the 
keyboard.
To explain the use of these commands two small programs will be used. The first 
demonstrates the use of sequential files, and the second of random or direct 
access files.
Suppose You went to check it a number matches any of a sequence you have 
previously created and stored in a data file named 'TABLE.DAT'.
First you have to create this file. The program to do it could be something like 
this:
100 DIM *"TABLE.DAT"
110 OPEN #*1;"TABLE:DAT";0
We have created the file and then opened it for output (0 symbolizes output) 
through channel 1.
120 REM Table input routine
130 INPUT "How many do you wish?";a
140 FOR n=1 TO a
150 INPUT "Enter Number";a$
160 PRINT *#1;a$+CHR$13
170 NEXT n
180 CLOSE #*1
The main body of the program ends here closing the file. In line 160 we do not 
print the number, but its string representation and use a carriage return (ASCII 
code 13) after the number as a SEPARATOR. In a sequential file such as this, the 
charaters are printed one after another and items must be separated, otherwise 
you will not be able to read them back separately.
Several types of separators are recognised by the extended BASIC. You can use 
commas, tabs (CHR$6) or quotes. Quotes must be used in pairs and everything 
between them will be considered a string. This way you can save a string that 
has a separator code in it. If you want to save a string that includes quotes, 
then use two quotes like this: ""Hello"".
After running this program there will be a file in your disk with all the 
numbers you have entered.
Use the following program to see how to check whether a number belongs to this 
table or not:
200 LET TRAP=23729:LET SYSERR=23728
300 OPEN #*1;"TABLE.DAT";i
310 POKE TRAP,255
320 PRINT "0 ends Program"
330 INPUT "Number to check";n
340 IF n=O THEN GOTO 440
350 INPUT *#1;p$
360 IF PEEK SYSERR <>0 THEN GOTO 410
370 IF VAL (p$) <>n THEN GOTO 350
380 PRINT "Number ";n;" belongs to the table"
390 RESTORE *#1
400 GOTO 330
410 PRINT "Number ";n;" does not belong to the table"
420 GOTO 3?0
430 REM Program end
440 CLOSE #*1
450 POKE TRAP,O
460 PRINT "End of program"
Line 200 defines variables used for error trapping-see appendix E. Line 310 
enables the error trapping routine. The loop in line 330 checks if the number 
presently entered figures in our list by checking it against all the numbers in 
the file. If you have already run the previous programme then enter run 2OO.
In line 350 a value is INPUT * from the file. This value is in the form of a 
string (p$) and is converted to a number in line 370 using VAL. All information 
transmitted to or from a file must be in string format.
The RESTORE in line 390 resets the file pointer so that every search starts at 
the beginning of the file.
The most important points concerning files and sequential access modes are;
1 - You can only use strings when reading or writing to a file.
2 - These strings have a maximum length of 256 bytes.
3 - You cannot use string arrays with more than one dimension for input.
4 - There must be 2 separator between strings in a file or you will not be able 
to read them back separately.
5 - There must be only one string expression in each PRINT * statement. It you 
want to print several items join them by a Plus '+'.
6 - In a sequential file you can only read or write items one after the other.
7 - If you open an already existing file for output its previous contents will 
be lost.
Another important point about files is record access.
You can write to a file as if it were an endless tape, separating the items for 
later reading, or you can define a fixed record length and every time you access 
the file the information transfer will be made in chunks of fixed length, 
disregarding the separator characters. For example enter:
DIM *"NAMES" (As a direct command)
100 OPEN #*1;"NAMES";0;30
110 FOR n=1 TO 20
120 INPUT "Name";n$
130 PRINT *#1;n$
140 NEXT n
150 CLOSE #*
This program will prompt for and write 20 names to a file called NAMES, each 
using 30 bytes. If n$ is longer than 30 bytes, only the first 30 will be 
written, if Shorter, the remaining bytes will be filled with blanks.
The names may be read back using this program:
200 OPEN #*1;"NAMES";I;30
210 FOR n=1 to 20
220 INPUT *#1;a$
230 PRINT a$
240 NEXT n
250 CLOSE #*
This program works without using separators, but you must know in advance the 
record length you are going to use. You could remove the carriage return from 
line 160 in the Program that generates the "TABLE.DAT" file (see above) if You 
introduced a fixed record length in line 110.
You must read the file using the same record length you used when you wrote it, 
otherwise you will read back different strings from those you wrote.
This can be useful to study the contents of a file. For example:
100 INPUT "Name of file to read";n$
110 LET x=1
120 OPEN #*1;n$;I;1
130 INPUT *#1;a$
140 PRINT x,a$;" ";CODE a$
150 LET x=x+1
160 GOTO 130
will read a file and display each character and its code, until the end of file 
is reached and the program stops (try it with NAMES)
The next example is an direct access files. With this type of access you can 
read or write to any place in the file but you must use fixed length records. 
This mode is useful to define records such as those in an address book where 
each entry has a predefined size.
The demonstration programme reads records without resetting the file pointer 
every time a search is made, and writes anywhere in the file without upsetting 
other records.
This program uses only one of the sixteen channels and the string slicing 
function to separate fields. Alternatively you could use several channels and 
allocate one to each of the fields thus avoiding the need for the string slicing 
function.
Please refer to the program 'ADDRESS' on your demo disk.
90 LET TRAP=23729
95 POKE TRAP,255
100 DIM *"address.dat"
110 POKE TRAP,O
115 OPEN #*1;"address.dat";r;10O
120 INPUT "1-Read,2=Write and 3=End";h$
130 IF h$="2" THEN GOTO 500
135 IF h$="3" THEN GOTO 610
140 IF h$<>"1" THEN GOTO 120
150 REM Read a record
160 INPUT "Record number";n
165 REM File size limited to 65535 records
170 IF n>65535 OR n<1 THEN GOTO 160
180 INPUT *#1;a$;AT n
190 CLS
200 PRINT AT 4,3;"Name: ";a$( TO 30)
210 PRINT AT 8,0;"Address: ";a$(31 TO 60)
220 PRINT AT 12,7;"Phone: ";a$(61 TO 75)
230 PRINT AT 16,2;"Notes: ";a$(76 TO)
Z40 INPUT "Enter to continue";h$
250 GOTO 120
500 REM Write a record
510 INPUT "Record number ";n
520 IF n>65535 OR n<1 THEN GOTO 510
530 CLS
540 DIM n$(30): DIM b$(30): DIM p$(15): DIM c$(25)
550 INPUT "Name ";n$
560 INPUT "Address ";b$
570 INPUT "Phone ";p$
590 INPUT "Notes ";c$
590 PRINT *#1;n$+b$+p$+c$;AT n
600 GOTO 120
610 CLOSE #*1: PRINT "Finished"
LINES 90, 95, 110 are used for the error trapping. It is not possible to DIM * 
an existing file name. The second time through the programme, an error would 
stop the programme, these lines prevent this. See Appendix E
LINE 115: Opens the file 'address.dat' as a random access file with a record 
length of 100 (256 maximum)
LINE 170: Is the system limit, normally 2 lower limit would apply
LINE 160: Read from the disk the record n (a$ will need slicing)
LINE 590: Writes the record to the disk, as a single string
LINE 610; The file must be closed. Otherwise records will not be updated.
The BASIC programme could be more sophisticated, the point here is to 
demonstrate the way that the TOS commands are used.
Specific records are written or read according to the number following the AT 
statement. Access times to specific records can be much shorter than with 
sequential type files since to access a record it is not necessary to read 
through the whole file.
Please note the following points:
1 - When a record is input from a file, the different fields can be separated 
with the string slicing function (TO).
2 - Care must be taken when writing to a record because if you specify a record 
number past the end of file the file size is increased until the record belongs 
to the file.
3 - The record number must be an integer between 1 and 65535.
The following is the complete syntax for the two commands:
PRINT *#n; Str-exp [;AT p]
INPUT *#n; Var [;AT p]
n : channel number (1 to 16)
Str-exp : any string or string expression resulting in a string with no more 
than 256 characters.
Var : any string variable or one dimensional string array
P : record number (1 to 65535). Optional when using random access files. If not 
defined, the next record position is used.
A last Point: everything said about sequential files is also true when using 
serial channels since TOS treats both in much the same way.
------------------------------------------------------------------------------
5.6 RESTORE *
------------------------------------------------------------------------------
The RESTORE * instruction, whose syntax is:
RESTORE *# channel-number
Allows you to reset the file pointer (to the value 1) bringing it back to the 
beginning of the file. This is especially useful in files open as streams which 
can only be accessed sequentially.
By using this command when the file is open in input only (i), you will start 
reading the beginning of the file again.
If the file is open in write only or append modes you will start overwriting it.
This instruction allows you to update only the initial characters of a stream 
file without destroying the rest of the file. Only in output mode does it 
destroy all the file contents.
Open the file in the append mode and then use the RESTORE * instruction: You can 
now start rewriting the file from the beginning without destroying all its 
contents.
The process is the same for record files, although you can avoid the use of 
RESTORE * by always specifying the number of the record you want, they can also 
be accessed sequentially.
------------------------------------------------------------------------------5.7 
CLOSE *
------------------------------------------------------------------------------
When you finish accessing a file you must close it. This is done with the CLOSE 
#* instruction, whose syntax is:
CLOSE #*[channel-number]
(Note that the # is printed by the SPECTRUM as part of the CLOSE keyword.)
If you specify a channel number, you will only close the corresponding channel 
(and associated file). It you omit it, all the open channels are closed. Closing 
a file (or SCP) implies disassociating it from a channel.
However, if the mode is other than input only, there is more involved.
Disk files are described by a few bytes in the disk directory containing the 
name of the file, its size and a description of which disk blocks (1K byte each) 
contain data belonging to that file. Therefore, it the file was open in a write 
mode (output only, random or append), the CLOSE #* instruction must update these 
bytes to reflect the new file contents.
The way in which CLOSE #* does this depends on the mode in which the file is 
open. NOTE that data written into a file is NOT safe until you CLOSE that file. 
If something happens (e.g. a power failure) before the file is closed, you may 
lose information just printed to that file. So - never keep a file open in write 
mode longer than is necessary.
When you open a file in the output only mode the file size is initialised to 
zero, even if the file already has some data. This is because the output only 
mode overwrites the previous contents of a file. However, the old version of the 
file is not destroyed until you close the file.
As an example, open a file in the output mode only. To avoid destroying one of 
your files, copy one and work on it. Enter:
MOVE *"SCREEN.SCR" TO "NEWSCR.SCR"
open it with
OPEN #*2;"NEWSCR.SCR";0
and now enter
CAT *
The "S" field shows you that the file 'NEWSCR.SCR' is open. Note that the file 
'NEWSCR.SCR', which should be 6917 bytes (being a screen), exhibits a size zero.
The 'Cur' field, which shows the currently used space in the disk, exhibits a 
value that is 7k bytes larger than the sum of the allocated spaces of all the 
files.
This is because the old version of 'NEWSCR.SCR' is still there, hidden by the 
system.
If you enter:
LIST *#2
you can list additional information on channel 2, open to this file.
Note this is a fast channel. The file is open as a stream in output only mode, 
has size 0 and the next character to be written will be the first, This 
information concerns the open version of the file.
You can new start writing data on the file. Try running the following program:
10 FOR n=1 TO 80
20 PRINT *#2;"a"
30 NEXT n
Now enter
CAT *
File 'NEWSCR.SCR' now has a size of 80 bytes and an allocated space of 1k. The 
'Cur' field has been incremented by one due to the 1K block allocated to the 
open version of 'NEWSCR.SCR'. This means that the CAT * instruction follows the 
development of the file, allowing you to monitor its growth, as does the LIST *
instruction.
Enter
LIST *#2
Now let us simulate a power failure. Press the reset button of the disk 
controller. This resets the entire system. Now enter:
LIST *
The fact that there are no channels open does not mean that they have all been 
closed. The term used here is 'aborted', meaning that your work on the open 
files ('NEWSCR.SCR') is lost. To better understand this, enter:
CAT *
The file 'NEWSCR.SCR' is still there, with all its 6917 bytes - so you didn't 
lose the old version of the file - but you did lose the 80 bytes (1K) used in 
the new version of the file.
Now do it Properly. Run the program:
5 OPEN #*2;"newscr.scr";o
10 FOR n=1 TO 80
20 PRINT *#2;"a"
30 NEXT n
40 CLOSE #*2
Now enter:
CAT *
Now the file 'NEWSCR.SCR' has size 80 and the 'Cur' field is consistent with the 
sun of the allocated spaces of all the files of disk. Before running this 
program the value shown in the 'Cur' field was 6k smaller, which proves that the 
old version of the file (which occupied 7 Kbytes) was erased.
This was done by the CLOSE #* instruction.
The same principle applies to the other write modes (random, access and append) 
with information written beyond the end of the file when it was opened.
This is the case with append in stream files, and append and random access in 
record files, when specifying a record number greater than the last one on file. 
In such a case, a system reset will lose all new information. However, if you 
write over already existing information, this is immediately replaced and will 
not be lost even in a power failure. This is also true with the RESTORE * 
instruction when in the append mode with stream files, and append and random 
access with record files, if you specify an already existing record number.
In the input mode data is never lost (even if the power fails) because the file 
is not being updated.
If you are writing into files always check that all files are closed before 
turning off your system, otherwise new information written in your files may be 
lost.
Errors that may occur with the CLOSE #* instruction are: if you specify a 
channel not open or with a number outside the 1 to 16 range, TOS will print: 
Channel not open and Illegal channel number respectively.
Extremely unlikely, but possible, is the error message: Directory full on disk 
<>, which means the disk directory has no space to hold the name and additional 
information of the new version of the file. This will only occur if you have the 
maximum possible number of files (128) per side of the disk occupied.
------------------------------------------------------------------------------
5.9 FAST AND SLOW CHANNELS
------------------------------------------------------------------------------
TOS provides you with 16 channels that are divided into two types: fast and 
slow. Channels 1 to 4 are fast and 5 to 16 are slow.
The difference is due to memory limitations: Each fast channel has a 512 byte 
buffer exclusively reserved to it whereas slow channels share a common 512 byte 
buffer.
TOS uses these buffers to speed up access to the disks. Reading or writing a 
memory buffer is much faster than reading or writing the same number of bytes in 
the disk. So, when you read a single byte from a file, TOS reads a lot more 
(256) into the channel memory buffer.
Slow channels share a common buffer, and the data in that buffer belonging to a 
file can be destroyed by the data of another file open in another slow channel.
When writing into a slow channel, TOS writes the data in the disk (or SCP) 
immediately after the PRINT * instruction, because otherwise a second PRINT *# 
in another slow channel would overwrite that data. As a direct consequence, TOS 
must perform a disk access (in case of disk files) for each PRINT *# instruction 
(even if you only print one character), which slows down the printing process. 
Hence the 'slow channel' designation.
You can observe this with the following program:
Enter :
DIM *"FILE1" as a direct command
10 LET n=4
20 OPEN #*n;"file1";o
30 FOR i=1 TO 50
40 PRINT *#n;"abcd"
50 NEXT i
60 CLOSE #*n
which stores the same string in 'FILE1' 50 times. Now run the same programme 
with line 10 modified to make n=5 (channel 5 is slow). The execution time is 
much longer because TOS accesses the disk every time line 40 is executed.
In reading operations this difference in speed does not arise unless another 
slow channel is used between two input operations.
In this case the date in the slow channel common buffer may be destroyed forcing 
TOS to re-read the file.
Before moving to CHAPTER 6 lets CLOSE #* channels that may be open due to the 
examples of CHAPTER 5.
CLOSE #*
Closes all channels.
------------------------------------------------------------------------------
CHAPTER 6
------------------------------------------------------------------------------
6.1 Serial communication ports SCP's
------------------------------------------------------------------------------
Your Floppy Disk Controller is equipped with two RS232C Serial Communication 
Ports (SCP's),
These R5232C interfaces are referred to as:
"CH_A.SCP"
"CH_B.SCP "
Entering the following will demonstrate this:
CAT *":"
SCP's are a special kind of file that convey data instead of storing it. Data is 
transmitted or received in a serial fashion, one bit at a time. TOS uses 
software and hardware protocols to ensure that the transmitter only sends data 
when the receiver is ready.
The instructions used to exchange information with the outside world via SCP's 
are: SAVE *, LOAD *, MERGE *, MOVE *, PRINT * and INPUT *.
------------------------------------------------------------------------------
6.2 SCP CONFIGURATION (FORMAT *)
------------------------------------------------------------------------------
Communication between two computers (and/or peripherals) through an RS232C 
interface is only possible when they use matching protocol. To permit a wide 
range of protocols, TOS provides an instruction to set all the parameters to the 
required values.
The syntax of this instruction is:
FORMAT * SCP - pathname
which is distinct from the disk formatting instruction because the 'TO' and the 
disk name are missing. As with any instruction using a pathname, you can either 
start at the root (i.e. FORMAT *":CH_A.SPC") or you can start at your disk 
directory.
Enter.
FORMAT *"^CH_A.SCP"
The type SCP is optional, so you could enter:
FORMAT *":CH_A"
TOS prompts for the required values to be entered, but as default uses 
predefined setting. If you press ENTER, TOS proceeds to the next question and 
maintains the previous value for that parameter. If you press SPACE, TOS 
terminates the command and maintains the former values for the subsequent 
parameters. It you press a key that is neither ENTER, nor SPACE, nor any of the 
alternatives asked by the question, TOS repeats the question. Replies may be 
entered in upper or lower case.
When FORMATting a serial port, these are the questions asked:
1. Text or Bytes (T/B) ?
If the data type is text answer 'T' this will set bit 7 of every transmitted 
data byte to 0. If the data type is bytes, all data is transmitted without 
modification.
2. Auto line feed (Y/N) ?
This question appears if the data type is text. Answering yes, TOS will insert a 
line feed (ASCII code 0AH) after each carriage return (ASCII code 0DH).
3. XON / XOFF (Y/N) ?
Choosing this option TOS establishes a software protocol using two special 
control characters:
X ON (ASCII code 11H) enabling transmission and X OFF (ASCII code 13H) disabling 
transmission.
4. Input with wait (Y/N) ?
Answering no, all read operations to the SCP will return even it the requested 
data is not present, as TOS won't wait for data to in the channel buffer. This 
is somewhat similar to the INKEY$ function provided by the SPECTRUM. Otherwise 
TOS will wait for the requested data.
5. Baud rate (A-P) ?
This parameter determines the number of transmitted bits per second, the 
transmission speed. The correspondence between letters and baud rates is:
Letter  Baud rate (bits/second)
A           50
B           75
C          110
D          134.5
E          150
F          200
G          300
H          600
I        1.200
J        1.900
K        2.400
L        3.600
M        4.800
N        7.200
O        9.600
P       19,200
6. Parity (E=Even, O=Odd, N=None) ?
This is an error detection mechanism that uses a bit to make the numbers of 1's 
odd (0) or even (E). The mechanism can be disabled (N).
7. Stop bits (A=1, B=1.5, C=2) ?
This is the minimal number of bits between the end of one byte and the beginning 
of the next.
8. Bits/char (A=5, B=6, C=7, D=8) ?
Number of bits of each data byte. Although the normal value is 8, some equipment 
uses less bits. Possible values are 5, 6, 7, and 8.
The factory default setting is:
1 : Bytes
2 : No auto line food
3 : No X ON / X OFF
4 : Input operation with wait
5 : 1200 baud
6 : No parity (none)
7 : 1 stop bit
8 : 8 bits per character
The new setting values defined by the FORMAT * will be destroyed when you turn 
your system off or press the Disk controller reset button. However, you can make 
these new values permanent by formatting a disk after configurating the SCP's. 
This will store the operating system (TOS) in the disk with the current SCP 
configuration.
If you don't like the names "CH_A" and "CH_B" you can change them with the LET * 
instruction.
Note, however, that it is the disk inserted in drive A that provides the 
operating system. So if you want to use your own SCP configuration - instead of 
the factory default system - you must use this new disk in drive A. Or run the 
the utility LOSYS in all existing disks (see appendix c).
You cannot configure an open SCP. If you do, you will get the error message:
<> is open
The angle brackets representing the name of the SCP in question,
------------------------------------------------------------------------------
6.3 TRANSMITTING FILES THROUGH SCP's
------------------------------------------------------------------------------
There are four instructions to exchange files: SAVE *, LOAD *, MERGE * and MOVE 
*
They all work as the disk files do. The SAVE * instruction allows you to 
transmit a program, code or data currently in memory, LOAD * and MERGE * perform 
the inverse operation. Note the auto run facility is also available e.g. SAVE 
*":CH_A" LINE 20.
MOVE * allows you to copy a disk file to an SCP (or vice-versa) or an SCP to 
another SCP.
The SCP's used must be configured with the data type 'bytes', since the data 
type 'text' gives special interpretation to some codes. TOS does not check this. 
These instructions deal with whole files. To transmit or receive byte by byte 
the PRINT * and INPUT * instructions must be used.
SCP's are interpreted by TOS as normal files with special characteristics. Thus, 
you can also access SCP's with PRINT * and INPUT * instructions. To do so you 
have to open and close the SCP's.
------------------------------------------------------------------------------
6.4 OPEN #*
------------------------------------------------------------------------------
The syntax of this instruction is:
OPEN #*channel-number;SCP-pathname;mode;record-length
Using SCP's the random access mode (r-input or output) has a special meaning, 
since each SCP can transmit and receive. This mode means you can transmit by 
writing with PRINT *# or receive by reading with INPUT *#.
As SCP's have no permanent data (SCP's send data - they do not store it) the 
append mode is given a special meaning. For instance, if you enter:
OPEN #*1;":ch_a";a
This means that "CH_A.SCP" will be open in the output only mode, with the data 
type 'text', the auto line feed and X ON / X OFF options independentely of the 
first four parameters of the SCP configuration settings.
In all other modes the SCP is programmed with the setting it had when you opened 
it.
As the append mode has this special meaning, there is no need to specify a 
record length. It you do TOS prints the error message:
Illegal mode/type combination
Also you cannot use the random access mode (input and output) if the X ON / X 
OFF Protocol option is on, because one way (transmit or receive) of the channel 
is needed to transmit the X ON and X OFF control characters, and it therefore 
cannot carry data too. If you have an SCP configurated to support an X ON / X 
OFF protocol and try to open it in the random access mode, TOS will generate the 
error message:
Illegal mode / SCP configuration
The same message is issued it you try to open an SCP and specify a record length 
when the SCP is configured with the data type 'text'. This is because words have 
a variable length. You cannot open an SCP input or random access in a slow 
channel because the system may need to use the slow channel common buffer to 
access another slow channel before it reads and stores all the bytes received by 
the SCP.
This is no problems with disk files because even if the bytes in the buffer are 
destroyed the disk file can be read back. SCP's do not have a memory and the 
bytes are only received once. In output only or append modes this is no problem 
because SCP's transmit all the information as you write it with the PRINT * 
instruction.
So, if you try to open an SCP in the input only or random access modes, TOS will 
generate the error message:
Cannot use a slow channel
Unlike disk files, you cannot open an SCP in more than one channel (even if the 
mode is input only) because data read from an SCP is no longer available for 
another read operation. This is because SCP's have no memory. If you could read 
an SCP from more than one channel the bytes received would be dispersed among 
those channels and no channel would receive the whole information.
If you try to open the same SCP in more than one channel you will got the error 
message:
<> is open
------------------------------------------------------------------------------
6.5 CLOSE #*
------------------------------------------------------------------------------
The CLOSE #* instruction is no different from the disk file CLOSE #* instruction 
except when the SCP is open in one of the write modes and with the data type 
'text'.
In this case an end of file character (^Z,ASCII code, 1AH) is sent through the 
SCP to inform the other party that no more date will be sent through the 
channel.
------------------------------------------------------------------------------
6.6 LIST *#
------------------------------------------------------------------------------
This instruction lists information on open channels and has a different 
presentation with disk files and SCP's because the information to be displayed 
is different.
With SCP's the information listed includes:
Ch   - Channel number (1 to 16)
T    - Channel type: slow (S) or fast (F)
M    - Mode: I,O,R or A
Typ  - Type: stream (STR) or record (REC)
Rln  - Record length : number of bytes of each record
Baud - Baud rate 50 to 19200 baud
Dat  - Data type Text (TXT) or bytes (BYT)
A    - Auto line feed : yes (Y) or no (N)
X    - XON/XOFF protocol : yes (Y) or no (N)
W    - Wait on input : yes (Y) or no (N)
------------------------------------------------------------------------------
6.7 RESTORE *
------------------------------------------------------------------------------
If the SCP is open in input only or random access mode, this instruction flushes 
the input buffer, erasing all bytes in the channel buffer waiting to be read.
If the SCP is open in another mode this instruction has no effect.
------------------------------------------------------------------------------
APPENDIX A - ERROR MESSAGES
------------------------------------------------------------------------------
This appendix includes the list of all the error codes and the messages which 
the system generates. To help you discover why the error arose a list of reasons 
is given below for each of the error messages.
The symbols <> are used to represent a name output by the system
------------------------------------------------------------------------------
30 ILLEGAL PATHNAME
------------------------------------------------------------------------------
-A character with ASCII code outside the range 32 to 126
-more than 64 characters (including spaces)
-no characters besides spaces or no characters at all
-spaces between two characters where neither of the characters is a separator 
(':', '^' or '.').
-a filename with more than 8 characters or an extension with more than 3
-a name and/or type without characters (spaces do not count)
-a file name with more than one '.'
-two colons (':') together
-an up arrow ('^') and a colon (":") together
-an up arrow preceded by a character other than an up arrow
-a template character ('+' or '?') not in the last file name, that is, a colon 
after a template character
------------------------------------------------------------------------------
31 NON EXISTENT PATH
------------------------------------------------------------------------------
A pathname beginning with up arrows tried to go higher than the root. Either you 
used more up arrows than you should or your current directory is not as low as 
you thought.
------------------------------------------------------------------------------
32 ILLEGAL USE OF A ROOT NAME
------------------------------------------------------------------------------
You cannot specify (1) the root or (2) a name in the root (disk name or SCP). 
This error can occur in the following instructions that have a pathname as their 
argument:
(1) All except GO TO *, GO SUB * and CAT *
(2) DIM *, ERASE * and SAVE *
------------------------------------------------------------------------------
33 <> HAS WRONG TYPE
------------------------------------------------------------------------------
(1) a file (2) a directory or (3) an SCP was specified where not allowed. This 
error can occur in the following instructions:
(1) GO TO *, GO SUB * and FORMAT * (SCP and disk.)
(2) OPEN #*, MOVE *, FORMAT * (SCP), LOAD * and MERGE *
(3) GO TO *, GO SUB *,ATTR * and FORMAT * (disk)
------------------------------------------------------------------------------
34 <> DOES NOT EXIST
------------------------------------------------------------------------------
You specified a pathname in which a name (not necessarily the last one) does not 
exist. Note that this does not mean that the name does not exist in your system: 
it just means that it was not found in the path specified in the pathname. This 
error can occur in all the instructions requiring pathnames, except DIM * and 
FORMAT * (disk).
------------------------------------------------------------------------------
35 <> ALREADY EXISTS
------------------------------------------------------------------------------
You tried to create a name that already exists. This error can occur in the DIM 
*, LET * and MOVE * instructions.
------------------------------------------------------------------------------
36 TYPES DO NOT AGREE
------------------------------------------------------------------------------
This error occurs in LET * if the type (file, directory or SCP) of the second 
pathname does not agree with that of the first.
LET * can only change the name, not the type.
------------------------------------------------------------------------------
37 TEMPLATE NOT ALLOWED
------------------------------------------------------------------------------
You must use a name not a template. Templates are only allowed in ERASE *, MOVE 
* (only in the first Pathname), CAT * and ATTR *.
------------------------------------------------------------------------------
38 NO FILES MATCHING THE TEMPLATE
------------------------------------------------------------------------------
You specified a template correctely, but there were no files (or directories or 
SCP's matching it). This error can occur in the ERASE *, MOVE *, CAT * and ATTR 
* instructions.
------------------------------------------------------------------------------
39 DIRECTORY FULL ON DISK <>
------------------------------------------------------------------------------
The system tried to create or update a file but there was no space in the disk 
directory. This error can occur in the DIM *, CLOSE #*, MOVE * and SAVE * 
instructions.
The disk directory can hold 128 entries. The disk itself uses one entry for its 
name. Other directories also use one entry, and files occupy one entry per each 
16K in size. Therefore, a file with 7K uses one entry and a file with 50K uses 4 
entries.
------------------------------------------------------------------------------
40 DISK <> FULL
------------------------------------------------------------------------------
The disk has no more space. This error may result from SAVE *, MOVE * or PRINT * 
instructions.
------------------------------------------------------------------------------
41 NO ROOM FOR FILE IN CHANNEL <>
------------------------------------------------------------------------------
This error occurs in the PRINT * instruction with a file open as a record file, 
with a record number so high that it would increase the file size to a value 
beyond the free space in the disk. With this error the disk maintains its free 
space.
------------------------------------------------------------------------------
42 <> IS WRITE PROTECTED
------------------------------------------------------------------------------
You tried to update or erase a file or directory that has been protected by the 
ATTR * instruction.
This error can be generated by the SAVE *, ERASE *, MOVE * and OPEN * 
instructions.
------------------------------------------------------------------------------
43 DISK <> IS SOFTWARE W/P
------------------------------------------------------------------------------
You cannot create, update, erase, rename or even write protect a file or 
directory defined in a disk that has been write protected by software with ATTR 
*. This error can be generated by SAVE *, OPEN #*, CLOSE *, DIM *, ERASE * LET 
*, MOVE *, PRINT * or ATTR *. Note that the FORMAT * (disk) does not generate 
this error because this instruction formats a disk, even if it software write 
protected.
------------------------------------------------------------------------------
44 DISK <> IS HARDWARE W/P
------------------------------------------------------------------------------
The disk is hardware write protected by the write protect tabs. The FORMAT * 
(disk) instruction will not format a hardware write protected disk, but 
generates the error: 'hardware fault on disk <>' instead.
------------------------------------------------------------------------------
45 <> HAS DIRECTORIES
------------------------------------------------------------------------------
You cannot erase a directory that contains other directories. You must erase the 
lower level directories first and then proceed upwards, erasing all the 
directories until you can finally erase the one you want. This error is 
generated by the ERASE * instruction.
------------------------------------------------------------------------------
46 <> HAS FILES OPEN
------------------------------------------------------------------------------
You cannot erase a directory that contains open files. You must close all files 
defined in the directory before you can erase it. This error is generated by the 
ERASE * instruction.
------------------------------------------------------------------------------
47 <> HAS FILES W/P
------------------------------------------------------------------------------
You cannot erase a directory that contains write protected files. You must 
unprotect them with the ATTR * instruction before you can erase the directory. 
This error is generated by the ERASE * instruction.
------------------------------------------------------------------------------
48 CANNOT ERASE CURRENT DIRECTORY
------------------------------------------------------------------------------
You cannot erase a directory if it is your current directory. Change it with GO 
TO *. This error is generated by the ERASE * instruction.
------------------------------------------------------------------------------
49 CANNOT CREATE MORE DIRECTORIES
------------------------------------------------------------------------------
You can create up to 15 directories in each side of each disk. This error is 
generated by the DIM * instruction if you try to create more. The structure of 
the directory tree does not matter.
------------------------------------------------------------------------------
50 ILLEGAL DIRECTORY SPECIFICATION
------------------------------------------------------------------------------
This error is generated by the LET * instruction if the first and second 
pathnames specify names (files, directories or SCP's) defined in different 
directories.
------------------------------------------------------------------------------
51 DIRECTORY STACK OVERFLOW
------------------------------------------------------------------------------
The directory stack has only 8 levels. This message appears if you execute a GO 
SUB * instruction at level 8.
------------------------------------------------------------------------------
52 CANNOT RETURN FROM LEVEL 0
------------------------------------------------------------------------------
You execute a DRAW * instruction while at level 0. Probably a DRAW * without a 
GO SUB *.
------------------------------------------------------------------------------
53 CHANNEL BUSY
------------------------------------------------------------------------------
This error is generated by the OPEN #* instruction it you specify the number of 
a channel that is already open. Change the channel number or close the other 
file first.
------------------------------------------------------------------------------
54 CHANNEL NOT OPEN
------------------------------------------------------------------------------
You tried to execute CLOSE *, LIST *#, PRINT *#, INPUT *# or RESTORE *# with a 
number corresponding to a channel that is not open.
------------------------------------------------------------------------------
55 ILLEGAL CHANNEL NUMBER
------------------------------------------------------------------------------
You specified a channel number outside the range 1 to 16 in one of the following 
instructions: OPEN #*, CLOSE #*, LIST *#, PRINT #*, or RESTORE *#. Possibly a 
variable with a wrong value.
------------------------------------------------------------------------------
56 NO CHANNELS OPEN
------------------------------------------------------------------------------
You executed a CLOSE #* without argument (close all channels) but all channels 
were already closed. This message also appears in the LIST *# instruction, but 
constitutes no error, just an information report.
------------------------------------------------------------------------------
57 NO CHANNELS FREE
------------------------------------------------------------------------------
This error message is generated by the instructions that access files as a 
whole, that is, SAVE *, LOAD *, MERGE * and MOVE *. The three first need one 
channel and MOVE * needs two. This error occurs if there are not enough free 
channels.
------------------------------------------------------------------------------
58 NO FAST CHANNELS FREE
------------------------------------------------------------------------------
This error can only occur when trying to copy an SCP to a file or another SCP. 
SCP's can only be read using fast channels. The MOVE * instruction also issues 
this message if channels 1 to 4 are busy.
------------------------------------------------------------------------------
59 CHANNEL TABLE OVERFLOW
------------------------------------------------------------------------------
The channel table holds information on open channels and has a capacity of 128 
entries. SCP's use one entry each. Files use one entry per 16K in size (an empty 
file uses one entry). This error occurs if TOS tries to exceed this number of 
entries. Closing a channel releases space in the table. This error can be 
generated by SAVE *, LOAD *, MERGE *, OPEN #*, MOVE * and PRINT *
------------------------------------------------------------------------------
60 ILLEGAL MODE/TYPE COMBINATION
------------------------------------------------------------------------------
-This error expresses an incompatibility between the mode and type in the OPEN 
#*. It will occur in the following situations:
-(1) - opening a disk file in random access mode (r) without specifying the 
record length.
-(2) - opening an SCP in append mode (2) and specifying a record length.
------------------------------------------------------------------------------
61 ILLEGAL RECORD LENGTH
------------------------------------------------------------------------------
You specified a record length in the OPEN #* instruction that is outside the 
range 1 to 256. Any variable used in the instruction must be within this range.
------------------------------------------------------------------------------
62 CANNOT USE A SLOW CHANNEL
------------------------------------------------------------------------------
You cannot open an SCP in input or random access mode and specify a slow 
channel. Use a fast channel.
------------------------------------------------------------------------------
63 <> is OPEN
------------------------------------------------------------------------------
You tried to open a file or SCP, but it was already open in another channel. You 
can only open a disk file in more than one channel if the mode is input only. 
This error is generated by the OPEN #* but it can also occur in the SAVE *, LOAD 
*, MERGE * and MOVE * instructions which open files and SCPs to access them.
------------------------------------------------------------------------------
64 <> CHANGED WITH FILES OPEN
------------------------------------------------------------------------------
You replaced a disk but the old one had at least one file open. You must replace 
the old disk to close the files(s) before using a new disk.
------------------------------------------------------------------------------
65 CANNOT FORMAT WITH FILES OPEN
------------------------------------------------------------------------------
This error occurs in the FORMAT * (disk) instruction if you have at least one 
file or SCP open. You must close all files before formatting a disk.
------------------------------------------------------------------------------
66 ILLEGAL DRIVE NAME
------------------------------------------------------------------------------
This error occurs in the FORMAT * (disk) instruction if you specify anything 
than A, B, C or D (upper or lower case) in the first string. These are the legal 
drive names, spaces are ignored.
------------------------------------------------------------------------------
67 ILLEGAL DISK NAME
------------------------------------------------------------------------------
This error occurs in FORMAT * (disk) instruction if you do not specify a single, 
legal name in the second string. You must specify a disk name, that is, a 
directory name not a pathname.
------------------------------------------------------------------------------
68 BUFFER FULL
------------------------------------------------------------------------------
This error occurs in the INPUT *# instruction when reading fromn an SCP, if the 
channel buffer becomes full - data incoming rate greater than system throughput 
- and you have no protocol to stop the transmiter. Configure the SCP to 
appropriate protocol.
------------------------------------------------------------------------------
69 SCP I/O ERROR
------------------------------------------------------------------------------
A transmission error was detected when reading from an SCP.
------------------------------------------------------------------------------
70 ILLEGAL OPERATION ON READ FILE
------------------------------------------------------------------------------
You executed a PRINT *# instruction with a channel number corresponding to a 
file or SCP open in input only.
------------------------------------------------------------------------------
71 ILLEGAL OPERATION ON WRITE FILE
------------------------------------------------------------------------------
You executed a INPUT *# instruction with a channel number corresponding to a 
file or SCP open in output only or append.
------------------------------------------------------------------------------
72 READ PAST END OF FILE
------------------------------------------------------------------------------
You executed an INPUT *# instruction in a channel corresponding to a file whose 
pointer was at the end of the file. No data is read.
------------------------------------------------------------------------------
73 HARDWARE FAULT ON DISK <>
------------------------------------------------------------------------------
This message can be generated by any instruction that reads or writes from or to 
the disk. A hardware fault may be detected, either from the disk itself or the 
drive. A likely cause is that there is no disk in the drive, and note the system 
does not work unless there is a disk in drive A.
------------------------------------------------------------------------------
74 DISK CORRUPTED
------------------------------------------------------------------------------
This message appears if either:
(1) - The disk is partially destroyed through magnetic fields, heat, etc.
(2) - Your operating system loaded in memory is corrupted, due to noise, caused 
by electrical interference.
(3) - You have replaced the disk in drive A, and the new disk has a diferent 
version of the operating system TOS.
You shoud reset your system. If the message persists, then the disk has becoma 
corrupted. In most cases you should be able to recover all or most if your files 
from the faulty disk. by copying them onto a good disk.
------------------------------------------------------------------------------
75 ILLEGAL DATA TYPE
------------------------------------------------------------------------------
This error occurs in the LOAD * instruction if you specify an option (CODE, 
SCREEN$, DATA or name) that is not the same or compatible with the option of the 
SAVE * that created the file. This error is also generatedif you try to load a 
file not generated by SAVE * or MERGE * - a file that does not contain a BASIC 
programme.
------------------------------------------------------------------------------
APPENDIX 6 - TOS summary
------------------------------------------------------------------------------
This appendix presents a brief description of each one of the extended BASIC 
instructions provided by TOS in alphabetical order.
For reference,
The arguments between square brackets are optional '[]'.
<> are used to represent a disk name/number/file/ or pathname output by the 
system.
------------------------------------------------------------------------------
ATTR *
------------------------------------------------------------------------------
Syntax: ATTR * pathname P or U or I or V
The P or U Protects or Unprotects a file respectively whereas I hides a file 
from the CAT * display and V unveils it.
Protected files are recognized by the appearance of a P under the rightmost 
field of the disk directory. If the file is unprotected, this field appears 
blank. Obviously neither 'V' nor 'I' will ever be displayed under the status 
field.
The pathname can be a template, so you can protect (or unprotect), hide (or 
unveil)more than one file with the same command.
A protected file cannot be erased or written to. If you protect a disk, then you 
cannot write to that disk. Note that the FORMAT * instruction can destroy a 
protected disk.
------------------------------------------------------------------------------
CAT *
------------------------------------------------------------------------------
Syntax: CAT * [pathname]
Without the pathname, this instruction displays information on all the files 
defined in the current directory. It the argument is specified, only the 
information concerning the files designated by the pathname (which can be a 
template) is listed.
This information consists at:
(1) General Data
    1 - Pathname of the directory where the files are defined
    2 - Its level
    3 - The name of the drive where it is physically defined
    4 - The disk capacity, the currently used space and the remaining space, all 
in K bytes.
(2) File Specific Data
    1 - Name (including type)
    2 - Size in bytes
    3 - Real size in K bytes (the space actually used)
    4 - File status (open or closed)
    5 - File protection state (write protected or unprotected)
As a special case, executing this instruction in the root shows the physical 
resources of your system, that is, the disk currently used and the SCP's.
------------------------------------------------------------------------------
CLOSE #*
------------------------------------------------------------------------------
Syntax: CLOSE #* expression
This instruction closes the open file linked to the channel number given by the 
expression.
The channel is disassociated from the file and becomes free.
If the file was open for input only, it suffers no modification. If the file was 
open for output only, or for random access (input/output) or append, this 
instruction updates the file with the modifications made to the file. If the 
system is initialized (by pressing the reset button or switching it off and on) 
the previous version of the file (prior to the OPEN #* instruction) will remain 
unchanged. The modifications made will only be transferred to the disk after the 
CLOSE #* instruction.
------------------------------------------------------------------------------
MOVE *
------------------------------------------------------------------------------
Syntax: MOVE * source-pathname TO destination-pathname
This instruction copies a file or SCP to another file or SCP. The source is not 
destroyed nor modified. The following combinations are allowed :1 Copying a file 
to a file makes a file duplicate allowing you to produce backup copies. 2. 
Copying an SCP to a file 3. Copying a file to an SCP. 4. Copying an SCP to an 
SCP.
The source-pathname can be a template, allowing you to copy several files with a 
single command, but in this case (and only in this case) the destination 
pathname must be a directory. All the files matching the template will be 
transferred to this directory, unless an error occurs.
TOS prints the names of the files (or error messages) as they are being copied.
SCP's cannot be used if you specify a template.
------------------------------------------------------------------------------
DIM *
------------------------------------------------------------------------------
Syntax: DIM * pathname
This instruction creates a file or a directory specified by the pathname. If you 
want to create a directory, you must specify a name with the type "DIR". Without 
it, TOS will create a file.
Files are created with size 0 and newly created directories are empty. SCP's 
cannot be created.
------------------------------------------------------------------------------
ERASE *
------------------------------------------------------------------------------
Syntax: ERASE * pathname [N]
ERASE * erases files, that is, destroys them and removes their names from the 
directory where they are defined.
The pathname can be a template, so you can erase more than one file with a 
single command.
This instruction will generate an error if you try to erase a file or directory 
that is write protected or belongs to a protected disk.
TOS asks for a confirmation of erasure with the Question:
Erase <> (Y/N)? unless an 'n' is specified in the initial command
------------------------------------------------------------------------------
FORMAT * (disk)
------------------------------------------------------------------------------
Syntax: FORMAT * drive-name TO disk-name
The FORMAT * instruction formats the disk currently inserted in the drive 
specified. Note that you must specify the name of the drive (A, B, C or D), not 
the pathname of the disk.
CAUTION: This instruction destroys all the files contained in the disk. The 
software protection provided by ATTR * is not effective. The only way to protect 
a disk against formatting is to protect it by hardware, using the disk's 
protection tabs.
Since this is a dangerous instruction (even more so than ERASE *), TOS checks 
your request before formatting by printing:
Format disk in drive <> (Y/N)?
Typing N will abort the command
If you specified drive A, TOS will print an additional message:
Change diskette and press ENTER
and waits for you to press the ENTER key before proceeding.
This allows you to format disks (without destroying the disk you are using) even 
if you have only one drive (which is necessarily drive A).
------------------------------------------------------------------------------
FORMAT * (SCP)
------------------------------------------------------------------------------
Syntax: FORMAT * SCP-pathname
If the string expression is a pathname designating a SCP, you can change the 
configuration of that SCP. TOS prints the following questions:
Text or bytes (T / B)?
Auto line feed (Y / N)?
Software Protocol (Y / N)?
Input with wait (Y / N)?
Baud rate (A - P)?
Parity (N=none, E=even, O=odd)?
Stop bits (A=1, B=1.5, C=2)?
Bits/char (A=5, B=6, C=7, D=8)?
In each case, you must type one of the letters shown above. You can hit ENTER if 
you want to proceed to the next parameter without changing the value of the 
current one, or SPACE if you don't want to change any of the subsequent 
parameters.
------------------------------------------------------------------------------
GO SUB *
------------------------------------------------------------------------------
Syntax: GO SUB * [pathname] or GO SUB *"drivename"d
The GO SUB * instruction saves the current directory in a special stack, known 
as the 'directory stack'.
If the pathname is specified, then TOS changes the current directory to the one 
designated by the pathname.
This instruction is used in conjunction with DRAW * as an easy means of 
returning to the original directory - even without you knowing which this is. 
Several GO SUB * instructions can be nested. The CAT * instruction shows the 
current level of GO SUB * nesting.
It you use the 'd' Parameter you must specify the drive name (A,B,C,D) and not 
the pathname. Hence you can move to another drive without knowing the disk name. 
Note that your directory level will be incremented as the stack directory is 
updated.
------------------------------------------------------------------------------
GOTO *
------------------------------------------------------------------------------
Syntax: GO TO * pathname or GO TO *"drivename"d
This instruction changes the current directory to the one designated by 
pathname. It is similar to GO SUB *, except it does not save the current 
directory in the directory stack.
Similarly to GO SUB * the "d" option is available. Except that once more the 
directory stack is not used.
------------------------------------------------------------------------------
INPUT *
------------------------------------------------------------------------------
Syntax: INPUT *#n; VAR$ [;AT p]
Reads a character(s) or a group of characters (i.e. a record) from a file or SCP 
via a channel.
n-specifies a channel (From 1 to 16)
VAR$-Any string variable or one dimension string array.
P-Record number (1 to 65535). Used to point to next record to be accessed in the 
random access mode. If ommited the next record is used.
------------------------------------------------------------------------------
LIST *
------------------------------------------------------------------------------
Syntax: LIST *
The LIST * instruction lists information on the current directory and an all 
directories stored in the stack.
This information includes:
     1 : The pathname of the current directory
     2 : Its level
     3 : The drive where its disk is inserted
This information is partially displayed in the first two lines of the listing 
produced by CAT *.
------------------------------------------------------------------------------
LIST *#
------------------------------------------------------------------------------
Syntax: LIST *# [channel number]
If the channel number (Can be a numerical expression) is given, this instruction 
lists information of the corresponding channel.
If the channel is not open, an error message is generated.
If the expression is omitted, this instruction lists information on all open 
channels.
This information includes:
For the channel(s) open to a file
-Channel number
-Channel type (fast or slow)
-Mode: i - input (read only)
       a - output (write only)
       r - random access (read/write)
       a - append (write at the end of the file)
-Type (record or stream)
-Record length (1 if stream)
-Current record (file pointer position)
-Size (file size in bytes)
Channel open to an SCP
-Channel number
-Mode: i - input (receive only)
       o - output (transmit only)
       r - full-duplex (transmit/receive)
       a - output of text with auto line feed and software protocol
-Type (record or stream)
-Record length (1 if stream)
-baud rate (50 to 19200 baud)
-Data type (text or bytes)
-Auto line-feed - yes (Y) or no (N)
-XON/XOFF Protocol - yes (Y) or no (N)
This instruction also prints the number of free channels.
------------------------------------------------------------------------------
LOAD *
------------------------------------------------------------------------------
Syntax: LOAD * pathname load-option
The LOAD * instruction is very similar to its equivalent in the SPECTRUM's 
BASIC. The load options are the same.
The Pathname can represent an SCP, allowing you to receive BASIC programs (or 
code) directly from another computer.
------------------------------------------------------------------------------
MERGE *
------------------------------------------------------------------------------
Syntax: MERGE * Pathname
This instruction is similar to its equivalent of the SPECTRUM BASIC language and 
merges a disk BASIC program to a program already existing in the memory of the 
SPECTRUM
------------------------------------------------------------------------------
LET *
------------------------------------------------------------------------------
Syntax: LET * old-pathname TO new-Pathname
This instruction renames a file, directory or SCP. Both pathnames must designate 
the same directory, This renaming operation does not affect the protection 
attribute.
------------------------------------------------------------------------------
OPEN #*
------------------------------------------------------------------------------
Syntax: OPEN #* expression 1;pathname;mode[expression 2]
This instruction opens a file or SCP and associates a channel with it, allowing 
you to access it through the instructions PRINT * and INPUT *.
expression 1 - channel number
pathname     - pathname of the file or SCP
mode         - i - input (read only)
               o - output (write only)
               r - random access (read/write)
               a - append
expression 2 - record length
------------------------------------------------------------------------------
PRINT *
------------------------------------------------------------------------------
Syntax: PRINT *#n;STR$; [;AT P]
Writes characters or groups of characters (i.e. records) to a file or SCP via a 
channel.
n-Specifies channel number (1 to 16)
STR$-Any string or string expression with no more than 256 characters.
P-Record number (1 to 65535) used to point to next record to be accessed in the 
random access mode. Can be ommited in which case the next record will be used.
------------------------------------------------------------------------------
DRAW *
------------------------------------------------------------------------------
Syntax: DRAW *
This instruction is used in conjuntion with GO SUB * to retrieve directory 
information from the directory stack, and thus return to the directory that was 
current when the last GO SUB * instruction was executed.
The directory level is decremented by one. An error occurs if you try to execute 
this instruction in level 0.
------------------------------------------------------------------------------
SAVE *
------------------------------------------------------------------------------
Syntax: SAVE * pathname save-option [n]
The SAVE * instruction is very similar to its equivalent in the SPECTRUM's 
BASIC. The save-options are the same.
When the optional [n] parameter is given TOS will overwrite an existing file 
with the same filename without the usual prompting:
<> already exists
Supersede (Y/N) ?
The pathname can represent an SCP, allowing you to transmit BASIC Programs (or 
code) directly to another computer.
------------------------------------------------------------------------------
APPENDIX C - UTILITY PROGRAMMES
------------------------------------------------------------------------------
The demonstration disk contains a number of utility programmes to perform 
certain useful operations. This appendix will explain the use of these 
programmes. They may be found under the directory 'UTIL'.
The programmes contained are BACKUP, DUMP, LPRINT and LOSYS.
C.1 BACKUP
This programme will copy an entire disk, sector by sector, copying all the 
contents. This allows the creation of backup copies, and will operate by copying 
the disk in drive A to any of the other drives. It is Possible to copy to drive 
A, in which case the prompt will appear to 'change disks now'. It is necessary 
to shuffle between the master and the target disk until the copy is complete. 
Using any other drive the copy will proceed without stopping.
C.2 LOSYS
This utility allows the updating of the operating system (TOS) without the loss 
of data in your disk. Each side of the disk has an operating system written to 
it, and this utility will COPY across your programmes onto a new disk with the 
now operating system resident.
To run the programme: LOAD *"LOSYS"
Several options are offered in such the same way as the backup programme, 
responding to these options, you can work with drive A only or any one of the 
other three drives. This utility can be used after FORMAT *(scp) to change 
default setting on existing disks.
C.3 DUMP
This will allow the chosen file to be dumped onto the screen, giving, the 
hexadecimal bytes, for each address, and the ASCII equivalent. Where the ASCII 
character cannot be printed it is displayed as a . (dot). The programme will 
prompt you for the name of the file you want to dump in this way.
To run the Programme: LOAD *"DUMP"
C.4 LPRINT
This programme will activate your printer connected to the serial channel A to 
work with the commands of SPECTRUM BASIC to print text and list a programme: 
LPRINT and LLIST.
The programme does not use any of the main RAM of the SPECTRUM, but uses the 
print buffer. Every time a NEW command is made this programme will be destroyed. 
To use the programme it must be first loaded, then run and then line 9, which is 
the only BASIC line of the programme, should be erased. The programme should be 
entered before the main programme you want to use, however it can be MERGED to 
the existing programme, provided no line 9 exists. There is a STOP command at 
the end of line 9 to allow a merge followed by a GO TO 9. The GO TO 9 will 
activate the printing routine by loading the machine code required. Once the 
code is in line 9 is no longer required and should be deleted. The STOP command 
will stop entry into the main programme and allow you to break out and delete 
the line 9.
------------------------------------------------------------------------------
APPENDIX D - RS232C LINK-UPS
------------------------------------------------------------------------------
D.1 PIN OUT OF PLUG
The RS232C sockets are wired as follows:
+++++++++++++++++++++++++++++
+   1    2    3    4     5   +
+                          +
  +    6    7    8    9    +
   +++++++++++++++++++++++
1 - N/C      (not connected)
2 - TX data  (transmit data)
3 - RX data  (receive data)
4 - CTS      (clear to send)
5 - DTR      (data terminal ready)
6 - N/C
7 - Ground   (signal ground)
8 - N/C
9 - +12v     (Pull-up)
D.2 MAKING a standard 25 pin D-type cable to connect a Printer (available from 
your dealer)
FDD SYSTEM---- TO ------- RS232C peripheral connections on
9 Pin D-type         25 Pin D-type
2 ------------------- 3 Rx Data
3 ------------------- 2 Tx Data
4 ------------------- 5 CTS
5 ------------------- 20 DTR
7 ------------------- 7 Signal Gnd.
9 ------------------- 6 DSR (data set ready)
NOTE:You will need to check, your printer configuration (protocol), and match it 
with that of the FDD SYSTEM. You can use the default protocol (see chapter 6), 
and configure your peripheral to that or you can reconfigure the RS232C port's 
current setting by using the FORMAT *"CH_A" instruction.
The most likely need will be to reconfigure the baud rate to match the 
peripheral.
D.3 PRINTING CHARACTERS
There is a utility programme named 'type' which you will be able to use with 
your printer, making it echo the output from the keyboard like a type writer. 
This is under the directory named 'UTIL' on your demo disk.
Before loading the program connect a printer equipped with an RS232C interface 
to channel A of the controller.
D.4 USING LPRINT and LLIST
You will need the utility programme 'lprint' see appendix C
These can also pass control codes for enlarged Print etc.:
10 OPEN  #*1."CH_A";a
20 PRINT *#1;CHR$(27)+'E'
30 CLOSE #*1
D.5 COMMUNICATING : FDD SYSTEM to another SYSTEM
Controller to Controller connection will use a standard TIMEX 9 Pin D type 
cable, to connect two FDD SYSTEMS. For any other system using an RS232C 
interface, follow the pin out table above, making the connections as shown. The 
receive programme would need to be written to suit that system.
To send characters between two systems connect the cable to both channels A of 
each system and load RSTRANS (under directory UTIL) into the transmitting 
computer. The programme listing is as follows:
Programme: RSTRANS
10 OPEN #*1;":ch_a";o
20 IF INKEY$<>"" THEN GO TO 20
30 IF INKEY$="" THEN GO TO 30
45 PRINT INKEY$;
50 PRINT *#1;INKEY$
60 GO TO 20
The receiver should load RSRECEIV (under the directory UTIL). Listing as 
follows:
Programme: RSRECEIV
10 OPEN #*1;"CH_A";i;1
20 INPUT *#1;A$;
30 PRINT A$;
40 GO TO 20
The receiver should start running the program before the transmitter.
You will find it easy to send programs from one computer to another. Simply load 
the program you want in the transmitting computer and then type:
SAVE *":CH_A" or( SAVE *":CH_B")
Note the use of CH_A or CH_B depends on the Port connections used. In the rest 
of these examples CH_A will be used for clarity.
The receiver should type:
LOAD *":CH_A"
All the save and load options are available (see section 3.6)
Using the MOVE * instruction it is possible to send a disk file from one 
computer to another using the RS232C (SCP's), linked up.
Example:
sender:
MOVE *"File name" TO ":CH_A"
receiver:
MOVE *":CH_A" TO "file name"
As before the receiver needs to be active first.
------------------------------------------------------------------------------
APPENDIX E - Error trapping
------------------------------------------------------------------------------
The extended BASIC instructions of TOS dealing with the disk drives issue an 
error report, where there is one. If these instructions are used within a 
programme, there is no way of knowing if they can be executed. For example 
suppose a sequential file is being accessed and it is not known where it will 
end. Any further data output from the file will generate an error stopping the 
programme. There are times that this type of error needs to be 'trapped', 
perhaps warning the user that this has happened, but not having the programme 
stop.
The method of carrying out this error trapping in TOS is using two of the unused 
systems variables of the SPECTRUM, which are referred to as SYSERR, and TRAP. 
When the SPECTRUM is turned on it writes 0 in TRAP and never uses it again. 
Poking another value into that location will activate the error trapping 
mechanism whereby TOS will write an error number into SYSERR, when one occurs, 
and a zero when there is not an error.
Testing for the error number and the error condition is the way that error 
trapping can be performed. The following example should explain the method more 
clearly:
50 LET TRAP=23729 :LET SYSERR=23728
100 OPEN #*1;1;"Filename";I
110 POKE TRAP,255
120 INPUT *#1;A$
130 IF PEEK SYSERR<>O THEN GO TO 500
140 PRINT A$
150 GO TO 120
500 PRINT "Reached end of file'
510 CLOSE #*1
Use any 'Filename' that exists under your current directory.
Line 110 error trapping is activated.
Line 130 the error number will appear in SYSERR, or a 0 if no there is not an 
error. The error numbers are those that appear in APPENDIX A.
Making use of these errors can be achieved as follows:
500 IF PEEK SYSERR<>72 THEN PRINT "System error number":PRINT PEEK SYSERR:STOP
510 PRINT "Reached end of file"
520 CLOSE  #*1
Note error 72 means an attempt to read past the end of a file, any other error 
will cause the programme to STOP.
To disable the error trapping routine remember to POKE 23729,0
------------------------------------------------------------------------------
APPENDIX F - MACHINE CODE TIPS
------------------------------------------------------------------------------
The extended BASIC functions of TOS may be used in machine code programmes, but 
to do so calls must be made to the external ROM, that TOS use. The first stage 
is to understand the ROM swapping mechanism that is used. All the new commands 
are in an external ROM that uses the same address range of the standard BASIC 
ROM. To access that ROM it must be selected by jumping to address 0008H. After 
doing this the external ROM is enabled and the routines can be used. To avoid 
crashing the system and not losing control of your programme, it is suggested 
that you use the following code to switch ROM's:
PAGEIN   PUSH  IY    ;the ROM uses IY to detect a user call
         LD    IY,0  ;flag user call
         CALL  8     ;paging mechanism activated
         POP   IY    ;restore IY
NOTES:
1 - After executing PAGEIN the external ROM disables interrupts.
2 - You can not use BASIC ROM routines using CBAS. CBAS is explained later
3 - You have access to 1Kbyte of RAM from 2000H to 23FFH that is used by the 
system to store variables and buffers. It is free from 2156H to 23FFH.
After using the external ROM you can reselect the BASIC ROM by calling 0603H or 
0604H, the latter does not reenable the interrupts.
In the external ROM there is a routine to call routines in the BASIC ROM with 
the external ROM selected, that takes care of all switching. It is called with 
the address of the BASIC ROM in the next two bytes. For example:
CBAS EQU 061DH ;the spcial calling routine
CLS  EQU OD6BH ;the SPECTRUM routine
CALL CBAS
DEFW CLS ;the calling address low byte first
There is a jump table starting at 0605H with some of the most useful routines in 
the externa1 ROM to the machine code programmer. The following is a list of the 
routines and the calling addresses:
0605H JP       PUTDAT
     Purpose       :transfer a data block to the disk system
     Registers used:none
     INPUT         :data to transfer in bufdat (2000H to 20FFH)
                    A - number of bytes to send
     OUTPUT        :none
     Comment       :can be aborted with break
0608H JP       PUTCOM
     Purpose       :send command to the disk system
     Registers used:none
     INPUT         :AF,PC, DE, HL, IX, IY
     OUTPUT        :none
     Comment       :all registers are sent to the disk system.
Can be aborted with break
060BH JP       GETBLOCK
     Purpose       :get data or command from the disk system
     INPUT         :none
     OUTPUT        :data - carry reset and data in bufdat
                    command - carry set and all the registers
                    changed. Error code in 2100H and
                    error message in 21ODH to 211DH
     Comment       :can be aborted with break
060EH JP       SENDBL
     Purpose       :send a package to the disk
     Registers used:none
     INPUT         :HL - buffer pointer
                    (tvp), (len) - type and length of data to send
     OUTPUT        :zero if ok.
0611H JP       GETBL
     Purpose       :get a package from the disk
     Registers used:none
     INPUT         :none
     OUTPUT        :data in bufdat or bufcom
                    zero it op.
                    (tvp), (Ion) - type and length of data received
0614H JP       RDBLOC
     Purpose       :tread up to 256 bytes from file
     Registers used:BC, HL
     INPUT         :(chan) - channel number
                    DE : number of bytes to read
     OUTPUT        :zero if ok
                    HL points to bufdat
                    BC number of bytes read
0617H JP       RDMEM
     Purpose       :read a file to memory
     Registers used:A
     INPUT         :(prolen) - number of bytes to read
                    (prostr) - loading address
                    (chan) - channel to use
     OUTPUT        :zero if ok
     Comment       :Prolen and Prostr are two byte variables
061AH JP       WRTMEM
     Purpose       :write memory to a file
     Registers used:A
     INPUT         :(prolen) - number of bytes to read
                    (prostr) - loading address
                    (chan) - channel to use
     OUTPUT        :zero if ok
061DH JP       CBAS
     Purpose       :Call a BASIC ROM subroutine
     INPUT         :address to call
     Comment       :all registers are preserved during the ROM switching
0620H JP       SAVEP
     Purpose       :save code or a Program to a file
     Registers used:none
     INPUT         :Pathname in bufdat (must end with CHR$(0))
                    A' - len of Pathname
                    BC - len of code to save
                    DE - code start
                    HL - line number it there is one
     OUTPUT        :zero if ok
To study the extended BASIC ROM you can use this programme:
COPY  PUSH IY
      LD IY,0
      CALL 0008H
      POP IY        ;the Paging routing
      LD BC,1000H   ;the ROM only has 4Kbytes
      LD HL,OOOOH
      LD HL,DEST    ;Place in, memory where code to be put
      LDIR
      CALL 0603H    ;select the BASIC ROM
      RET           ;return
To send a command to the disk system you must place the command in 2100H set the 
Z80 registers with correct parameters and call PUTCOM. The disk tries to execute 
the command and sends back the result and error report (0 if 0,K). To get the 
result you can use GETBLOCK which returns with the carry set if the disk. sent a 
command or reset if it was data.
Montagem e impressão:
GRÁFICA P. CACILHAS, LDA.
ALMADA - PORTUGAL