Commodore 1541 Users Guide
Commodore 1541 Users Guide
1541
DISK DRIVE
USER'S GUIDE
Second Edition
(:: commodore
COMPUTERS
1lle informalion in Ihis manual has been reviewed and is believed to be entirely reliable.
No responsibility, however, is assumed for inaccuracies. The material in this manual is
for information purposes only, and may be changed wilhout notice .
Ap"""'"
A. Changing the Devict Number .. . . .. .. .•.... .•. . •. .•. . .... . ...• 81
B. Error Messages ..... . .. . ... . ...•...•.........•..•.••...••... 83
C. Diskette Formats .•..•............... . .....••..••.••...•. . .. 87
D. Disk Commaad Qukk RdtftD« Cbart ••..... .• ..•..•......... 92
E. Tesl/Demo Diskette •..•..••..•..••..•.... .. .• . .• . .• . . . .• . ••. 93
Un of Flgum
t. FrOll1 Paael. . . . . . . . . . . . . .. . . • . . ... . .• . . • . . • . . • . . • . . . . . . . . . . . S
2. Back Paael • . . . . . . . . . • . . . . . . •• . •• . ..• . .• . . • . . • . . • . . .. . . .. . .. 6
3. Floppy Disk Hookup .•.... .. .. . .. .. .•..• .. • .. • .. •. .. ........ II
4. PositioD for Diskette laJUtjoD ...... . ... . .. . ......... . ... . ..... 12
INTRODUCTION
TI!c: 154 1 disk drive greatly increases the speed. storage capacity. flexibility and reliabi l-
ity of your Commodore computer. As you use the 154 J disk drive, you will appreciate its
superiority to the cassene recorder you may have used before and to disk drives offered for
other brands of computers.
• Sp<ed
If you have used a cassette recorder for data storage, you probably know it can take up
to an hour jusl lo search one long cassette tape looking for a spe<:ific program . Wi th the
154\ disk drive, a list of all the programs on a diskette appears on your screen in
seconds. The speed ofprogrnm loading is also greatly iml'f"Oved . It takes the 1541 only
a minute [0 load a large program that would take a half-hour [0 load from tape.
• Reliability
Reliability is anOther reason for choosi ng a disk drive. It is all 100 common for a cassette
use r to accidentally erase a valuable program by saving a new program on top o f the old
one. without real izing il. The 1541 disk drive automatically verifies everything it
records.
Overall. using a disk drive makes for easier and more powerful computing.
The 1541 is one of the most affordable disk drives on the market. Compared to
competitors. the 1541 has high capacity. and even higher intelligence . It is one of the most
cost-effecti ve disk drives ava ilable. Most home and personal computers that use a disk
take at least 10K of RAM memory from the computer to hold a disk operating system
(known as a OOS. ) This large program must be in memory the wholc time the disk is
being used. and much of it must also be kept on every diskette.
The Commodore 1541 works differenlly and more effectively . It contains its own
bui lt-in microcomputer to control its various operations. along with enough ROM and
RAM memory to operate withou t any help from the computer. Commodore's 005
" li ves" entirely inside the disk drive. and does not require any internal mell'lOl)' in the
computer to do ils work . nor does it have to be loaded before use like OOS on other
computers. It is so independent that once it begins WOrking on a com mand. it will
com plcte it whi le the com puter goes on to some other task. effectively allOwing you to do
two things at once.
Another key advan tage of the Commodore 1.54 1 over di sk drives for o ther computers
is ils dynam ic allocation of disk space. Many other disk drives make you think about
every program you save . Where can I store it on this diskelle . and should J pack the disk
first? (Packing is the: process of moving all the: leftover wort areas. to the: end o( the:
diskette's storage space.) All this is handled automatically on Commodore disk drives.
1be 1541 disk drive always knows where the ne:u program will go, and automatically fits
it into the best available spot.
Diskettes created on the 1541 may be read by several other Commodore disk
drives, including the fonner 1540,2040, and 4040, and the 2031. It is usually possi-
ble, though not recommended, to write data to anyone o( these drives from any o(
the others.
The 1541 communicates with the computer and other devices over a cable and
interface known as the Commodore serial bus. It is patterned after the lEEE-488
bus used on Commodore's PET and CBM models, except that the serial version
only uses one wire (Of data. The two serial ports on the 1S41 allow several devices
to be connected together al once, each plugged into the neJlL:t in "daisy chain" (ash-
ion . Up to 4 disk drives and 2 printers can be connected this way.
This book is divided into two main parts. 1be first part gives you the infonnation you
need to use the 1541 effectively, even if you know little or nothing about programming .
This part of the book tells you how to set up the system, how to prepare diskettes for use,
how to read a directory. and how to load programs. Part two of the book is for advanced
users and those who would like to become advanced users. This part provides more
advanced commands, tells about the different files the 1541 uses, and how to manage
them , as well as giving a few hints for machine language programmers.
Both beginning and advanced users will find valuable information in the appendi·
ces-a quick reference list of disk commands, a Jist of disk error messages and what they
mean, a glossary of words used in this manual, how to use two or more disk drives at
once, and uplanations of some programs on the Test/Demo diskette packed with your
1541.
Since owners of four different Commodore computers use the 1541, we have
separated several explanations into two versions, depending on which Basic your com-
putet uses. If you have a VIC 20 or Commodore 64 . please read the pages marked Basic
2 . 1bose with the Commodore 16 or the Plusl4 should read pages marked Basic 3.S. For
many commands, there will be an added page or two of further comments and advanced
techniques. Feel free to skip anything you don't understand on those pages now, and come
back later.
If you're like most people, you're anxious to stan usin, your new disk drive
right away. In view of that, we have outlined the basic steps you need to know in
order to get started.
Once you've mastered the basic steps however, yoq will need to refer to the rest of
this manual in order to make full use of the 1541 's features . In fact , before you begin, you
should take a look at the following short sections, which offer precautions on handling the
equipment: "Simple maintenance tips," "Safety rules for diskette care." and "Safety
roles for removing diskettes."
2
1. Unpack, hook-up, and turn on the disk drive.
There's no shoncut through this part. You'll have to read this section to find oul
what connects to what, when to turn everything on, and how to empty fhe drive.
If you run into any problems at this point, refer to the Troubleshooting Guide.
4. After you perform step 3, the following wi/{ appear on the screen:
At this point, type RUN and press the RETURN key and follow)he directions
for the program.
3
SPEC IFIC ATIONS OF THE 1541 DISK DRIVE
STORAGE
T()(al formalted capacity 174848 bytes per diske lte
Maxi mum Sequential fi le size 168656 bytes per dis kette
Ma:'limum Relative file size 167 132 bytes per diskene
Records per file 65535
Files per d iskette 144
Tracks per d iskelte 35
Sectors per track 17-2 1
Sectors per diskelte 683 t()(al
664 free for data
Bytes per sector 2"
INTEGRATED C IRCUIT C HIPS USED
I 6502 microprocessor
Used for overall control
2 6522 VIA Versatile Inte rface Adapters
Used for input and out put.
and as intern al timers
6 11 6 RAM Random Access Memory
Used as 2K of buffers
16K RO M Read·Only Memory
Contains a 16 K Disk Operating System (OOS)
INTERFAC E USED
Commodore serial bus with two 6-pin DIN connectors
Device number selectable from 8-1 I
Secondary addresses 0-15
PHYSICAL DIMENSIONS
Height 97 mm
Widt h 200 mm
Depth 374 mm
MEDIA
Any good quality SV. inc h diskettc may be used (Commodore diskenei are recom·
me nded).
4
PART 1: GUIDE TO OPERATION
CHAPTER 1
DISK DRIVE
UNPACKING
The first th ing you will need 10 do with your di sk drive is unpack it. Inside the carton
in which you fou nd this manual. there should also be: a 154 1 disk drive , a gray power
cord, a black cable 10 connecllhc disk drive 10 the computer, a demonstration diskette ,
and a warranty card to be filled OUI and ret urned to Commodore .
Please don ' , connect anythi ng until you've read the OCJtt three pages! II could save
you a lot of trouble.
rC====================~ Fig.000,
Pop l.A
DOQRLATCH
DR IVE IND ICATE A IAED LEDI
LIGHT . ACT IVE
FLASH ERROR
POWER INDICATEA
Fig I. Front Pinel {GREEN LED) LI GHT : POWER ON
c===================1
r- Fig. loB
Spin
000,
DOOR LEVER
5
EMPTY THE DRIVE
First, il is very important to be sure nothing is inside the disk drive. If you lurn Ihe
power off or on with a diskettc in thc drive, you could lose ils contcnls and have '0 re-
record it. Since you wouldn', like having to do that. always check to be sure oothing is
inside the drive before turning it off or on.
When you firsl unpack Ihe disk drive, you will find a cardboard shipping spacer
inside . Following the instructions below, pull it 01.11 as though it wcre a d iskette, bUI don'l
throw it away . You will want to put il back inside the slot any lime you move or ship the
disk drive later.
To check whether a spin-door drive is empty (Fig I. B), simply rotate Ihe lever on the
front of tbc disk drive counter-clockwise until it stops . one-quarter tum al most. Then
reach inside the long slot the leve r covers when it points down, and pull out any diskette
you find there .
To check whether a pop door drive is empty (Fig I.A). simpl y press lightly on the
door lalch, as though it were a pushbutton. The doOr will pop open upwards. exposing the
long slot in which your d iskettes will rest. Once the door is open, a small spring inside
will usual1y eject an y diskelle inside.
The power cable plugs into the back of the disk drive at one end. and into a grounded
(3-prong) outlet aline other end. It will only go in one way . Before you plug it in though.
makc sure that your enlire compuler system is turned off. The disk drive's onloff switch is
in the back, on the left side (when viewed from the back). It is orf when the portion
FUSE/ HOLDER
,
marked "off' is pushed inward . Leave your whole system off until everything is
connected. We will tell yoo when it is safe 10 tum il on.
After plugging the power cord inlo the disk drive and a suitable outle t. find the black
cable that goes from the disk drive to the computer. It is called a serial bus cable to
describe the way the computer, and other accessories com municate with each other
through its wires. It has an idenlical 6-pin DIN connector at each end, which like the
power connector can only go in one way- wit h the dimple in the side of the plug facing
"p.
To plug in the serial bus cable, find the dimple on the side of the metal part of the
plug and tum that side up. Then push it straight into one of the two serial bus connect0f5
on the back of the disk drive. The other end goes into the similar connector on the back of
your computer, marked "serial bus." If another accessory , such as a printer, is already
connected there, unplug the other device's cable from the computer, and attach it to the
spare serial bus connector o n lhe back of the 1541 . Then inSlal1 the serial cable from the
154 I in the serial bus connector on the back of the computer (Fig 3.A .)
If you havc more than onc disk drive, each added disk drive's serial bus cable is
plugged inlo the second serial bus connector on the back of the previous disk drive, like a
daisy chain (Fig 3.B). However, don' t connect the oIhl:lis) until you've leamed how to
change their device numbers , as no two disk drives can ha ve the same de vice number.
We'll cover ways of changing d isk device numbers in Appendi)!; A. Until you are ready to
read that section, yoo may find it easier to leave your extra drive(s) unconnected .
With everything hooked up, and the disk drive empty, it is time to tum on the power.
You can tum on the power to the disk and other devices on the serial bus (connected via
serial cables) in any order you like. Just be sure 10 either tum on the power to the computer
itself last. or to use a multiple outlet power OO)!; with a master switch to tum everything off
and on at once. When everything is on, including the computer, the disk drive witt go
through a self check for a second or so. to be sure it is working correctl y. After the drive is
$3.tisfied with its own health , it will nash the red tight below the drive door once, and the
green power-on light to the left of the drive door will glow continuously . At the same
time, the computer will be going through a similar self-test, and displayi ng its hello
message on your TV or video monitor. Once the red light on the disk drive has flashed and
gone ouI. it is safe to begin working with the drive . If the tight doesn't go out, but
continues to flash. you may have a problem . Refer to the troubleshooting guide for help.
7
. !541
Co.mmodor' Sil\\l1I Oriv.
Persol\ll ComexJlIf FIOOPV Oillt
Single
Fig 3.A Floppy Dis<: Hookup
154\
Sil\\lI'Drive
F looDV O i1~
~~:--__ Flooov
..
' ,
Singl' Oriv.
~isk
Twin
Flg 3.b Floppy DiK Hookup
8
TROUBLESHOOTING GUIDE
Symplom RrlMdy
Green indicator light Disk drivr not Make sure power swilCh
on the 154 1 not on tumed on is in !he "on" posi tion
Power cable not Check both ends of power
plugged In cable 10 be sure they
are fully in ser1ed
Power off to Replace fuse ()f reset
watl outlet circuit breaker in house
Bad (use in Rrplace fuse (located
di sk drive on back ~ncl. as snown
in Figure 2) with one of
same size and nlting
(If any fuse fail s twice, added help is f'ltCckd . If the hou.r.c fuse failed. you may need an electrician. If
the drive fuse failed, call your dealer.)
Red CITQr lighl The disk drive is Tum the system orf for
on drive flashes faili ng its power-on a minute and try again .
continouslyon self-lest If il repeats. I.ry again
power-up . bc:fore wi th the serial bus
any disk command~ di$C()l'llleCled. If il
have been given slill repeats, call your
dcaJer . lfunplugging
the serial cable made a
difference. check lhe
cable for proper
oonneclion at both ends.
This can also be caused
by some cartridges on
the C-64 and always by
a 16K canridge on the
VIC 20. Remo~ the
cartridge and power-up
the disk drive again to
determinc wllere the
problem is.
(The principle behind unplugging !he serial cable is " divide and conquer . ,. "The drive can do its
power-on test even wilen not connected to a compute r. If it succeeds thaI way. then !he problem is
probably in the cable or the rest of the system. 001 the 1541 .)
9
TROUBLESHOOTING GUIDE
10
SIMPLE MAINTENANCE TIPS
Your 154 1 should serve you well for years to come. but there are a few things you
can do to avoid costly maintenance.
1. Keep the drive well·ventilated . Like a refrigerator. it needs a few inches of air
circulation on all sides to work properly. If heat can't be avoided any other way, you may
cool the dri ve by placing a small filtered fan on the drive so its ai r blows into the cooling
slots. (An inexpensive air freshener is quite suitable for this.) However, the added air flow
will result in more dirt getting in the drive.
2. Use only good quality dis kettes. Badly-made diskettes could cause increased wear on
the drive's read/write head . If a particular diskette is unusually noisy in use , it is probably
causing added wear, and should be re placed .
3. Avoid using programs that " thump" the drive as they load. Many commercial
programs, and diskettes that are failing. cause the disk drive to make a bumping or
chattering noise as it attempts to read a bad sector. If the diskette can be copied to a fresh
diskette, do so immediately. If it is protected by its maker agai nst copying, the thumping
is intentional and will have to be endured . Be aware, however, that excessi\'e thumping.
especially when the drive is hot, caused some older 1541 's to go out of alignment and led
to costly repairs. Current 154 1's have been redesigned to prevent the problem.
Note: the "Memory-Write" example in Chapter 8 temporarily turns off the bumps.
4. It would be a good idea to have your 154 1 checked over about once a year in nonnal
~ Several items are likely to need attention: the felt load pad on the read/write head may
be dirty enough to need replacement, the head itself may need a bit of cleaning (with 91 %
isopropyl alcohol on a cotton swab), the rails along which the head moves may need
lubrication (wilh a special Molybdenum lubricant. NOT oi l), and the write protect sensor
may need to be dusted to be sure its optical sensor has a clear view. Since most of these
chores require special materials or pans, it is best to leave the work to an authorized
Commodore service center. If you wish to do the work yourself, ask your dealer to order
the 1541 maintenance guide for you (part number 99(445), but be aware that home repair
of the 1541 will void your warranty,
"
CHAPTER 2
DISKETIES
WHAT IS A DISKETIE?
Before we actually begin using the drive, let's lake a moment to look al the
TestJDemo diskette packed with the disk drive. TI,"I do this, grasp it by the label. which
should be sticking out of the paper jacket. Then pull il out of the jacket which keeps it free
of dust and other contaminants. (Save the jacket; the diskette should always be kept in its
jacket except when actually in use in the disk drive.) It is often called II floppy diskettt ,
because it is flexible, even though il is not safe to bend diskettes.
A diskette is much like a casselle tape, but in the fonn of a circle and enclosed within
a proleCtive square plastic cover. As on a cassette tape. only II small exposed portion of
the magnetic recording surface is sensitive. You may louch the rest of the diskette any
time you like, but avoid touching the few small ponions that are nOI covered by the
protective cover. Also, never try to remove this cover. Unlike the paper jacket, the plastic
diskette cover is intended to remain on permanently.
Next, notice the notch on one side of the diskette (it may be covered by a piece of
tape). This notch is called the write protect noIch. When it is covered with the opaque tape
packed with blank diskettes , the disk drive cannot change the contents of that diskette.
Never remove the tape on the TestlOemo diskette .
The label on the top of the diskette says' 'I 541 TestlOemo" on it , and tells you
which diskette you are using. Blank diskettes come with extra labels in addition to one
applied by the maker of the diskette. Use them to describe your own diskettes .
At least two other pans of the diskette are worth mentioning: The hub and the access
slot. The hole in the center is called the hub. A cone.shaped spindle fill s it when the drive
door is closed, and its edges are clamped. This' keeps them from slipping, when the
diskette spins al 300 RPM in use.
The oval opening in the diskette opposite the label is called the access slot. It exposes
just enough of the diskette's surface for the readiwrite head and load pad inside the drive
to touch a one inch long line from the center 10 the edge of the diskette's working surface.
The bottom side of that slot is where all the infonnat ion is written as the diskette spins. It
is one place your fingers should never touch .
~
m
•-<
z
WRITE -<
PROTECT
o
g
<
m
WHEN COVERED. DISKETTE
CONTENTS CANNOT BE
AL TERED LABEL
I. Keep the disk drive and its diskeues away from all moisture, dust, smoke, food, and
magnets (including the electromagnets in telephones and TV's). Also keep them away
from temperatures either too hot or too cold for you to work in for eXiended period~ .
2. When not in the: drive, diskettes should be stored upright inside their paper jackets. Do
not allow them to become. bent Of folded . Sioce the working part of the diskette i~ on
the: bottom, never set it down on a table top. or OIller place wllere du~t or moistu re
might affect it, and be especially careful to keep your fingeo; away from tile opening~
in the: diskette cover.
3. Although some people sell kits intended to '"double your diskette's capacity" by
CUlling an eXIra write-protect notch into a diskette, it is best not to use the other side of
the diskette on the 154 1 drive, even if your diskette is labeled' 'double-sided." Doing
so will cause added wear to your diskettes and drive, and may cost you an important
program some day.
4. When buying diskettes, you may use any good quality 5'/. inch diskette.
5. Make sure the diskette center hole is more or less centered in its opening before
inserting the diskette into the drive . Although the: hub assembly will correctly center
most any diskette, it would be very difficult to rescue data from a disketle recorded
with its hub off-cc:nter. One way to help center diskettes is to "tickle" the drive door
shut instead of slamming it down. By gently closing it part-way, and then opening a bit
and then closing the rest of the way, you give the spindle more chances to center the
diskette properly. Another way to ease diskette centering is to buy diskettes that come:
with reinforced hubs. These hard plastic rings around the hub opening make the
diskeue hub more rigid, and easier to center properly.
INSERTING A DISKETTE
13
Now insert the disketle by pushing it straight into the slot, with the access slot going
in first and the label last. Be sure the diskelle goes in until it stops naturally and no longer
springs bad out if you re lease it. No part of the diskette should be showing outside the
drive when the dis kette is fully inserted, but you shouldn 't have to force or bend it to get it
rhere. You may notice a small click when it reaches fu ll insertion and the ejection spring
catches.
Wi th the diskette in position, scat it for use by pressing slraight down on the door
latch until it clicks into position , and its hand le moves slightly toward you. If the latch
docs not move easily, stop! You may have put the diskette in the Wf9ng way, or
incompletely . If that happens, reposi tion the diskette until the latch closes easily. Now
you arc ready to begin working with the diskette.
Always re move diskettes before turning a drive off or on. If a diskette were in place
and the door closed at power on or off, you could lose pan or all of the data on thai
diskette.
Similarly, do not remove a diskette from its drive when the red drive activity light is
on! That light onl y glows when the drive is actually in usc. Removi ng the diskette wi th it
on may result in your losing information currently being wri tten to the diskette.
To usc prepackaged BASIC programs ava ilable on diskette . here is the procedure:
Afler tuming on your computer system, carefully insert the preprogrammcd diskette
as described on the previous page. For purpose of demonstration , use the Test/Demo
diskette included with the disk drive . The following commands will load a program from
the diskette into the computer:
BASIC 2:
LOAD "program name",clcvice number,relocate flag
Exa,11lple : LOAD "HOW TO USE" .8
BAS IC 3.5:
14
Last is the relocate Hag. 11 can have one of two values, 0 and I. If the relocate Hag is
o or omitted, all Commodore computers that use the 1541 automatically relocate the
programs they load to live in the pan of co mpUler memory reserved for BASIC programs.
If the re locate Hag val ue is I, auto-relocation is turned off. and the: program is loaded into
the: e",act pan of memory from which it was origi nall y saved. This feature allows
machi ne-lang uage and other special purpose programs to come into the compu ter
at t he correct location for the m to operate pro perly. At t his poinl in you r [earni ng,
the o nly thing you need to know about the relocate fl ag is how to use it . Simply
include the I at t he end of the LOAD command if a particular progra m doesn't run
properly when loaded t he usual way.
After you type in the: command and press the: RETURN key, the foll owing will
appear on the screen:
READY .
•
When the word READY and the Hashing cursor reappear on the: screen and the red
light goes off on the drive, the program named " HOW TO USE" on the Test/Demo
diskette has been loaded into the computer. To use ii , just type the word RUN and press
the: RETU RN key.
11le same Load command will also allow you to load other prepackaged programs
from the TestlDemo or other diskettes. Mere ly substitute the exact program narne that you
wan t to use between the quotation mms in the above eump1e. and that will be the
program the computer will load (a list of TestlDemo programs is shown in Chapter 3, in
the sectio n enti tled " What a Directory Sho ws").
Note: here and in the remainder of the book, we will assume you are in graphic
mode , seeing upper case letters and graph ic characters when you type. Thi s is the nonnal
condition of all Commodore compu ters covered by this man ual when they are first turned
on. If you now see lower-case letters when you type without using the SHIFT key, you are
in text mode instead. Press the COMMODORE key (Or ), at the lower left comer of your
keyboard. together with a SHIFT key to switch 10 graph ic mode.
A diskette needs a pattern of magnetic grooves in order for lhe dri ve 's read/wri te
head to fi nd Ihi.ngs on it. This pattern is 1'101 on your diskettes when you buy them. but
addi ng it to a diskene is simple once you know to do it . Here is the procedure:
This Open command will be described more full y in Chapters 4 and 5. For now, just
copy it as is, re placing onl y the pans given in lower case. 11lesc: include: the device
15
number of the 1541, normally 8; the drive number, always 0 on the 1541; any desired
name for the diskette, up to 16 characters in length, followed by a 2 ch.aracterdiskeue 10
number, The Close command is often op(ional; just don't Open that same Iile again
without Closing it the first time .
Note: the challering or thumping noise you hear JUS! after lhe disk New command
begins is entirely normal. The disk musl be sure il is al lrack I , which it assures by
stepping outward 4S times (on a 35 track diskette.) The noise you hear is the head
assembly hitting the track I bumper after its inevitable arrival.
A diskette needs a pattern of magnetic grooves in order for the drive's readlwrite
head 10 find things on it. This pattern is not on your diskettes when you buy them. bul
adding itlo a diskelle is simple once you know to do it. Hen: is the procedure:
Where • 'diskette name" is any desired name for the diskette, up 10 16 characters in
length; "id" is a 2 character diskette ID number; "drive II" is the drive number, 0 if
omitted (as il must be on the 1541); and . 'device II" is the disk's device number, assumed
to be 8 if omitted. As described in the nell page, "id" is optional if (and only if) the
diskette has been previously fonnalled on a 1541 . Also, the 10 must be a suing literal . not
a variable or expression. and may nOI include Basic reserved words. Thus, ., ,1FI " cannot
be used because If is a Basic keyword, and ".I(AS)" is not allowed because AS is a
variable. ", lAS" is allowed, but the ID number will be the leiter " A" plus a dollar sign
($), no( the contents of the variable AS. If you need a variable 10 nu mber, use the Basic 2
form of the fonnal command.
EXAMPLE:
NOle: the chaUering or thumping noise you hear just after the Header command
begins is entirely normal. The disk must be sure il is al track I , which il assures by
slepping outward 4S times (on a 35 track diskette). The noise you hear is the head
assembly hilling the track I bumper after its inevitable.arrival.
Afler you have once formalled a particular diskette, you can re·format it as thoJigh it
were brand new at any time, using the above procedures. However, you can also change
its name and erase its programs ,more quickly and easily by omitting the ID number in
16
your fonnat command . By leaving off the ID number. the fonnat command will finish in a
few seconds instead of the usual 90 seconds.
Though you may nOI believe it now, you will eventually have doze ns, if no( hundreds
of diskelles. You can ease life then by planning 00111' . Assign each diske lle a unique ID
nunlber when you fonnat il. There are diskette cataloging programs you can buy. that
store and alphabetize a list of all your file names, but are of limited val ue unless you r
diskette ID numbers are un ique.
At least two valid approaches are used in assigning ID nLimbers. One starts at 00 with
the fi rst diskette. and continLies upward with each new diskette, th ro ugh 99. and then
onward from AA through 12. Another organizes diskettes within small categories, and
starts the ID number for each diskette in Ihat category wi th the same first character. going
from 0 to 9 and A to Z with the second character as before. Thus, all " Tax '· disket(es
could have ID nLimbers that begin with ·'T." Eit her approach works well when followed
dil igently.
While on this subject, may we suggest you choose names for disketle~ on Ihe same
basis. so they too will be unique. and descriptive of the files on the m.
BACKUPS
When to do a Backup
Although the 1541 is far more reliable than a cassette drive Linder most circum·
stances. its diskelles are still re latively fragile, and have a useful life of only a few years in
steady use. Therefore. it is imponanlto make regular backups of imponant programs and
files. Make a backup whenever you wouldn't wanllo redo your current work. Just as you
should save your work every half hOLir or so whe n writing a new program. so you should
also back up the diskette you're using at least daily while you are cha nging it frequently .
In a business. you would make an archival backup every time imponant information was
due to be erased. such as when a new accounting period begin~ .
How to do a Backup
We havc included programs on the TesVDemo diskellc that can be used for similar
purposes. These programs are described further in Appendix E.
17
CHAPTER 3
DIRECTORIES
WHAT IS A DIRECTORY?
One of the primary advantages of a disk drive is that it can, with nearly equal ease
and speed, access any pan of a diskenc's surface. and jump quickly from one spot 10
another. A DATASSElTE '·, on the other hand, usually reads a cassette file from the
beginning to the end. without skipping around. To see wha(s on a cassene, il is necessary
to look at its entire length. which could take as long as an hour. On a disk drive, by way of
contrast, it is a quick and simple maner 10 view a list of the programs and data files on a
diskellc. This list is called the directory .
To view the directory in Basic 2. il is usuall y necessary to load it, like a program. As
when you load other programs, this crases anythin g l!lready in Basic memory. so be sure
to save any work you don', want 10 lose before loading the directory in Basic 2. (Chapler 4
describes how to Save a program .)
For example, to load the entire directory from disk device 8, typc:
LOAO"S",8
Then , to display the directOt"y on your screen after it loads into computer memory,
type LIST. You may slow the listi ng by pressing the CONTROL key on the VIC 20 and
Commodore 64. and halt it en tirely by pressing the STOP key.
You can also use this command to limit the directory to desired files by using pattern-
matching characters described later in this chapter.
To view the directory in Basic 3.5. simply type the word DIRECTORY on a blank
line, and press the RETURN key . Unlike Basic 2'5 method of loading a directory, this
does not erase anything already in Basic memory, so you can safely ask for a directory at
almost any lime, even from withi n anQ(her program.
Agai n , you may slow a directory listing on the Commodore 16 and Plusl4 by holdi ng
down the COMMOOORE key «(): ). or halt it entirely by pressing the STOP key. You
may also pause it wi th CONTROL-S (by holding down the CONTROL key while pressing
the "S" key). and resume by pressing any other key.
Now let's look at a typ ical directory on your 1541 Test/Dem o Diskette:
18
READY.
e
I~ "HOW TO USE- PRG
12 -HOW PfIIIRT e-
PRG
12 -HOW PART 3- PRG
~ -VJC-28 ~OG£ -PRG
I -C-604 ~OGE- PRG
~ -DOS :s .• - PRO IMPORT ANT NOTE:
9 -PR JNT'ER TEST- PRO Your Test/ Demo diskette
6
• -DISK "'OOR CHANGE- PRO
-v lEW BAM- PRO
may contain additional
programs. Commodore
•
14
-CHECK DISK-
-DISPL.AV. T&S-
PRG
PRO
may update the diskette
from time to time.
S -PERFORMANCE TEST- PRO
S -S[Q.FIL.E.OEMO- PRG
7 -SD.BACKUP.CI6- PRO
7 -SD.BACKUP.PL.US4- PRG
Ie -SD.BACKUP . C64- PRG
7 -PRINT.64.UTIL.- PRO
7 ·PRINT . CIS.UTIL- PRO
7 -PRJNT.+4.UTIL- PRO
3e -CS4 BASIC DEMO- PRG
OS -+4 .ASIC DEMO- PRO
8 -LOAD ADDRESS- PRG
7 -UNSCRATCH - PRO
S -HEADER CHA~E- P'RG
Ie -REL..FIL.[.DEMO- PRO
426 BL.OCKS FREE.
The 0 at the left end lells us thai the 1541 's single drive is drive O. If we had gotten
this directory from a dual disk drive, it mighl have said " I " instead.
The DCXI thing on the lop line of the direclory after the fonnat Iype is IRe name of the
diskette. enclosed in quotation marks, and printed in reverse field. Jusi as eac h program
has a name, so does the diskelte itself, assigned when the diskette was fonnatted. The
diskene name may be up to 16 characters long, and serves mainly to help you organize
your diskette li brary. By keeping related fi les together on the same diskette . you'll ease
the task of finding the program you want later, when you have dozens or hundreds of
diskettes. The two characler code 10 the right of the name is the diskette ID, also created
when the diskette was formatted, and equally useful for individualizing diskettes.
The 2A al the right end of the top line !ells us that !he 154 1 uses vers ion 2 of
Commodore's OOS (disk operating system), and thai ii, like most Comrnodofe drives.
uses formal "A."
I'
The rest of the directory contains one line per program or file, each line supplying
three pieces of infonnation about its subject.
At the left end of each line is the size of that line's file in blocks (or sectors) of 256
characters. Four blocks are equivalent to I K (1024 characters) of RAM (read/write)
memory inside the computer.
The middle of each directory line contains the name of the file, enclosed in q uotation
marks. All characters between the quote marks are part of the name, and must be included
when loading or openi ng that file .
1lle right portion of each directory line is a three character abbreviation for the file
type of that entry. As we witt see in later chapters, there are many ways to store
infonnation on a diskette, most of which are associated with a distinctive fi le type.
After all the directory entries have listed. the directory finishes with a message
showing how many blocks of the diskette are still available for use. Th is number can vary
from 664 on a new diskette to 0 on one that is already completely full.
One indicator you may occasionally notice on a directory line , aiter you begin saving
programs and files, is an asterisk appeari ng just before the file type of a file that is 0
blocks long. This indicates the fi le was not properly closed after it was created. and that it
should not be relied upon. 111ese "splat" fi les (as they are called in England) will
normally need to be erased from the diskette and rewritten. However. do not use the
Scratch command to gel rid of them. They can only be safely erased by the Validate and
Collect commands. One of these should nonnally be used whenever a splat fi le is noticed
on a diskette . (All these commands are described in the nexl chapter.)
There are two exceptions to the above warning: one is that Val idate and Collect
cannot be used on some diskettes that include direct access (random) files, and the other is
that if the infonnation in the splat file was crucial and can't be replaced. there is a way to
rescue whatever part of the fi le was properly written. (This option is also described in the
nexi chapter).
20
PRINTING A DIRECTORY
LOAD· ·W·'.8
PRINT#4:CLOSE 4
Also note tha t all of the statements that can be combined o n one line already ha ve
been . Type them in Immediate mode to avoid dislU rb ing the directory.
All other optllm~, ~uc h as differing device num bers. and selective di rectories (sce
next section) can al~ be specified a~ u~ual in the Load command.
WA RNI NG: Be sure to incl ude the PRINT' command after every printer
listing, Otherwi:.c . the printer will remain as an unwanted listener on the .serial bus.
aoo may disru pt other work. . Also, do not abbreviate PR INT# as ?# . Although it
will look proper when lisled OUI , it will causc a SYNTAX ERROR in usc. The
proper abbreviation for PRINT II is pR .
If you would like to read a directory from wi thin a prog ram. you may do so. In Basic
3.5. si mply include the DIRECTORY command in you r Basic program. In Basic 2.
ho ..... ever. and optionall y in the otllen;. you will have to Open the directory as though it
were a data fil e and read il char.!cter by character. Sec the discussion of Oct I! in Chapter 5
for more information .
Before discussing the pallem.malching options avai lable for use in several disk
commands, let's cover one more that is only usable in a directory . Several different types
of fi les can coexist peacefully on the same diskette. By altering our directory load
command, we can creale a direclory from the files of a single selected type. Thus. we
might request a list of all sequenlial data files (see Chapter 5). one of alilhe relalive data
files (sec Chapter 6). or one or only program files . To do th is. simply add to the end of
your selective directory req uest the equals sign (:o) followed by the first letter or the file
type you want in your directory. For example, the Basic 2 command:
21
LOAD"SO:- = S" ,8
will load a directory of all sequential tiles, while the Basic 3.5 command:
will display a di rec t~ consisting only of relative files beginning with the letter " A".
The possible tile types, and their abbreviations for this use are:
P = Program
S = Sequential
R = Relative
U = User
D = Deleted
A = Append
M = Modify
Just as cassette users can load programs without giving a full name, disk users can
use special pattern matching characters to load a program from a partial name. The same
charactel1i can also be used to provide selecti ve directories. The two special characte rs
used in pattern matching are the asterisk (- ) and the question mark (1). They act
something like a wild card in a game of cards. 1be difference between the two is that the
asterisk makes all characters in and beyond its position wild, while the question mark only
makes its own character position wild. Here are some examples, and their resul ts:
LOAD " A- ... 8 loads the first fil e on disk that begins with an .. A··, regardless of
what follows. " ARTIST". "ART ERY'·. and " AZURE" would all qualify, but
" BARRY· · wouldn 't. even though it has an "A" elsewhere in its name.
DLOAD "SMrrH " (Basic 3.5) loads the first program that starts with "SM", ends
with " TH· ', and has one O(her character between . This would load "SMITH " or
"SMYTH ". but not "SMYTHE".
OPEN 8,8,2,"R?C-,S,R" We ' ll study Open in Chapter S, butlhe pattern used here
means that the selected file wil l begin wit h an " R,. and have a "C" in the third character
of its name.
D1RECTORY ,"Q'" (Basic 3.S) will load a directory of files whose names begin
with " Q " .
LOAD ..... ,8 and DLOAD " ... are special cases. When an asterisk is used alone as
a name, it matches the las t fi le used. If none have been used yet on the current diskette
since turning on the dri ve. usi ng the asterisk alone loads the first program on the diskette.
10 INPUT AS: LOAD AS + ·"" ,8 loads an y tile whose name stans with the
characters entered in AS.
22
FORMAT FOR PATIERN MATCHI NG: EXAMPLES:
"expression· "
Use any of the above patterns in any of the disk commands whose format includes a
pattern. This applies to Load , Dload, Directory, Open, Scrollch, and to [nc source file in
the Copy and Rename commands. More than one "1" can appear in the same pattern.
As you might expect, thei r use in pattern matching means you can't use the asterisk
or question mark in a file name when saving or writing a file (see next chapler.)
2J
PART TWO:
GUIDE TO ADVANCED OPERATION
AND PROGRAMMING
CHAPTER 4
COMMANDS
COMMAND CHANNEL
Commodore disk drives expect to receive many of their instructions over what is
known as a command channel. Although we will not explain the concepts behind it unt il
Chapter 6, we wi ll learn il iO use it now , so you can give your 1541 disk the commands il
needs to do some essential chores.
To instruct the command channel. we use a Basic Open statement to the disk, with a
se<:ondary address of 15 . The usual form of this statement is;
OPEN 15.8, IS
The first 15 is a fi le number, and coold be any number from I to 255. It is used to
match the secondary address (the lasl number on the line). which is also 15 . The middle
number is the primary address , beller known as the device nu mber, and is nonnaIly 8
when talking with the 1541 . A second disk drive would usually be 9, a third. 10 and soon.
Once the command channel has been opened, use the Basic Print# command to send
information to the d isk drive, and Basic's Input# command to receive infonnat ion back
from the disk drive. These two commands are like Basic's Print and Input statements,
except that they use the device nu mber specified in the preceding Open statement instead
of defaulti ng to the screen and keyboard respect ively .
In Basic 2, you'll use both Pri nt #IS ahd InpulI IS extensively, to send housekeep-
ing commands to the disk and 10 check its error status. Basic 3.5 has built-in commands
for most of these chores. Even so, it will be good for those of yo\! with Basic 3.5 10 sec
how such commands are sent .
This command assu mes we have a lready o pened the file I S to the comma nd
cha nne l. "10" ca n be rep laced wit h any st ring expression tha t is a val id disk co m-
ma nd , If file t 5 isn't already open, we ca n combine the Open and th e Pri ntl in a
single statement:
OPEN 15 ,8, 15:'10"
However. Ihis only works for lhe first disk command given . After that, fi le 15 is
already open . and Opening it again wou ld cause a "FILE OPEN" error. Added com,
mands are sent via Prinl# instead.
2l
RlRMAT RlR SENDING DISK COMMANDS
0'
PrinlllS,commandS
Examples :
PEN IS,8,IS,"VO"
0' f RINTIIS,"VO"
whe "device II" is the disk's device number. nonnally 8, and "commandS" is any
valid Iri ng expression . If il is not also a valid disk command. it will result in an error on
the di k drive . This is indicated by a flashing error light on the disk drive, and an error
mess,e such as "31.SYNTAX ERROR " when the error channel is read as described on
lhe nextlwo pages.
L Basic 2, there is no simple way to leam what is causing the error lighlto fl ash on
the disk drive withoul writing a small program. This. in tum. causes you to lose any
pro~ variables already in memory. The reason for this is that the INPlJT# command
canndt easily be used in immediate mode (that is. without a line number).
You will often need to be able 10 read the disk error channel . to see why the disk error
light is fl ashing, and thereby tum the error light ofT again.
Here is a brief program 10 check for disk errors:
to OPEN 15 ,8.15
20 INPUTII15 ,EN,EMS.ET,ES
30 PRINT EN .EMS,ET ,ES
40 CLOSE IS
This little program reads the error channel into 4 Basic variables, and prints the
results on the screen. A message will be displayed whether there is an error or 00(, but if
there was an error. this program will also clear it from disk memory and tum off the error
light on the disk drive.
Once the message is on the screen, you can look il up in Appendix B to see what il
means, and what to do about il.
In Basic 3.5, il is very easy to' learn whal is causing the error light to flash on the disk
drive. and no need 10 write a program. Simply type:
26
PRllIIT DS$
or abbreviate it to
?DSS
eilher in immc:diate mode Of within a program. and the current enur status message of the
disk will be displayed on the screen. A message will be displayed whelher Ihere is an enur
or nOl, but if there was an enur. printing its message will also clear it from the disk
memory and tum off the enur light on the disk drive .
Once the message is on the screen. you can look it up in Appe ndix B to see what it
means, and what to do about it.
Since those of you who are writing programs shou ld be: checking the error status after
each disk command. you may want to include a small su broutine in each program to take
care of the error channel. Here is one we use:
59980 REM READ ERROR C HANNEL 59990 REM READ ERRO R CHANNEL
59990 INPUT#15, EN.EM$,ET.ES 60000 IF DS > I THEN PRINT DSS:STOP
60000 IF EN> I THEN PRINT
EN.EM$,ET,ES:STOP 60010 RETURN
600 10 RETURN
The Basic 2 version assumes file 15 has al ready been opened earlier in the program. and
that it will be closed somewhere ctse at the end of the program.
This subroutine reads the error channel and puts the results into the na med variables.
In the Basic 2 version. they are EN. EMS, ET. and ES. which stand for Error Number.
Error Message, Error Track and Error Sector respecti vely. Of the four. only EMS has to
be a string , and you could choose other variable names. although these have become
traditional for this use.
The Basic 3.5 version subroutine uses the reserved variables DS and DSS already set
aside for this purpose . They are updated automatically by Basic whenever they are used .
Otherwise. the two versions of the su broutine are equivalent.
Two error numbers arc harmless: 0 means everything is OK. and I tells how many
files were erased by a Scratch command . If the error status is anything else. line 60000
prints the error message and halts the program. After you have repaired the damage. you
may then continue the program with Basic's Cont command.
Because this is a subroutine. you access it with the Basic Gosub command. either in
immediate mode or from a program. (For example. "200 GOSUB 59990".) The Return
statement in li ne 60010 will jump back to immediate mode or the next statement in your
program. whichever is appropriate.
27
HOUSEKE EPI NG HI NTS
Hlnl #1: II is best 10 open file 15 once allhe very start of a program, and only close it al
the end of the program , after all other files have already been closed. Do this because
closing the command channel automaticall y closes all other disk files . By opening once at
the start, the file is open whenever needed for disk commands elsewhere in the program.
Closing it at the end makes sure all disk files are properly closed wi thout intenupting any
other fi le eommands.
Hint #2: If Basic halts with an error whe n you have fi les open, Basic aborts them without
closing them properly on the disk . To close them properly on the disk, you musltypc:
This opens the command channe l and immediately closes it. along with all other disk
fi les. Failure to close a d isk fi le properly both in Basic and on the disk may resu h in losing
the entire file!
HI NT # 3: One disk error message is nO( always an error. Error 73, "CBM OOS 2.6
1541" will appear if you read the disk error channel before sending any disk commands
when you tu m on your computer. This is a handy way toched. which version of OOS you
are us ing. However. if this message appears later, after othe r disk commands, it means
there is a mismatch between the OOS used to format your diskette and the OOS in your
drive .
HI NT #4: To reset drive, type: O PEN 15.8.15 ,"U1" Then wait un til the drive acti vi ty
LED is off and mO(Qr goes off. then type: CLOSE 15. This also applies to sendi ng a UI +
or a UI -
Before you can save a program to diskette, the diskette must be fonnatted . as
described earlier. Saving 10 diskette is just/i ke saving to cassette, ucepc that the device
number of the disk drive is not optional.
where "file name" is any Siring expression of up to 16 characters, preceded by the dri ve
number (always 0 on the 1541) and a colon, and followed by the dev ice number of the
disk, oonnall y 8.
However, it will oot work in copying programs that are not in the Basic teKt area.
such as "DOS 5. I" for the Commodore 64 . To copy it and similar machine language
program s. you will need a machine la ng u age monito r program . lis use
for thb pUTJXY.-C is identical to ,he moni tor save desc ribed on the neKt page unde r
Ba~ic 3.5.
Nott: the "0:" at the start of file names is a holdover from the days when all
Commodore disks had two drives in the same cabinet. Although the 1541 will
normally defaull to drive 0 (not having a drive I ,) it is best to specify the drive
number whenever saving or writing a file. This avoids potential confusion in DOS
(the Disk Operating System.)
Before you can save a program to diskette, the diskette must be fonnatted, as
described earlier. Saving to diskette is just like saving to cassette, except that the device
number of the disk drive is 'nOl optional ,
where "file name" is any string expression of up to 16 charac ters, optionally followed by
the drive num ber (the "0" parameter, always 0 on the 1541 ), and the device number of
the disk drive (the "U" parameter) . If omiued, the drive nu mber defaults to 0, and the
device number to S.
However, it will nOl work in copying programs that are not in the Basic tex t area,
such as " DOS 5. 1" for the Comrnooore 64. To copy it and similar machine language
programs, you will need the .S command of the machine language monitor built into the
Commodore 16 and Plusl4. To access a built-in monitor, type MONITOR . To e:a:it a
monitor, type X alone on a li ne.
where " drive # :" is the drive num ber, 0 on the 1541; "file name" is any valid file name
up to 14 characters long (leaving 2 for the drive num ber and colon); "device # " is a two
digit device number, nonnall y 08 on the 1541 (the leading 0 is required); and the
addresses to be saved are given in Hexadecimal (base: 16,) but without a leading dollar
sign ($). Note that the ending address li ~ted must be 1 location beyond the last location to
be sa~·ed.
EXAMPLE:
29
SAVE WITH REPLACE OPTION
If a tile already exists, it can't be saved again because the disk only allows one copy
of any given tile, name per diskette. It is possible to gel around this problem using the
Rename and Scratch commands described later. However, if all you wish to do is replace
a program Of data file with a revised version, another command is more convenienl .
Known as Save-with-replace , or @Save, this option tells the disk to replace any file it
finds in the directorY with the same name, substituting the new file for it.
FORMAT FOR SAVE WITH REPLACE: FORMAT FOR SAVE WITH REPLACE:
BASIC 2 BASIC 3.5
where all the parameters are as usual except for adding a leading " at" sign (@.) The
"0:" in the Basic 2 version, though a holdover from earlier dual drives is required here .
EXAMPLES:
1be actual procedure is that the new version is saved completely, then the old version
is scratched, and its directory entry altered to point to the new vers ion . Because it works
this way , there is linle, if any, danger that a disaster such as having the power going off
midway through the process would destroy both the old and new copies of the file .
Nothing happens to the o ld copy until after the new copy is saved properly.
However, we do offer one caution--do not use @Save on an a lmost-full diskelle.
Only use it when you have enough room on the diskette to hold a second complete copy of
the program being replaced. Due to the way @Saveworks, both the old and new versions
of the file are on disk simultaneously at one point, as a way of safeguarding against loss of
the program. If there is not enough room left on diskette to hold that second copy, only as
much of the new version will be saved on the 1541 as there is still room for. After the
command completes, a look at a directory will show the new version is present, but
doesn't occupy enough blocks to match the copy in memory. Unfonunately, the Verify
command (see nex t section) will not detect this problem, because however much did get
saved will have been saved properly .
VERIFYING PROGRAMS
Although not as necessary with a disk drive as with a cassette, Basic's Verify
command can be used to make doubly cenain that a program file was properly saved to
disk. It works much like the Load command, except that it o nly compares each
char~cter in Ih~ program agai nst th~ equivalent character in t h~ computer's mem-
ory, inst~ad of actually being copied iDlo memory.
30
If the disk copy of the program differs even a tiny bit from the copy in memory,
"VER IFY ERROR" will be displayed, to tell you that the copies differ. This in itself
doesn', mean either copy is bad, but if they were supposed to be identical, one or the other
has a problem .
Natura lly, there' s no point in trying to verify a disk copy of a program after lhe
original is no longe r in memory . Wit h nothing to compare to, an appare nt error will
always be announced, even though the disk copy is always and au tomatically verified as it
is written to the disk .
where " drive # :" is an optional drive numbe r (0 on the 154 1,) "panern" is any string
expression that evaluates to a fi le name, with or without pattern-matching characters, and
"device II " is the disk device number, nonnally g. If the relocate flag is present and
equals I, the file will be verified where ori ginally saved. rather than relocated into the
Basic text area.
It verifies the last fi le used without having to type its name or drive numbe r. However. it
won't work properly after save-wi th- replace, because the last file used was the one
de leted. and the drive wililry to compare the deleted file 10 the program in memory . No
harm will result, but "VERIFY ERROR" will always be an nounced. To use verify after
@ SAVE, include at least part of the file name that is to be verified in the pattern.
One other note about Verify-when you Verify a relocated fi le, an error will nearly
always be announced , due to changes in the link pointers of Basic programs made during
re location . It is best to only verify files saved from the same type of machine, and
identical memory size. For example, a Basic program saved from a VIC 20 can't easily be
verified using a Commodore 64, even when the program would work fi ne on Doth
machines (unless the program is re-saved). This shouldn', matter, as the only lime you'll
be verifying files on machines other than the one which wrote them is when you are
comparing two disk fi les to see if they are the same. This is done by loading one and
verifying agai nst the other, and as suggested, can only be done on the same machi ne and
memory size as the one on which the fi les were first created .
The Scratch command allows you to erase unwanted files. and free the space they
occupied for use by other files . It can be used to erase either a single file. OT several fite s at
once via pattern-matching.
31
FQRMAT fUR 1HE SCRATCH COMMAND:
or abbreviate it as:
PRINT# 15."SO:pauem"
"patlem" can be any file name or combination of characters and wild card characters. As
usual. it is assumed that the command channel has already been opened as file 15.
Although 1101 absolutely necessary, it is best to include the drive number in Scratch
commands.
If you check the error channel after a Scratch command, as tlescribed in the prior
section. the value for ET (error track) will tell you how many files were scratched. For
eumple, if your diskette contains program files named "TEST", "TRAIN" ,
"TRUCK", and "TAIL", you may scratch all four, along with any otherfi1e:s beginning
with the letler " T", by using the command:
PRINT#15.·'SO:P"
GOSUB 59990
to call the error checking subroutine given earlier in this chapler, and if the four listed
were the only files beginning with "T", you will sec:
01 ,ALES SCRATCHED,04,OO
READY . •
The Scratch command allows you to erase unwanted programs and files from your
diskettes, and free up the space they occupied for use by other files and programs. It can
be used to erase either a single file, or several files at once via pattern-matching (described
at the eod of Chapter 3).
32
"pattern" can be any file name or combination of characters and wild card characters. As
usUal, " 0 " stands for dri ve number. which may only be 0 on the 1541. If the dri ve
number is omitted, 0 is assumed. Likewise, "U" stands for unit (de vice) nu mber ,
nonnal ly 8, If " U" is omitted , 8 is assumed.
Thanks to the defaults, the usual fonn of the Scratch command becomes:
before Basic obeys a Scratch command . If you are sure , simply press Y and RETURN . If
not , press RETURN alone or type anr Olher answer. and Ihe command will be cancelled.
The number of files that were scratched will be automaticall y displayed . For eum-
pic. if your d iskette contains program fi les named " TEST" , " TRAIN", "TR UCK ", and
" TAIL", you may scratch all four , along wi th any other files beginn ing with the letter
" T ". by using the command:
SCRATC H "T·"
and if the fou r lisled were the only fi les beginning with " T ". you will sec:
01,FILES SCRATCHED,04,OO
REA DY . •
Scratch is a powerful command . and should be used with cauti on, to be s ure you onl y
de lele the fi les you rea ll y want erased . When using il wi lh a pattern , we suggest you fi rst
use the same pattern in a Directory command . to be sure exactl y which files will be
de leted . ThaI way you' ll have no unpleasant surprises when you u'sc the same pattem in
the Scratch command.
J3
More about Splats
One OIher warning- never scratch a splat tile. These are files that show up in a
directory listing with an aste risk (-) just before the tile type for an entry. 'The asterisk (or
splat) means that tile was never properly closed, and thus there is no valid chain of sector
links for the Scratch command to follow in erasing the file .
If you Scratch such a file. odds are you will improperly free up sectors that are still
needed by other programs. and cause permanent damage to those OIher programs latcr
when you add more tiles to the diskette . If you find a splat file. or if you discover too late
that you have scratched such a file. immediately validate the diskelle using the Validate
command described later in this chapter. If you have added any files to the diskette since
scratching the splat file, it is best to immediately copy lhe entire diskeue onlo another
fresh diskette. but do this with a copy program rather than with a backup program .
Otherwise. the same problem will be recreated on the new diskette. When the new copy is
done. compare the number of blocks free in its directory to the number free on the Original
diskette. If the numbers match, no damage has been done, If not. very likely at least one
file on the diskeue has been corrupted. and all should be immediately checked.
Locked Files
Very occaslonally, a diskette will contain a locked file ; that is one which cannol be
erased with the Scratch command. Such tiles may be recognized by the "<" character
which immediately follows the file type in their directory entry. If you wish to erase a
locked file. you will have 10 use a disk monitor to clear bit 6 of the file.type byte in the
directory entry on the diskette . Conversely. to lock a file . you would set bit 6 of the same
byte . For more information on how such tricks are done, see Chapter 9 and Appendices 0
and E.
The Rename command allows you to alter the name of a program or other file in the
diskette directory . Since only the directory is affected, Rename works very quickly .
where "new name " is [he name you wantlhe fiJe to have , and "old name" is the name it
has now . "new name " may be any valid file name. up to 16 characters in length. It is
assumed you have already opened file 15 to the command channel .
One caulion-be sure the file you are renamIng has been properly closed before you
rename it .
34
EXAMPLES:
Just before saving a new copy of a "calendar" program, you might type:
Or to move a program called " BOOT", currentl y the first program on a di$keue to
someplace else in the directory, you might type:
followed by a Copy command (described later), which turns " TEMP" into a new copy of
"BOOT", and finiShing with a Scratch command to get rid of the original copy of
"BOOT", since renamed 10 "TEMP" by the command above.
The Rename command allows you to alter the name of a program or other file in the
diskette directory. Since only the directory is affected, Rename wor\!;s very quickly.
where "new name" is the' name you want the file 10 have , and "old name" is the name it
has now. "new name" may be any string expression that evaluates to a valid file name.
up to 16 characters in length. If "0" is left out, drive 0 is assumed . If "U" is absent.
device 8 is assumed. One caution-be sure the file you are renaming has been properly
closed before you rename it.
EXAMPLES;
Just before saving a new copy of a "calendar" program, you might type:
followed by a Copy command (described later), which turns "TEMP" into a new copy of
" BOOT", and finishing with a Scratch command 10 get rid of the original copy of
" BOOT". since renamed 10 " TEMP" by the command above.
35
RENAMING AND SCRATCHING TROUBLESOME FILES
(ADVANCED USERS)
Evenlually, you may run across a file which has a crazy fi lename, such as a comma
by itself (", ") or one that includes a SHIFI'ed SPACE. Or perhaps you will find one that
includes nonprin ting charac ters. Any of these can be troublesome. Comma files, for
instance, arc an e~ception to the rule that no two files can have the same name. Since it
shouldn't be possible to make a file whose name is only a comma, the disk never e~pccts
you to do it again.
Files wi th a SH IFI'-SPACE in their name can also be troublesome, because the disk
interprets the shifted SPACE as signalling the end of the file name, and prints whatever
follows after the quotation mark that marks the end of a name in the directory. This
te<:hnique can also be useful, allowing you to have a long file name, but also make the
disk recognize a small pan of il. as being the same as the whole thing without using
pattern-matching characters.
In any case, if you have a troublesome filename, you can use the ChrS() function to
specify troublesome characters without typing them directly. This may allow you to build
!pem into a Rename command. If this fails, you may also use the pattern-matching
characters in a Scratch command. This gives you a way to specify the name wi thou t us ing
the troublesome characters al all , bUI also means loss of your file.
For e~ample. if you have managed to create a file named ""MOV IES", with an
extra quotation mark at tlie front of the fi le name, you can rename it to "MOVIES" by
using the ChrSO equivalent of a quotation mark in the Rename command:
BASIC 2 FORMAT:
PRINT' IS, " RO:MOV IES =" +CHRS(34)+ "MOVIES"
The C HRS( 34) forces a quotation mark into the command string witho ut ulJSetting Basic.
The procedure for a fil e name that includes a SHiFf-SPACE is similar, but uses
CHRS{l60).
In cases where even this doesn ' \ work, for example if your diskette contains a comma
file, (one named " ,") you can get rid of it this way:
Depending on the exact problem, you may have to be very creative in choosing pattern·
matchi ng characters that will affect only the desired fi le. and may have to rename other
files first to keep them from being scratched \00 .
36
COPYING PROGRAMS: BASIC 1
TIle Copy command allows you 10 make a spare copy of any program Of file on a
diskette. However, on a single drive like the 1541, the copy must be on the same diskette.
which means it must be give n a differe nt name from the file copied. It's also used to
concatenate lip to four sequential data files (combining them by linking one to another.
end to end in a chain). Files are linked in the order in whic h they appear in the command.
1be source files and other fi les on the diskelte are not changed. Files must be closed
before they are copied or concatenated".
EXAMPLES:
PR INT#J5,··COPYO:BACKUP = ORIGlNA L "
or abbrev iated as
PR INT#15 :'Cdrive * :new file = drive # :old file"
where "drive ff-" is the drive number (0 on the 1541,) "new fi le" is the copy, and · ·old
file" is the original .
where "drive #" is the drive number for each file . Since it is always 0 on the 1541. the
drive number is often omitted.
EXAMPLES:
After creating several small ~uentiaJ files that each fi t easily in memory along with
a program we are using, we can use the concatenate option to combine them in a maSter
file, even if the result is too big to fit in memory. (Do be sure it will fit in remaining space
on the diskette-it will be as big as the sum of the sizes of the files in il.)
37
NOTE: Dual drives make fuller use of this command. copying programs from one diskeue
to anothe r in a single disk un it. To do that on the 154 1, refer to Appendi x E 10 find the
programs that you need .
1be Copy command allows you to make a spare copy of any program or fi le on a
dis kette. However. on a single dri ve like the 1541. the copy must be on the same diskeue.
which means it must be given a different name from the file copied. 1lle source file and
other fi les on the d iskette are nOI changed . Files must be closed before they are copied.
Allhough the 1541 supports a Concatenate option, Basic 3.5 doesn't have a special
command for it. 1be Basic 2 syntax from the previous page may be used instead.
where " 0" is the drive number (always 0 on the 154 1,) "new fi le" is the copy, "old
file" is the original, and "U" is the device number. If omitted, the drive number defa ults
to 0 and the device nu mber (un it) to 8.
EXAMPLES:
After renaming a file named " BOOT" to "TEMP" in the last section's example, we
can use the Copy command to make a spare copy of the program elsewhere on the
d iskette, under the original name:
NOTE: Dual dri ves make fuller use of this command, copying programs from one diskette
to another in a single disk unit . To do that on the 1541, refer to Appendix E to find the
programs that you need .
The Validate command recalculates the Block Availability Map (BAM) of the
current diskette, allocating only those sector.; still being used by valid, property·dosed
fi les and programs. All other sectors (blocks) are lert una llocated and free for re·use, and
all improperly-closed fi les are automatically Scratched. However, this bare descri ption of
its wortings doesn' t indicate either the power or the danger of the Validate command. Its
power is in restoring to good healt h many diske ttes whose directories or block availability
maps have become muddled. Any time the blocks used by the files on a diske lle plus the
blocks shown as free don't add up to the 664 available on a fresh diskette. Validate is
needed. with one exception below. Similarly, any time a diske tte contains an improperly-
38
closed tile (splat file), indicated by an asterisk (*) next to its file type in the directory, that
diskette needs to be validated . In fac t, but for the one exception below, it is a good idea to
validate diskettes whenever you are the least bit concerned about their integrity.
1be exception is diskettes containing Direct Access files, as described in Chapter 7.
Most direc t access (random) files do not allocate their sectors in a way the Validate
command can recognize. Thus, using Validate on such a diske tte may resul t in un-
allocating all direct access files, wi th loss of all their contents when other files are added.
Unless specifically instruc ted otherwise, never use Validate on a diskette containing direct
access fi les. (Note: these are not the same as the relative files described in Chapter 6.
Val idate may be used on re lative files without difficulty.)
or abbreviated as
PRI NT#15,··Vty.,·
where "0" is the drive numbe4i!ways 0 on the 1541.) As usual, it is assumed fi le 15 has
been opened to the comma nd channel on the 1541.
EXAMPLE:
PRI NT#15,"VO'
The Collcct command in Basic 3.5 is the same as the Validate command in Basic 2.
It recalculates the Block Availability Map (BAM) of the cum:nt diskette. allOCating only
those sectors still being used by valid, properly-closed files and programs. All othe r
sectors (blocks) are left unallocated and free for re-use, and all im'properly-closed files are
au tomatically Scratched. However, this bare description of its workings doesn't indicate
either the power or the danger of the Collect command. Its power is in restoring to good
health many diskettes whose directories or block availability maps have become muddled.
Any time the blocks used by the files on a diskette plus the blocks shown as free don't add
up to the 664 available on a fresh diskette, Collect is needed (with one exception below.)
Similarly, any time a diskeue contains an improperly-closed file (splat file). indicated by
an asterisk (*) nell' to ils file type in the directory, that diskette needs to be collected. In
fact. but for the one exception below, it is a good idea to collect diskettes whenever you
are the leaSI bit concerned about their integrity. Just note the number of blocks free in the
diskeue 's directory before and after using Collect. and if the tOlaJs differ. there was indeed
a problem, and the diskette should probably be copied onto a fresh diskette fi le by file.
using the Copy command described in the previous section, rather than using a backup
command or program.
The ellception is diskettes containing Direct Access files, as described in Chapter 7.
Most direct access (random) files do not allocate their sectors in a way Collect can
recognize. Thus, collecting such a diskette may result in un-allocating all direct access
39
files , wi th loss of all thei r conients when other tiles are added. Unless specifically
inSlructed otherwise. never collect a diskeue containi ng dil"C(:t access files. (N()(e; these
are not the same as the re lative files described in Chapter 6. Collect may be used on
re lat ive fi les wit hout difficulty .)
where "0" is the drive nu mber (always 0 on the 154 1,) and "U " the dev ice number. As
usual, if omitted they defaul! to dri ve 0 and device 8 respect ively .
EXAMPLE:
COLLECT DO
INITIALIZING
One command that should no! often be needed on the 1541, but is still of occasional
value is Initial ize . On the 1541, and nearly all other Commodore dri ves, this function is
perfonned automatically, whenever a new diskette is insened. (The optical write-protect
swi tch is used to sense when a diskette is changed.}'
The result of an Initialize, whether forced by a command, or done automatically by
the disk, is a re-read ing of the current diskette's BAM (Block Availa bility Map) into a
disk buffer. This infonnation must. of course, always be correct in order for the disk to
store new files properly. However, since the chore is handled automatically, the only time
you'd need to use the command is if something happened to mue the information in the
drive buffers unre liable. Even so, you may use the command for reassurance, as often as
you like , so long as you close al l your files except for the command channel first.
PRINTII 15 ," INITI ALlZEdrive II" PRI NTII 15, " lNITI ALlZE 0"
or it may be ab~viated to
where the command channel is assumed to be opened by fi le 15, and " drive II" is 0 on
the 1541.
40
One use for Inilialize is 10 keep a cleaning diskem: spinning, if you choose 10 use
one. (1bcre is no need to use such kits on any regular basis under nonnal conditions of
cleanliness and care.) Nonetheless, if you are using such a kit, the followin g shon
program will keep the diskette spinning long enough for you r need:
10 OPEN 15,g,15
20 FQR I ::: I TO 99
30 : PRINT#1 5,"IO'·
40 NEXT
50 CLOSE 15
It uses an Initialize loop to keep the drive mOlor on for about 20 seconds.
41
CHAPTER 5
SEQUENTIAL DATA FILES
THE CONCEPT or FILES
A tile on a diskette is just like a file cabinet in your office-an organized place 10 put
things. Nearly everything you put on a diskette goes in one kind of file or another. So far
all we've used are program fi les, but there are others, as we have mentioned. In this
chapter we will team about seq uen tial data files.
As we just suggested. the primary purpose of a dala file is 10 store the contents of
program variables. so they won't be lost when Inc program ends. A sequential data file is
one in which the contents of the variables are stored " in sequence, ,. one right after
another,just as each link in a chain follows the previous link. You may already be familiar
with sequential files from using a DATASSElTE '·. because sequential files on diskette
are just like the data files used on cassettes. Whether on casselle or diskette, sequential
files must be read from beginning to end, without skipping around in the middle.
When sequent ial files are created, information (data) is transferred byte by byte,
through a buffer, onto the magnetic media. Once in the disk drive, program files ,
sequential data files, and user files all work sequentially. Even the directory ac ts li ke a
sequential file .
To use sequential files properly, we wiJIleam some more Basic words in the ne"t
few pages . Then we'll put them together in a simple bu t useful program.
Note: Besides sequential data files, two other file types are recorded sequentially
on a diskette, and may be considered varying forms of sequential files . They arc
program files, and user files. When you save a program on a diskette. it is saved in
order from beginning to end . just like the infonnation ill a sequelltial data file . The
main difference is in the commands you use to access il . User files are even more
similar to sequential data files---differing . for most purposes, in name only. User
files are almost never used, but like program files, they could be treated as though
they were sequential data files and are accessed with the same commands.
For the advanced user. the similafll y of the various file types offers the
possibility of such advanced tricks as reading a program file into the computer a
byte (c haracter) at a time and rewriting it to the diskette in a modified fonn . The
idea of using one program to write another is powerful. and available on the
Commodore disk drives .
O PENING A FILE
One of the most powerful tools in Commodore Basic is the Open statement. Wi th il.
you may send almost any data almo~t anywhere. much like a telephone switchboard that
can connect any caller \0 any destinat ion. As you might e"pect, a command that can do
this much is fairly comple" . You have alread y used Open statements regularly in some of
your diskette housekeeping commands.
Before we stud y the format of the Open statement, let's rev iew some of the possible
devices in a Commodore computer system:
Because of the flexibility of the Open statement. it is possible for a single program
stateme nt to contact anyone o f these devices. or eve n others, depending on the value of a
single character in the command. Often an Open statement is the only difference between
a program that uses a DAT ASSElTE'~ and one using the 1541. If the character is kept in
a variable. the de vice used can even change each time that part of the program is used.
sending data alternately and with eq ual ease to diskelle. cassette, printer and screen.
EXAMPLE:
OPE N file II. device II. channel II ."dri ve lI :file name.file type.direction"
where:
"file II " is an in tege r (whole number) between I and 255 . If the file number is
grea ter than 127, a line-feed character is inserted after each carriage return in the file
opened. Though this may be helpful in primer files. it will cause severe problems in disk
files, and is to be avoi ded al all costs. Do nOl open a disk file with a fi le number greate r
th an 121. After the file is open. all other file commands will refer to it by the number
given here. Only one file can use any given file number at a time .
"device II" is the num ber. or primary address. of the device to be used. This
number is an in teger in the range 0-31, and is normally 8 on the 1541 .
43
"channel #" is a secondary address, giving funhcr instructions to the selected
device about how further commands are to be obeyed. In disk files. the channel nu mber
selects a particular channel along which communications for this file can take place. The
possible range of disk chan~e l nu mbers is 0-15, but 0 is reserved for program Loads, I for
program Saves, and 15 (or the disk command channel. Also be sure that no two disk fi les
have the same channel number unless they will never be open at the same time. (One way
to do this is to make the channel number for each fi le the same as its file numbeL)
" drive # " is the drive nu mber, always 0 on the 1541. Do oot omit it, or you will
only be abl e to use two chan nels at the same time instead of the normal maximum of three.
If any pre-existing file of the same name is to be replaced. precede the drive number with
the "at" sign (@) to request Open.with-replace.
"fiJc name" is the file name, maximum length 16 characters. Pattern matching
characters are allowed in the name when access ing existing files, but not when creating
new ones.
" file type" is the file type desired: S = sequential. P = program, U = user. and
L"" length of a relative file .
"di~tlon" is the type of access desi red . There are three possibili ties: R=read,
W= write, and M = modify . When creating a fi le, use " W" to write the data to diskette.
When viewing a completed file, use "R" to read the data from diskette. Only use the
"M" (modify) option as a last di tch way of reading back data from an improperly-closed
(Splat) file. (If you try this, chec k every byte as it is read to be sure the data is still valid.
as such files always incl ude some erroneous data, and ha ve no proper end.)
" file type" and "dir_tction" don't have to be abbreviated. They c an be spelled out
in full for clarity in printed listi ngs.
"file #", " device # " and " ch.annel # " must be valid numeric constants, variables
or expressions. The rest of the command mus! be a valid string literal. variable or
expression.
The maximum number of files that may be open sim ultaneously is 10, including all
files to all devices. The maximum number of sequential disk tiles that can be open at once
is 3 (or 2 if you neglect to include the drive number in your Open statement ). plus the
command chan nel .
On the off-chance we've al ready gol a " PHONES" file on ou r diskette, we can avoid a
"FILE EXISTS" error message by doing an @OPEN
OPEN 2,8,2:'@.0:PHONES,S,W"
44
Of course, this erases all our old phone nu:nbe rs, so make sure that an y infonnation that
may be de leted is of no impor1ance, After writing our phone file. we remo ve our diskette
and turn ofT the system. Later, to recall the data in the fil e. we would reope n it with
something like
It doesn't maner whethe r the file and channet numbe rs match the ones we used before. but
the fi le name docs have to match. Howe ve r. it is possible to use an abbreviation fonn of
the file name, if there are no rnher files that would have the same abbreviation:
If we have too many phone numbe rs. the y might nOi fit in one fi le. In that case, we
might use several simi lar file names. and leI a program choose the correct fi le.
You can omi t lhc dri ve number on an Open command to read a fi le. Doing so allows those
with dual dri ves to search both d iskenes for the fi le.
Note: Basic 2 and Bas ic 3.5 use the same file handli ng commands and the same
direct access commands (chapters 7-8), Unless otherwise noted . you may use the
same commands for bOih throughout the re mai nder of this book .
J where. everything is as on the previous page except for the endi ng " A" replacing the
" type" and " di rec tion" parameters.
EXAMPLE:
If you are writing a grading program , it would be convenient to simply tack on each
student's new grades to the end of their e",;sting grade files. To add data to the " JOHN
PAUL JONES" file. we could type
In this case, DOS will allocate at least one more sector (block) to the file th.e first
time you append to it, even if you only add one character of information. You may also
notice that using the Collect or Validate command didn't correct the file size. On the other
hand, your data is quite safe, and if the wasted space becomes a problem, you can easily
·correct it by copying the file to the same dis kette or a different one, and scratching the
original file. Here's a sequence of commands that will copy such files to the original
diskette under the original name, for ease of continued use:
BASIC 2:
PRINT*15,"RO:TEMP=JOHN PAUL JONES"
PRINT* 15, "CO:JOHN PAUL JONES =TEMP"
PRINT#15, "SO:TEMP"
BASIC 3.5:
RENAME "JOHN PAUL JONES " TO "TEMP"
COPY " TEMP" TO "JOHN PAUL JONES"
SCRATCH "TEMP"
If you are using Basic 2, be sure to open file 15 to the command channel beforehand (i.e.,
with OPEN 15,8,15) and close it afterwards (I.e., with CLOSE 15).
46
where "file /I " is the WIle file number given in the desired file 's current Open statement_
During any given access of l particular file, the fi le number must remain constant because
it serves as a shorthand way of relating all other file-handling commands back to the
correct Open slatement. Given a file number. the computer can look up everything else
ainu a file that matters .
1bc "data list" is the same as for a Print statement - a list of constants, variables
and/or expressions , including numbers, strings Of both. However, it is strongly recom-
mended that each Print# stalement to disk include only one data item. If you wish 10
include more items , they must be scpanted by l carriage return chllJ1k:tCr, not a comma.
Semicolons are pennined, but not recorded in the file , and do not resull in any added
spaces in the file. Use them to separate items in the list that might otherwise be confused,
such as a stri ng variable immediately following a numeric variable.
Note: Do not leave a space between PRINT and #, and do DOl abbreviate the
command as ?#. 'The correct abbreviation for Print# is pRo
EXAMPLES:
To record a few grades for John Paul Jones, using a sequential disk file /I I previously
opened for writing, we could use:
(assuming your program includes an error check subroutine like the one in the last
chapter).
In using Print# there is an exception to the requirement to check for disk
errors after every file-handling statement. When using Printl, a single check after
an entire set of data has been written will still detect the error, so long as the check
is made before any albtr file-handling statement or disk command is used. You
may be familiar with Print statements in which several items follow each other:
To get those same variables onto sequential disk file number 5 instead of the screen, the
best approach would be to use three separate Print# statements, as follows:
47
However, if you need 10 combine them, here is a safe way 10 do il:
CHRS( I3) is the carriage return charac ter, and has the same effect as putting the print
items in separate lines. If you do th is often, some space and time may be saved by
previously defi ning a variable as equal to CHRS( 13):
The basic idea is that a proper sequential disk file write, if redirected to the screen,
will display only one data item per line, with each succeeding item on the ne:s:t line .
After you finish using a data file, it is extremely important that you Close it. Ouring
the process of writing a file, data is accu mulated in a memory buffer, and only written out
to the physical cassette or diskette when the buffer fill s.
Working this way, there is almost always a small amount of data in the buffer that
has not been written to diskette or cassette yet, and which would simpl y be lost if the
computer system were turned off. Similarly, there are diskette housekeeping mailers, such
as updating the BAM (Block Availability Map) of sectors used by the current file , which
are not performed during the ordinary coume of writing a file. This is the reason for
ha ving a Close statement. When we know we are done with a fi le, the Close statement
will wrile the rest of the data buffer out 10 cassette or diskette. update the BAM, and
complete the fi le's entry in the directory . Always Close a data file when you are done
using it! Failure to do so may cause loss of the entire file!
However, do not close the disk command channel un til all other files ha ve been
Closed. The command channel (described in the Jast chajXer), when used, should be the
first file Opened, and the last fi le Closed in any program. Otherwise, Teillaining files may
be closed automatically, As also desc ribed there , this may be used to advantage if a
program halts on an error while disk files are open.
CLOSE file #
whe re " fi le 1/- " is the same file number given in the desired file·scurrent Open statement.
EXAMPLES:
To close the data fi le #5 used a! an e:s:ample on the previous page, we would use
CLOSE 5
[n Commodore's CBM and PET computers, there is a Dclose statement , that, when
u'-Cd alone, cJosc~ all dhk tile~ al once. Wilh a bit of planning. the same can be done in
Ba~ic 2 and 3.5 via a program loop. Since Ihere is no harm in closing a file thaI wasn't
open, close every file you even think might be open before ending a program. If for
example. we always gave our files numbers between I and 10. we could close them all
with
9950FOR I =1 TO 10
9960 CLOSE I
9970 GOSUB 59990:REM CHECK FOR DISK ERRORS
9980 NEXT I
(assumi ng your program includes an error check subroutine like the one in Chapler 4)
Once infonnation has been writte n properly to a diskette fi le. it may be read back into
the computer with an Input# statement. Just as the Print# statement is much like the Print
statement, Input# is nearly identical to Input, except that the list of items following the
command word comes from a particular file instead of the keyboard. Both statements are
subject to the same limitations-halting input after a comma or colon, not accepling data
items too large to fit in Basic·s Input buffer, and not accepti ng non-numeric data into a
numeric variable.
where "file #" is the same file nu mber given in the des ired file's current Open statement.
and "variable lis!"· is one or more valid Basic variable names. If more than one data
element is to be input by a panicular lnput# statement, each variable name must be
separated from others by a comma,
EXAMPLES:
To read back in the grades wrinen wit h the Print# example. use:
(assuming your program includes an error c~k subroutine like the one on page 27).
To read back in the address data written by another Print# example, it is safest to
use:
800 INPUT#5.NAMES
810 GOSUB 59990: REM CHECK FOR DISK ERRORS
820INPUT#5,STREETS
830 GOSUB 59990:REM CHECK FOR DISK ERRORS
840 INPUT#5,CITYS
850 GOSUB 59990:REM CHECK FOR DISK ERRORS
49
but many programs cheat on safety a bit and usc
800 INPtrr#5,NAMES,STREETS,CI1"Y$
8 10 GOSUB 59990:REM CHECK FOR DISK ERRORS
lbis is done primarily when'top speed in the program is essential, and there is lillie or no
risk of reading improper data from the file.
Troublesome Cbaracten
After you begin using data files regu larly, you may encounter two Basic error
messages more or less f~uent l y. They are "STRING TOO LONG ERROR" and " ALE
DATA ERROR" , Both are likely to halt your program at an Input# statement, but may
also have been caused by errors in a Print# statement when the file was written.
50
quotation mark, in either an Input or InpUl# statement, all other characters except a
carriage return Of anothe r qu()(ation mark are accepted as part of the cu~nt data element .
EXAMPLES:
To force a quotation mark into a data element going 10 a file, append a CHRS(34) 10
the start of the~ta clemen!. For example:
PRINT#2,CHRS(34)+ "STRASMA,lIM"
0'
PRINT#2,CHRS(34):"STRASMA, JIM"
If you do this often, some space and ti me may be saved by previously defi ning a variable
as cquallo CHRS(34) as we did earlier wi th CHRS( 13):
400 PRINTII5,QT$+NAMES
In each case, the added quotation mark will be siripped OIIt of the data by the Input or
Input# statemen!, but the comma or colon will remam safely pan of the data.
Inside the computer, the space occupied by a numeric variable depends only on its
type. Simple numeric variables use 7 bytes (character locations) of memory. Real array
variables use 5 byte~ per array element, and integer array elements use 2 bytes each. In
contrast, when a numeric variable or any type is written to a file, the space it occupies
depends entirely on its length, not its type.
Nume ric data is written to a file in the fonn of a string, as if the StrSO function had
been perfonned on it. The first character will be a blank space if the nu mber is positive,
and a mi nus sign ( -) if the number is negative. Then comes the number, digi t by digit .
The last character is a cursor right character.
This fonnat allows the disk data to be read back into a string or nu meric variable
later. It is, however, somewhat wasteful of disk space, and it can be difficult to anticipate
the space required by numbers of unknown length. For this reason, some programs
convert all numeric variables into strings before writing them to diskette, and use string
functions to remove any unneeded characters in advance. Doing so still allows those data
elements to be read back into a numeric variable by Input# later, although file data errors
may be avoided by reading all data in as strings, and converting 10 numbers after the
infonnation is inside the computer.
For example, '·NS===M lDS(STRS(N),2) " will convert a positive number N into a
striog NS without the usual leading space for ils numeric sign. Then instead of writing
PR INT#5,N , you would use PRINTII5,NS .
READING FILE DATA: USING GET#
The Get# stateme nt retrieves data from the disk drive, one character at a time . Like
the similar keyboard Get statement in Bas ic, it only accepts a single character into a
specified variable. However, unlike the Gel statement, it doesn't just fall through 10 lhe
nex t statement if there is no data 10 be gOiten. The primary use of ('Jet# is to retnelle from
diskette any data that cannot be read into an Input# statement, either because it is too long
to fi t in the in put buffer or because it includes lroUblesome characters.
where "file: If" is the same fi le nu mber gillCn in the desired file's current Open statement,
and "variable list" is one or more valid Basic variable names. If more than one data
e lement is to be in put by a particular Get# statement, each lIariable name must be
separated from others by a comma.
In practice. you wi ll almost neller see a Get or Getl statement contain ing more than
one lIariable name. If more than one character is needed, a loop is used rather than
addit ional lIariables. Also as in the Inpu tlf statement, it is safer to use stri ng lIariables
when the file to be read might contain a non-n umeric character.
Data in a Getlf statement comes in byte by byte. including such nonnally inllisi ble
characters as the Carriage Return, and the lIariOUS cursor controls. All but one will be read
properly . The exception is C HRS(O), the ASCII Null character. It is d ifferent from an
empt y string(oneoft he fonn AS ", "").ellen though empty strings are often referred to as
null strings . Unfon unately. in a Ge tl statement. CHRS(O) is conllened in to an empty
string. TIle cure is to lest for an em pty string after a Get#", and replace any that are found
with CHRS(O) instead. The first example below illustrates the method.
EXAM PLES:
To read a file that may contain a CHRS(O), such as a mach ine language program fi le,
we could correct any CHRS(O) bytes wi th
If an overlong stri ng has managed to be rttorded in a file, it may be safely read back
in to the computer wi th Get#", usi ng a loop such as this
The limit for such a technique is 255 characters. It will ignore CHRS(O), Du tthat may be
an adllantage in building a text stri ng.
52
GetI' may be espedally useful in recovering damaged files, or files with unkoown
contents , The Ba~ic reserved varia ble ST (the file STatus variable) can be used to indicate
when all of a properly-closed file has been read.
500 GET*2,SS
510 SU = ST:REM REMEMBER FILE STATUS
520 PRINT S5:
530 IF SU=OTHEN 500:REM IF THERE'S MORE TO BE READ
540 IF SU<> 64 THEN PRINT "STATUS ERROR: ST = ":SU
Copying ST into SU is often an unneccessary precaution. but must be done if any other
file -handling stateme nt appears between the one which read from the file and the one that
loops back to read again. For example. it would be required if line 520 was changed to
Otherwise, the file status checked in line 530 would be that of the write file, no! the read
file .
53
DEMONSTRATION OF SEQUENTIAL FILES
Use the (ollowing program for your first experiments with sequential files.
Comments have been added to help you better understand it.
54
CHAPTER 6
RELATIVE DATA FILES
THE VALUE OF RELATIVE ACCESS
Sequential files are very useful when you're j uS! worting with a conti nuous stream of
data - i.e .. infonnation thai can be read or wriuen all at once. However. sequential files
are not useful or desirable in some situations. For eumple, after writi ng a large list of
mail labels. you wouldn't want to have to re-read the enti re list each time you need a
person's record. Instead . you need some kind of random access, a way to get to a
particular label in you r file without having to read through allthosc preceding it firs!.
As an example, compare a record turntable with a cassette recorder. You have to
listen to a cassette from beginning to cnd, but a turntable needle can be: picked up at any
time. and instantl y moved to any spol on the record. Your disk drive worts like a fUmtable
in thai respect. In this chapler we wi tl team about a type of file that re flects this flexibility.
AClUall y. two different types of random access files may be used on Commodore
disk drives: re lative fi les and random fi les. Relative files are much more convenient for
most data handling operations, but true random access file commands arc also available to
advanced users. and will be discussed in the nex t chapter.
When leaming about sequential files, we did not won)' about the organization of data
within a file, so long as the variables used m write the file matched up properly with those
which read it back into the computer. But in order for relative access to work, we need a
more structured and predictable environment for our data .
The structure we will use is similar to that used in the traditional filing cabinet. In a
traditional office, all customer records might be kept in a single file cabinet. Within this
file , each customer has a personal record in a file folder with their name on it, that
contains everythin g the office knows about that person. Likewise, wi thin each file folder.
there may be many small slips of paper, each containing one bit of information about that
customer, such as a home phone number, or the date of the most recent purchase.
In a computerized office. the file cabinet is gone, but the concept of a file containing
all the information about a group or topic remains. The file folders arc gone too. but the
notion of subdividing the file inlO individual records remains. The slips of paper wi thin
the personal records are gone too, replaced by subdivisions within the records, called
fields. Each field is large enough to hold one piece of information about one record in the
file . Thus, wi thin each file there are many records, and within each record there are
typically many fields.
A relative file takes care of organizing the records for you, numbering them from I to
whatever, by ones, but the fields are up to you to organize. Each record will be of the
same size, bUl the 154 1 won't insist that they all be divided the same way. On the other
hand , they normally will all be subdivided the same way, and if it can be known in
advance exactly where each field starts within each record, there are even fast ways to
access a desired field within a record without reading through the other fields . As all of
this implies, access speed is a primary reason for putting information into a re lative disk
file. Some well-written relative file programs are able to find and read the record of one
55
desired pen;on out of a thousand in under 15 seconds. a feat no sequential file program
could mutch.
FILE LIMITS
One of the nicest aspects o f relative files is that all this is done for you wi thout your
having to worry at all abou t exacll y where on the diskelle's surface a given record will be
stored , or whether it will fit properly within the current disk sector. or need to be extended
onto the next available sector. DOS takes care of all that for you. All you need to do is
specify how long each record is. in bytes. and how man y records you will need. OOS will
do the res!. and organi ze things in such a way that it can quickly find any record in the fi le.
as soon as it is given its record number (ordinal position within the file).
111e only limit that will concern you. is that each record must be the same size. and
the record length you choose must be between 2 and 254 characters. Naturally the entire
file also has to fit on your diskette too, which means that the more records you need. the
shorter each must be .
When a re lative fi le is to be used for the first time. its Open statement will create the
file; after that. the same Open statement will be used [0 re-open the fi le for both reading
and writing.
OPEN file II. device II . channel #-, "drive II : file name. L." + C HRS (record
length)
whe re' 'file II " is the fi le number. nonnally an integer between I and 127; . 'device #-" is
the device number to be used, nonnall y 8 on the 154 1; "channel II" selects a panicular
channel along which communicatio ns for this file can take place. nonnall y between 2 and
14; " drive II" is the dri ve number. always 0 on the 1541 ; and " file name" is the file
name. wi th a maximum length of 16 characters. Pallem matching characters are allowed
in the name wben accessing an existing fi le. but not when creating a new one . The
"record length " is the size of each record within the file in bytes used. including carriage
returns. qU$, tion marks and other special characters.
"
Notes:
J. Do not precede the drive number with the "at" sign (@);there is no reason
to replace a relative file .
2. ,L ," + CHRS(record length) is only required when a relative file is first
created, though it may used later, so long as the "record length" is the same as
when the file was first created. Since relative files may be read from o r written to
alternately and with equal ease, there is no need to specify Read or Write mode
when opening a relative file.
3. "file II", "device II" and "channel II" must be valid numeric constants,
variables or ell.pressions. The rest of the command must be a valid Siring literal.
variable or expression.
4. Only I selath'e file can be open at a time on the 1541 , although a sequential
file and the command channel may also be open at the same time .
EXAMPLES:
To create or re-open a relative file named "GRADES ", of record length 100, use
To re·open an unknown relati'le file of the user's choice that has already been
created, we could use
When a relative file is opened for the first time. it is not quite ready for use. Both tQ,
save time when using the file later, and to assure that the file will work reliably, it is
necessary to create several records before clOSing the file for the first time. At a minimum,
enough records to fill more than 2 disk sectOrs (5 12 bytes) should be written. In practice.
most programs go ahead and create as man y records as the program is even tu ally expected
to use. That approach has the additional benefit of avoiding such problems as runn ing out
of room on the diskette before the en tire file is completed.
If you si mply begin writing data to a just·opened relative file, it will act much like a
sequential file, puning the data elements wrinen by the first Printll statement in Record
#1, those written by the second Print# statement in record ff2 and so on. (As this
implies, each relative record must be wrinen by a si ngle Print# statement , using embed·
ded carriage returns within the data to separate fields thai will be read in v ia one or more
Inpulff statements later.) However, it is far better to explicitly specify which recoro
number is desired via a Record# command to the disk. This allows you to access recoros
in any desired order, hopping anywhere in a file with equal ease. Properly used. it also
a'loids a subtle error (bug) common to all Commodore disk drives.
57
FORMAT FOR THE RECORD# COMMAND:
PRINT# IS, " p" +CHR$ (channel # +96) + CHR$ «record If) + CHR$
(>record If ) + CHRS (offset)
where "channel 'If" is the channel number specified in the current Open statement for the
specified file, "<record II" is the low byte of the desired record number, expressed as a
two byte integer, ">record 'If " is the high bYle of the desired record number, and an
optional "offset" vaiue, if present. is the bYle within the record at which a following
Read Of Write should begin.
To fuJl y understand this command, we must understand how rta>St integers are stored
in computers based on the 6502 and related microprocessors . In the binary arithmetic used
by the microprocessor. il is possible to express any unsigned integer from 0-255 in a
single byte. II is also possible to store any unsigned integer from 0-65535 in 2 bytes, with
I byte holding the part of the number that is evenly divisible by 256, and any remainder in
the other byte. In machine language. such numbers arc wrillen backwards. with the low.
order byte (the remainder) first. followed by the high order byte . In assembly language
programs wrillen with the Commodore Assembler. the low part .)f a two byte number is
indicated by preceding its label with the less·than character «). Similarly, the high part
of the number is indicated by greater-than ( » .
EXAMPLES:
To position the record pointer for file number 2 to record number 3, we could type:
The CHRS(98) comes from adding the constant (96) to the desired channel number (2).
(96+2=98) Although the command appears to work even when 96 is nOl added 10 the
channel number, the constant is normally added to maintain compatibililY with the way
Record# wor\c.s on Commodore's C8M and PET computers .
Since 3 is less than 256, the high byte of its binary rcpreM!ntation is 0, and the entire
vatue fits into the tow byte. Since we want to read or writc fmm the beginning of the
record, no offset value is needed.
Since these calculations quickly become tedious, most progntm~ arc wrillen to do
them for you. Here is an example of a prognl.m which inputs a record number and converts
it into the required low byte/high byte form:
58
450 INPLIT" RECORO II OESIREO";RE
460' IF RE< I OR RE > 65535 T HEN 450
410 RH = INT(REJ256)
480 RL = RE-256·RH
490 PRI NTI 15, "P" + C HRS (98) +CHRS (RL) + CHRS (RH )
Basic 4,0 on Commodore 's PET and CBM models includes a Basic Record#
command not fou nd in any of the serial bus computers . However, some available
utility programs for these models include il. It serves the same function as the
Recordl command ex plained above, but has a simplified syntax:
where "file II " is the relative file number being used, not the command c han nel's
fi le, "record II" is the desired record nu mber, and " offset" is as above.
If you .see a Recoro l command wri lten in Basic 4 fonn in a program you want
to use , simply conven it into the usual fonn for both Basic 2 and 3.5 described in
this section.
Now that we have learned how to use both the Open and Recordll commands, we are
almost ready to properly create a re lative file. The only additional fact we need to know is
that C HRS(255) is a special character in a relative file. It is the character used by the DOS
to fi ll re lative records as they are created , before a program fi lls them with other
infonnation . Thus, if we. want to write the last record we eKpect to need in o ur fi le with
dummy data that will not interfere with our later work., CHRS(255) is the obvious choice.
Here is how it works in an actual program which you may copy for use in you r own
relative file programs,
59
14 10 OPEN 1,8,2. "0:"+ FIS+" .L," +CHR,S(RL) Begin to create desired fi le
1420 GOSUB 59990 Check for disk errors
1430 RH = INT(NRI256) Calculate length values
1440 RL = NR-256·RH
1450 PRI NT#15. "P" +CHR,S(96+2)+
CHRS(RL) + CHRS(RH ) Position to last record
number
1460 GOSUB 59990
1470 PRINT# I,CHRS(255); Send default character to it
1480 GOSUB 59990
1490 PRI NT# IS, •. p" +CHRS(96+2)+ Re-pos ition for safety
CHRS(RL) + C HR,S(RH )
1500 GOSUB 59990
1510 CLOSE I Now the file can be safely
closed
1520 GOSUB 59990
9980 CLOSE 15 And the command channel
closed
9990 END Before we end the pro-
."m
59980 REM C HECK DISK SUBROUTINE
59990 INPUT # 15,EN,EMS. ET .ES
60000 IF EN> I AND EN <> 50 THEN PRI NT
EN,EMS,ET_ES:STOP Ignore " RECORD NOT
PRESENT"
600 10 RETURN
Two lines require addi tional e~planat iop. When line 1470 e~ecu tes. the disk drive will
operate for up to te n or more minutes, creating all the records in the fi le, up to the
muimum record number you selected in line 1390. This is normal. and only needs to be
done once. During the process you may hear the drive motor turn ing and an occasional
slight click as the head steps from track to track , everything is probably just fine . Second.
line 60000 above is different from the equivalent line in lhe error check subroutine given
earlier. Here disk error number 50 is specifically ignored. because it will be generated
when the error channel is chel;ked in line 1460. We ignore it because not havi ng a
requested record would only be ali error if that record had previously been created.
What if you underesti mate your needs and need to e~ pand a relative file later? No
problem . Simply request the record number you need. even if it docsn'l currently exist in
the file . If lnere is no such record yet. DOS will create it as soon as you try to write
information in il. and also automatically create any other missing records below it in
number . The only penalty will be a slight ti me delay while the Tet:ords are created.
WRIT ING RELATIVE FILE DATA
The commands used to read and wri te re latiye file data are the same Print #, Input#,
and Get# commands used in the preceding chapter on Sequential files . Each command is
used as descri bed there . Howeyer. some aspects of relative file access do differ from
sequential file programming, and we will cover those differences here.
As stated earlier in this chapter, each relatiye record has a fixed length, including all
special characters. Within that fixed length. there are two popular ways to organize
various individual fields of infonnation. One is free-fonnat, with individual fields varying
in length from record to record, and each field separated from the next by a carriage return
character (each of which does take up I character space in the record ). The (){hc r approach
is to use fixed-length fields, that mayor may not be separated by carriage retu rns. If fixed
length fields are not all separated by carriage retu rns, you will either need to be sure a
carriage retu rn is in(;luded withi n each 88 character port ion of the record. If this is not
done, you will have to use the Get# command to read the record, at a significant cost in
speed.
Re latiye records of 88 or fewer characters, or final portions of records that are 88 or
fewer characters in length. need not end in a carriage return. J'he 154 1 is sman enough to
recognize the end of a relatiye record even without a final-carriage return . Though the
saYing of a single character isn't muc h. when multi plied by the number of records on a
diskette, the saYings could be Significant.
Since each relatiye record must be: written by a single Print# statement. the recom-
mended approach is to build a copy of the current record in memory before writing it to
disk . It can be collected into a single string yariable with the hel p of Basic's many string-
handling functions, and then all written out at once from that yariable.
Here is an example. If we are writing a 4-line maillabc:I , consisting of 4 fields named
"NAME". " ST REET", "CITY & STATE". and "ZIP CODE". and have a total record
size: of 87 characters. we can o rganize it in either of twO ways:
With fixed length records. the field lengths add up to exactly the record length. Since
the total length is JUSt within the Input buffer size limitation. no carriage return characters
are needed . With yariable length records. we can take advantage of thc vatiab ility of
actual address lengths. While one name conta ins 27 letters. another may have onl y 15.
and the same variability exists in Street and City lengths. Al thou gh variable le ngth records
lose I character per field for carriage returns, they can take advantage of the difference
bl
between maximum field length and average fie ld le ngth . A program that uses variable
record lengths must calculate the total length of each record as it is entered, to be sure the
total of all fi elds doesn' t exceed the space available .
Here is an example of program tines to enter variable length fie lds for the above fi le
design, build them in to a single string, and send them to record number RE in file number
3 (assumed to be a re lative fi le that uses channel num ber 3),
To use the above program lines for the version wi th fixed length fields, we wou ld
alter a few lines as fol1ows :
62
2030 IF LEN(SAS»27 T HEN 2020
2035 SAS= SAS + LEFTS(BU,27-LN)
2040 INPUT"CITY & STATE";CSS
2045 LN = LEN(CSS)
2050 IF LEN(CSS»23 T HEN 2040
2055 CSS=CSS + LEFTS(Bl.$,23-LN)
2060 INPUT"ZIP CODE";ZP$
2065 LN = LEN(ZPS)
2070 I.F LEN(ZPS» \0 THEN 2060
2075 ZPS=ZPS + LEfTS(Bl.$, IO-LN)
2080 DAS = NAS + SAS + CSS + ZPS Note lack of separators
2120 RH = INT(REJ256)
2130 RL = RE-256 t RH
2140 PRI NT#15, " P" +CHRS(96+ 3) +
CHR$(RL) + CHRS(RH l + CHRS ( I)
2 150 GOSU B 59990
2160 PRI NT#3.DAS; Note added semicolon
2170 GOSU B 59990
2180 PRINTNI5,"P" +CHRS(96+ 3) +
CHRS(RL) + CHRS( RH )+CHRS ( I)
2190 GOSU B 59990
If fie ld contents vary in length. variable field lengths are often preferable. On the
other hand, if the field lengths are stable. fixed fie ld lengths are preferable. Fixed length
fields are also required if you want to use the optional offset parameter of the Record#
command to point at a particular byte wi th in a record. However, one warning mus t be
made about using the offset this way. When any part of a record is written. OOS
overwrites any re mai ning spaces in Ihe record. Thus, if you must use the offset option.
never update any field in a record other than the last one unless all succeeding fields will
also be updated from memory later.
1be above programs are careful to matc h record lengths exaclly to the space
available. Programs that don 'I do so will discover that OOS pads short records out to full
size with filt characters, and t~ncates overlong records to fill only their allotted space.
When a record is lruncated, DOS will indicate error 5 1. " RECORD OVERFLOW". bul
short records will be accepted without a DOS error message.
Once a relative record has been written properly to diskelle, readi ng it back inlO
computer memory is fai rly simple, but the procedure again varies, dependi ng on whe ther
it uses fi xed or variable length fie lds. Here are the program lines needed to read back the
variable fields crealed above from record nu mber RE in file and channel 3:
63
3030 GOSUB 59990 Check for disk: crrors
3040 INPUT# I ,NAS,SAS,CSS,ZPS Read in fi elds
3050 GOSUB 59990
3060 PRI NT#15,"P" +CHRS(96+ 3)+
CHRS(RL) + C HRS(RH) Re-position for safety
Here are the lines needed to read back the version with fixed length fields:
This ends our discussion of n'l.l(lve files. A complete " RELATIVE ALE" program,
similar to the examples in this ch.!plc·r. is includcd on (he TeslfDemo diskette.
In the last two chapters we have learned how to use sequential and relative files
separately . But they are often used together, with the sequential file used to keep brief
records of which name in the relative file is stored in each record number. That way the
contents of the sequential file can be read into a string array and sorted alphabetically.
After sorting, a technique known as a binary search can be used to very quickly find an
entcred name in the array, and read in or write the associated record in the re lative file.
Advanced programs can maintain two or more such index fi les, sorted in differing ways
simultaneously.
64
CHAPTER 7
DIRECT ACCESS COMMANDS
A TOOL FOR ADVANCED USERS
Direct access commands spedfy individual seeton on the diskette. reading and
writing information entirely under your direction . This gives them almost complete
flexibility in data- handling praBrams. but also imposes tremendous responsibilities on the
programmer •.JlO be su re nothing goes awry . As a result. they are normally used only in
com plex commercial programs able to properly organize data without help from the disk
drive itself.
A far more common use of direct access commands is in utility programs used to
view and alter pans of the diskette that are not normally seell directly. For instance. such
commands can be used to change the name of a diskette without erasing all of ils
programs. to loc k a program so it can' , be erased. or hide your name in a location where it
won't be expected .
DISKETTE ORGANIZATION
There arc a tOlal of 683 blocks on a 1541 di skette. of which 664 are available for use.
with the rest reserved for the BAM (Block Availability Map ) and the Directory .
The diskette's surface is divided into tracks. which are laid out as concentric circles
on the surface of the diskette. There are 35 different tracks, starting with track I at the,
ou tside of the diskelle to track 35 at the ce nter. Track 18 is used for the directory, and the
DOS fills up the diskette from the cente r outward. allemately in both directions.
Each track is su bdivided into sectors (a lso called blocks). Because there is more
room on the oute r tracks, there are more sectors per track there. The outermost tracks
contain 21 sectors each. while the innermost ones only have 17 sectors eac h. The table
below shows the number o f sectors per track.
In this chapler we will deseribe the DOS com mands for direc tly reading and writing
any track and block on the di skeue, as well as the commands used to mark blocks as used
or unused. Unless otherwise notes. all dire<:t access commands are the same in both Basic
2 and Basic 3.5.
When working wi th direct access data. you· need two channels ope n to the disk : the
command channel we've used throughout the book, and another for data. The command
<' hannel is opened with the usual OPEN 15.8,15 or equivalent. A direct access data
.5
channel is opened much like other files. exce~ that the pound sign (#), o~ ionall y
followed by a memory buffer number, is used as a file name.
where "file #" is the file number. "device #" is the disk's device number, normally 8;
"channel #" is the channel number, a number between 2 and 14 that is oot used by other
files open at the same time; and "buffer #", if present, is a O. I, 2, or 3, specifying the
memory buffer within the 1541 to use for this file's data .
EXAMPLES:
If we don 'I specify which disk buffer to use. the 1541 will select one:
OPEN 5,8,5."#"
BLOCK·READ
The purpose of a Block Read is to load the contents of a specified sector into a
file buffer. Although the Block Read command (B-R) is still part of the DOS
command sct, it is nearly always replaced by the UI command.
PRINT# 15, "UI "; channel II; drive II: track #; sector II
where "channel II" is the channel number specified when the file into which the block
will be read was opened. "drive #" is the drive number. always 0 on the 154 1, and
"track #" and "sector #" are respectively the track and sector numbers containing the
desired block of data to be read into Ihe file buffer.
66
EXAMPLE:
Here is a complete program to read a sector into disk memory usi ng U I. and from
there into computer memory via Get# . (If a carriage return will appear at least once in
every 88 characten of data, Input# may be used in place of Get#).
As the loop progresses. the contents of the specified track and sector arc copied into
computer memory. beginni ng at the address set by variable MB in line 160. and may be
examined and altered there, This is the basis for programs like "DISPLAY T & S" on the
Test/Demo diskette.
8LOCK·WRITE
The purpose of a Block Write is to save the contents of a fi le buffer into a specified
sector. It is thus the reverse of the Block Read command. AlthouSh the Block Wri te
command (B· W) is still part of the DOS command set, it is nearly always replaced by the
U2command.
where "channel #" is the channel number specified when the fi le into wh ich the block
will be read was opened; "drive if" is the drive number (always 0 on the 1541); and
"track #" and "sector #., are respectively the track and sector numbers that should
receive the block of data being saved from the fi le buffer.
61
EXAMPLES:
To restore track 18. sector I of the directory from the disk buffer lilled by the Block
Read example on page 82, we can use
We'll return to this example on the next page, after we learn to alter the directory in a
useful way ,
We can also use a Block Write to write a name in Track I. Sector I, a rarely-used
sector. This can be used as a way of marking a diskette as belonging to you. Here is a
program to do it, using the alternate form of the Block Write command:
Although the Block Read and Block Write commands are nearly always replaced by
the VI and U2 commands respectively. the original commands can 5t il1 be used. as long
as you full y understand their effects. Unli ke V I and U2. B-R and B-W allow you to read
or write less than a fult sector. In the case of B-R. the lirst byte of the selected sector is
used to set the buffer pointer (see next section). and determines how many bytcs of thaI
sector are read into a disk memory buffer. A program may check to be sure it doesn't
attempt to read pas' the end of data actually loaded into the buffer. by watching for the
value of the file stat us variable ST to change from 0 to 64. When the buffer is wrillen back
to diske tte by S-W, the first byte wrinen is the current value of the buffer pointcr. and
only that many bytes are wrillen into the specified scrtor. B-R and B· W may thus be
useful in working with custom-designed file structures.
FORMAT FOR THE OR IGINAL BLOCK- READ AND BLOCK-WR ITE COM-
MANDS:
,""
PRINT#1 5." BLOCK·WRITE":channcl #;drivc * :track * :scctor *
68
abbreviated as: PRINTfl.15,"B-W ":channel fI. :drive fI.;track fI. ;sector fI.
where "channel II " is the channel number specified when the file into which the block
will be read was opened, " dri ve II" is the drive number (always 0 on the 1541), and
" track II " and "sector II" arc respectively the track and sector num bers contai ning the
desired block of data to be panially read into or written from the file buffer.
IMPORTANT NOTES:
The buffer pointer points to where the next Read or Write will begin within a disk
memory buffer. By moving the buffer pointer, you can access individual bytes within a
block in any order. This allows you to edit any ponion of a sector, or organize it into
fields, like a relative record ,
where "channel II " is the channel number specified when the file reserving the buffer
was opened, and "byte" is the character number within the buffer at which to point.
ALTERNA TE FORMATS:
EXAMPLE:
Here is a program that locks the first program or file on a 1541 diskette. It works by
reading the Slart of the direc tory (Track 18, Sector 1) into disk memory , setting the buffer
69
pointer to the first file type byte (sec Appendix C for details of directory organization),
locking it by setting bit 6 and rewri ting it.
Afte r the above program is run, the first file on that diskette can no longer be erased. If
you later need to erase that file, re·run the same program, but substitute the revised line
160 below to unlock the file agai n:
ALLOCATING BLOCKS
Once you have written something in a particular sector on a diskeue with the help of
direct access commands, you may wish to mark that sector as "already used ," to keep
other files from being written there. Blocks thus "allocated" will be safe until the diskette
is validated .
where "drive #" is the dri ve number, always 0 on the 154 1, and "track II" and "sector
II" are the track and seclor containing the block of data 10 be read into the file buffer.
ALTERNATE FORMAT:
EXAMPLE:
If you try to allocate a block that isn't available, the DOS will sel the error message
to number 65, NO BLOCK, and set the track and block numbers in the error message to
70
the next available track and block number. 1lIerefore, before selecting a block to write,
try to allocate that block. If the block isn't available ; read the next available block from
the error chan nel and allocate it instead. However, do not allocate data blocks in the
di rectory track. If the track number retu rned is 0, the diskette is fu ll .
Here is a program that allocates a place to store a message on a diskette.
FREEING BLOCKS
The Block-Free command is the opposite of Block-Allocate. It frees a block that you
don't need any more, for re-use by the DOS . Block-Free updates the BAM to show a
particular sector is not in use. rather than actually erasing any data.
where " drive #" is the drive number (alwaysOon the IS4 1), and "track/!" and "sector
#'. are respectively the track and sector numbers containing the desired block of data to
be read into the file buffer.
ALTERNATE FORMAT:
71
EXAMPLE:
To free the sector in which we wrote our name in the Block Write example. and
allocated in the first Block-Allocate example, we could use the following command:
72
CHAPTER 8
INTERNAL DISK COMMANDS
Expert programmers can give commands that directly alte r the worki ngs of the 1541,
much as skilled programmers can alter the worki ngs of Basic inside the computer with
Peeks. Pokes and Sys calls. It is also possible to write machine language progra'Vs that
load and run enl irely within the 1541, ei ther by writing them into disk memory from the
computer , or by loading them directly from diskette into the desi red disk memory buffe r .
In use, this is similar to loadi ng and running machine language programs in your
computer.
As when learning to use PeckO. Poke and Sys in your computer. extreme caution is
advised in using the commands in this cha pter. They are esse nt ially ma(;hinc language
com mands, and lack all of Basic's safeguards . If anyt hing goes wrong. you may have to
tum the di sk drive off and on again (after removing the diskette) to regain control. Do not
practice these comm ands on any important diskette. Rather. make a spare copy and work
with that. Knowing how to program a 6502 in machine language will help greatly. and
you will also need a good memory map of the 1541 . A brief 1541 map appca~ below.
Location Purpose
2K of RAM memory
OOOO-OOFF Zero page work area: job queue. important variables & pointe rs
OJ(X)-Ol FF Stack work area
0200-02FF Command buffers & tables: channels. parser. out put. variables
0300-07FF Data buffers 0-4. I per page of memory .
Input/Output chips
ISOO- JSOF 6522 VIA: 1/0 to compu ter
lCOO-ICOF 6512 VIA: If0 to disk controller
Two 8K Disk Operating System ROMs
ClOO-F25S Interface Processor: receive & interpret commands from computer
F259-FE66 Aoppy Disk Controller: executes JP' s commands, controls mecha -
nism
FE67-FES4 IRQ handler: switches from ]P to FOC & back every 10 ms.
FES5-FEE6 ROM tables & constants
FEE7-FFOF Patch area
FFE6-FFFF JMP table: User command vectors
13
Other- Resour-ces:
More detailed infonnation about Commodore disk drives can be found in these
books:
Inside Commodore OOS, by Immers & Neufeld (Datamost, cI984)
The Anatomy of the 1541 Disk Drive, by Englisch & Szczepanowski
(Abacus, cl984)
Programmi ng the PET/CBM, by West (Level Limited, c 1982)
The PET Personal Computer Guide. by Osbome & Strasmas
(Osbome/McGraw·HiII. c 1982)
MEMORY· READ
Note: Unlike other disk commands, those in this chapter cannot be spelled ou t in
full . Thus, M-R is correct, but MEMORY· READ is nOf a permitted alternate
word ing.
where "<address" is the low order par1. and " > address" is the high orde r part of the
address in disk memory to be read. If the optional "If- of bytes'· is specified. it selects
'how many memory locations will be read in , from 1-2SS. Otherwise, I character will be
read. If desired, a colon (:) may follow M-R inside the quotation marks .
The next byte read usi ng the Getif- statement through channel II I S (the error
channel), will be from that address in the disk controller's memory, and successive bytes
will be from successive memory locations.
Any Input# from the error channel will give peculiar results when you're uiing this
command. This ca n be cleared up by sendin g any other command to the disk, except
another memory command.
74
EXAMPLES :
To see how many tries the disk will make to read a particular sector. and whcther
"seeks" one-half track to each side will be attempted if a read fails. and whether
"bumps" to track one and back will be attempted before declaring the sector unreadable.
we can'use the follow ing lines. They will read a spetial variable in the zero page of disk
memory, called REVCNT. It is located at S6A hexadecimal ($6A hexadecimal = 6 x 16
+ 10 = \(6),
Here's a more general purpose program that reads one or more locations anywhere in disk
memory:
MEMORY-WRITE
The Memory-Write command is the equivalent of the Basic Poke command. but has
its effect in disk memory instead of within the computer, M- Wallows you to write up to
34 bytes at a time into disk memory . 1be Memory-Execute and some User commands can
be used to run any programs writlen this way .
75
FORMAT FOR THE MEMORY-WR ITE COMMAND:
where "<address" is the low orde r part. and ">address" is the high o rder part of the
address in disk memory to begin writing ... # of bytes" is the number of memory
locations that will be written (from 1-34), and "data byte" is I or more byte values to be
written into disk memory, each as a CHRS() val ue. If desired, a colon (:) may follow M-
W within the quolalion marks.
EXAMPLES :
We can use this line to tum off the "bumps" when loading DOS- protec ted programs (i.e .•
programs that have been protected against being copied by creating and chec king for
specific dis k errors).
PRINT 1115 •. 'M-W' 'CH RS( I 06)CB RS(O)C HR'S( I )CHRS( 133)
The following line can be used to recover bad seCIOrs, such as when an important fi le has
been damaged and cannot be read nonnally,
The above two exam ples may be very useful under some circumstances. They are the
equi vale nt of POKE 106,133 and POKE 106.31 respectively. but in disk memory. not
inside the com pUler. As mentioned in the previous section's first example. location 106 in
the 1541 disk drive signifies three separate ac tivi ties to the dri ve. all related to error
recovery. Bit 7 (the high bit), if set means no bumps (do n ' I thump the drive back to track
I). Bit 6, ifsel . means no seeks. In that case, the drive won't attempt to read the half-track
above and below the assigned track to see if it can read the data that way. The bottom 6
bits are the count of how many times th e disk will try to read eac h sector before and afler
trying seeks and bumps before giving up. Since 31 is the largest number thai can be
expressed in 6 bits. that is the maximum number of tries allowed.
From this example. you can see the value of knowing something about Peeks. Pokes.
and machine-language before using direcl-access disk commands, as well as their poten-
tial power.
76
MEMORY-EXECUTE
Any routine in disk memory, either in RAM or ROM , can be executed with !he
Memory-Execute command. It is the equivalent of the BasK: Sys ca1l 10 a machine
language program or subrouline. but works in disk memory instead of within !he com·
puter.
where "<address" is lhe low order part, and ">address" is the hi gh order part of !he
address in disk memory at which execution is 10 begin .
ALTERNATE FORMAT:
EXAMPLE:
Here is a Memory-Execute command thai docs absolutely nothing. The first instruc-
lion it executes is an RTS, which ends the command:
A more plausible use for this command would be to artifiCially uiger an error message.
Don't forgello check !he error channel, or you'll miss the message:
However, most uses require intimate knowledge of the inner workings of the OOS, and
preliminary setup with other commands, such as Memory-Write .
BLOCK· EXECUTE
This rarely-used command will load a sector conlllining a machine language routine
into a memory buffer from diskette, and execute it from the first kx:atm within the
buffer, unlil a ReTurn from Subroutine (RTS) instruction ends the command.
where "channel #" is the channel number specified when the file into which the block
will be loaded was opened, "drive #" is the drive number (always 0 on the 1541). and
"track II" and "sector # " arc respectively the track and sedor numben containing the
desired block of data to be loaded into the file buffer and eleculed there .
77
ALTERNATE FORMATS:
EXAMPLES:
Assu ming you've written a mac hine language program onto Track 1. Sector 8 of a
diskette. and would like to run it in buffer number I in disk memory (starting at S0400
hexadecimal. you could do so as follows:
USER COMMAN DS
Most User commands arc intended 10 be used as machine language JMP or Basic
SYS commands to machine language programs that reside inside the disk memory.
However, some of them have other uses as well . The Use rl and User2 commands arc used
to replace the Block-Read and Block-Write commands, UI re-starts the 1541 without
changing its variables. UJ cold-stans the 154 1 almost as if it had been turned off and on
again, and UI- speeds up the 1541 when used with the VIC 200nly . (Note: VIC 20 owners
don't have to use UI-; the 1541 works wi th the VIC 20, with or without this command.)
By loading these memory locations with another milchine language JMP command,
such as JM P $0520, you can create longer routines that operate in the disk's memory
along with an easy-to-use jump table.
"
FORMAT FOR USER COMMANDS:
where "character" defines one of the preset user commands listed above.
EXAMPLES:
19
CHAPTER 9
MACHINE LANGUAGE PROGRAMS
Here is a list of disk-related Kemal ROM subroutines and a practical example of their
use in a program which reads a sequential file into memory from disk. Note that most
require advance sctup of one or more processor registers or memory locations, and all are
called with the asse mbl y language J$R command .
For a more complete description as 10 what each routine does and how parameters are
set for each routine, see the Programmer's Reference Guide for your specific computer.
Address Function
SETLFS • SFFBA ;SET LOO ICAL, FIRST & SECOND ADDRESSES
SETNAM • SFFBD ;SET LENGTH & ADDRESS OF F ILENAME
OPEN SFFCO ;OPEN LOGICAL FILE
CLOSE SFFC3 ;CLOSE LOG ICAL FiLE
CHKIN $FFC6 ;SELECT CHANNEL FOR INPUT
CHKOUT • SFFC9 ;SELECT CHANNEL FOR OUTPUT
CLRCHN SFFCC ;CLEAR ALL CHANNELS & RESTORE
DEFAULT UO
CHRIN SFFCF :GET BYTE FROM CURRENT INPUT DEVICE
(HROUT SFFD2 ;OUTPtrr BYTE TO CURRENT OUTPUT
DEVICE
80
APPENDIX A: CHANGING THE DEVICE NUMBER
"(H·.WARE METHOD
The pre ferred way to temporarity change the device number of a disk drive is via a
program. When power is first tumed on. the drive reads an 110 location whose value is
controlled by a jumper on its circuit board. and writes the device number il reads there into
memory locations 119 and 120. Any time the reafter, you may write over thaI de vice
numrer wi th a new one, which will be effective until it is changed again. or the 1541 is
reset.
EXAMPLE:
Note: If you will be using two di sk drive s. and wan! to temporarily cha nge the
device number of one. you will need to ron the above program with the di sk dri ve
whose dev ice nu mbe r is not to be changed turned off. Afte r the program has been
ron . yo u may IlIm that drive back on. If you need to connect more than two drives
at once. yo u will need to use the hardware method .of chan ging dev ice numbers.
although you m.. ~ be able to get by in an emerge ncy by unpl uggi ng the se rial bus
table from dnves whose device number has already been set while changing others.
This IS not recommended. however. as there is always dange r of damaging
clectrolllc devke~ when plugging in cables with the power on.
HARDWARE METHQI>
IMPORTANT: Using the fot lowing method mchange the device number will void
the 1541 Disk Drive warranty!
Bl
If you have more than one drive, either you or preferably your dealer may penna-
nendy change the address of all afte r the first, to avoid having to run the program on the
previous page before eac h use of multiple drives. The only tools needed to make the
change are a Phillips-head screwdriver and a sharp knife.
Note: If you make a mistake, perhaps CUlling the wrong jumper, or your needs
change later , a cui jumper can be restored with a small dot of electrical solder.
However. do not attempt this yourself unless you are already skilled at electronic
soldering.
82
APPENDIX B: DOS ERROR MESSAGES AND LIKELY CAUSES
Note: Many commercial program diskettes are intentionally created with one or
more o f the following errors, to keep programs from being improperl y duplicated .
If a disk error occurs while you are making a security copy of a commercial
program diskette. check. lhe program's manual. If its copyright statement docs not
penni! purchasers 10 copy the program for their own use, you may not be able to
duplicate the diskette . In some such cases, a safety spare copy of the program
diskette is available from your dealer or directly from the company for a reasonable
fee .
NOTE: If an y other error message numbers less than 20 ever appear, they may be
ignored. All true errors have numbers o f 20 or more,
8J
24: READ ERROR (byte decoding error)
The data or header has been read into disk memory, but a hardware error has been
created by an invalid bit pauem in the data byte, May indicate grounding problems.
84
39: SYNTAX ERROR (invalid command)
The OOS does not recognize a command sent to the command chanoel (secondary
address 15). Check your Iyping and try again .
61 : FI LE NOT O PEN
A file is being accessed that has not been opened by t he DOS. In some such
cases no error message is generated. Rather the request is simply ignored.
65: NO BLOCK
Occurs in conjunction with 6 -A. The sector you tried to allocate is already
allocated. The track and sector numbers returned are the nellt higher t(ack and
sccmr available. If the track number returned is ze ro (0). all remaining sectors are
full. If the diskette is not fult yet, try a lower track and sector.
85
66: ILLEGAL TRACK AND SECTOR
The OOS has attempted to access a trac k or- sector which does fK)( exist. May
indica te a faulty li nk pointer in a data block.
71 : DIRECTORY ER ROR
The BAM (Block Availability Map) on the diskeue does not match the copy in disk
memory. To correct, Ini tialize the diskeue.
86
PENDIX C: D1SKETIE FORMATS
/ NOTE
/ \ Not to ,cOIk
/ \
/ \
I \
I
\
~
•
87
1541 BLOCK DISTRIBUTION BY TRACK
88
PROGRAM FILE FORMAT
BYTE DEFINITION
ALL BUT f iNAL SECTOR
0- 1 Track and sector of next sequential data block.
2·255 254 bytes of data.
FINAL SECTOR
0, 1 Null (SOO). followed by number of valid data bytes in sector.
2· ??? Last bytes of data. Any re maining bytes are garbage and may be ignored.
89
1541 RELATIVE FILE FORMAT
BYTE DEFINITION
DATA BLOCK
,-.
6-7
I()..II
Track and sector of second side sector (n umber I)
Track and sector of third side sector (number 2)
Track and sector of foonh side sector (number 3)
12-13 Track and sector of fifth side sector (number 4)
14-15 Track and sector of sixth side sector (number 5)
16-255 Track and sector pointers to 120 data blocks.
90
1541 DIRECTORY FlLE FORMAT
Track 18, Sector t.
BYTE DEFINITION
0,1 Track and sector o f ne xt directory block.
2-3 1 File entry I·
34-63 File entry 2·
66-95 File entry 3·
98-127 File entry 4·
130-159 File entry 5·
162-19 1 File entry 6-
194-223 File entry 7·
226-255 File e ntry 8-
- STRUcruRE OF EACH IND IVID UAL DIRECTORY ENTRY
BYTE CONTENTS DEFINITION
0 128 File type OR'ed with 580 to indicate properly closed file .
+ (ifOR 'cd with SCO instead , file is locked.)
type TYPES : 0 = DEleted
I = SEQuential
2 = PROGram
3 = USER
4 = RElative
1-2 Track and sector of first data block .
3- 18 File name padded with shifted spaces.
19-20 Rel ati ve file only: track and sector of first s ide
sector block.
21 Relative file only: Record length.
22-25 Unused.
26·27 Track and sector of replacement file 9uring an
@ SAVEor @OPEN .
28-29 Number of blocks in fil e: stored as a two-byte integer.
in low byte . high byte order.
91
APPENDIX D: DISK COMMAND QUICK REFERENCE CHART
General Fonnat: OPEN 15.8, 15:PRI NT * 15.~om ma nd : C LOSE 15 (Basic 2)
HOUSEKEEPING COMMANDS
BASIC 2 NEW "NO:diskcIlC namc.id'·
COPY "CO:new file = O:old tile"
RENAME " RO:new name = old name"
SCRA TCH "SO:filc name"
INITIALIZE " 10"
VA LIDATE "VO"
FILE COMMANDS
92
APPENDIX E: TESTI DEMO DISKETTE
1I0WTO USE
The " HOW TO USE" programs provide brief descriptions of the other programs
on the Test/Demo diskette.
DOS 5. 1
The DOS S.I program is nOt imended to be loaded di rectl y, but is. loaded instead
from the program C-64 WEDGE. lIS load address is SCC00 hexadecimal.
PRINTER TEST
The PRINTER TEST prin ts a listing o f characters in a form that makes it easy to
ched the mechanical and electronic capabilities of the printer.
VIEW BAM
The VIEW BAM program allows a programmer to examine the contents of the sec-
tOrs thai make up the block avai labilit y map (BAM)-the table that DOS uses to identify
blocks that have been allocated to the files on that dis kette.
CHECK DISK
The CHECK DISK program can be used to make sure a new diskene that has been
headered is in fact a good diskette. The program writes to every block to verify its abilily
to store information and identifies any diskelte that contains a bad block. Don't use
such dis kettes.
DISPLAY T&S
The DISPLAY T&S program allows a programmer to examine the contents of a
block by specifying the particular track number and sector number that identifies that
block.
PERFORMANCE TEST
The PERFORMANCE TEST program tests the elearonic and mechanical capabili-
ties of the disk drive whenever necessary. Use this program whenever you suspect there
may be damage to the drive.
91
SEQ. FILE.DEMO AND REL.FlLE.DEMO
These two files are included as programming examples or guidelines when writing
your own programs. They also illustrate the important ta.:hnique of cha.:king the error
channel after each access to the disk drive.
SD.BACKUP.u
These three programs are entitled SD.BACKUP.C64, SD. BACKU P.Cl6, and
SD. BACKUP.PLUS4. Each, when [Ollded into its resptttive computer, allows you to
create an e~act duplicate of a diskette by switching a blank diskette and the diskette to
be copied in and out of the drive at the appropriate limes. Loading and running them
incorrectly may damage a diskette.
PRI NT.u.UTIL
These three programs are actually entitled PRINT.64.UT IL, PR INT.+4, and
PRINT.C I6.UTIL They provide twO functions; a printout of any Text-Mode screen
display. and a listing of the contents of all scaler (non-array) variables in a Basic pro-
gram to screen or printer _Any CBM printer may be used for either funct ion. Printing of
reverse-video and graphics characters depends on the specific printer model used. These
programs can run from tape.
LOAD ADDRESS
LOAD ADDRESS is a simple program that tells you where a program was origi-
nally located in memory. Some programs can only ru n in the same localions from which
they were saved. Load such programs with LOAO"filename",8,1.
UNSCRATCH
Allows you to restore a file that's been deleted (scratched) from a diskette as long as
the dis kette hasn't been written to since the scratch was performed.
HEADER CHANGE
Allows you to rename a diskette withou t losing the data currently stored in the
diskette.
I M PORT AN T N OTE:
Your TestlDemo diskette
may contain additional
programs. Com m odo re
may update the d iskette
f rom time to time.
..