home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CBM Funet Archive
/
cbm-funet-archive-2003.iso
/
cbm
/
manuals
/
drives
/
oc-118.txt
< prev
next >
Wrap
Text File
|
1994-09-27
|
57KB
|
1,756 lines
nOTES:
tHIS DOCUMENT CONTAINS ADDITIONS FROM SEVERAL SOURCES.
iN THE SECTION OF memory COMMANDS, THE SYNTAX SHOWN IS INCORRCT; THE
COMMANDS MUST BE WRITTEN WITHOUT THE ':'.
----------------------------------------------------------------------------
oc-118 5.25" fLOPPY dISK dRIVE fOR cOMMODORE c64
table of contents
pAGE
1.iNTRODUCTION 2
2.sPECIFICATIONS 3
3.iNSTALLATION 5
cABLE cONNECTIONS 5
tURNING oN pOWER 5
dISK iNSERTION 5
4.uSING pROGRAMS 6
uSING pREPACKAGED sOFTWARE 6
tHE dISK dIRECTORY 7
pATTERN mATCHING AND wILD cARDS 8
5.dISK cOMMANDS10
rEADING THE eRROR cHANNEL13
6.sEQUENTIAL fILES16
7.rANDOM fILES16
uSING rANDOM fILES20
8.rELATIVE fILES25
uSING rELATIVE fILES26
9.pROGRAMMING THE dISK cONTROLLER30
10.cHANGING THE DEVICE NUMBER33
sOFTWARE mETHOD33
hARDWARE mETHOD34
aPPENDICES
a.lIST OF cOMMANDS35
b.dESCRIPTION OF eRROR mESSAGES36
c.bam AND dIRECTORY fORMAT dESCRIPTION-
1. iNTRODUCTION
tHE oc-118 dISK dRIVE IS A VERSATILE AND EFFICIENT DISK DRIVE
BUILT FOR THE cOMMODORE SERIES OF PERSONAL COMPUTERS. tHIS DRIVE
IS FULLY COMPATIBLE WITH THE cOMMODORE 64 COMPUTER AND DIRECTLY
REPLACES THE cOMMODORE 1541 dISK dRIVE, GIVING MUCH BETTER
PERFORMANCE IN TERMS OF DATA LOADING AND WRITING SPEED AND MEMORY
BUFFER SIZE.
iF YOU ARE A BEGINNER, THE FIRST FEW CHAPTERS WILL HELP YOU
INSTALL AND OPERATE THE DISK DRIVE. aS YOUR SKILL AND EXPERIENCE
IMPROVES, YOU WILL FIND MORE USES FOR YOUR DISK DRIVE AND THE MORE
ADVANCED CHAPTERS WILL BE VERY HELPFUL.
iF YOU'RE AN EXPERIENCED PROFESSIONAL, THIS MANUAL CAN GIVE YOU THE INFORMATION
YOU NEED TO TAKE ADVANTAGE OF ALL THE oc-118 POWER AND FEATURES.
rEGARDLESS OF THE LEVEL OF YOUR PROGRAMMING EXPERTISE, THE oc-118 WILL
GREATLY INCREASE THE EFFICIENCY AND CAPABILITY OF YOUR COMPUTER SYSTEM.
pLEASE BE AWARE THAT THIS MANUAL IS A REFERENCE GUIDE TO THE OPERATION OF THE
oc-118. wHILE IT CONTAINS STEP BY STEP INSTRUCTIONS AND A SECTION TO LET YOU
EASILY USE PREPACKAGED SOFTWARE, YOU SHOULD BECOME FAMILIAR WITH basic AND THE
COMPUTER COMMANDS THAT HELP YOU OPERATE YOUR COMPUTER AND ITS PERIPHERALS.
rEMEMBER, YOU DON'T NEED TO LEARN EVERYTHING IN THIS MANUAL AT ONCE. tHE FIRST
THREE OR FOUR CHAPTERS WILL LET YOU USE THE DISK DRIVE FOR MOST APPLICATIONS,
AND THE FOLLOWING CHAPTERS TELL YOU HOW TO SET UP FILES, ACCESS ANY DATA, AND
PROGRAM THE DISK DRIVE ITSELF AT THE MACHINE LANGUAGE LEVEL.
notes:iN format EXAMPLES, LOWER CASE WORDS NEED TO BE REPLACED BY
AN APPROPRIATE WORD OR NUMBER THAT YOU CHOOSE.
2. sPECIFICATIONS
oc-118 fLOPPY dISK dRIVE
sLIM LINE CONSTRUCTION (LOW PROFILE) AND FULLY cOMMODORE COMPATIBLE.
dISK SIZE: 5-1/4 INCH DIAMETER.
cAPACITY
pER dISK .....................174.8 KBYTES
dIRECTORY eNTRIES ............144/DISK
sECTOR/tRACK .................17-21
bYTES/sECTOR .................256
tRACKS .......................35
sECTORS/dISK .................683
bam 1
dIRECTORY 18
dATA664
aVERAGE mtbf RATE OF 8000 HOURS.
pOWER rEQUIREMENTS
vOLTAGE ......................117 vac, 220/240 vac OPTIONAL
fREQUENCY ....................50/60 hERTZ
pOWER dISSIPATION ............24 wATTS
mECHANICAL dIMENSIONS
hEIGHT, WIDTH, DEPTH .........268 X 150 X 47.5 MM
wEIGHT .......................2.8 KGS.
oc-118 floppy disk driver
.------------------------------------------------------.
{$7c}__ {$7c}
{$7c} l_{$7c} _______________/-. {$7c}
{$7c}=============================={$7c} {$7c}================ {$7c}
{$7c} {$7c}_____________{$7c}_/{$7c} {$7c}
{$7c} {$7c}
{$7c}______________________________________________________{$7c}
--- ---
RED - ACTIVE
ledGREEN - READY
FLASH - ERROR
.------------------------------------------------------.
{$7c} serial buspoweron {$7c}
{$7c} __ {$7c}
{$7c} (_) (_)(_) {$7c}__{$7c} {$7c}
{$7c} {$7c}__{$7c} {$7c}
{$7c}off {$7c}
{$7c}______________________________________________________{$7c}
--- ---
pEASE, DON'T CONNECT ANYTHING UNTIL YOU'VE COMPLETED THE FOLLOWING
SECTION, OTHERWISE YOU WILL GET DANGER OR TAKE TROUBLE IN YOUR SYSTEM.
3. iNSTALLATION
cable connections
fIRST, PLUG THE POWER CABLE INTO THE BACK OF THE DISK DRIVE.
iT WON'T GO IN IF YOU TRY TO PUT IT IN UPSIDE DOWN. nEXT, PLUG
THE OTHER END INTO THE ELECTRICAL OUTLET. iF THE DRIVE MAKES SOUND ANY
SOUND AT THIS TIME, TURN IT OFF USING THE SWITCH ON THE BACK!
dO NOT PLUG ANY OTHER CABLES INTO THE DRIVE WITH THE POWER ON.
sECOND, PLUG THE SERIAL BUS CABLE INTO EITHER ONE OF THE SERIAL
BUS SOCKETS ON THE BACK OF THE DRIVE. tURN OFF THE COMPUTER AND
PLUG THE OTHER END OF THE CABLE INTO THE BACK OF THE COMPUTER.
yOU'RE READY TO GO!
iF YOU HAVE A PRINTER OR ANOTHER DISK DRIVE, ATTACH ITS CABLE TO
THE REMAINING SERIAL BUS SOCKET TO "DAISY CHAIN" THE DEVICES.
iF IT'S A DISK DRIVE, YOU WILL NEED TO CHANGE ONE OF THE DRIVES
DEVICE NUMBERS.
turning on the power
wHEN ALL THE DEVICES ARE HOOKED TOGETHER, THE POWER MAY BE TURNED ON.
iT IS IMPORTANT TO TURN THEM ON IN THE CORRECT ORDER: THE COMPUTER IS
ALWAYS LAST. aLSO: MAKE SURE THERE ARE NO DISK IN THE DISK DRIVE WHEN
YOU TURN ON THE POWER.
disk insertion
tO INSERT A DISK, SIMPLY TURN THE LEVER TO A HORIZONTAL POSITION, SLIDE
THE DISK IN GENTLY TILL IT STOPS, AND TURN THE LEVER DOWN. tHE DISK GOES
IN FACE UP, WITH THE LARGE OPENING GOING IN FIRST AND THE WRITE-PROTECT
NOTCH (A SMALL SQUARE CUTOUT IN THE DISK) ON THE LEFT.
nEVER REMOVE A DISK WHEN THE DRIVE LIGHT IS ON!
aND REMEMBER, ALWAYS REMOVE THE DISK BEFORE THE DRIVE IS TURNED ON OR
OFF! dATA CAN BE DESTROYED BY THE DRIVE AT THIS TIME!
4. uSING pROGRAMS
using prepacked programs
iF YOU WANT TO USE A PROGRAM ALREADY WRITTEN ON A DISK, SUCH AS A VIDEO
GAME, HERE'S ALL YOU HAVE TO DO.
tURN THE LEVER UP AND INSERT THE THE PREPROGRAMMED DISK SO THE LABEL ON
THE DISK IS FACING UP AND CLOSEST TO YOU. tHERE SHOULD BE A LITTLE NOTCH
ON THE DISK (MAYBE COVERED WITH TAPE) THAT SHOULD BE ON THE LEFT. tURN
THE LEVER DOWN. NOW, TYPE IN load "PROGRAM NAME" AND HIT THE return KEY.
tHE DISK WILL MAKE NOISE AND YOUR SCREEN WILL SAY:
searching for program name
loading
ready
wHEN THE SCREEN SAYS ready, JUST TYPE IN run AND HIT THE return KEY -
YOUR PROGRAM IS READY TO USE!
load command
purpose: tO TRANSFER A PROGRAM FROM THE DISK TO THE COMPUTER'S
CURRENT MEMORY.
format: load"PROGRAM NAME", DEVICE #, COMMAND #
tHE PROGRAM NAME IS A CHARACTER STRING, THAT IS, EITHER A NAME IN QUOTES
OR THE CONTENTS OF A GIVEN STRING VARIABLE. tHE DEVICE NUMBER IS PRESET
ON THE DISK DRIVE'S CIRCUIT BOARD TO BE 8. iF YOU HAVE MORE THAN ONE DRIVE,
READ THE CHAPTER ON CHANGING THE DEVICE NUMBER. tHIS MANUAL ASSUMES YOU'RE
USING 8 AS THE DEVICE NUMBER FOR THE DISK DRIVE.
tHE COMMAND NUMBER IS OPTIONAL. iF NOT GIVEN, OR ZERO, THE PROGRAM IS LOADED
NORMALLY, INTO THE START OF YOUR COMPUTER'S AVAILABLE MEMORY FOR basic
PROGRAMS. iF THE NUMBER IS 1, THE PROGRAM WILL BE LOADED INTO EXACTLY THE
SAME MEMORY LOCATIONS FROM WHICH IT CAME. tHE COMMAND NUMBER 1 IS USED MAINLY
FOR MACHINE LANGUAGE, CHARACTER SETS, AND OTHER MEMORY DEPENDENT FUNCTIONS.
examples:
load "test",8
load "pROGRAM #1",8
load "mACH lANG",8,1
load a$,j,k
caution: bESIDES PUTTING YOUR PROGRAM INTO THE COMPUTER'S CURRENT MEMORY,
load WIPES OUT ANY PREVIOUS PROGRAM THERE!
note:aS IN THE LAST EXAMPLE, YOU CAN USE VARIABLES TO REPRESENT THE
STRINGS, DEVICE NUMBERS, AND COMMAND NUMBERS; JUST BE SURE THEY ARE
ALL PREVIOUSLY DEFINED IN YOUR PROGRAM. aLSO, SEE THE NOTE ON FILE
NAMES ON PAGE 9.
the disk directory
yOUR DISK DRIVE IS A RANDOM ACCESS DEVICE. tHIS MEANS THE READ/WRITE HEAD
OF THE DRIVE CAN GO TO ANY SPOT ON THE DISK AND ACCESS A SINGLE BLOCK OF
DATA, WHICH HOLD UP TO 256 BYTES OF INFORMATION. tHERE ARE 683 BLOCKS ON
A DISK.
fORTUNATELY, YOU DON'T HAVE TO WORRY ABOUT INDIVIDUAL BLOCK OF DATA (CHECK
CHAPTER 5 IF YOU DO). tHERE IS A PROGRAM IN THE DISK DRIVE CALLED THE dISK
oPERATING sYSTEM, OR dos, THAT KEEPS TRACK OF THE BLOCKS FOR YOU. iT ORGANIZES
THEM INTO A bLOCK aVAILABILITY mAP, OR bam, AND A DIRECTORY. tHE bam IS
SIMPLY A CHECKLIST OF THE BLOCKS, AND IS UPDATED EVERY TIME A PROGRAM IS
saveD OR A DATA FILE IS openED.
tHE DIRECTORY IS A LIST OF ALL PROGRAMS AND OTHER FILES STORED ON THE DISK.
tHERE ARE 144 ENTRIES AVAILABLE, CONSISTING OF INFORMATION LIKE FILE NAME AND
TYPE, A LIST OF BLOCKS USED, AND THE STARTING BLOCK. lIKE THE bam, THE
DIRECTORY IS UPDATED EACH TIME A PROGRAM IS saveD OR A FILE IS closeD. iF NOT
closeD PROPERLY, ALL DATA IN THAT FILE WILL BE LOST. mORE ON THIS LATER.
tHE DIRECTORY CAN BE loadED INTO YOUR COMPUTER'S MEMORY JUST LIKE A basic
PROGRAM. pUT THE DISK IN THE DRIVE AND TYPE:
load"$",8
tHE COMPUTER WILL SAY:
searching for $
found $
loading
ready
nOW THE DIRECTORY IS IN CURRENT MEMORY, AND IF YOU TYPE list IT WILL BE
DISPLAYED ON THE SCREEN. tO EXAMINE THE DIRECTORY FROM INSIDE A basic PROGRAM,
SEE CHAPTER 6 CONCERNING THE get# STATEMENT.
pattern matching and wild cards
tO MAKE loadING EASIER, PATTERN MATCHING LETS YOU SPECIFY
CERTAIN LETTERS IN THE PROGRAM NAME SO THE FIRST PROGRAM IN THE
DISK THAT MATCHES YOUR PATTERN IS THE ONE LOADED.
examples:load "*",8(loadS FIRST FILE ON DISK)
load "te*",8(loadS FIRST FILE THAT STARTS WITH te)
load "te??",8(loadS FIRST FILE THAT HAS TOUR LETTERS AND
BEGINS WITH te)
load "t?nt",8(loadS FIRST FILE THAT HAS FOUR LETTERS BUT
COULD BE tint, tent, ET CETERA)
tHE ASTERISK (*) TELLS THE COMPUTER NOT TO WORRY ABOUT THE REST
OF THE NAME WHILE THE QUESTION MARK (?) ACTS AS A WILD CARD.
tHE ABOVE CAN ALSO BE USED WHEN loadING THE DIRECTORY INTO
CURRENT MEMORY. tHIS ALLOWS CHECKING FOR A LIST OF SPECIFIC
PROGRAMS. tHE PROCEDURE IS THE SAME AS ABOVE EXCEPT FOR THE
ADDITION OF A "$:" :
example:load "$:t?st*",8 (loadS ALL FILE NAMES IN THE DIRECTORY
THAT HAVE THE CORRECT FIRST, THIRD, AND
FOURTH LETTERS)
save
purpose: tRANSFER A PROGRAM IN CURRENT MEMORY ONTO THE DISK FOR
LATER USE.
format: save"PROGRAM NAME", DEVICE #, COMMAND #
aS BEFORE, THE COMMAND NUMBER IS OPTIONAL. iF THERE IS ALREADY
A PROGRAM OR FILE BY THE SAME NAME ON THE DISK OR THERE ISN'T
ENOUGH ROOM ON THE DISK, AN ERROR SIGNAL WILL BE GENERATED. iF
THERE ISN'T ENOUGH ROOM, OTHER PROGRAMS WILL HAVE TO BE ERASED OR
USE A DIFFERENT DISK.
example: save"homework",8
save and replace
purpose: rEPLACE AN ALREADY EXISTING FILE WITH A REVISED VERSION.
format: save"@0:PROGRAM NAME",8
iF YOU EDIT AN EXISTING PROGRAM AND WANT TO SAVE IT UNDER THE
SAME NAME, save and replace DOES SO AUTOMATICALLY. iF YOU WANT TO
KEEP THE OLD VERSION, SAVE THE NEW VERSION UNDER A DIFFERENT NAME.
example: save"@0:homework",8
verify
purpose: cHECKS CURRENT PROGRAM WITH ONE ON THE DISK.
format: verify"PROGRAM NAME", DEVICE #, COMMAND #
verify DOES A BYTE BY BYTE COMPARISON OF THE PROGRAM IN CURRENT
MEMORY WITH ONE ON THE DISK, AS SPECIFIED IN THE verify COMMAND.
example: verify"old version",8
note about file names: fILE NAMES MUST BEGIN WITH A LETTER NOT A NUMBER.
sPACES ARE PERMITTED. wHILE THERE IS NO RESTRICTION ON THE LENGTH OF A FILE
NAME, ALL COMMANDS MUST BE 58 OR FEWER CHARACTERS IN LENGTH.
fOR EXAMPLE, IN THE ABOVE verify COMMAND, THERE ARE 10 CHARACTERS BESIDES THE
ACTUAL PROGRAM NAME, SO THE MAXIMUM NAME LENGTH, IN THIS CASE,IS 48 CHARACTERS.
5. disk commands
sO FAR, YOU HAVE LEARNED THE SIMPLE WAYS OF USING THE DISK DRIVE. iN ORDER TO
COMMUNICATE YORE FULLY WITH THE DISK, DISK COMMANDS NEED TO BE USED. tWO OF
THESE, open AND print#, ALLOW THE CREATION AND FILLING OF A DATA FILE ON THE
DISK. jUST AS IMPORTANT IS THEIR ABILITY TO OPEN A COMMAND CHANNEL, ALLOWING
THE EXCHANGE OF INFORMATION BETWEEN COMPUTER AND DISK DRIVE.
open
purpose: cREATES A FILE BY openING A COMMUNICATION CHANNEL BETWEEN
COMPUTER AND DISK DRIVE.
format: open FILE #, DEVICE #, (COMMAND) CHANNEL #, TEXT STRING
tHE FILE NUMBER SHOULD BE ANY NUMBER FROM 1 TO 127. nUMBERS FROM 128 TO 255
CAN BE USED BUT SHOULD BE AVOIDED AS THEY CAUSE THE print STATEMENT TO GENERATE
A LINEFEED AFTER CARRIAGE RETURNS. tHE DEVICE NUMBER IS USUALLY 8.
tHE CHANNEL NUMBER CAN BE ANY NUMBER FROM 2 TO 15. tHESE REFER TO CHANNELS USED
TO COMMUNICATE WITH THE DISK, AND CHANNELS 0 AND 1 ARE USED BY THE OPERATING
SYSTEM FOR loadING AND saveING. cHANNELS 2 THROUGH 14 CAN BE USED TO SEND DATA
TO FILES WHILE 15 IS RESERVED AS THE COMMAND CHANNEL.
tHE TEXT STRING IS A CHARACTER STRING THAT IS USED AS THE NAME FOR THE FILE
CREATED. a FILE CANNOT BE CREATED UNLESS THE FILE NAME IS SPECIFIED IN THE TEXT
STRING. iF YOU ATTEMPT TO OPEN A FILE ALREADY OPENED, THE ERROR SIGNAL
"file open error" WILL BE GENERATED.
examples:open 5,8,5, "test" (CREATES A FILE CALLED test)
open 15,8,15,"i" (SENDS COMMAND TO DISK ON COMM A CHANNEL)
open a,b,c,z$ (THESE VARIABLES MUST BE DEFINED)
print#
purpose: fILLS A PREVIOUSLY openED FILE WITH DATA.
format: print# FILE #, TEXT STRING
tHE print# COMMAND WORKS EXACTLY LIKE THE print COMMAND EXCEPT THE DATA GOES
TO A DEVICE OTHER THAN THE SCREEN, IN THIS CASE THE DISK DRIVE. wHEN USED WITH
A DATA CHANNEL, print# SENDS INFORMATION TO A BUFFER IN THE DISK DRIVE WHICH
THEN loadS ONTO THE DISK. wHEN USED WITH A COMMAND CHANNEL, print# SENDS
COMMANDS TO THE DISK DRIVE. THE COMMAND IS PLACED INSIDE QUOTES AS A TEXT
STRING.
examples: print# 7,c$ (FILLS FILE 7 WITH TEXT STRING c$)
print# 15,"i" (SENDS DISK COMMAND ON COMMAND CHANNEL)
initialize
purpose: iNITIALIZES DISK DRIVER TO POWER UP CONDITION.
format; open 15,8,15, "i" OR
open 15,8,15 : print#15, "i"
sOMETIMES, AN ERROR CONDITION ON THE DISK WILL PREVENT YOU FROM PERFORMING
AN OPERATION. initialize RETURNS THE DISK DRIVE TO ITS ORIGINAL STATE WHEN
POWER IS TURNED ON.
purpose: fORMATS NEW DISK OR RE-FORMATS USED ONE.
format: print#15, "new 0: DISK NAME, ID#"
tHIS COMMAND FORMATS A NEW DISK. iT IS ALSO USEFUL TO ERASE AN ALREADY-
FORMATTED DISK, AS IT ERASES THE ENTIRE DISK, PUTS TIMING AND BLOCK MARKERS ON,
AND CREATES THE DIRECTORY AND THE bam. tHE DISK NAME IS FOR USER CONVENIENCE
WHILE THE ID# IS A 2 DIGIT ALPHANUMERIC IDENTIFIER THAT IS PLACED IN THE
DIRECTORY A EVERY BLOCK ON THE DISK. iF YOU SWITCH DISKS WHILE WRITING DATA,
THE DRIVE WILL KNOW BY CHECKING THE ID#.
examples: open 15,8,15, "new 0: test disk, a1"
open 15,8,15 : print#15# "n 0: my disk, my"
iF THE DISK NEEDS ERASING BUT NOT REFORMATTING, THE SAME
COMMAND IS USED, BUT LEAVE OUT THE ID#.
example:open 15,8,15, "n 0: new info"
scratch
purpose: eRASE A FILE OR FILES FROM THE DISK.
format:print#15, "scratch 0: FILENAME"
tHIS COMMAND ERASES ONE OR MORE FILES FROM THE DISK, MAKING ROOM FOR NEW OR
LONGER FILES. gROUPS OF FILES CAN BE ERASED AT ONE TIME BY NAMING ALL OF THEM
IN ONE SCRATCH COMMAND.
examples:print#15,"s 0: text" (ERASES FILE CALLED text)
print#15,"scratch0: text, 0:test, 0: music"
(ERASES FILES text, test AND music)
copy
purpose: dUPLICATE AN EXISTING FILE.
format:print#15,"copy 0:NEWFILENAME=0: OLDFILENAME"
copy ALLOWS YOU TO MAKE A COPY OF ANY PROGRAM OR FILE ON THE DISK. tHE NEW
FILE'S NAME MUST BE DIFFERENT FROM THE OLD ONE. copy CAN ALSO COMBINE UP TO
FOUR FILES INTO ONE NEW ONE.
examples:print#15,"c 0:backup=0: original"
print#15,"copy 0: newfile=0: old1,0: old2,0"
(COMBINES old1 AND old2 INTO newfile)
rename
purpose: cHANGE cHE NAME OF EXISTING FILE.
format:print#15"rename0: NEWNAME=0: OLDNAME"
tHIS COMMAND LETS YOU CHANGE THE NAME OF A FILE ONCE IT'S IN THE DISK
DIRECTORY. rename WILL NOT WORK ON ANY FILES THAT ARE CURRENTLY OPEN.
example:print#15,"r 0:goodname=0: dumbname"
validate
purpose: rEMOVES WASTED SPACES ON DISK.
format: open 15,8,15,"v0:"
aFTER A DISK HAS HAD MANY FILES SAVED AND ERASED, SMALL GAPS IN THE DATA BEGIN
TO ACCUMULATE AND WASTE MEMORY SPACE ON THE DISK. validate REORGANIZES YOUR
DISK SO YOU CAN GET THE MOST MEMORY FROM THE AVAILABLE SPACE. aLSO, THIS
COMMAND REMOVES FILES THAT WERE openED BUT NEVER PROPERLY CLOSED.
caution! validate ERASES RANDOM FILES (SEE CHAPTER 7). iF YOUR DISK CONTAINS
RANDOM FILES, do not USE THIS COMMAND!
reading the error channel
wITHOUT THE dos sUPPORT pROGRAM, THERE IS NO WAY TO READ THE DISK ERROR CHANNEL
SINCE YOU NEED TO USE THE input# COMMAND, UNUSABLE OUTSIDE A PROGRAM. hERE IS A
SIMPLE basic PROGRAM TO READ THE ERROR CHANNEL:
10 open 15,8,15
20 input#15, a$, b$, c$, d$
30 print a$, b$ c$, o$
wHEN YOU USE AN input# FROM THE COMMAND CHANNEL, YOU READ UP TO FOUR VARIABLES
THAT DESCRIBE THE ERROR CONDITION. THE FIRST, THIRD, AND FOURTH ARE NUMBERS SO
NUMERIC VARIABLES CAN BE USED. tHE inputS ARE ORGANIZED AS FOLLOWS:
fIRST:ERROR NUMBER (0 MEANS NO ERROR).
sECOND:ERROR DESCRIPTION.
tHIRD:tRACK NUMBER WHERE ERROR OCCURRED.
fOURTH:BLOCK (SECTOR) IN TRACK WHERE ERROR OCCURRED.
eRRORS ON TRACK 18 CONCERN THE bam AND DIRECTORY.
close
purpose: pROPER ALLOCATION OF DATA BLOCKS, CLOSES ENTRY.
format: close FILE#
tHIS COMMAND IS VERY IMPORTANT. oNCE A FILE THAT WAS OPENED IS NO LONGER NEEDED
FOR DATA ENTRY, it must be closed or else all data in that file will be lost.
iT IS VERY IMPORTANT THAT THE DATA FILES BE CLOSED BEFORE THE ERROR CHANNEL
(CHANNEL #15) IS CLOSED. oTHERWISE, THE DISK DRIVE WILL CLOSE THEM FOR YOU BUT
basic WILL STILL THINK THEY ARE OPEN AND LET YOU TRY TO WRITE TO THEM. tHE
ERROR CHANNEL SHOULD BE openED FIRST AND CLOSED LAST OF ALL YOUR FILES.
note: iF YOUR basic PROGRAM LEADS TO AN ERROR CONDITION, ALL FILES ARE closeD
IN basic, BUT NOT ON THE DISK DRIVE. THIS IS very dangerous!
iMMEDIATELY TYPE:
close 15: open 15,8,15: close 15
tHIS WILL RE-INITIALIZE YOUR DRIVE AND MAKE ALL YOUR FILES SAFE.
6. sequentialfiles
sEQUENTIAL FILES ARE STORED AND READ SEQUENTIALLY FROM BEGINNING TO END. tHERE
ARE BASICALLY THREE DIFFERENT TYPES OF SEQUENTIAL FILES THAT CAN BE USED. tHE
FIRST IS THE PROGRAM FILE, WHICH IS ABBREVIATED IN THE DIRECTORY AS prg. tHE
prg IS THE ONLY SEQUENTIAL FILE THAT CAN STORE AND READ PROGRAMS. tHE SECOND
FILE, SEQUENTIAL (seq), AND THE THIRD FILE, USER (usr), ARE FOR DATA HANDLING.
tHESE TWO FILES MUST BE OPENED JUST LIKE THE COMMAND CHANNEL IN THE LAST
CHAPTER.
open
purpose: oPEN A SEQUENTIAL FILE.
format: open FILE#, DEVICE#, CHANNEL#, "0: NAME, TYPE, DIRECTION"
tHE FILE NUMBER IS THE SAME AS IN PREVIOUS USES OF THE open COMMAND, THE
DEVICE NUMBER IS USUALLY 8, THE CHANNEL NUMBER IS A DATA CHANNEL, 2 THROUGH 14.
iT'S A GOOD IDEA TO USE THE SAME NUMBER FOR BOTH FILE AND CHANNEL NUMBERS, FOR
EASY REMEMBERING (YOU MAY HAVE NOTICED THIS IN PREVIOUS EXAMPLES).
tHE NAME IS THE FILE NAME, FOR WHICH NO WILD CARDS OR PATTERN MATCHING MAY BE
USED IF YOU'RE CREATING A WRITE FILE. THE TYPE CAN BE ANY ONE FROM THE LIST
BELOW, OR AT LEAST THE FIRST LETTER OF ONE. tHE DIRECTION MUST BE read OR
write, OR AT LEAST THEIR FIRST LETTERS.
fILE tYPE cODEmEANING
00sCRATCHED
*seq01uNCLOSED sEQUENTIAL FILE
*prg02uNCLOSED pROGRAM FILE
*usr03uNCLOSED uSER FILE
*rel04uNCLOSED rELATIVE FILE (NOT IMPLEMENTED)
del80dELETED (RARELY USED TYPE)
seq81sEQUENTIAL FILE
prg82pROGRAM FILE
usr83uSER FILE
rel84rELATIVE (NOT IMPLEMENTED IN basic 2.0)
del<c0lOCKED dELETED
seq<c1lOCKED sEQUENTIAL FILE
prg<c2lOCKED pROGRAM FILE
usr<c3lOCKED uSER FILE
rel<c4lOCKED rELATIVE FILE (NOT IMPLEMENTED)
nOTE: iT IS POSSIBLE TO USE VALUES NOT LISTED ABOVE, BUT THE RESULTS MAY BE
UNPREDICTABLE.
examples:
open 5,8,5, "0: data, s, r"
open a,b,c,"0:text, p,w"
open a,b,c,"o:" +a$+ "u,w"
(openS A WRITE FILE WITH A NAME SPECIFIED BY THE STRING
VARIABLE a{$7e})
open 2,8,2 "@0: phones, s, w"
(REPLACES OLD VERSION OF THE FILE WITH A NEW ONE)
oNCE A FILE HAS BEEN OPENED FOR READING OR WRITING, THREE COMMANDS CAN BE USED
TO ACTUALLY TRANSFER THE DATA. tHESE COMMANDS ARE print#, input#, AND get#.
print#
purpose: dIRECTS OUTPUT TO PREVIOUSLY OPENED FILE.
format: print# FILE#, DATA LIST (NO SPACE ALLOWED BETWEEN print AND #)
tHE print# STATEMENT WORKS EXACTLY LIKE print: FORMATTING CAPABILITIES FOR
PUNCTUATION AND DATA TYPES WORK JUST THE SAME. bUT THAT MEANS YOU NEED TO BE
CAREFUL WHEN PUTTING DATA INTO FILES. tHE FILE NUMBER IS THE ONE JUST openED
AND THE DATA LIST CONSISTS OF VARIABLES AND/OR TEXT INSIDE QUOTATION MARKS.
cARE MUST BE TAKEN WHEN WRITING IN DATA SO THAT IT IS AS EASY AS POSSIBLE TO
READ OUT LATER. cOMMAS USED TO SEPARATE ITEMS WILL CAUSE SPACES TO BE STORED
ON THE DISK. sEMICOLONS WILL KEEP SPACES FROM BEING STORED. iF BOTH COMMAS AND
SEMICOLONS ARE ABSENT, A CARRIAGE RETURN (cr) WILL BE STORED AT THE END OF THE
DATA THAT IS WRITTEN IN.
cONSIDER THE FOLLOWING EXAMPLE PROGRAM:
10 a$="this is a"
20 b$="test"
30 open 8,8,8, "o:test ,s,w"
40 print#8,a$,b$"of the disk"
50 close 8
60 end
iF YOU COULD SEE THE DATA AND ITS POSITION ON THE
DISK, IT WOULD LOOK LIKE THIS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
t h i s i s a t e s t o f
26 27 28 29 30 31 32 33 34 35
t h e d i s k cr EOF (END OF FILE)
tHE COMMA, SEMI-COLON, AND CARRIAGE RETURN HAVE SPECIAL MEANING THEN STORED TO
THE DISK. wHEN USED INSIDE A STRING OR QUOTES, THEY WILL BE STORED AS REGULAR
CHARACTERS. wHEN USED AS A SEPARATOR BETWEEN FIELDS, THE COMMA INSERTS SPACES
(USUALLY A WASTE OF MEMORY), THE SEMICOLON DOESN'T, AND THE cr STORES A
CARRIAGE RETURN ON THE DISK. THESE ARE IMPORTANT WHEN YOU USE get# OR input#
TO RETRIEVE THE DATA YOU STORED.
get#
purpose: tO GET DATA FROM THE DISK BYTE BY BYTE.
format: get FILE #, VARIABLE LIST
dATA COMES IN BYTE BY BYTE, INCLUDING cr'S, COMMAS, AND OTHER SEPARATORS.
gENERALLY, IT'S SAFER TO USE CHARACTER STRING VARIABLES TO AVOID ERROR
MESSAGES.
examples:
get#8, a$
get#5, a (ONLY WORKS FOR NUMERICAL DATA)
get#a, b$, c$, d$ (getS MORE THAN ONE VARIABLE AT A TIME)
tHE get# STATEMENT IS VERY USEFUL WHEN THE ACTUAL DATA CONTENT OR STRUCTURE IS
NOT KNOWN, SUCH AS A FILE ON A DISK THAT HAS BEEN DAMAGED. iF YOU ARE FAMILIAR
WITH THE FILE AND THERE ARE NO PROBLEMS, input# IS MORE EFFICIENT. bUT TO LOOK
AT DATA IN AN UNFAMILIAR OR DAMAGED FILE, THE FOLLOWING EXAMPLE PROGRAM WILL
READ THE CONTENTS OUT (IN THIS CASE, FROM THE FILE CREATED IN THE print EXAMPLE
PROGRAM).
10 open 8,8,8, "test"
20 get#8,a$:print a$;
30 if st=0 then 20(st IS A STATUS SIGNAL)
40 close 8
50 end
input#
purpose: rETRIEVE DISK DATA IN GROUPS.
format: input# FILE #, VARIABLE
tHE FILE NUMBER IS THE SAME AS THE ONE openED AND THE VARIABLE CAN REPRESENT
CHARACTER STRINGS OR NUMBERS. tO READ A GROUP OF DATA, SEPARATORS ARE NEEDED
TO INDICATE THE START AND FINISH OF THE GROUP. tHESE ARE THE COMMA, SEMICOLON,
AND cr, AND WORK AS EXPLAINED IN THE SECTION ON THE print# COMMAND. nUMBERS ARE
STORED WITH A SPACE IN FRONT OF THEM, WHICH IS EMPTY FOR POSITIVE NUMBERS AND
CONTAINS A NEGATIVE SIGN FOR NEGATIVE NUMBERS. hERE'S A SAMPLE PROGRAM:
10 open 8,8,8,"@0: datafile,s,w"
20 for a=1 to 10
30 print#8,a
40 next a
SO close 8
60 open 2,8,2,"datafile,s,w"
70 input#2,b : printb
80 if st=0 then 70
90 close 2
100 end
tHIS EXAMPLE PROGRAM WILL WRITE THE NUMBERS 1 THROUGH 10 TO A SEQUENTIAL FILE
CALLED datafile. lINES 70 AND 80 WILL READ THE DATA FROM THE DISK AND PRINT IT
OUT. sEE PAGE 20 FOR TWO USEFUL SAMPLE PROGRAMS.
sEQUENTIAL FILES ARE FINE WHEN YOU'RE JUST WORKING WITH A CONTINUOUS STREAM OF
DATA, BUT SOME JOBS NEED MORE FLEXIBILITY. fOR EXAMPLE, IF YOU HAVE A LARGE
MAILING LIST, IT WOULD BE INCONVENIENT TO SCAN THE ENTIRE LIST TO FIND ONE
PERSON'S ADDRESS. a RANDOM ACCESS METHOD WOULD LET YOU PICK OUT THE DESIRED
DATA WITHOUT HAVING TO READ THE WHOLE FILE.
tHERE ARE TWO FILE TYPES THAT CAN DO THIS: RANDOM FILES AND RELATIVE FILES.
rANDOM FILES ARE THE BEST CHOICE WHEN SPEED IS A DESIRED FACTOR, AS IN MACHINE
LANGUAGE PROGRAMS. tHIS IS BECAUSE LOCATIONS OF THE DATA ARE MAINTAINED BY THE
PROGRAM WHEN RANDOM FILES ARE USED, WHILE RELATIVE FILE LOCATIONS ARE MAINTAI-
NED BY THE dos. tHE PROBLEM IS RANDOM FILES ARE EASY TO ACCIDENTALLY REMOVE
FROM THE DISK SINCE THE dos DOESN'T MAINTAIN THEM.
rANDOM FILES ARE FILES THAT HAVE BEEN WRITTEN TO A CERTAIN PHYSICAL LOCATION
ON THE DISK. tHE DISK IS DIVIDED INTO 35 CONCENTRIC RINGS, OR TRACKS, WITH EACH
TRACK CONTAINING FROM 17 TO 21 SECTORS.
tRACK nUMBER sECTOR rANGE tOTAL sECTORS
1 to 170 to 2021
18 to 240 to 1819
25 to 300 to 1718
31 to 350 to 1617
iT IS POSSIBLE TO READ AND WRITE TO ANY BLOCK ON THE DISK, AS WELL AS
DETERMINE WHICH BLOCKS ARE AVAILABLE FOR USE. tHE FOLLOWING COMMANDS EXPLAIN
HOW TO USE THE RANDOM FILE FUNCTIONS.
open
purpose: openS A DATA CHANNEL FOR RANDOM ACCESS.
format: open FILE #, DEVICE #, CHANNEL #
wHEN WORKING WITH RANDOM FILES, YOU NEED TO HAVE TWO CHANNELS OPEN TO THE
DISK: THE COMMAND CHANNEL (15) TO SEND COMMANDS AND A DATA CHANNEL (2 TO 14)
FOR THE DATA TRANSFER. tHE DATA CHANNEL FOR RANDOM ACCESS FILES IS openED BY
SELECTING THE POUND SIGN, "#", AS THE FILE NAME.
tHE ADDITIONAL "#" ON THE END OF THE COMMAND CAUSES THE DISK TO ALLOCATE A 256
BYTE BUFFER FOR THE PURPOSE OF HANDLING THE DESIRED BLOCK OF DATA. iF A BUFFER
NUMBER IS SPECIFIED, THE ALLOCATED BUFFER WILL BE THE ONE YOU SPECIFIED.
examples:
open 5,8,5,"#"(YOU DON'T CARE WHICH BUFFER)
open a,8,c,"#2"(YOU SPECIFY BUFFER 2)
block-read
purpose: tO READ A SPECIFIC BLOCK OF DATA FROM THE DISK.
format: print# FILE #,"block-read:" CHANNEL #, DRIVE #, TRACK #,
BLOCK # (block-read CAN BE REPLACED WITH b-r)
tHE FILE AND CHANNEL NUMBERS ARE ONES THAT HAVE BEEN openED. tRACK NUMBER AND
BLOCK NUMBER INDICATE WHICH 256 BYTE BLOCK TO BE READ. eXECUTING THIS COMMAND
CAUSES THE DISK DRIVE TO THE SPECIFIED BLOCK OF DATA INTO THE BUFFER AREA.
tHE DATA THEN BE READ FROM THE BUFFER AREA USING EITHER input OR get#.
oNLY DATA IN THAT PARTICULAR BLOCK WILL BE READ, AND ANY UNUSED BYTES IN THE
BLOCK WILL NOT BE READ, tHE SAMPLE PROGRAM BELOW USES block-read TO READ THE
CONTENTS OF BLOCK 9 ON TRACK 5 DISPLAY THE BLOCK'S CONTENTS ON THE SCREEN.
10 open 15,8,15
20 open 8,8,8,"#"
30 print#15, "b-r:"8,0,5,9(READS BLOCK INTO BUFFER)
40 get#8, a$
50 print a$;
60 if st=0 then 40
70 print "read complete"
80 close 8 : close 15
block-write
format: print# FILE #, "block-write:" DRIVE #, CHANNEL #, TRACK #,
BLOCK #
block-write CAN BE SHORTENED TO b-w. tHIS COM{$7e}AND CAUSES DATA PREVIOUSLY STORED
IN THE BUFFER TO BE WRITTEN TO THE SPECIFIED LOCATION ON THE DISK. tHE DATA
SHOULD BE TRANSFERRED TO THE BUFFER ON A DATA CHANNEL USING print# BEFORE
block-writeING IT INTO THE DISK. tHE dos KEEPS TRACK OF HOW MANY BYTES ARE
STORED INTO THE BUFFER AND STORES THE BYTE COUNT INTO FIRST BYTE OF THE BLOCK
WHEN block-write IS EXECUTED. tHIS MEANS THAT ONLY 255 BYTES CAN ACTUALLY BE
WRITTEN TO OR READ FROM BLOCK, SINCE THE BYTE COUNT USES THE FIRST BYTE OF THE
BLOCK. hERE'S AN EXAMPLE OF A ROUTINE THAT WILL WRITE DATA TO THE SAME BLOCK
THAT IS READ IN THE block-read EXAMPLE ABOVE (TRACK 5, BLOCK 9):
10 open 15,8,15
20 open 8,8,8,"#"
30 for aa=1 to 32
40 print#8, "testing"
50 next
60 print#15,"b-w:" 8,0,5,9
70 close8 : close15
block-allocate
purpose: dETERMINE IF A PARTICULAR BLOCK IS FREE AND ALLOCATE IT IF SO.
format: print#15,"b-a:" CHANNEL #,DRIVE #, TRACK #, BLOCK #
aS MENTIONED EARLIER, THE dos DOES NOT MAINTAIN THE DISK WHEN block-reads AND
block-writes ARE USED. bUT THE USER CAN MAKE SURE A PARTICULAR BLOCK IS
AVAILABLE BY USING THE block-allocate COMMAND. tHIS ALLOWS USE OF block
COMMANDS ON A DISK WITH FILES ALREADY ON IT. bY CHECKING THE bam, THE COMMAND
DETERMINES IF THE SPECIFIED BLOCK HAS BEEN USED. sINCE THE bam UPDATES EACH
TIME A FILE IS STORED ON THE DISK, FILES CAN BE MAINTAINED. block COMMANDS DO
NOT UPDATE THE bam AND SO WILL NOT BE RECOGNIZED UNLESS A block-allocate HAS
BEEN EXECUTED.
caution: THE validate COMMAND DOES NOT RECOGNIZE RANDOM FILES AND SHOULD
NEVER BE USED ON A DISK THAT HAS RANDOM FILES.
iF block-allocate DETERMINES THAT THE SPECIFIED BLOCK HAS ALREADY BEEN USED,
AN ERROR SIGNAL (65) WILL BE GENERATED. tHE ERROR MESSAGE TELLS YOU THE NUMBERS
OF THE NEXT AVAILABLE TRACK AND BLOCK ON THE DISK. tHIS BLOCK DOES NOT GET
ALLOCATED, SO THE block-allocate COMMAND MUST BE USED AGAIN, BUT THIS TIME YOU
CAN BE SURE THAT THE BLOCK SPECIFIED IS FREE TO USE. tHE FOLLOWING PROGRAM WILL
ALLOCATE A BLOCK AND WRITE TO THAT BLOCK. iF THE BLOCK IS ALREADY USED, IT WILL
WRITE TO THE NEXT AVAILABLE ONE, AS INDICATED BY THE ERROR MESSAGE.
10 open 15,8,15:open 8,8,8,"#"
20 print#8,"this goes into the buffer"
30 t=5 : s=9
40 print#15,"b-a:"0,t,s
50 input#15,a,a$,b,c
60 if a=65 then t=b:s=c: goto 40
70 print#15,"b-w:" 8,0,t,s
80 print"data was stored in track:"t," sector:"s
90 close 8:close 15
100 end
lINE 20 LOADS THE BUFFER WITH TEXT, LINES 30 AND 40 CHECK BLOCK 9 ON TRACK 5
TO SEE IF IT'S FREE, AND LINE 50 INPUTS THE ERROR SIGNAL. iF THE BLOCK IS FREE,
THE DATA IS STORED THERE. iF BLOCK 9 ON TRACK 5 IS ALREADY USED, LINE 60 TAKES
THE NEW BLOCK AND TRACK NUMBERS AND ALLOCATES THE BLOCK THEY SPECIFY, AND THEN
THE DATA IS STORED IN THE NEW BLOCK. lINES 70 AND 80 READ THE TRACK AND B]OCK
NUMBERS INTO THE COMPUTER AND PRINT THEM ON THE SCREEN.
block-free
purpose: fREE UP A USED BLOCK FOR NEW USE.
format: open 15,8,15,"b-f:" DRIVE #, TRACK #, BLOCK #
tHIS COMMAND IS THE OPPOSITE OF block-allocate, IN THAT IT FREES A BLOCK YOU
DON'T WANT TO USE ANY MORE FOR USE BY THE SYSTEM. iT IS SOMETHING LIKE THE
scratch COMMAND IN THAT IT DOESN'T ACTUALLY ERASE ANYTHING, JUST FREES THE
ENTRY, IN THIS CASE JUST IN THE bam.
examples:
10 open 8,8,"#"
20 open 15,8,15,"b-f:"0,5,9
30 close 8 : close 15 (FREES TRACK 5, BLOCK 9 FOR USE)
buffer-pointer
purpose: tO ALLOW RANDOM ACCESS INSIDE A BLOCK.
format: print#15,"b-p:" CHANNEL #, LOCATION (BYTE #)
tHE BUFFER POINTER KEEPS TRACK OF WHERE THE LAST PIECE OF DATA WAS WRITTEN,
AND POINTS TO WHERE THE NEXT PIECE OF DATA WILL BE READ. bY CHANGING THE BUFFER
POINTER'S LOCATION IN THE BUFFER, YOU CAN RANDOMLY ACCESS INDIVIDUAL BYTES
INSIDE A BLOCK. tHIS MEANS YOU CAN DIVIDE A SINGLE BLOCK INTO RECORDS.
example:
print15,"b-p:" 5,64 (SETS POINTER TO 64TH CHARACTER IN BUFFER)
using random files
tHE PROBLEM WITH RANDOM FILES IS THAT YOU HAVE NO WAY OF KEEPING TRACK OF WHICH
BLOCKS YOU HAVE USED. tO KEEP TRACK, THE MOST COMMON METHOD IS TO CREATE A
SEQUENTIAL FILE TO GO WITH EACH RANDOM FILE. tHIS FILE IS USED TO KEEP JUST A
LIST OF RECORD, TRACK, AND BLOCK LOCATIONS. tHIS MEANS YOU HAVE THREE CHANNELS
OPEN TO THE DISK FOR EACH RANDOM FILE: tHE COMMAND CHANNEL, THE CHANNEL FOR THE
RANDOM DATA, AND THE CHANNEL FOR THE SEQUENTIAL FILE. yOU'RE ALSO USING TWO
BUFFERS AT THE SAME TIME.
fOLLOWING YOU WILL FIND FOUR PROGRAMS THAT USE RANDOM ACCESS WITHIN BLOCKS:
program a WRITES 10 RANDOM ACCESS BLOCKS WITH A SEQUENTIAL FILE.
program b READS BACK THE SAME FILE.
program c WRITES 10 RANDOM ACCESS BLOCKS WITH 4 RECORDS EACH.
program d READS BACK THE SAME FILE.
program a:wRITES SEQUENTIAL FILE
10 open 15,8,15
20 open 5,8,5,"#"
30 open 4,8,4,"@0:keys,s,w"
40 a$="rECORD cONTENTS #"
50 for r = 1 to 10
60 print#5,a$","r
70 t=1:s=1
80 print#15,"b-a:"0,t,s
90 input#15,a,b$,c,d
100 if a=65 then t=c:s=d: goto 80
110 print#15,"b-w:"5,0,t,s
120 print#4,t","s
130 next r
140 close 4:close 5:close 15
program b:reads SEQUENTIAL FILE
10 open 15,8,15
20 open 5,8,5,"#"
30 open 4,8,4,"keys,s,r"
40 for r = 1 to 10
50 input#4,t,s
60 print#15,"b-r:"5,0,t,s
70 input#5,a$,x
80 if a$ <>"rECORD cONTENTS #" or x<>r then stop
90 print#15,"b-f:"0,t,s
100 next r
110 close 4:close 5
120 print#15,"s0:keys"
130 close 15
program c:wRITES rANDOM aCCESS fILE
10 open 15,8,15
20 open 5,8,5,"#"
30 open 4,8,4,"keys,s,w"
40 a$="rECORD cONTENTS #"
50 for r=1 to 10
60 for l=1 to 4
70 print#15,"8-p:"5: (l-1)*64
80 print#5,a$","l
90 next l
100 t=1 : s=1
110 print#15,"b-a:",0,t,s
L20 input#15,a,b$,c,d
130 if a=65 then t=c:s=d: goto 110
140 print#15,"b-w:"5,0,t,s
150 print#4,t","s
160 next r
170 close 4: close 5: close 15
program d:reads rANDOM fILE
10 open15,8,15
20 open 5,8,5,"#"
30 open 4,8,4,"keys,s,r"
40 for r = 1 to 10
50 input#4,t,s
60 print#15,"b-r:"5,0,t,s
70 for l = 1 to 4
80 print#15,"b-p:"5,(l-1)*64
90 input#5,a$,x
100 if a$<>"rECORD cONTENTS #" or x=l then stop
110 next l
120 print#15,"b-f:"0,t,s
130 next r
140 close 4: close 5
150 print#15,"s0:keys"
160 close 15
user1
purpose: tO READ A FULL 256-BYTE BLOCK FROM DISK TO BUFFER.
format: print# FILE #,"u1:" CHANNEL $, DRIVE #, TRACK #, BLOCK #
tHE user1 COMMAND IS ALMOST IDENTICAL TO THE block-read COMMAND EXCEPT THAT
user1 FORCES THE BUFFER-POINTER TO THE END OF THE BLOCK TO BE READ, SO THE
ENTIRE BLOCK IS READ. user1 CAN BE ABBREVIATED AS EITHER u1 OR ua. fOLLOWING
IS A SAMPLE PROGRAM THAT WILL GET THE ENTIRE 256 BYTES FROM TRACK 5 BLOCK 9
AND DISPLAY IT ON THE SCREEN.
10 open 15,8,15:open 8,8,8
20 print15,"u1:"8,0,5,G
30 get#,a$:print a$;
40 if st=0 then 30
50 close 8:close 15
60 end
user2
purpose: tO WRITE A BLOCK OF DATA TO THE DISK WITHOUT ALTERING
THE BUFFER-POINTER.
format:print#15,"u2:" CHANNEL #, DRIVE #, TRACK #, BLOCK #
user2 (ABBREVIATED AS u2 OR ub) IS VARY SIMILIAR TO THE block-write COMMAND.
bUT u2 DOES NOT CHANGE THE POSITION OF THE BUFFER-POINTER WHEN THE BUFFER IS
WRITTEN TO THE DISK. tHIS IS USEFUL IF YOU WANT TO READ A BLOCK OF DATA INTO
THE BUFFER AND MODIFY IT.
aFTER FINDING THE PARTICULAR DATA WITH THE BUFFER-POINTER AND MODIFYING IT,
THE user2 COMMAND CAN BE USED TO REWRITE THE DATA TO THE DISK- AND THE BUFFER-
POINTER WILL BE IN THE CORRECT POSITION.
iF block-write WAS USED, THE BUFFER-POINTER WOULD HAVE TO BE RESET FIRST. tHE
FOLLOWING PROGRAM USES THE user1 AND user2 COMMANDS.
10 open 15,8,15:open 8,8,8
20 print#15,"u1:"8,0,5,9
30 print#15,"b-p:"8,32
40 print#8, "a"
50 print#15,"u2:"8,0,5,9
60 close 8: close 15
70 end
lINE 20 READS TRACK 5 BLOCK 9 INTO THE BUFFER. lINE 30 MOVES THE BUFFER-POINTER
TO BYTE 32. lINE 40 CHANGES BYTE 32 TO THE CHARACTER "a".
lINE 50 PRINTS THE BUFFER BACK TO THE DISK.
eVEN THOUGH THE BUFFER-POINTER HAS BEEN ALTERED, user2 MAKES SURE THE OLD
BUFFER-POINTER IS NOT CHANGED ON THE DISK.
8. relative files
rELATIVE FILES CAN ACCESS ANY PIECE OF DATA ON THE DISK, JUST LIKE RANDOM
FILES, BUT YOU DON'T HAVE TO MAINTAIN THE FILES IN YOUR OWN PROGRAM. tHE dos
MAINTAINS THE DATA FOR YOU, KEEPING TRACK OF THE STATUS OF YOUR FILES. bECAUSE
OF THIS, RELATIVE FILES ARE SLOWER THAN RANDOM FILES, BUT OFTEN THE EXTRA
CONVENIENCE MAKES UP FOR THIS.
tHE dos KEEPS TRACK OF THE TRACKS AND SECTORS (BLOCKS) USED, AND EVEN ALLOWS
RECORDS TO OVERLAP FROM ONE BLOCK TO THE NEXT. iT DOES THIS BE ESTABLISHING
SIDE SECTORS, A SERIES OF POINTERS FOR THE BEGINNING OF EACH RECORD. tHERE CAN
BE 6 SIDE SECTORS IN A FILE, AND EACH SIDE SECTOR CAN POINT TO UP TO 120
RECORDS. tHIS MEANS A FILE CAN HAVE AS MANY AS 720 RECORDS, AND SINCE EACH
RECORD CAN BE 254 CHARACTERS LONG, ONE FILE CAN FILL THE ENTIRE DISK.
tHE BLOCK FORMAT CONSISTS OF THE FIRST TWO BYTES SPECIFYING THE TRACK AND
SECTOR OF THE NEXT DATA BLOCK. tHE NEXT 254 BYTES CONTAIN THE ACTUAL DATA. aNY
EMPTY RECORD WILL HAVE ff (HEXADECIMAL FOR ALL 1'S) IN THE FIRST BYTE AND 00
IN THE REST OF THE RECORD. tHE SIDE SECTORS ARE USED TO REFERENCE ALL SIDE
SECTOR LOCATIONS, NOT JUST THE 120 DATA BLOCK LOCATIONS RELATED TO THAT SIDE
SECTOR. oN tHE NEXT PAGE YOU WILL FIND A CHART SHOWING THE FORMAT OF THE
RELATIVE FILES.
relative file format
data block:
bYTEdESCRIPTION
0,1 ........tRACK AND SECTOR OF NEXT DATA BLOCK.
2-256 ......254 BYTES OF DATA. eMPTY RECORDS CONTAIN ff (ALL BINARY ONES)
IN THE FIRST BYTE FOLLOWED BY 00 TO THE END OF THE RECORD.
pARTIALLY FILLED RECORDS ARE PADDED WITH NULLS (00).
side sector block:
bYTEdESCRIPTION
0-1tRACK AND SECTOR OF NEXT SIDE SECTOR BLOCK.
2sIDE SECTOR NUMBER (0-5).
3rECORD LENGTH.
4-5tRACK AND SECTOR OF FIRST SIDE SECTOR (0).
6-7tRACK AND SECTOR OF SECOND SIDE SECTOR (1).
8-9tRACK AND SECTOR OF THIRD SIDE SECTOR (2).
10-11tRACK AND SECTOR OF FOURTH SIDE SECTOR (3).
12-13tRACK AND SECTOR OF FIFTH SIDE SECTOR (4).
14-15tRACK AND SECTOR OF SIXTH SIDE SECTOR (5).
16-256tRACK AND SECTOR POINTERS TO 120 DATA BLOCKS.
using relative files
rELATIVE FILES ARE CREATED THE FIRST TIME THEY ARE openED. tHE SAME FILE WILL
BE USED UNTIL IT IS CLOSED. a RELATIVE FILE CAN ONLY BE ERASED FROM A DISK BY
USING THE scratch COMMAND OR BY REFORMATTING THE ENTIRE DISK. tHE "@" SIGN,
USED WITH save AS A save AND replace, WILL NOT WORK WITH RELATIVE FILES.
format tO CREATE RELATIVE FILE:
open FILE #, DEVICE #, CHANNEL #, "0:NAME,l," + chr$(RL#)
(RECORD LENGTH)
examples:
open 2,8,2,"0:file,l"+chr$(100) (RECORD LENGTH IS 100)
open f,8,f,"0:" +a$+ ",l,"+chr$(q)
format to open eXISTING relative FILE:
open FILE #, DEVICE #, CHANNEL #, "0:NAME"
example:
open 2,8,6, "0: test"
iN THIS CASE, THE dos CAN TELL BY THE SYNTAX THAT IT IS A RELATIVE FILE. bOTH
OF THE ABOVE FORMATS ALLOW EITHER READING OR WRITING TO THE FILE.
hOWEVER: iN ORDER TO READ OR WRITE, before any operation, YOU MUST POSITION
THE FILE POINTER TO THE CORRECT RECORD POSITION.
position
purpose: tO position THE FILE POINTER AT A RECORD.
format:print# FILE#,"p" chr$(CHANNEL#)chr$(REC# LO)
chr$(REC# HI)chr$(RECORD POSITION)
note: chr$(RECORD POSITION) SPECIFIES THE LOCATION WITHIN THE RECORD ITSELF
AND IS OPTIONAL.
sINCE THERE ARE 720 RECORDS AVAILABLE AND THE LARGEST NUMBER ONE BYTE CAN HOLD
IS 256, TWO BYTES MUST BE USED TO SPECIFY THE POSITION. tHE REC#LO CONTAINS
THE LEAST SIGNIFICANT PART OF THE ADDRESS AND REC#HI HOLD THE MOST SIGNIFICANT.
tHE RELATIONSHIP IS REPRESENTED BY: REC# = REC#HI * 256 + REC#LO. tHE REC# IS
THE ACTUAL POSITION IN A RECORD WHERE DATA TRANSFER STARTS.
examples:
print#15,"p"chr$(2)chr$(1)chr$(0)
print#15,"p"chr$(ch)chr$(r1)chr$(r2)chr$(p)
hERE'S A SAMPLE PROGRAM THAT CREATES A RELATIVE FILE:
10 open 15,8,15
20 open 8,8,8,"0:test,l," + chr$(50)
30 print#15,"p"chr$(8)chr$(0)chr$(4)chr$(1)
40 print#{$7e},chr$(255)
50 close8:close15
tHIS PROGRAM CREATES A RELATIVE FILE CALLED test THAT WILL CONTAIN RECORDS
THAT ARE 50 BYTES LONG. lINE 30 MOVES THE POINTER TO THE FIRST POSITION IN
RECORD #1024 (REC# = 256 * 4 + 0 = 1024). nOTICE THAT THE pointer COMMAND IS
SENT ON THE COMMAND CHANNEL WHILE DATA IS SENT ON A DATA CHANNEL, 8 IN THIS
CASE. sINCE THE RECORD DIDN'T ALREADY EXIST, AN ERROR MESSAGE WILL BE GENE-
RATED, WARNING YOU NOT TO USE get OR input.
oNCE A RELATIVE FILE EXISTS, YOU CAN open IT AND EXPAND IT OR ACCESS IT FOR
DATA TRANSFER. tHE FILE CAN BE EXPANDED BUT THE RECORD LENGTH CANNOT BE
CHANGED. tO EXPAND A FILE JUST SPECIFY A LARGER NUMBER OF RECORDS, AS IN LINE
30 IN THE PREVIOUS EXAMPLE PROGRAM.
tO WRITE DATA TO AN EXISTING RELATIVE FILE USE THE FOLLOWING:
10 open 15,8,15
20 open 2,8,6,"0:test"
30 gosub 1000
40 if a=100 then stop
50 print#15,"p"chr$(6)chr$(100)chr$(0)chr$(1)
60 gosub 1000
70 if a=50 then print#2,1: goto 50
80 if a=100 then stop
90 print#2,"123456789"
100 print#15,"p"chr$(6)chr$(100)chr$(0)chr$(20)
110 print#2, "john owerty"
120 close 2: close15
130 end
1000 input#15,a,a5,b$,c$
1010 if (a=50) or (a<20) then return
1020 print "fatal error:";
1030 print a,a$,b$,c$
1040 a=100:return
lINES 10 AND 20 OPEN THE COMMAND AND A DATA CHANNEL. lINES 30 AND 40 CHECK FOR
ERRORS. lINE 50 MOVES THE FILE POINTER TO THE 100TH RECORD POSITION. sINCE NO
RECORDS EXIST YET, AN ERROR SIGNAL IS GENERATED.
lINES 60, 70, AND 80 CHECK FOR THE ERROR AND CREATE 100 RECORDS.
lINE 90 WRITES 9 BYTES OF DATA TO THE FIRST 9 LOCATIONS IN RECORD 100.
lINE 110 THEN PRINTS A NAME FROM THAT POSITION.
iT IS IMPORTANT THAT DATA IS WRITTEN INTO THE RECORD SEQUENTIALLY SO DATA
ALREADY IN THE RECORD IS NOT DESTROYED.
tHE FOLLOWING PROGRAM READS BACK THE DATA PUT IN THE FILE BY THE PREVIOUS
PROGRAM.
10 open 15, 8,15
20 open 2,8,6,"0:test"
30 gosub 1000
40 if a=100 then stop
50 print#15,"p"chr$(6)chr$(100)chr$(0)chr$(1)
60 gosub 1000
70 if a=50 then print a$
80 if a=100 then stop
90 input#2,d$: print d$
100 print#15, "p"chr$(6)chr$(100)chr$(0)chr$(20)
110 input#2,d$: print e$
120 close 2: close15
130 end
1000 input#15,a,a$,b$,c$
1010 if (a=50) or (a<20) then return
1020 print "fatal error:";
1030 print a,a$,b$,c$
1040 a=100:return
lINES 90, 100, AND 110 READ THE RECORD AND DISPLAY THE CONTENTS ON THE SCREEN.
notice THAT THE CARRIAGE RETURN SENT TO THE DISK AFTER EACH print# STATEMENT
ON THE WRITE ROUTINE IS THE SEPARATOR FOR EACH FIELD ON THE RECORD.
iF THE FILE IS TO BE WRITTEN OR READ SEQUENTIALLY, IT ISN'T NECESSARY TO
ADJUST THE POINTER TO EACH RECORD. tHE RECORD POINTER AUTOMATICALLY STARTS AT
POSITION 1 IF NO OTHER POSITION HAS BEEN DEFINED. tHE POINTER MOVES THROUGH
THE RECORD AS EACH FIELD IS READ OR WRITTEN.
9. programming the disk controller
tHE oc-118 IS A SMART PERIPHERAL, WHICH MEANS THAT IT CONTAINS ITS OWN MICRO-
PROCESSOR AND MEMORY. aN ADVANCED PROGRAMMER CAN ACCESS THE MICROPROCESSOR AND
ITS MEMORY, PROVIDING A WIDE RANGE OF APPLICATIONS. rOUTINES CAN BE DESIGNED
THAT RESIDE IN THE DISK MEMORY AND OPERATE ON THE MICROPROCESSOR TO CONTROL
DISK DRIVE OPERATION. dos PROGRAMS CAN BE ADDED THAT COME FROM THE ACTUAL DISK.
tHERE IS 16k OF rom IN THE DISK DRIVE AS WELL AS 2k ram. tHE MOST USEFUL AREA
TO THE ADVANCED PROGRAMMER IS THE BUFFER ram AREA LOCATED BETWEEN 4000h AND
5fffh (THE h MEANS IT'S A HEXADECIMAL NUMBER). tHIS AREA CAN ACTUALLY BE
WRITTEN INTO WITH mACHINE lANGUAGE LEVEL INSTRUCTIONS AND EXECUTED BY THE DISK
CONTROLLER (MICROPROCESSOR).
tHE METHOD OF HANDLING DATA TRANSFERS TO AND FROM MEMORY ARE REFERRED TO AS
memory COMMANDS. tHERE ARE THREE BASIC memory COMMANDS, AND SOME ADDITIONAL
COMMANDS CALLED user COMMANDS.
memory-write
purpose: tRANSFERS UP TO 34 BYTES OF DATA TO DRIVE MEMORY.
format: print#15,"m-w:"chr$(ADDRESS LOW BYTE) chr$(ADDRESS HIGH BYTE)
chr$(# OF CHARACTERS) chr$(DATA)
memory-write ALLOWS YOU TO WRITE UP TO 34 BYTES OF DATA AT A TIME INTO THE DISK
CONTROLLER'S MEMORY. memory-execute and user COMMANDS CAN BE USED TO RUN THIS
CODE. tHE LOW AND HIGH BYTES ARE THE DECIMAL EQUIVALENT OF THE HEXADECIMAL
ADDRESS IN THE ACTUAL MEMORY SPACE. tHE NUMBER OF BYTES IS THE DECIMAL AMOUNT
OF BYTES TO BE TRANSFERRED, UP TO 34. tHE DATA MUST BE THE DECIMAL REPRESENTA-
TION OF THE HEXADECIMAL-CODED INSTRUCTION YOU WISH SENT. sEE THE EXAMPLE BELOW.
10 open 15,8,15
20 print#15,"m-w:"chr$(0)chr$(112)chr$(3)chr$(169)chr$(8)chr$(96)
30 close 15
tHIS ROUTINE WRITES THREE BYTES TO LOCATIONS 7000h, 7001h, AND 7002h
(256 *112 + 0 = 28672 = 7000h). tHE THREE BYTES ARE:
169(a9h, A pAGE zERO INSTRUCTION),
8(08h, A LOCATION),
96(60h A return INSTRUCTION).
wHEN {$7e}XECUTED, THIS PROGRAM WOULD CAUSE THE DRIVE CONTROLLER TO LOAD ITS
ACCUMULATOR WITH THE CONTENTS OF LOCATION 0008h AND THEN RETURN CONTROL BACK
TO THE DISK DRIVE.
memory-read
purpose: rEAD DATA FROM DRIVE MEMORY.
format: print$15 FILE #, "m-r:" chr$(ADDRESS LOW BYTE)
chr$(ADDRESS HIGH BYTE)
tHE memory-read COMMAND SELECTS A BYTE TO BE READ FROM A LOCATION IN THE DISK
DRIVE MEMORY, SPECIFIED BY THE LOW AND HIGH BYTES OF THE LOCATION ADDRESS. tHE
NEXT BYTE READ (USING get#) FROM CHANNEL #15 WILL BE FROM THE SPECIFIED MEMORY
LOCATION. tHE FOLLOWING EXAMPLE ILLUSTRATES THIS BY READING DATA FROM 10
CONSECUTIVE BYTES, LOCATED FROM ff00h TO ff0ah (IN DECIMAL, 65280 TO 65290).
10 open 15,8,15
20 for a = 1 to 10
30 print#15,"m-r:"chr$(a)chr$(255)
40 get#15,a$:print asc(a$ + chr$(0));
50 next
60 close 15
wHEN USING memory-read, ANY USE OF input# ON THE ERROR CHANNEL WILL GIVE
PECULIAR RESULTS. tHIS CAN BE CLEARED UP BY USING ANY OTHER COMMAND, EXCEPT
THE memory COMMANDS. hERE'S A USEFUL PROGRAM THAT READS THE DISK CONTROLLER'S
MEMORY:
10 open 15,8,15
20 input"location please";a
30 a1 = int(a/256): a2 = a - a1*256
40 print#15,"m-r:"chr$(a2)chr$(a1)
50 for l = 1 to 5
60 get#15,a$
70 print asc(a$ + chr$(0))
80 next
90 input"continue";a$
100 if left$(a$,1)="y" then 50
110 goto 20
memory-execute
purpose: eXECUTES PROGRAM IN DISK MEMORY.
format: print#15 FILE #,"m-e:"chr$(ADDRESS LOW BYTE) chr$(ADDRESS
HIGH BYTE)
oNCE A PROGRAM HAS BEEN LOADED INTO DISK MEMORY (EITHER THE 16k IN THE rom OR
THE 2k IN THE ram), THE ADDRESS OF THE memory-execute COMMAND SPECIFIES WHERE
PROGRAM EXECUTION WILL BEGIN. tHE USE OF THIS COMMAND REQUIRES THAT THE PROGRAM
TO BE EXECUTED END WITH AN rts INSTRUCTION, SO CONTROL WILL BE RETURNED TO THE
dos. fOLLOWING IS A ROUTINE THAT WRITES AN rts (rEtURN FROM sUBROUTINE).
10 open 15,8,15,"m-w:"chr$(0)chr$(5);1;chr$(96)
20 print#15,"m-e:"chr$(0)chr$(19): rem jumps to byte, returns
30 close 15
user commands
aLONG WITH THE user1 AND user2 COMMANDS DISCUSSED IN CHAPTER 7, THERE ARE
OTHERS THAT, WHEN EXECUTED, CAUSE JUMPS TO SPECIFIC LOCATIONS IN THE DISK
DRIVE'S BUFFER. tHIS LETS YOU MAKE LONGER ROUTINE THAT OPERATE IN THE DISK'S
MEMORY ALONG WITH A JUMP TABLE, EVEN IN basic.
user commandfunction
u1 OR uablock-read WITHOUT CHANGING BUFFER-POINTER
u2 OR ubblock-write WITHOUT CHANGING BUFFER-POINTER
u3 OR ucJUMP TO 0500h
u4 OR udJUMP TO 0503h
u5 OR ueJUMP TO 0506h
u6 OR ufJUMP TO 0509h
u7 OR ugJUMP TO 050ch
u8 OR uhJUMP TO 050fh
u9 OR uiJUMP TO fffah
u; OR ujPOWER-UP VECTOR (eaa0h OR fe67h)
ui+SET cOMMODORE 64 SPEED
ui-SET vic 20 SPEED
examples OF user commands
print#15,"u3"
print#15,"u"+chr$(50+q)
print#15,"ui"
1ocHANGING tHE dEVICE nUMBER
aLL PERIPHERALS NEED DEVICE NUMBERS SO THE COMPUTER CAN IDENTIFY WHICH ONE YOU
WANT TO TRANSFER DATA TO OR FROM. tHE oc-118 IS PRESET INSIDE THE HARDWARE WITH
A DEVICE NUMBER OF 8, DRIVE NUMBER 0. tHE DISK KNOWS ITS OWN DEVICE NUMBER BY
LOOKING AT A HARDWARE JUMPER ON THE CIRCUIT BOARD AND WRITING THE NUMBER BASED
ON THE JUMPER INTO A SECTION OF ITS ram.
tHE DEVICE NUMBER CAN BE CHANGED BY TWO METHODS, HARDWARE AND SOFTWARE. iF YOU
ARE TEMPORARILY USING TWO DISK DRIVES, USING THE SOFTWARE METHOD LETS YOU
CHANGE ONE DRIVE'S DEVICE NUMBER TEMPORARILY. iF YOU EXPECT TO USE TWO (OR
MORE) DRIVES ON A PERMANENT BASIS, THE HARDWARE METHOD IS A SIMPLE AND
PERMANENT WAY TO CHANGE A DRIVE'S DEVICE NUMBER.
10-1.software method
tHE DEVICE NUMBER IS CHANGED BY PERFORMING A memory-write TO LOCATIONS 0077h
AND 0078h. tHE COMMAND IS EXECUTED ONCE THE COMMAND CHANNEL HAS BEEN OPENED.
format:print# FILE #,"m-w:"chr$(119)chr$(0)chr$(2)
chr$(ADDRESS + 32)chr$(ADDRESS + 64)
tHE ADDRESS IS THE NEW DEVICE NUMBER DESIRED. bELOW IS AN EXAMPLE OF
CHANGING THE DEVICE NUMBER TO 9.
10 open 15,8,15
20 print15,"m-w:"chr$(119)chr$(0)chr$(2)chr$(9+32)chr$(9+64)
30 close 15
fIRST, TURN ON ONE DRIVE AND CHANGE ITS DEVICE NUMBER, THEN THE NEXT DRIVE,
UNTIL ALL THE DRIVES ARE ON.
1o-2. cHANGING tHE dEVICE nUMBER bY hARDWARE
aLL PERIPHERALS NEED DEVICE NUMBERS SO THE COMPUTER CAN IDENTIFY WHICH ONE YOU
WANT TO TRANSFER DATA TO OR FROM. THE oc-118'S DEVICE NUMBER IS EXTREMELY EASY
TO CHANGE. nO HARDWARE OR SOFTWARE MODIFICATIONS ARE NEEDED. jUST SET THE dip
SWITCHES ON THE BOTTOM OF THE DRIVE TO CHANGE THE DRIVE'S DEVICE NUMBER.
dETAILED INSTRUCTIONS ARE BELOW.
to change the device number:
1. tURN off DISK DRIVE.
2. tURN OVER AND LOCATE TWO SMALL dip SWITCHES ABOUT HALFWAY
TOWARDS THE BACK.
3. sET SWITCHES IN COMBINATION WHICH GIVES DESIRED DEVICE NUMBER.
"on" IS TOWARDS THE back OF THE DRIVE.
dEVICE NUMBER SELECTED BY:
dEVICE NUMBER:891011
sWITCH 1:onoffonoff
sWITCH 2:ononoffoff
4. dISK DRIVE IS NOW READY TO USE WITH NEW DEVICE NUMBER.
appendix a.list of commands
pAGE
cHAPTER 4. uSING pROGRAMS
load 6
save 8
save and replace 8
verify 9
cHAPTER 5. dISK cOMMANDS
open10
print#11
initialize11
new11
scratch12
copy12
rename12
validate12
close13
cHAPTER 6. sEQUENTIAL fILES
open14
print#15
get#15
input#16
cHAPTER 7. rANDOM fILES
open17
block-read18
block-write18
block-allocate19
block-free20
buffer-pointer20
buffer-execute-
user123
user224
cHAPTER 8. rELATIVE fILES
position27
cHAPTER 9. pROGRAMMING THE dISK cONTROLLER
memory-write30
memory-read 31
memory-execute31
user commands32
appendix b. description of error messages
wHENEVER AN ERROR SIGNAL IS GENERATED, THE led LIGHT ON THE
FRONT PANEL OF THE oc-118 WILL START FLASHING. THE DISK DRIVE WILL
NOT SEND THE ERROR MESSAGE TO THE COMPUTER UNLESS REQUESTED. tHE
FOLLOWING ROUTINE INPUTS THE ERROR MESSAGE AND PRINTS IT ON THE
COMPUTER'S SCREEN.
10 open 15,8,5
20 input#15,a,as,b$,c$
30 print a,a$,b$,c$
40 close 15
50 end
bELOW IS A LIST AND EXPLANATION OF THE ERROR MESSAGES USED ON
THE oc-118 dISK dRIVE:
0no error
tHIS IS NOT AN INDICATION OF AN ERROR AND WILL OCCUR WHEN
THE ERROR CHANNEL IS READ WHILE THE led ISN'T FLASHING.
1files scratched
tHIS ALSO IS NOT AN ERROR CONDITION.
rEADING THE ERROR CHANNEL AFTER ONE OR MORE FILES HAVE
BEEN SCRATCHED WILL SHOW THIS, AS WELL AS THE NUMBER OF
FILES THAT HAVE BEEN SCRATCHED.
2-9unused error message numbers
20read error (BLOCK HEADER NOT FOUND)
tHE DISK CONTROLLER IS UNABLE TO LOCATE THE HEADER OF THE
REQUESTED BLOCK. tHIS CAN BE CAUSED BY A BAD HEADER ON THE
DISK OR SPECIFYING AN ILLEGAL SECTOR NUMBER.
21read error (NO SYNC CHARACTER)
tHE DISK CONTROLLER IS UNABLE TO DETECT A SYNC MARK ON THE
DESIRED TRACK. cAUSED BY MISALIGNMENT OF THE READ/WRITE HEAD
OR DISK NOT PRESENT, UNFORMATTED, OR NOT SEALED PROPERLY.
cAN ALSO INDICATE A HARDWARE FAILURE.
22read error (DATA BLOCK NOT PRESENT)
tHE DISK CONTROLLER HAS BEEN REQUESTED TO READ OR VERIFY
A DATA BLOCK THAT WAS NOT PROPERLY WRITTEN. tHIS ERROR
MESSAGE OCCURS IN CONJUNCTION WITH THE block COMMANDS AND
INDICATES AN ILLEGAL TRACK AND/OR SECTOR REQUEST.
23read error (CHECKSUM ERROR IN DATA BLOCK)
tHIS ERROR MESSAGE INDICATES THAT THERE IS AN ERROR IN ONE
OR MORE OF THE DATA BYTES. tHE DATA HAS BEEN READ INTO THE
dos MEMORY, BUT THE CHECKSUM OVER THE DATA IS IN ERROR.
mAY ALSO INDICATE GROUNDING PROBLEMS.
24read error (BYTE DECODING ERROR)
tHE DATA OR HEADER HAS BEEN READ INTO THE dos MEMORY, BUT A
HARDWARE ERROR HAS BEEN CREATED DUE TO AN INVALID BIT PATTERN
IN THE DATA BYTE. mAY ALSO INDICATE GROUNDING PROBLEMS.
25write error (WRITE-VERIFY ERROR)
tHIS MESSAGE IS GENERATED IF THE CONTROLLER DETECTS A MISMATCH
BETWEEN THE WRITTEN DATA AND DATA IN THE dos MEMORY.
26write protect on
tHE CONTROLLER HAS BEEN REQUESTED TO WRITE A DATA BLOCK WHILE
THE WRITE PROTECT SWITCH IS DEPRESSED. tYPICALLY, THIS IS
CAUSED BY USING A DISK WITH A {$7e}RITE PROTECT TAB OVER THE NOTCH.
27read error (CHECKSUM ERROR IN HEADER)
tHERE IS AN ERROR IN THE HEADER OF THE REQUESTED DATA BLOCK.
tHE BLOCK HAS NOT BEEN READ INTO THE dos MEMORY. mAY ALSO
INDICATE GROUNDING PROBLEMS.
28write error (LONG DATA BLOCK)
tHE CONTROLLER ATTEMPTS TO DETECT THE SYNC MARK OF THE NEXT
HEADER AFTER WRITING A DATA BLOCK. iF THE SYNC MARK DOES NOT
APPEAR WITHIN A PRE-DETERMINED TIME, THE ERROR MESSAGE IS
GENERATED. tHE ERROR IS CAUSED BY A BAD DISK FORMAT (DATA
EXTENDS INTO THE NEXT BLOCK) OR BY A HARDWARE FAILURE.
29disk id mismatch
tHE CONTROLLER HAS BEEN REQUESTED TO ACCESS A DISK WHICH HAS
NOT BEEN INITIALIZED OR HAS A BAD HEADER. aLSO OCCURS IF
DISKS ARE SWITCHED DURING DATA TRANSFER.
30sytax error (GENERAL SYNTAX)
tHE dos CANNOT INTERPRET THE COMMAND SENT TO THE COMMAND
CHANNEL. tYPICALLY, THIS IS CAUSED BY AN ILLEGAL NUMBER OF
FILE NAMES OR PATTERNS ARE ILLEGALLY USED.
31sytax error (INVALID COMMAND)
tHE dos DOESN'T RECOGNIZE THE COMMAND. THE COMMAND MUST START
IN THE FIRST CHARACTER POSITION.
32sytax error (LONG LINE)
tHE COMMAND SENT IS LONGER THAN 58 CHARACTERS.
33syntax error (INVALID FILE NAME)
pATTERN MATCHING IS USED INVALIDLY IN THE open OR savE COMMAND.
34syntax error (NO FILE GIVEN)
tHE FILE NAME WAS LEFT OUT OF A COMMAND OR THE dos DOES NOT
RECOGNIZE IT AS SUCH. tYPICALLY, A COLON (:) HAS BEEN OMITTED.
35-38not used
39syntax error (INVALID COMMAND)
mAY RESULT IF THE COMMAND SENT TO THE COMMAND CHANNEL IS
UNRECOGNIZABLE BY THE dos.
40-49not used
50record not present
rESULT OF DISK READING PAST THE LAST RECORD THROUGH THE
input OR get COMMANDS. tHIS MESSAGE WILL ALSO OCCUR AFTER
POSITIONING TO A RECORD BEYOND THE END OF A FILE IN A RELATIVE
FILE. iF THE INTENT IS TO EXPAND THE FILE BY ADDING THE NEW
RECORD (WITH A print# COMMAND), THE ERROR MESSAGE MAY BE
IGNORED. input OR get SHOULD NOT BE USED AFTER THIS ERROR
OCCURS WITHOUT FIRST REPOSITIONING.
51overflow in record
print# STATEMENT EXCEEDS THE RECORD BOUNDARY, TRUNCATING
INFORMATION. sINCE THE CARRIAGE RETURN, SENT AS A RECORD
TERMINATOR, IS COUNTED IN THE RECORD SIZE, THIS MESSAGE WILL
OCCUR IF THE TOTAL CHARACTERS IN THE RECORD (INCLUDING THE
FINAL CARRIAGE RETURN) EXCEEDS THE DEFINED SIZE.
52file too large
rECORD POSITION WITHIN A RELATIVE FILE INDICATES THAT DISK
OVERFLOW WILL RESULT.
53-59not used
60write file not open
a WRITE FILE THAT HAS NOT BEEN CLOSED IS BEING OPENED FOR
READING.
61file not open
a FILE BEING ACCESSED HAS NOT BEEN OPENED IN THE dos.
sOMETIMES IN THIS SITUATION, AN ERROR IS NOT GENERATED,
THE REQUEST IS SIMPLY IGNORED.
62file not found
tHE REQUESTED FILE DOESN'T EXIST ON THE INDICATED DRIVE.
63file exists
tHE FILE NAME OF THE FILE BEING CREATED ALREADY EXISTS ON
THE DISK.
64file type mismatch
tHE FILE TYPE DOES NOT MATCH THE FILE TYPE IN THE DIRECTORY
ENTRY FOR THE REQUESTED FILE.
65no block
oCCURS WHEN A BLOCK TO BE ALLOCATED HAS ALREADY BEEN ALLOCATED.
tHE PARAMETERS INDICATE THE TRACK AND SECTOR AVAILABLE WITH THE
NEXT HIGHEST NUMBER. iF THE PARAMETERS ARE ZERO, THEN ALL
BLOCKS HIGHER IN NUMBER ARE IN USE.
66illegal track and sector
tHE dos HAS ATTEMPTED TO ACCESS A TRACK OR SECTOR WHICH DOES
NOT EXIST IN THE FORMAT BEING USED. mAY INDICATE A PROBLEM
READING THE POINTER TO THE NEXT BLOCK.
67illegal sytem t or s
tHIS SPECIAL ERROR INDICATES AN ILLEGAL SYTEM TRACK OR SECTOR.
68,69not used
70no channel (AVAILABLE)
tHE REQUESTED CHANNEL IS NOT AVAILABLE, OR ALL CHANNELS ARE IN
USE. a MAXIMUM OF FIVE SEQUENTIAL FILES MAY BE OPENED AT ONE
TIME TO THE dos. dIRECT ACCESS CHANNELS MAY HAVE SIX OPENED
FILES.
71directory error
tHE bam (bLOCK aVAILABILITY mAP) DOES NOT MATCH THE INTERNAL
COUNT. THERE IS A PROBLEM IN THE bam ALLOCATION OR THE bam HAS
BEEN OVERWRITTEN IN dos MEMORY. tO CORRECT THIS PROBLEM,
REINITIALIZE THE DISK TO RESTORE THE bam IN MEMORY. sOME
ACTIVE FILES MAY BE TERMINATED BY THE CORRECTIVE ACTION.
72disk full
eITHER THE BLOCKS ON THE DISK ARE USED UP OR THE DIRECTORY IS
AT ITS LIMIT OF 144 ENTRIES.
73dos mismatch("cbm dos v2.6 1541")
dos 1 AND 2 ARE READ COMPATIBLE BUT NOT WRITE COMPATIBLE.
dISKS MAY BE INTERCHANGEABLY READ WITH EITHER dos, BUT A DISK
FORMATTED ON ONE VERSION CANNOT BE WRITTEN UPON WITH THE OTHER
VERSION BECAUSE THE FORMAT IS DIFFERENT. tHIS ERROR IS
DISPLAYED WHENEVER AN ATTEMPT IS MADE TO WRITE UPON A DISK
WHICH HAS BEEN FORMATTED IN A NON-COMPATIBLE FORMAT.
tHIS MESSAGE MAY ALSO APPEAR AFTER POWER UP.
74drive not ready
aN ATTEMPT HAS BEEN MADE TO ACCESS THE DISK DRIVE WHEN THERE
ISN'T A DISK IN THE DRIVE.
appendix c.bam AND dIRECTORY fORMAT dESCRIPTION
bam fORMAT
bYTEvALUEdESCRIPTION
0 18tHE FIRST tRACK OF dIRECTORY
1 1tHE FIRST sECTOR OF dIRECTORY
2 65fREE.
4-143bam
+0nUMBER OF FREE SECTORS ON THE TRACK 0.
+1bITMAP OF SECTORS 0 - 7.
+2bITMAP OF SECTORS 8 - 15.
+3bITMAP OF SECTORS 16 - 23.
ETC.
144-161dISK NAME
162-163dISK id
164160sHIFTED sPACE
165-166 50,65ascii CHARACTERS '2a'. dISK FORMAT.
167-170160sHIFTED sPACES
171-255 0nOT USED
dIRECTORY fORMAT
bYTEdESCRIPTION
0tRACK OF NEXT dIRECTORY BLOCK
1sECTOR OF NEXT dIRECTORY BLOCK
2-31fILE ENTRY #1
2fILE tYPE
3tHE FIRST TRACK OF THE FILE
4tHE FIRST SECTOR OF THE FILE
5-20fILENAME
21-23uSED ONLY WITH RELATIVE FILES
24-27nOT USED. cAN BE USED TO STORE CODES ETC.
28-29oNLY USED WITH replace COMMAND
30-31fILE LENGTH IN BLOCKS
32-33uNUSED (SHOULD BE 0)
uSED ONLY IN THE FIRST ENTRY TO
STORE THE NEXT DIRECTORY BLOCK.
34-63fILE ENTRY #2
34fILE tYPE
ETC.