Commodore C1570 a

Page 1

COMMODORE

Diskettestation

1570/71

Brugervejledning

Page 2

Page 3

Oplysningerne i denne vejledning er revideret og menes at være korrekte, såvel teknisk som typografisk. Der kan imidlertid ikke garanteres mod unøjagtigheder. Indholdet af manualen er udelukkende til information, og kan ændres uden varsel.

Page 4

INDHOLDSFORTEGNELSE.

INTRODUKTION 1
DEL ET: BASIC BETJENINGSVEJLEDNING.
KAPITEL 1: UDPAKNING, INSTALLATION OG IBRUGTAGNING AF 1571
trinvise instruktioner
vejledning ved fejlfinding
enkle vedligeholdelsesråd
isætning af diskette
diskettehåndtering
brug af færdigudviklede disketteprogrammer
klargoring af ny diskette
disketteindholdsfortegnelse
selektive indholdsfortegnelse
udskrivning af indholdsfortegnelse
mønstersammenligning
33677890
1112213
KAPITEL 2: BASIC 2.0 KOMMANDOER
fejlkontrol
BASIC tips
save (gem)
save with replace (gem og erstat)
verify (verificer).
scratch (slet)
mere om scratch
rename (omdøb)
omdøbning og sletning af problemfyldte filer
copy (kopiering)
validate (validering)
initializing (initialisering)
14
15
16
17
19
21
23
23
KAPITEL 3: BASIC 7.0 KOMMANDOER
fejlkontrol
save (gem)
save with replace (gem og erstat)
dverify (verificer)
25
25
27
28
29
30
31
32
Page 5
KAPITEL 4: DOS SHELL
valg af sprog
hovedmenuens skærmbillede 3
disk/printer definition 3
afvikling af et program 3
formattering af diskette 3
oprydning på diskette 3
kopiering af diskette 3
kopiering af filer 3
sletning af filer
retablering af filer 3
omdøbning af filer
omsortering af indholdsfortegnelse

DEL TO: AVANCERET BETJENING OG PROGRAMMERING

KAPITEL 5: SEKVENTIELLE DATAFILER 3 8
filkoncept 8
åbning af en fil 3 8
tilføjelse til en sekventiel fil4 .2
skrivning af fildata: med anvendelse af print# .2
lukning af en fil 4
læsning af fildata: med anvendelse af input∉ 5
mere om inputf (øvede brugere) 6
lagring af numeriake data nå diskette. 7
legating of fildets mad any addition of gate ່ຂ
demonstration of activation le filer ŝ
U
2
verdien of filer med relativ tilgang 5
filer records og felter 5 5
ž
onpathalae of an valativ fil 3
brug of polotive filow, poord4 kommondo 1
fundi ganalao of nolotiv fil opportoloo 4
0
0
skrivning al data til relative liler 0
0
skrivning af recorden 9
Lesning al en relativ record 2
værdien af indeksfiler (rutinerede brugere) 5
Page 6
KAPITEL 7: KOMMANDOER VED DIREKTE TILGANG
66
66
66
69
70
71
72
73
KAPITEL 8: INTERNE DISKKOMMANDOER 74
memory-read 75
memory-write 76
memory-execute 77
block-execute 78
brugerkommandoer 79
indlæsning af utility 80
KAPITEL 9: MASKINSPROGSPROGRAMMER 81
disketterelaterede kernal subrutiner 81
KAPITEL 10: BURST - KOMMANDOER 82
read 83
inquire disk 83
format mfm 84
format gcr (ingen indholdsfortegnelse) 85
sektor mellemrum 86
query disk format 87
inquiry status 88
chgull utility 87
fastload utility 88
nedbrydning af statusbyte 89
burst overførselsprotokol 90
forklaring af procedurer 91
APPENDIKS: 96
B: fejlmeddelelser 97
C: disketteformater 101
D: referencekort til diskettekommandoer 110
E: specifikationer - 1571 diskettestation 112
F: information om seriel interface 114
G: disk operativ systemer - Commodore og CP/M 116
Page 7
INTRODUKTION
DE ALMINDELIGSTE ANVENDELSESMULIGHEDER.

1571 er en alsidig diskettestation, der kan håndtere flere disketteformater og transmissionshastigheder. Disketternes format kan variere fra enkeltsidet, enkelt tæthed til dobbeltsidet, dobbelt tæthed. 1571 kan anvendes af en række computere, inklusive Commodore 128, Commodore 64, Plus 4, C 16 og VIC 20.

  • Når 1571 anvendes sammen med Commodore 128 er der følgende faciliteter til rådighed:
  • * Standard og hurtig seriel data overførselshastighed 1571 vælger auto matisk den rette overførselshastighed (langsom eller hurtig) således at den passer til de tre operations - modes, der er til rådighed på Commodore 128 computeren (C128 mode, C64 mode og CP/M mode).
  • * Evnen til at læse og skrive med dobbelt tæthed MFM format Dette tillader adgang til andre personlige computeres CP/M programbiblioteker.
  • * Dobbeltsidet, dobelt tæthed dataskrivning Giver op til 336K lagerkapacitet pr. diskette (168K på hver side).

Når 1571 diskettestationen anvendes sammen med Commodore 64 computeren bruger den standard enkel-tæthed, GCR formatterede disketter, som bruges på Commodore 1541, 4040 eller 2031 diskettestationer.

NB.

CP/M diskette er indlagt i Commodore 128 æsken; vejledning i CP/M anvendelse beskrives i Commodore 128 vejledningerne.

HVORDAN DENNE VEJLEDNING ER OPBYGGET.

Denne vejledning er opdelt i to hovedafsnit og 7 tillæg, som beskrevet herunder.

DEL ET: GENEREL BETJENINGSVEJLEDNING - indeholder den information som nye og øvede brugere skal anvende for at betjene Commodore 1571 diskettestationen. Del et er underopdelt i fire kapitler:

Kapitel 1 fortæller, hvordan man anvender færdigkøbte programmer på diskette, som f.eks. Perfect Writer* og Jane*. Disse færdigudviklede programmer gør det muligt at udføre en række opgaver på områder inden for virksomhedsledelse, uddannelse, økonomi og videnskab, eller "kun" for sjov. Er man kun interesseret i at indlæse og arbejde med færdigudviklede disketteprogrammer, behøver man ikke at læse mere end dette kapitel. Er man også interesseret i at gemme, indlæse og udføre egne programmer, skal man læse resten af vejledningen.

Kapitel 2 beskriver brugen af BASIC 2.0 disk kommandoer med Commodore 64 og Commodore 128 computere.

Kapitel 3 beskriver brugen af BASIC 7.0 disk kommandoer med Commodore 128.

Page 8

Kapitel 4 beskriver brugen af DOS Shell program, der giver en god alternativ metode til udførelse af diskettekommandoer. DOS Shell er på den 1571 test/demo diskette, der følger med diskettestationen.

DEL TO: AVANCERET BETJENING OG PROGRAMMERING - henvender sig primært til brugere, der er bekendt med computerprogrammering. DEL TO er underopdelt i 5 kapitler:

  • Kapitel 5 gennemgår datafilers koncepter, definerer sekventielle data filer, og beskriver hvordan sekventielle datafiler dannes og anvendes på diskette. Kapitel 6 beskriver forskellen mellem sekventielle og relative data-
  • * Kapitel 6 beskriver forskellen mellem sekventielle og relative datafiler, og beskriver hvordan relative filer dannes og anvendes på diskette.
  • * Kapitel 7 beskriver diskkommandoer med direkte tilgang, som et værktøj for avancerede brugere, og viser brugen af disse kommandoer.
  • * Kapitel 8 koncentrerer sig om interne diskkommandoer. Inden man bruger disse avancerede kommandoer, skal man have et godt kendskab til programmering af 6502 chip i maskinsprog, samt adgang til memory map over 1571.
  • * Kapitel 9 indeholder en fortegnelse over disk-relaterede kernal ROM subrutiner, og giver praktiske eksempler på deres anvendelse i et program.
  • * Kapitel 10 indeholder information om hurtige burst kommandoer.

APPENDIX A TIL G - giver detaljeret referenceinformation. Appendix A viser f.eks. hvordan drevnummer angives ved brug af to kontakter på drevets bagside.

Page 9

DEL ET GENEREL BETJENINGSVEJLEDNING.

KAPITEL 1. UDPAKNING, INSTALLATION OG IBRUGTAGNING AF 1571

INSTRUKTIONER TRIN FOR TRIN:

  • 1. Se efter om emballagen er beskadiget. Er emballagen beskadiget, og er der mistanke om at diskettestationen kan have lidt overlast, skal De straks kontakte Deres Commodore-forhandler.
  • Kontroller forsendelsens indhold. Foruden 1571 og denne vejledning skal der være følgende: 1 kabel til lysnet, 1 tilslutningskabel samt en Test/Demo diskette. Fjern papstykket, der sidder i diskettestationen.
  • 3. Fjern papstykket, der sidder i diskettestationen. Dette papstykke beskytter diskettestationens indre under forsendelse. Det fjernes ved at man drejer håndtaget på diskettestationens forside mod uret (se figur 1.), og herefter trækker papstykket ud.

Page 10

4.Isætning af lysnetkabel.

4.15ætning af fyshetkabel. Undersøg afbryderen på diskettestationens bagside (se figur 2) og forvis Dem om, at den er slukket (OFF). Forbind kablet som vist på figur 2. Sæt kablets anden ende i en stikkontakt. Tænd endnu ikke for strømmen.

Page 11

  • 5. Isætning af tilslutningskablet.
    • Forvis dem om, at computeren og alle øvrige enheder er slukket. Sæt kablets ene ende i tilslutningsbøsningen på diskettens bagside (se figur 2). Monter kablets anden ende i computerens tilslutningsstik, på bagsiden af computeren. Andre ydre enheder (printer, ekstra diskettestation) kan tilsluttes diskettestationens ekstra bøsning.
  • 6. Tænd for strømmen.
    • Når alt er forbundet, og der ikke sidder en diskette i diskettestationen, kan man tænde for de ydre enheder i den rækkefølge, man ønsker, blot man ALTID tænder computeren sidst. Når alt er tændt, starter diskettestationen en selv-test. Hvis alt er OK, vil den grønne lampe blinke en gang, og den røde kontrollampe for lysnettilslutning vil lyse fortsat. Hvis den grønne lampe fortsætter med at blinke, kan der være problemer. Se vejledning ved fejlfinding.
OPERATIONSTILSTANDE

For at opnå maksimal kompatibilitet mellem 1571 og andre diskettestationer har 1571 operationstilstande, som gør det muligt at anvende den i forskellige sammenhænge.

1541 Mode

Når man tænder for 1571, starter den i 1541 mode. Det vil sige at den næsten arbejder nøjagtigt som en 1541 diskettestation. Dette bevarer kompatibiliteten til visse specialprogrammer og kopibeskyttede disketter. Også mange indlæsningsrutiner er afhængige af 1541 drevets interne tidsopdeling. Når drevet arbejder i denne mode, kan det ikke drage fordel af de specielle 1571 faciliteter.

1571 Mode

I 1571 mode kan drevet udnytte faciliteter som dobbeltsidede disketter, MFM-formatterede disketter, høj hastighed ved dataoverførsel og burst - overførselsprotokol. 1571 afgør om den tilsluttede computer kan, eller ikke kan modtage hurtige dataoverførsler, og sender i overensstemmelse hermed.

Valg af mode

Valg af mode Som tidligere nævnt, starter 1571 i 1541 mode. Den vil imidlertid skifte til 1571 mode ved den første hurtige serielle overførsel, startet af den tilsluttede computer (Commodore 128). Commodore 64 og Plus4 kan ikke udføre hurtig seriel overførsel på den serielle bus, men De kan skifte fra 1541 mode til 1571 mode ved at sende følgende BASIC kommando: OPEN 1,8,15,"UO>MI". Selv om disse computere ikke direkte kan udnytte fordelen ved drevets hurtigere overførselshastigheder, kan de fordoble deres lagerkapacitet.

Anvender De Commodore 128 og ønsker at 1571 skal forblive i 1541 mode, kan De sende følgende BASIC kommando: OPEN 1,8,15,"UO>MO". Drevet vil da forblive i 1541 mode, indtil anlægget atter tændes eller systemet resettes.

De mulige kombinationer af modes med Commodore 128 og 1541 følger her:

C128/1571 modes: Tænd drevet og tænd eller reset herefter computeren.

Page 12

C128/1541 modes - Tænd eller reset computeren og tænd for drevet, når markøren kommer frem. I dette tilfælde vil første disktilgang bevirke skift til 1571 mode. Send BASIC kommandoen angivet på foregående side, for at låse drevet i 1541 mode. C64/1571 modes - Tænd for drevet og tænd eller reset herefter com-

puteren. Tast nu GO 64.

VEJLEDNING VED FEJLFINDING.

Problem Mulig årsag Løsning
Rød kontrollampe
lyser ikke
Strøm ikke
tilsluttet
Kontroller at ON/OFF kontakten
er ON
Kontakterne bag på
drevet er ikke
sat til det rig-
tige apparatnum-
mer.
Se appendiks A. Indstil kon-
takterne så de passer til LOAD-
kommandoen.
Strømkabel ikke
isat
Kontroller at begge ender af
lysnetkablet er korrekt isat.
Ikke strøm til
kontaktsted.
Udskift sikringer og tilslut
atter evt. HI/HFI relæ i huset.
Grøn lampe
blinker.
Diskettestati-
onens selvtest
afbrydes.
Sluk for anlægget et øjeblik og
tænd igen. Hvis lampen stadig
blinker, slukkes for diskette-
stationen, og der tændes igen,
når det serielle tilslutnings-
kabel er afmonteret. Løser
dette ikke problemet, skal De
kontakte Deres Commodore for-
handler. Løstes problemet ved
afmontering af kablet, skal man
sikre sig, at dette er monteret
korrekt. Er der stadig problemer
findes defekten i kablet, eller
et andet sted i systemet.
Programmer ind-
læses ikke,
computeren med-
deler "DEVICE NOT
PRESENT ERROR"
Defekt tilslut-
ningskabel, ikke
tændt for
diskettestation.
Kontroller ledningsforbindelser
og lysnettilslutning.
Programmer ind-
læses ikke, ingen
fejmelding fra
computeren
Andre dele af
systemet kan
genere.
Afbryd alle computerens øvrige
ydre enheder. Tilslut dem her-
efter een for een og lokaliser
den defekte enhed.
Forsøger man at indlæse et ma-
skinsprogsprogram i BASIC area-
let, vil dette problem opstå.

C64/1541 modes - Tænd for drevet. Hold derefter COMMODORE tasten nedtrykket, mens computeren tændes eller resettes.

Page 13

VEJLEDNING VED FEJLFINDING.

Problem Mulig årsag Løsning
Programmer ind-
læses ikke. Grøn
lampe blinker.
Disk-fejl Undersøg fejlkanalen for at
stedfæste fejlen. Følg herefter
de råd der gives i appendiks B
for at rette fejlen. Fejlkanalen
forklares i kapitlerne 2 og 3.
(Ved indlæsning af programmer
skal man være omhyggelig ved
indtastning af programnavn og
angivelse af tegn.)
Egne programmer
kan indlæses.
Programmer skrevet
på andre 1571'ere
kan ikke læses.
Enten diskette-
fejl eller ju-
steringsfejl på
diskettestatio-
nen.
Prøv at indlæse et andet eksem-
plar af programmet. Kan dette
heller ikke indlæses, skal De få
Deres forhandler til at justere
diskettestationen.
Egne programmer
der tidligere
har kunnet ind-
læses kan mu
Beskadigelse af
ældre disketter.
Se råd om diskettesikkerhed i
næste afsnit. Kopier atter fra
sikkerhedskopier.
ikke indlæses. Diskettestatio-
nen er gået ud
af justering.
Få Deres forhandler til at ju-
stere diskettestationen.

ENKLE VEDLIGEHOLDELSESRÅD.

  • 1. Sørg for god ventilation omkring diskettestationen.
  • God plads omkring 1571 tillader god ventilation, og forhindrer varmen i at ophobe sig inde i diskettestationen.
  • Brug Commodore disketter. Disketter af ringe kvalitet øger sliddet på diskettestationens læse/skrivehoveder. Brug af støvede disketter giver forøget slid. Derfor bør disse disketter udskiftes.
  • 3. Ved normal brug skal 1571 renses en gang årligt. Adskillige dele skal efterses: de to læse/skrive-hoveder skal renses (med 91% isopropyl alcohol på en vatpind). Skinnerne, hvorpå skrivehovedet bevæger sig, kan behøve smøring (med et specielt molybdænum smøremiddel, ikke olie), og føler for skrivebeskyttelse kan trænge til rensning. Da denne vedligeholdelse kræver specielle materialer og dele, er det klogest at overlade dette arbejde til et autoriseret Commodore serviceværksted. VIGTIGT! Ved uautoriseret reparation af eller service på 1571, bortfalder garantien.
ISÆTNING AF DISKETTE

Før man indsætter en diskette, skal diskettelågen åbnes ved at dreje håndtaget 1/4 omgang mod uret, indtil håndtaget står parallelt med disketteåbningen på diskettestationens forside.

Tag disketten på den halvdel der er modsat den store ovale læse/ skrive-åbning, og hold den med etikettesiden opad og med skrivebeskyttelseshakket til venstre (se figur 3). Nu indsættes disketten ved at skubbe den lige ind i disketteåbningen med læse/ skrive-åbningen forrest og etiketten sidst. Disketten skal glide jævnt ind, indtil den er på plads. Der må ikke anvendes magt, ligesom disketten ikke må bøjes under

Page 14

monteringen.

NB. Når skrivebeskyttelseshakket er dækket af tape, kan indholdet på disketten ikke ændres, ligesom data ikke kan tilføjes. Dette beskytter mod utilsigtet sletning af information, De ønsker at bevare. Hvis en diskette leveres uden skrivebeskyttelseshak, er det ikke meningen, at indholdet skal kunne ændres.

Blanke disketter har ikke etiketter påsat, når man køber dem.

Når disketten er på plads, drejes dørhåndtaget 1/4 omgang med uret indtil den stopper lodret over åbningen. ADVARSEL: Hvis håndtaget ikke bevæger sig let, skal man straks stoppe. Måske er disketten ikke rigtigt isat. Sæt disketten rigtigt i, således at dørhåndtaget let kan lukkes.

Figur 3. Indsætning af diskette.

DISKETTEHÅNDTERING.

  • 1. Berør ikke de ubeskyttede områder på disketten.
  • Det omfatter den ovale læse/skrive-åbning og diskettens center.
  • 2. Bøj aldrig en diskette.
  • Hold disketter (og diskettestation) borte fra magneter. Dette omfatter elektromagneter i telefoner, tv og transformatorer. Beskyt disketterne mod røg, fugt og støv. Opbevar disketterne lodret i de tilhørende diskettekuverter.
  • 4. Anvend disketter med forstærket centerhul. Selv om diskettestationen normalt centrerer en diskette korrekt, vil det være vanskeligt at rekonstruere data fra en diskette med defekt centerhul. Forstærket centerhul gør det lettere for diskettestationen at centrere en diskette.
  • 5. Tænd eller sluk ALDRIG for diskettestationen, når der er en diskette isat.
    • Data på disketten kan herved gå tabt.
  • Tag aldrig en diskette ud af diskettestationen, når den grønne lampe lyser. Den grønne lampe lyser, når diskettestationen arbejder. Hvis man fjerner en diskette på dette tidspunkt, kan information, der netop skrives, gå tabt.
Page 15

BRUG AF FÆRDIGUDVIKLEDE DISKETTEPROGRAMMER.

Programmets brugervejledning bør indeholde beskrivelse af, hvordan programmet indlæses i computeren. Her følger imidlertid en generel vejledning. Brug også denne fremgangsmåde ved indlæsning af programmer fra Deres egne disketter. Brug den medfølgende Test/Demo diskette som eksempel på dette.

  • 1. Tænd for anlægget.
  • 2. Isæt diskette.
  • 3. Hvis De anvender VIC 20, Commodore 64 eller en Commodore 128 i C64 mode, skal De indtaste: LOAD"HOW TO USE",8 Hvis De anvender Plus/4 eller Commodore 128 i C128 mode tastes: DLOAD"HOW TO USE"
  • 4. Tryk på RETURN tasten.
  • 5. Nu vil følgende komme frem på skærmen:

SEARCHING FOR "HOW TO USE" LOADING

READY

  • 6. Tast:RUN
  • 7. Tryk på RETURN tasten.

Ønsker man at indlæse et andet program eller en anden fil, skal man blot erstatte navnet HOW TO USE imellem anførelsestegnene, med navnet på det, man ønsker at indlæse. NB. Programmet "HOW TO USE" er nøglen til Test/ Demo - disketten. Når de indlæser det (LOAD) og udfører det (RUN), giver det instruktioner i brugen af diskettens programmer. Ønsker De at finde ud af, hvilke programmer der er på Deres Test/ Demo - diskette, henvises til afsnittet "Indholdsfortegnelser", sidst i dette kapitel.

finde ud af, hvike programmer der er på beres test/ bemo - diskette, henvises til afsnittet "Indholdsfortegnelser", sidst i dette kapitel. Hvis programmet ikke kan indlæses, eller hvis det ikke arbejder korrekt, når det indlæses med ovennævnte metode, kan det skyldes, at det er et maskinsprogs program. Men med mindre De ønsker at anvende avanceret programmering, behøver De ikke kende noget til maskinsprog. Programmets brugervejledning skulle fortælle, om det er skrevet i maskinsprog. Er det det, eller er der vanskeligheder med at indlæse et specielt program, kan man ganske enkelt tilføje ,1 (et komma og tallet et) i slutningen af kommandoen.

VIGTIGT!

Når der gives en form for kommando i denne vejledning, vil den følge et specielt mønster. Det, der er skrevet med store bogstaver skal indtastes nøjagtigt, som det vises (disse kommandoer er udskrevet med store bogstaver for oversigtens skyld. Brug ikke SHIFT - tasten, når disse kommandoer indtastes). Det der er udskrevet med små bogstaver er mere eller mindre en tilhørende forklaring. Det som er omsluttet af skarpe paranteser er valgmuligheder. Som eksempel nævnes formatet til HEADER kommandoen på følgende side.

Som eksempel nævnes formatet til HEADER kommandoen på følgende side. Ordet HEADER, det store Iid, det store D i Drevnummer og det store U i Uenhedsnummer, skal alle indtastes som de er (Ddrevnummer og Uenhedsnummer er valgfrie).

Der skal indtastes et navn til disketten, men det er op til Dem at vælge navnet. Det er ligeledes Dem der afgør id i Iid og enhedsnummer i Uenhedsnummer. Drevnummer i Ddrive er altid O på 1571, men kan være både O og 1 på en dobbelt diskettestation. Vær imidlertid opmærksom på, at der er visse begrænsninger for, hvilke værdier der kan vælges.

Page 16

Disse begrænsninger forklares umiddelbart efter formatet (diskette-navnet kan f.eka. ikke være større end 16 tegn og enbedsnummer er normalt 8). De skal også være omhvggelig med at indtaste alle skilletegn nøjagtigt, hvor det er vist i formatet. Til sidst trykkes RETURN efter slutningen af hver kommando.

KLARGØRING AF NY DISKETTE.

En diskette skal have et mønster af magnetiske felter, for at diskettestationens 18se-/skrivehoved kan finde dens indhold. Dette mønster er ikke på disketterne når De køber dem, men ved anvendelse af HEADER eller NEW kommandoen, kan de tilføres disketten. Det kaldes at formattere en diskette. Dette er kommandoen der skal anvendes med C128 i C128 mode.

HEADER"diskettenavn", Iid. Ddrevnummer. [Uenhedsnummer]

nvor: "diskettenavn" er det navn man ønsker at give disketten (max 16 tegn, incl. mellemrum), "id" kan være to valgfri tegn, når blot de ikke udgør et BASIC – nøgleord (som f.eks. ON eller IF). enten for sig selv. eller efter et stort I. "drevnummer" er O. "enhedsnummer" er 8, med mindre De har mndret det, som beskrevet i appendiks A (1571 går ud fra værdien 8, selvom det ikke indtastes).

Kommandoen for C64. VIC 20 eller C128 i C64 mode er denne:

OPEN15, enhedsnummer, 15, "NEWdrevnummer: diskettenavn, id" CLOSE15

Enhedsnummer, drevnummer, diskettenavn og id er de samme, som beskrevet OPEN - kommandoen forklares i den næste kapitel. Skriv den som den er indtil videre.

BEMÆRKNING TIL ØVEDE BRUGERE:

Hvis De ønsker at bruge variabler til diskettenavn eller id. er formatet således:

C128. Plus/4: HEADER(A$). T(B$). DO

C64: OPEN15.8.15: PRINT#15. "NO: "+A$+B$: CLOSE15

Hvor:

A$ indeholder diskettenavn (max. 16 karakterer) B$ indeholder id (med en længde på 2 karakterer)

Page 17

Efter at en diskette er formatteret, kan den til enhver tid reformatteres. De kan ændre dens navn og slette dens filer hurtigere ved at udelade id nummeret i HEADER - kommandoen.

DISKETTE INDHOLDSFORTEGNELSE (DIRECTORY):

En indholdsfortegnelse er en liste over en diskettes filer. Indholdsfortegnelsen indlæses på C128 og Plus4 ved at indtaste ordet DIRECTORY på en tom linie, og herefter trykke på RETURN - tasten, eller ved blot at trykke på F3 tasten på C128. Det sletter intet i hukommelsen, så De kan kalde indholdsfortegnelsen frem på ethvert tidspunkt, selv under afvikling af et program. Kommandoen til C64 indholdsfortegnelse, LOAD"$",8 (afterfulgt af tryk på RETURN - tasten). LIST (efterfulgt af tryk på RETURN tasten), SLETTER det, der måtte være i computerens hukommelse. Hvis en indholdsfortegnelse ikke kan være på skærmen, ruller skærm-

Hvis en indholdsfortegnelse ikke kan være på skærmen, ruller skærmbilledet frem, indtil sidste linie vises. Hvis De vil stoppe rulningen, holde en pause eller nedsætte dens hastighed, kan man i vejledningen til den computer, man anvender se hvilke taster der skal bruges. For at få en ide om, hvordan en indholdsfortegnelse ser ud, kan De

For at få en ide om, hvordan en indholdsfortegnelse ser ud, kan De indlæse Test/ Demo - diskettens indholdsfortegnelse.

"O" i venstre side af første linie er 1571's drev nr. (på en dobbelt diskettestation kan det være O eller 1). Herefter følger diskettenavnet og diskette id - som begge angives, når disketten formatteres.

"2A", der står sidst på øverste linie, betyder at 1571 anvender Commodores disk operations system (DOS) version 2A.

På hver af de øvrige linier, er der tre informationer om diskettens filer. Til venstre i hver linie angives filens størrelse i blokke a 254 tegn. Fire blokke svarer næsten til 1K hukommelse i computeren. Midt på linien står filnavnet omgivet af anførelsestegn. Alle tegn indenfor anførelsestegnene er dele af filnavnet. Hver linie afsluttes med en forkortelse på tre bogstaver, der angiver filtypen. Filtyperne beskrives i senere kapitler.

FILTYPER:

PRG - Program SEQ - Sekventiel REL - Relativ USR - User(bruger) DEL - Deleted - slettet (denne type vil De ikke se)

Bemærk: Filer med direkte tilgang, også kaldet Random filer, vil ikke automatisk fremkomme i indholdsfortegnelsen. De beskrives i kapitel 7.

På sidste linie i indholdsfortegnelsen vises, hvor mange blokke der endnu er til rådighed. Dette tal varierer fra 664 (i 1541 mode) og 1328 (i 1571 mode) på en nyformatteret diskette, til O på en diskette, der er fyldt helt op.

Page 18

SELEKTIVE INDHOLDSFORTEGNELSER.

Ved ændring af LOAD - kommandoen til indholdsfortegnelsen kan De danne en art "under-indholdsfortegnelse", som udskriver en enkelt, udvalgt filtype. De kunne f.eks. udskrive en liste over alle sekventielle data filer (kapitel 5), eller over alle relative datafiler (kapitel 6). Formatet for denne kommando er:

LOAD"$0:mønster=filtype".8 (til C64)

hvor mønstret angiver en speciel gruppe filer, og filtypen er en forkortelse på et bogstav for de herunder nævnte filtyper:

P = Program S = Sekventiel R = Relativ U = User (bruger)

Kommandoen til C128 og Plus/4 er:DIRECTORY"mønster=filtype"

Nogle eksempler:

LOAD"$0:*=R".8 og DIRECTORY"*=R" viser alle relative filer.

LOAD"$0:Z*=R",8 og DIRECTORY"Z*=R" viser en under-indholdsfortegnelse over alle relative filer med begyndelsbogstavet Z (stjernen (*) forklares i afsnittet, der hedder "Mønster-sammenligning").

UDSKRIFT AF INDHOLDSFORTEGNELSE:

En udskrift af indholdsfortegnelsen fås således:

LOAD"$",8 OPEN4,4:CMD4:LIST PRINT#4:CLOSE4

MØNSTER-SAMMENLIGNING

Man kan anvende specielle mønster-sammenlignings tegn, når man indlæser et program ved delvis indtastning af navnet, eller til at danne selektive indholdsfortegnelser som tidligere beskrevet.

De to karakterer der anvendes i denne sammenhæng er stjerne (*) og spørgsmålstegn (?). De fungerer som en art jokere i et spil kort. Forskellen mellem de to er, at stjernen accepterer alle tegn fra dens position og fremad, mens spørgsmålstegnet kun accepterer en tilfældig karakter i den position hvor det står. Her følger nogle eksempler og deres resultat:

LOAD"A*",8 indlæser den første fil på disketten, hvis begyndelsesbogstav er A, uanset hvilke tegn der ellers følger i filnavnet.

Page 19

DLOAD"SM?TH" indlæser den første fil hvis navn begynder med SM, slutter med TH og har een karakter imellem. DIRECTORY"Q*" indlæser en indholdsfortegnelse over filer, hvis navne begynder med Q. LOAD"*",8 er et specielt tilfælde. Når en stjerne anvendes alene som et navn, passer den på den sidst anvendte fil (på C64 og C128 i C64 mode). LOAD"0:*",8 indlæser den første fil på disketten (C64 og C128 i C64 mode).

DLOAD"*" indlæser den første fil på disketten (Plus/4 og C128 i C128 mode).

SPLAT FILER

En markering, De lejlighedsvis vil opdage i en linie på en indholdsfortegnelse, efter De har gemt programmer og filer, er en stjerne, der står umiddelbart før filtypen på en fil, der er O blokke lang. Dette indikerer at filen ikke var korrekt lukket efter at den var dannet, og at man ikke skal regne med at kunne anvende den. Disse "splat" skal normalt slettes fra disketten og omskrives. De skal imidlertid ikke bruge SCRATCH - kommandoen, når disse skal slettes. Kun med VALIDATE eller COLLECT kommandoen kan disse fejlramte filer slettes på en sikker måde. En af disse bør normalt bruges hver gang man opdager en "splat" fil på en diskette. Alle disse kommandoer beskrives i de følgende kapitler.

Der er to undtagelser til ovenævnte advarsel: den ene er, at VALIDATE og COLLECT ikke kan anvendes på visse disketter, der indeholder filer med direkte tilgang (random filer) (Kapitel 7). Den anden er, hvis oplysningerne i "splat" filen var vitale, og ikke kan erstattes. Der er en metode, der kan redde den del af filen, der blev skrevet korrekt. Denne mulighed beskrives i næste kapitel.

Page 20
KAPITEL 2.

BASIC 2.0 KOMMANDOER.

Dette kapitel beskriver diskette kommandoer som anvendes med VIC 20, Commodore 64 eller Commodore 128 computeren i C64 mode. Disse er Basic 2.0 kommandoer.

De skal sende kommandodata til diskettestationen via noget som kaldes kommandokanalen. Første trin er at åbne kanalen med følgende kommando:

OPEN15,8,15

Det første tal "15" er et fil nummer eller et kanal nummer. Selvom det kunne være et tilfældigt tal mellem 1 og 255, vil vi bruge "15", fordi det anvendes til at sammenligne den sekundære adresse på 15 med, hvilket er kommandokanalens adresse. Tallet i midten er den primære adresse, bedre kendt som enhedsnummer. Det er sædvanligvis 8, med mindre De ændrer det (se appendiks A).

Når kanalen er åbnet, bruges PRINT# kommandoen til at sende information til diskettestationen og INPUT# kommandoen til at modtage information fra diskettestationen. De skal lukke kanalen med CLOSE15 kommandoen.

Det følgende eksempel viser anvendelsen af kommandokanalen ved formattering (NEW) af en uformatteret diskette:

OPEN15,8,15 PRINT#15,"NEWdrevnummer:diskettenavn,id" CLOSE15

De kan kombinere de to første kommandoer, og forkorte NEW - kommandoen således:

OPEN15,8,15, "Ndrevnummer:diskettenavn.id"

Er kommandokanalen allerede åben, skal følgende kommando anvendes (prøver man på at åbne en kanal der allerede er åben, vil det resultere i en "FILE OPEN" error):

PRINT#15, "Ndrevnummer:diskettenavn.id"

FEJL UNDERSØGELSE

Når den grønne lampe på disketten lyser i Basic 2.0, kan De skrive et lille program for at finde ud af, hvad fejlen er. Dette bevirker, at De mister enhver programvariabel, der allerede var i hukommelsen. Her følger programmet til fejlundersøgelse:

10 OPEN15,8,15 20 INPUT#15,EN,EM$,ET, ES 30 PRINT EN,EM$,ET,ES 40 CLOSE15

Dette lille program læser fejlkanalen ind i fire BASIC variabler (beskrevet herunder), og udskriver resultatet på skærmen. En meddelelse vises enten der var en fejl eller ej, men hvis der var en fejl, sletter programmet den fra diskhukommelsen og slukker den grønne lampe på diskettestationen.

Page 21

Når meddelelsen står på skærmen, kan De slå fejlen op i appendiks B for at se, hvad det betyder og hvordan den afhjælpes.

For dem der selv skriver programmer, følger her en lille fejl-kontrol subrutine, De kan indlægge i Deres programmer:

59980 REM LÆS FEJLKANAL 59990 INPUT#15,EN,EM$,ET,ES 60000 IF EN>1THEN PRINT EN,EM$,ES:STOP 60010 RETURN

Dette program forudsætter at fil 15 blev åbnet tidligere i programmet, og at den lukkes i programmets slutning.

Subrutinen læser fejlkanalen og skriver resultatet i de navngivne variabler-EN (fejl nr), EM$ (fejlmeddelelse),ET (fejlspor) og ES (fejl sektor). Af disse fire skal kun EM$ være en streng. De kunne vælge andre variabelnavne, selvom disse traditionelt anvendes til dette brug.

To fejlnumre er harmløse – O betyder at alt er OK og 1 fortæller hvor mange filer, der er blevet slettet med SCRATCH kommandoen (som beskrives senere i dette kapitel). Har fejlstatus en anden værdi, udskrives fejlmeldingen i linie 60000 og programmet stopper.

Da det er en subrutine, skal den kaldes med BASIC GOSUB kommandoen, enten i direkte mode eller fra et program. RETURN - kommandoen i linie 60010 vil hoppe tilbage til direkte mode eller til næste linie i programmet, alt efter anvendelsesmetoden.

BASIC TIPS

Tip 1. Det er bedst at åbne fil 15 ved programmets start og lukke den ved programmets slutning, efter at alle øvrige filer allerede er lukket. Når man åbner den i starten, er den klar, når De får behov for en disk kommando et eller andet sted i programmet.

Tip 2. Hvis Basic stopper med en fejl, når De har filer åbne, afbryder Basic dem, uden at lukke dem korrekt på disketten. For at lukke disse korrekt på disketten, skal De taste:

CLOSE15:OPEN15.8.15."I":CLOSE15

Dette åbner kommandokanalen og lukker den umiddelbart herefter, sammen med øvrige diskfiler. Hvis en fil ikke lukkes korrekt, både i Basic og på disketten, kan det resultere i, at man mister hele filen.

Tip 3. En diskfejlmeddelelse er ikke altid en fejl. Fejl 73, "CBM DOS 3.0 1571" vil fremkomme, hvis diskens fejlkanal læses inden der er sendt nogen diskkommando, når De tænder Deres computer. Dette er en nem måde til at kontrollere, hvilken version DOS der anvendes. Kommer denne meddelelse imidlertid senere, efter andre diskkommandoer, betyder det, at der er uoverensstemmelse mellem den DOS der har formatteret disketten og den DOS, der er i diskettestationen. DOS betyder Disk Operativ System.

Page 22

Tip 4. Drevet nulstilles således: tast:OPEN15,8,15,"UJ":CLOSE15. Samme resultat fås ved at sende "UI+" eller "UI".

SAVE

Brug SAVE kommandoen til at gemme et program eller en fil på disketten til senere brug. Inden man kan SAVE på en diskette, skal disketten være formatteret, som tidligere beskrevet.

FORMAT FOR SAVE KOMMANDOEN:

SAVE"drevnummer:filnavn",enhedsnummer

hvor "fil navn" er en streng på indtil 16 tegn, der efterfølger drev nummeret og et kolon. Herefter kommer diskettestationens enhedsnummer, der normalt er 8.

Imidlertid vil SAVE - kommandoen ikke kopiere det der ikke er i BASIC tekstområdet, som f.eks. "DOS 5.1" til C64. For at kopiere dette og lignende maskinsprog, skal De anvende et maskinsprogs monitorprogram.

"SAVE MED MONITOR" KOMMANDOENS FORMAT:

.S"drevnummer:filnavn"enhedsnummer,start adresse,slut adresse+1

hvor "drevnummer" er drevets nr., 0 på 1571; "filnavn" er et gyldigt filnavn på indtil 14 tegn (efterladende 2 til drive nr og kolon);"enhedsnummer er apparat nummer med to cifre, normalt 08 (der skal være forantillet 0); og adressen, der skal gemmes, angives som hexadecimal, men uden foranstående $ (dollar tegn). Bemærk at slutadressen som angives, skal være en position efter den sidste position, der skal gemmes.

EKSEM PEL:

Her er den krævede syntaks for at SAVE et eksemplar af "DOS 5.1"

.S"0:DOS 5.1".08.CC00.D000

GEM MED ERSTAT FUNKTION.

Hvis en fil allerede eksisterer, kan den ikke igen gemmes med samme navn, idet diskettestationen kun tillader et eksemplar af et givet filnavn pr. diskette. Det er muligt at omgå dette ved at anvende RENAME eller SCRATCH kommandoerne, der beskrives senere. Hvis De imidlertid ønsker at erstatte et program eller en datafil med en revideret version, er en anden kommando mere belejlig. Dette er GEM MED ERSTAT, eller @ SAVE. Denne funktion beder diskettestationen erstatte enhver fil, den finder i diskettens indholdsfortegnelse med det samme navn, idet den erstatter den gamle version med den nye fil.

Page 23
GEM MED ERSTAT KOMMANDOENS FORMAT:

SAVE 90:Drevnummer:filnavn",enhedsnummer hvor alle parametere er sædvanlige, med undtagelse af "erstat"-tegnet "". Drevnummer skal angives her.

EKSEM PEL:

SAVE "@O:REVIDERET PROGRAM",8

Det der sker er, at hele den nye version gemmes først. Derefter slettes den gamle version. Derfor er der kun en lille risiko for et uheld hvis f.eks. strømmen svigter under denne proces, ved at både den nye og den gamle version af filen vil blive ødelagt.

Advarsel: Brug ikke SAVE på en diskette der næsten er fyldt. Brug den kun, når der er tilstrækkelig plads på disketten til, at den kan indeholde endnu en kopi af det program, der skal erstattes. Hvis der ikke er plads nok på disketten til den nye version, vil kun den del der er plads til blive gemt. Når kommandoen er udført, vil et blik på indholdsfortegnelsen vise, at den nye version er der, men at den ikke optager det antal blokke, der svarer til den størrelse, programmet har i hukommelsen. Dette problem bliver desværre ikke opdaget af VERIFY kommandoen (se nedenfor), da det der er blevet gemt, er blevet gemt korrekt.

VERIFY

Selv om det ikke er så nødvendigt ved brug af en diskettestation som med en kassettebåndoptager, kan BASIC's VERIFY kommando anvendes, når man ønsker sig ekstra sikkerhed for, at en programfil er korrekt gemt på disketten. Kommandoens funktion minder meget om LOAD kommandoens, med den undtagelse at den kun sammenligner programmet karakter for karakter med den tilsvarende karakter i computerens hukommelse, i stedet for at indlæse det i hukommelsen.

Hvis programmet adskiller sig blot det mindste fra hukommelsens indhold, vil "VERIFY ERROR" komme frem for at meddele, at der er en forskel mellem programmerne. Dette behøver ikke at betyde, at et af eksemplarerne er defekt. Men hvis de skulle have været ens, er der et problem.

Det tjener naturligvis ikke noget formål at prøve på at verificere en disketteudgave af et program, når originalprogrammet ikke længere er i hukommelsen. Når der ikke er noget at sammenligne med, vil der altid fremkomme en fejl, selv om disketteudgaven altid automatisk verificeres, når den skrives på disketten.

VERIFY KOMMANDOENS FORMAT:

VERIFY"drevnummer:mønster",enhedsnummer,placeringsflag

Mens "drevnummer" er et valgfrit drev nr., er "mønster" et strengudtryk, der svarer til filnavnet, med eller uden mønstersammenlignende tegn, og "enhedsnummer" er diskettestationens apparatnr., normalt 8. Hvis placeringsflaget er til stede og er 1, vil filen blive verificeret, hvor den oprindeligt blev gemt, og ikke flyttet til BASIC tekstområdet.

Page 24

En nyttig alternativ form for kommandoen er:

VERIFY"*", enhedsnummer

Denne kommando verificerer den sidst anvendte fil, uden at man skal indtaste filnavn eller drev nr.. Den virker imidlertid ikke korrekt efter en GEM OG ERSTAT, da den sidst anvendte fil var den, der blev slettet og diskettestationen vil derfor prøve at sammenligne en slettet fil med programmet i hukommelsen. Der vil ikke ske noget ved det, men "VERIFY ERROR" vil altid fremkomme. Ved anvendelse af VERIFY efter @SAVE skal mindst noget af det filnavn der skal verificeres, indtastes i mønstret. En anden bemærkning om VERIFY - når man verificerer en relokeret BASIC

En anden bemærkning om VERIFY - når man verificerer en relokeret BASIC fil, vil der næsten altid blive meldt fejl, på grund af ændringerne i link pointerne i BASIC programmer, udført under relokationen. Det er bedst at verificere filer gemt af samme maskintype og med ens hukommelsesstørrelser. Et BASIC program, gemt af en Plus/4, kan ikke let verificeres med en C64, selv om programmet kan køre på begge maskiner. Dette skulle ikke have nogen betydning, da det eneste tidspunkt, man vil verificere filer på andre maskiner end dem der har gemt dem, er, når man vil sammenligne 2 diskettefiler for at se, om de er ens. Dette sker ved at indlæse den ene, og verificere den mod den anden, og dette kan kun ske på en maskine af samme type og med samme hukommelsesstørrelse som den, filerne var først var dannet på.

SCRATCH

SCRATCH kommandoen tillader Dem at slette uønskede filer, og derved gøre plads for andre filer. Den kan anvendes ved sletning enten af en enkelt fil, eller flere filer via mønstersammenligning.

SCRATCH KOMMANDOENS FORMAT:

PRINT#15. "SCRATCHO:mønster"

eller forkortelsen:

PRINT#15."S:mønster"

"mønster" kan være ethvert filnavn eller en kombination af tegn og "jokere". Det forudsættes som sædvanligt, at kommandokanalen allerede er åbnet som fil 15. Selvom det ikke absolut er nødvendigt, er det bedst at angive drevnr. i SCRATCH kommandoerne.

Hvis De kontrollerer fejlkanalen efter en SCRATCH kommando, vil værdien for ET (fejlspor) fortælle, hvormange filer der blev slettet. Hvis Deres diskette f.eks. indeholder programfiler med navnene "TEST", TRAIN", "TRUCK", og "TRAIL" kan De slette alle fire, sammen med alle øvrige filer, der begynder med bogstavet "T" ved at følge denne fremgangsmåde:

PRINT#15."SO:T*"

Som kontrol for at de er slettet, kan De taste:

GOSUB 599990

Page 25

for at kalde den fejlkontrol subrutine, der er anført tidligere i dette kapitel. Hvis de fire nævnte var de eneste der begyndte med bogstavet "T", vil De se:

01.FILES SCRATCHED.04.00

READY

Tallet "04" fortæller, at fire filer blev slettet

MERE OM SCRATCH

SCRATCH er en effektiv kommando, og skal benyttes med omtanke, således at De kun sletter de filer, De ønsker at slette. Når SCRATCH benyttes sammen med et mønster, anbefales det først at udskrive en indholdsfortegnelse med brug af samme mønster for at være sikker på nøjagtigt hvilke filer, der slettes. På den måde undgår De ubehagelige overraskelser, når man anvender samme mønster i SCRATCH- kommandoen.

Genfinding efter SCRATCH

Hvis De, ved et uheld, kommer til at slette en en fil, der ikke skulle have været slettet, er der stadig en chance for at redde den. I lighed med "NEW" kommandoen sletter SCRATCH ikke den egentlige fil, men nulstiller filens pointere (pegepinde) i diskettens indholdsfortegnelse. Der er et "Unscratch" program på Deres Test/ Demo-diskette

BEMÆRK! Hvis De ved et uheld sletter en fil inden for DOS Shell (se kapitel 4), kan De retablere den med Shell's RESTORE FILES funktion.

Mere om "Splats"

slet aldrig en "splats" Slet aldrig en "splat"fil. Dette er filer der dukker op i indholdsfortegnelsen med en stjerne (*) umiddelbart før typeangivelsen. Stjernen (eller "splat") betyder, at filen aldrig blev rigtigt lukket, og derfor er der ingen brugbar kæde af sektorforbindelser, som Scratch kommandoen kan følge ved sletning af filen.

Hvis De sletter en sådan fil, er der chance for, at De ukorrekt frigør sektorer, der stadig anvendes af andre programmer eller filer, og derved beskadiger disse, når De tilføjer flere filer på disketten. Hvis De finder en "splat" fil, eller for sent opdager, at De har slettet en sådan, skal De straks validere disketten med VALIDATE - kommandoen, beskrevet senere i dette kapitel. Har De tilføjet filer til disketten efter at De har slettet en "splat" fil, er det bedst straks at tage en kopi af hele disketten på en anden, ny diskette. Gør dette med COPY programmet og ikke med BACKUP programmet. Ellers bliver det samme problem overført til den nye diskette. Når kopieringen er foretaget, sammenlignes antal frie blokke på de to disketter. Er disse tal lige store, er der ingen skade sket. Hvis ikke, er der sandsynligvis mindst en fil på disketten, der er beskadiget. Undersøg derfor straks alle diskettens filer.

Page 26

Låste filer

Lejlighedsvis indeholder en diskette en låst fil, en fil som ikke kan slettes med SCRATCH - kommandoen. Sådanne filer kan kendes på "<" tegnet, som følger umiddelbart efter fil typen i indholdsfortegnelsen. Hvis man ønsker at slette en sådan fil, skal man bruge en disk monitor til at slette bit 6 i filtypen i diskettens indholdsfortegnelse. Modsat, for at låse en fil, skal bit 6 i samme byte sættes.

RENAME

RENAME - kommandoen tillader Dem at ændre navnet på et program eller en fil i diskettens indholdsfortegnelse. Da dette kun berører indholdsfortegnelsen, arbejder RENAME meget hurtigt.

RENAME KOMMANDOENS FORMAT:

PRINT#15. "RENAMEO:nyt navn=gammelt navn"

eller den kan forkortes således:

PRINT#15, "RO:nyt navn=gammelt navn"

hvor "nyt navn" er det navn, De ønsker at give filen, og "gammelt navn" er det navn, filen har nu. "nyt navn" kan være et gyldigt filnavn med en længde på indtil 16 karakterer. Det antages, at kommandokanal 15 allerede er åbnet.

Et råd - Vær sikker på, at filen, hvis navn skal ændres, er korrekt lukket.

EKSEM PLER:

Lige før en ny version af et "kalender" program gemmes, kan De taste:

PRINT#15. "RO:KALENDER/BACKUP=KALENDER"

eller flytte et program med navnet "BOOT", i øjeblikket det første program på disketten, til et andet sted i indholdsfortegnelsen ved at taste:

PRINT#15, "RO:TEMP=BOOT"

efterfulgt af en COPY - kommando (beskrives senere), som gør "TEMP" til en ny kopi af "BOOT", og slutte med en SCRATCH - kommando for at komme af med den oprindelige version af ""BOOT".

Page 27

ANDRING AF NAVNE OG SLETNING AF PROBLEMFYLDTE FILER (ØVEDE BRUGERE)

Nu og da kan man støde på filer der, har sære filnavne, som f.eks. et komma alene (","), eller en, der indeholder et SHIFT mellemrum (et SHIFT mellemrum fremtræder som et almindeligt mellemrum, men hvis en fil med et mellemrum i navnet ikke vil indlæses korrekt, og alt andet er rigtigt, er det muligvis et SHIFT mellemrum). Eller De finder måske en fil, der indeholder karakterer, der ikke kan udskrives. Alt dette kan skabe problemer. Kommafiler er således undtagelsen fra reglen om, at to filer ikke kan have samme navn. Da det ikke skulle være muligt at lave en fil, hvis navn kun er et komma. forventer digken aldrig, at De gør det igen.

Filer med SHIFT mellemrum i deres navne kan også skabe problemer, fordi disken tolker SHIFT mellemrummet som en markering af filnavnets slutning og skriver, hvad der måtte følge efter anførelsestegnet, som markerer slutningen af et navn i indholdsfortegnelsen. Denne teknik kan være nyttig, idet den tillader Dem at anvende lange filnavne, og lader disken genkende en lille del af det, som var det hele navnet, uden brug af mønstersammenlignende karakterer.

Hvorom alting er, har De et filnavn, der skaber problemer, kan De anvende CHR$() funktionen til at angive den karakter, der skaber problemer, uden at skulle indtaste dem direkte. Dette giver Dem mulighed for, at bygge dem ind i en RENAME - kommando. Hvis det ikke lykkes, kan De også bruge mønstersammenlignende karakterer i forbindelse med SCRATCH - kommandoen. Dette giver Dem mulighed for at specificere filen uden overhovedet at skulle anvende de problemskabende karakterer overhovedet, men det betyder også, at De mister Deres fil.

Er det f.eks. lykkedes for Den at danne en fil med navnet ""FILM" med et ekstra anførelsestegn i starten af filnavnet, kan den omdøbes til "FILM" ved anvendelse af CHR$() svarende til anførelsestegnet i RENAME kommandoen:

PRINT#15, "RO:FILM="+CHR$(34)+"FILM"

CHR$(34) tvinger et anførelsestegn ind i kommandolinien, uden at genere BASIC. Fremgangsmåden for filer der indeholder SHIFT mellemrum er den samme med CHR$(160).

I tilfælde, hvor selv dette ikke virker, hvis Deres diskette f.eks indeholder en komma fil (en der hedder ","), kan De komme af med den på denne måde:

PRINT#15,"SO:?"

Dette eksempel vil slette alle filer med navne på en karakter.

Afhængig af det enkelte problem kan det være nødvendigt at være meget kreativ ved valg af mønstersammenlignende karakterer, der kun vil berøre den ønskede fil, og det kan være nødvendigt først at ændre navne på andre filer for at undgå, at de bliver slettet. I nogle tilfælde er det lettere at kopiere de filer man ønsker at

I nogle tilfælde er det lettere at kopiere de filer man ønsker at bevare over på en anden diskette, og lade filerne med problemer blive tilbage.

COPY

COPY kommandoen giver Dem mulighed for at fremstille en ekstra kopi af ethvert program eller enhver fil på en diskette. På en enkelt diskettestation som 1571 skal kopieringen ske på samme diskette, hvilket betyder at den skal have et navn der er forskelligt fra navnet på den fil, der ønskes kopieret. Kommandoen anvendes også til at sammenstille indtil 4 sekventielle datafiler (filerne sammenkædes til hinanden som led til led i

Page 28

en kæde). Filerne sammenkædes i den orden, hvori de fremkommer på kommandolinien (i). Sourcefiler og andre filer på disketten ændres ikke. Filerne skal lukkes før de kopieres eller sammenkædes.

COPY KOMMANDOENS FORMAT:

PRINT#15, "COPYdrevnummer:ny fil=gammel fil"

EKSEMPLER:

PRINT#15, "COPYO: BACKUP=ORIGINAL"

eller forkortet til:

PRINT#15."Cdrevnummer:ny fil=gammel fil"

PRINT#15."CO:BACKUP=ORIGINAL"

hvor "drevnummer" er drevets nummer, "ny fil" er kopiens navn og "gammel fil" er originalens navn.

FORMAT FOR SAMMENK #DNINGSMULIGHEDEN:

PRINT#15, "Cdrevnummer:ny fil=fil 1.fil 2.fil 3.fil 4"

hvor "drevnummer" altid er 0.

BEMARK! Længden af en kommandostreng (kommando og filnanve) er begrænset til 41 karakterer.

EKSEM PLER:

Efter at have ændret filnavnet "BOOT" til "TEMP" i sidste afsnits eksempel, kan De bruge COPY kommandoen til at lave en ekstra kopi af programmet et andet sted på disketten under det oprindelige navn:

PRINT#15."CO:BOOT=TEMP"

Efter at have dannet flere små sekventielle filer, der let passer i hukommelsen sammen med et program, vi anvender, kan De bruge sammenkædningsmuligheden til at kombinere dem i en hovedfil, selv om resultatet er for stort til at kunne være i hukommelsen. (Vær sikker på, at filen kan være på den resterende del af disketten - den vil blive lige så stor som summen af de filer, der indgår i den.)

PRINT#15, "CO:A-Z=A-G,H-M,N-Z"

Page 29

BEMÆRK: Et dobbelt drev udnytter denne kommando bedre ved at kunne kopiere programmer fra diskette til diskette. Vil De gøre dette på 1571, kan De anvende et program der findes på Test/Demo disketten, eller bruge DOS Shell, som beskrives i kapitel 4.

VALIDATE

VALIDATE kommandoen efterregner Block Availability Map (BAM) på den aktuelle diskette, og allokerer kun de sektorer, der stadig anvendes af korrekte lukkede filer og programmer. Alle andre sektorer (blokke) vil forblive uallokerede, og alle filer, der ikke er korrekt lukket, bliver automatisk slettet. Denne korte beskrivelse viser hverken styrken af aller faren ved kommandoens anvendelse. Dens styrke er, at den kan retablere en diskette, således at indholdsfortegnelse og antal frie blokke er rigtige. Hver gang antallet af blokke, brugt af diskettens filer og antal frie blokke, ikke ialt er 664 (i 1541 mode) eller 1328 (i 1571 mode) på en ubeskadiget diskette, skal der ske en validering af disketten. Der er dog een undtagelse, der beskrives nedenfor. Er der på et tidspunkt filer på en stjerne (*) ved filtypen i indholdsfortegnelsen, trænger disketten til at blive valideret. Det er faktisk en god ide, med den nævnte undtagelse, at validere sine disketter, når man er det mindste i tvivl om en diskettes stabilitet.

Undtagelsen er disketter, der indeholder filer med direkte tilgang, som beskrevet i kapitel 7. De fleste filer med direkte tilgang (random filer) allokerer ikke deres sektorer på en måde, som VALIDATE kan genkende. Derfor kan en validering af en sådan diskette resultere i, at alle filer med direkte tilgang frigives (reallokeres), med det resultat, at deres indhold mistes, når disketten tilføjes flere filer. Med mindre De instrueres om det, må De ALDRIG bruge VALIDATE på en diskette, der indeholder filer med direkte tilgang. (Bemærk: det er ikke det samme som relative filer beskrevet i kapitel 6. VALIDATE kan uden problemer anvendes på relative filer.)

VALIDATE KOMMANDOENS FORMAT:

PRINT#15"VALIDATEO"

eller forkortet til

PRINT#15, "VO"

hvor "O" er drevnummer. Som sædvanligt antages det, at fil 15 er blevet åbnet som kommandokanal, og vil blive lukket efter kommandoens udførelse.

EKSEM PEL:

PRINT#15."VO"

INITIALISERING

En kommando, der ikke ofte er nødvendig på 1571, men lejlighedsvis anvendes, er INITIALIZE. På 1571, og næste alle andre Commodore drev, udføres denne kommando automatisk, når en ny diskette isættes. (Den optiske skrivebeskyttelseskontakt anvendes til at føle, om disketten er ændret.)

Page 30

Resultatet af INITIALIZE, enten den fremtvinges med en kommando eller foretages automatisk af diskettestationen, er en genindlæsning af den aktuelle diskettes BAM til diskbufferen. Denne information skal altid være rigtig, således at disken kan lagre nye filer rigtigt. Da denne operation imidlertid sker automatisk, er det eneste tidspunkt den kommer til anvendelse på, hvis der sker noget, der gør informationerne i drevets buffer utroværdige.

INITIALIZE KOMMANDOENS FORMAT: EKSEMPEL

PRINT#15"INITIALIZEdrevnummer" PRINT#15."INITIALIZEO"

eller forkortet til:

PRINT#15."Idrevnummer" PRINT#15."IO"

hvor det antages, at kommandokanalen er åbnet med fil 15, og "drevnummer" er 0.

En anvendelse for Initialize er at få rensedisketten til at rotere ved rensning af diskettestation, hvis De vælger denne metode. (Der er ingen grund til at anvende et sådant rense-kit regelmæssigt under normale driftsbetingelser.) Anvender De imidlertid et rense-kit, følger her et kort program, der vil få disketten til at rotere i det omfang, det er nødvendigt:

10 OPEN15,8,15 20 FOR I=1 TO 15 30 PRINT#15,"IO" 40 NEXT I 50 CLOSE 15

Programmet anvender en initialiserings-løkke til at lade drevmotoren køre i ca. 20 sekunder.

Page 31
KAPITEL 3
BASIC 7.0 KOMMANDOER

Dette kapitel beskriver de diskkommandoer der anvendes sammen med Commodore 128 computer (i C128 mode). Det er BASIC 7.0 som indeholder BASIC 2.0. BASIC 3.5 og BASIC 4.0 kommandoer, der alle kan anvendes.

FEJLKONTROL

Hvis lampen på diskettestationen (grønt lys) blinker, kan De bruge følgende kommando for at finde ud af, hvilken fejl det er.

PRINT DS$

Herefter vises om det er en fejl. Var der en fejl, sletter denne kommando fejlen fra diskens hukommelse, og afbryder fejllampen på diskettestationen.

Når meddelelsen er kommet frem på skærmen, kan De slå op i appendiks B og se hvad den betyder, og hvad der skal gøres ved den. Skriver De selv programmer, følger her en lille fejlkontrol sub-

Skriver De selv programmer, følger her en lille fejlkontrol subrutine, som De kan lægge ind i Deres programmer:

59990 REM LÆS FEJLKANAL 60000 IF DS>1 THEN PRINT DS$:STOP 60010 RETURN

Subrutinen læser fejlkanalen og anbringer resultatet i de reserverede variabler DS og DS$. De opdateres automatisk af BASIC.

To fejlnumre er harmløse - O betyder, at alt er OK, og 1 fortæller, hvor mange filer der er blevet slettet med SCRATCH kommandoen (beskrives senere i dette kapitel). Hvis fejlstatus er noget andet, udskriver linie 60000 fejlen, og stopper programmet.

Da dette er en subrutine, får De adgang til den med BASIC GOSUB kommandoen, enten i direkte mode eller fra et program. RETURN ordren i linie 60010 vil hoppe tilbage i direkte mode, eller gå til næste ordre i programmet, alt efter hvad der er passende.

SAVE

Denne kommando vil gemme et program eller en fil, så De kan bruge den igen. Disketten skal være formatteret, før De kan gemme noget på den.

SAVE KOMMANDOENS FORMAT:

DSAVE"filnavn"[,Ddrevnummer][,Uenhedsnummer]

Denne kommando fungerer ikke ved kopiering af programmer, der ikke er skrevet i BASIC. For at kunne kopiere et maskinsprogs program, skal De bruge BSAVE kommandoen, eller den indbyggede Monitor S kommando.

Page 32

BSAVE KOMMANDOENS FORMAT:

BSAVE"fil navn"[Ddrevnummer][,Uenhedsnummer][,Bbanknummer] [,Pstart adresse][T0 Pslutadresse+1]

hvor de sædvanlige muligheder findes og banknummer er en af de 16 banker i C128. Adressen der skal gemmes, angives i decimaltal. Bemærk at slutadressen skal være 1 plads efter den sidste plads, der skal gemmes.

For at få adgang til den indbyggede monitor, skal der tastes MONITOR. Monitor forlades ved at taste X først på en linie.

FORMAT FOR MONITOR SAVE*
.S"drevnummer:filnavn",enhedsnummer,start adresse,slutadresse+1

hvor drevnummer er drive nummer, 0 på 1571;"filnavn" er ethvert lovligt filnavn på op til 14 karakteres længde (der efterlades 2 til drevnummer og kolon); "enhedsnummer" er et tocifret tal, normalt 08 på 1571. (Det foranstillede nul kræves); og adressen der skal gemmes er angivet i hexadecimal (16-tals system) men uden foranstillet dollartegn (for Plus/4). På C128 behøver adressen ikke at være i hexadecimal. Bemærk at den slutadresse, der angives, skal være en plads efter den sidste plads, der skal gemmes.

GEM MED ERSTAT

Hvis filen allerede eksisterer, kan den ikke gemmes med samme navn, idet diskettestationen kun tillader et eksemplar af et givet filnavn pr. diskette. Det er muligt at undgå dette problem ved anvendelse af RENAME og SCRATCH kommandoerne, som beskrives senere i dette kapitel. Hvis det, De ønsker at gøre er at erstatte et program eller en datafil med en nyere version, findes der en anden kommando som er mere anvendelig. Den er kendt som "GEM MED ERSTAT eller ØSAVE. Denne funktion bevirker, at diskettestationen erstatter en fil der findes i diskettens indholdsfortegnelse med samme navn, idet den erstatter den gamle version med den nye.

GEM MED ERSTAT KOMMANDOENS FORMAT:

DSAVE "efilnavn"[, Ddrevnummer][, enhedsnummer]

Fremgangsmåden er denne: Den nye version gemmes fuldstændigt. Herefter slettes den gamle og indholdsfortegnelsen ændres, så den peger mod den nye version. Da det virker på denne måde, er der en ringe risiko for, at en katastrofe, som f.eks. strømafbrydelse midt i operationen, skulle ødelægge både den gamle og den nye version af filen. Intet sker med den gamle version før den nye version er gemt forsvarligt.

Advarsel! Brug ikke SAVE på en diskette der næsten er fyldt op. Brug kun kommandoen, når der er tilstrækkelig plads på disketten til at et ekstra eksemplar af programmet eller filen kan være der. På grund af SAVE's virkemåde, befinder både den gamle og den nye version af programmet sig på disketten på samme tidspunkt, som en sikring mod tab af programmet. Er der ikke plads på disketten til at rumme det andet eksemplar af programmet, bliver der kun gemt så meget som der er plads til af den nye version. Se indholdsfortegnelsen efter at kommandoen er udført.

Page 33

De vil da kunne se, om den nye version er der, men ikke optager samme plads som den version, der befinder sig i hukommelsen.

DVERIFY

Denne kommando udfører en bit for bit sammenligning mellem det aktuelle program i hukommelsen, og et program på disketten. Denne sammenligning inkluderer BASIC link linierne, som kan variere for forskellige typer hukommelses-konfiguration. Dette betyder, at et program, gemt på diskette via en C64 og genindlæst i en C128, ikke vil verificere korrekt, da link linierne peger mod forskellige hukommelseslokationer. Er disketteversionen af programmet på nogen måde forskellig fra versionen i hukommelsen, vil "VERIFY ERROR" blive vist. Dette betyder ikke, at nogen af versionerne er fejlramte, men det forventedes, at de var ens, derfor opstår problemet.

DVERIFY KOMMANDOENS FORMAT:

DVERIFY"fil navn"[Ddrevnummer][,Uenhedsnummer][,relokerflag]

Følgende version af kommandoen verificerer en fil, der netop er blevet gemt:

DVERIFY"*"

Denne kommando vil ikke fungere korrekt efter GEM OG ERSTAT, da den sidst anvendte fil var den der blev slettet, og drevet vil herefter prøve at sammenligne den slettede fil med programmet i hukommelsen. Der vil ikke ske nogen skade, men "VERIFY ERROR" vil blive meddelt hver gang. Hvis man vil anvende VERIFY efter SAVE, skal der i det mindste angives noget af filnavnet til verificering i mønstret.

COPY

Copy kommandoen gør det muligt at lave en kopi af ethvert program eller enhver fil, der er på disketten. På et enkelt drev som 1571 skal kopien imidlertid være på samme diskette, hvilket betyder, at den skal have et navn, der er forskelligt fra navnet på den fil, der kopieres. Sourcefiler og andre filer på disketten ændres ikke. Filer skal lukkes, før de kan kopieres eller sammenlægges.

COPY KOMMANDOENS FORMAT:

COPY[Ddrevnummer,]"gammelt filnavn"TO[Ddrevnummer,]"nyt filnavn" [,Uenhedsnummer]

hvor begge drevnumre skal være 0, hvis de anvendes.

Page 34

NB. Ønsker De at kopiere en fil fra en diskette til en anden, kan De ikke bruge Copy - kommandoen. Brug i stedet for det kopieringsprogram, der er på Test/Demo disketten eller DOS Shell (se kapitel 4).

CONCAT

CONCAT kommandoen tillader Dem at sammenkæde (kombinere) to sekventielle filer.

CONCAT KOMMANDOENS FORMAT:

CONCAT [Ddrevnummer,]"tillægsfilen"TO [Ddrevnummer,]"hovedfil" [,Uenhedsnummer]

hvor det valgfri drevnummer er O i begge tilfælde. Den gamle "hovedfil" bliver slettet og erstattet med en ny "hovedfil", som er en sammenkædning af den gamle "hovedfil" og "tillægsfilen".

NB: Længden af kommandostrengen ( kommando og filnavne) er begrænset til 41 tegn.

SCRATCH

Scratch - kommandoen anvendes, når De ønsker at slette uønskede programmer eller filer fra Deres diskette og derved give plads til andre filer og programmer. Den kan anvendes til sletning af en enkelt fil eller af flere filer på een gang via mønstersammenligning.

SCRATCH KOMMANDOENS FORMAT:

SCRATCH"mønster" [, Ddrevnummer][, Uenhedsnummer]

hvor "mønster" er et eksisterende filnavn eller mønstersammenlignende karakterer.

Som en sikkerhed spørges der:

ARE YOU SURE?- (er De sikker?)

Hvis De er sikker, skal De taste Y og derefter RETURN. Hvis ikke trykkes blot RETURN, uden andet svar. Herved annulleres kommandoen.

Page 35

Antallet af filer der blev slettet vises automatisk. Hvis Deres diskette f.eks. indeholder programfiler med navnene "TEST", TRAIN", "TRUCK", og "TRAIL" kan De slette alle fire, sammen med alle øvrige filer, der begynder med bogstavet "T" ved at følge denne fremgangsmmåde:

SCRATCH"T*"

Hvis de fire nævnte var de eneste der begyndte med bogstavet "T" vil De se:

01, FILES SCRATCHED, 04,00

READY

Tallet "04" fortæller, at fire filer blev slettet

En SCRATCH kommando kan udføres i et program. Herunder vil spørgsmålet "ARE YOU SURE?" ikke fremkomme.

MERE OM SCRATCH

SCRATCH er en effektiv kommando og skal benyttes med omtanke, således at De kun sletter de filer, De ønsker at slette. Når SCRATCH benyttes sammen med et mønster, anbefales det, først at udskrive en indholdsfortegnelse med brug af samme mønster for, at være sikker på, nøjagtigt hvilke filer der slettes. På den måde undgår De ubehagelige overraskelser, når man anvender samme mønster i SCRATCH- kommandoen.

Genfinding ofter SCRATCH

Hvis De, ved et uheld, kommer til at slette en en fil, der ikke skulle have været slettet, er der stadig en chance for at redde den. I lighed med BASIC's "NEW" kommandoen sletter SCRATCH ikke den egentlige fil, men nulstiller filens pointere (pegepinde) i diskettens indholdsfortegnelse. Der findes et "Unscratch" program på Deres Test/ Demo-diskette.

BEMARK! Hvis De ved et uheld sletter en fil inden for DOS Shell (se kapitel 4), kan De retablere den med Shell's RESTORE FILES funktion.

Mere om "Splats"

Mere om "Splats" Slet aldrig en "splat"fil. Dette er filer der dukker op i indholdsfortegnelsen med en stjerne (*) umiddelbart før typeangivelsen. Stjernen (eller "splat") betyder, at filen aldrig blev rigtigt lukket, og der er derfor ingen brugbar kæde af sektorforbindelser, som Scratch kommandoen kan følge ved sletning af filen.

Hvis De sletter sådan en fil, er der chancer for, at De ukorrekt frigør sektorer, der stadig anvendes af andre programmer eller filer, og derved beskadiger disse, når De tilføjer flere filer på disketten.

Page 36

Hvis De finder en "splat" fil, eller for sent opdager at De har slettet en sådan, skal De straks validere disketten med COLLECT - kommandoen, beskrevet senere i dette kapitel. Har De tilføjet filer til disketten, efter at De har slettet en "splat" fil, er det bedst straks at tage en kopi af hele disketten på en anden, ny diskette. Gør dette med COPY programmet og ikke med BACKUP programmet. Ellers bliver det samme problem overført til den nye diskette. Når kopieringen er foretaget, sammenlignes antal frie blokke på de to disketter. Er disse tal lige store, er der ingen skade sket. Hvis ikke, er der sandsynligvis mindst en fil på disketten, der er beskadiget. Undersøg derfor straks alle diskettens filer.

Låste filer

Lejlighedsvis indeholder en diskette en låst fil, en fil som ikke kan slettes med SCRATCH - kommandoen. Sådanne filer kan kendes på "<" tegnet, som følger umiddelbart efter fil typen i indholdsfortegnelsen. Hvis man ønsker at slette en sådan fil, skal man bruge en disk monitor til at slette bit 6 i filtypen i diskettens indholdsfortegnelse. Modsat, for at låse en fil, skal bit 6 i samme byte sættes.

RENAME

RENAME - kommandoen tillader Dem at ændre navnet på et program eller en fil i diskettens indholdsfortegnelse. Da dette kun berører indholdsfortegnelsen, arbejder RENAME meget hurtigt. Hvis De at omdøbe en fil ved anvendelse af et navn, der allerede er i indholdsfortegnelsen, vil fejlmeddelelsen "FILE EXISTS" fremkomme. En fil skal være korrekt lukket, før den kan omdøbes.

RENAME KOMMANDOENS FORMAT:

RENAME [Ddrevnummer,] "gammelt navn "TO[Ddrevnummer,] "nyt navn" [, Uenhedsnummer]

hvor begge drevnumre er 0, hvis de anvendes.

ANDRING AF NAVNE OG SLETNING AF PROBLEMFYLDTE FILER (ØVEDE BRUGERE)

Nu og da kan man støde på filer, der har sære filnavne, som f.eks. et komma alene (","), eller en der indeholder et SHIFT mellemrum, eller De finder måske en, der indeholder karakterer, der ikke kan udskrives. Alt dette kan skabe problemer. Kommafiler er således undtagelsen fra reglen om, at to filer ikke kan have samme navn. Da det ikke skulle være muligt at lave en fil, hvis navn kun er et komma, forventer disken aldrig, at De gør det igen.

Filer med SHIFT mellemrum i deres navne kan også skabe problemer, fordi disken tolker SHIFT mellemrummet som en markering af filnavnets slutning og skriver, hvad der måtte følge efter anførelsestegnet, som markerer slutningen af et navn i indholdsfortegnelsen. Denne teknik kan være nyttig, idet den tillader Dem at anvende lange filnavne, og lader disken genkende en lille del af det, som var det hele navnet, uden brug af mønstersammenlignende karakterer.

Page 37

Hvorom alting er, har De et filnavn, der skaber problemer, kan De anvende CHR$() funktionen til at angive den karakter, der skaber problemer, uden at skulle indtaste den direkte. Dette giver Dem mulighed for, at bygge den ind i en RENAME - kommando. Hvis det ikke lykkes, kan De også bruge mønstersammenlignende karakterer i forbindelse med SCRATCH - kommandoen. Dette giver Dem mulighed for at specificere filen uden overhovedet at skulle anvende de problemskabende karakterer, men det betyder også, at De mister Deres fil.

Er det f.eks. lykkedes for Dem at danne en fil med navnet ""FILM" med et ekstra anførelsestegn i starten af filnavnet, kan den omdøbes til "FILM" ved anvendelse af CHR$() svarende til anførelsestegnet i RENAME kommandoen:

RENAME(CHR$(34)+"FILM")TO"FILM"

CHR$(34) tvinger et anførelsestegn ind i kommandolinien, uden at genere BASIC. Fremgangsmåden for filer der indeholder SHIFT mellemrum er den samme med CHR$(160).

I tilfælde, hvor selv dette ikke virker, hvis Deres diskette f.eks indeholder en komma fil (en der hedder ","), kan De komme af med den på denne måde:

SCRATCH"?"

Dette eksempel vil slette alle filer med navne på een karakter.

Afhængig af det enkelte problem kan det være nødvendigt at være meget kreativ ved valg af mønstersammenlignende karakterer, der kun vil berøre den ønskede fil, og det kan være nødvendigt først at ændre navne på andre filer for at undgå, at de bliver slettet.

I nogle tilfælde er det lettere at kopiere de filer man ønsker at bevare til en anden diskette, og lade filen med problemer være, som den er.

COLLECT

COLLECT kommandoen efterregner Block Availability Map (BAM) på den aktuelle diskette, og allokerer kun de sektorer, der stadig anvendes af korrekte lukkede filer og programmer. Alle andre sektorer (blokke) vil forblive uallokerede, og alle filer, der ikke er korrekt lukkede, bliver automatisk slettet. Denne korte beskrivelse viser hverken styrken af eller faren ved COLLECT's anvendelse. Dens styrke er, at den kan retablere en diskette, således at indholdsfortegnelse og antal frie blokke er rigtige. Hver gang antallet af blokke, brugt af diskettens filer og antal frie blokke, ikke ialt er 664 (i 1541 mode) eller 1328 (i 1571 mode) på en ubeskadiget diskette, skal der ske en COLLECT af disketten. Der er dog een undtagelse, der beskrives nedenfor. Er der på et tidspunkt filer på en diskette, der ikke er korrekt lukkede ("splat-filer"), markeret med en stjerne (*) ved filtypen i indholdsfortegnelsen, trænger disketten til at blive "collected". Det er faktisk en god ide, med den nævnte undtagelse, at COLLECTe sine disketter, når man er det mindste i tvivl om en diskettes stabilitet. Noter antallet af frie blokke i diskettens indholdsfortegnelse, før og efter brugen af COLLECT. Er antallene ikke ens, er der et problem, og disketten bør kopieres, fil for fil, til en ny diskette ved anvendelse af COPY kommandoen, beskrevet i foregående afsnit, og ikke ved anvendelse af BACKUP - kommando eller program.

Page 38

Undtagelsen er disketter der indeholder filer med direkte tilgang, som

beskrevet i kapitel 7. De fleste filer med direkte tilgang (random filer) allokerer ikke deres sektorer på en måde som VALIDATE kan genkende. Derfor kan en validering af en sådan diskette resultere i at alle filer med direkte tilgang frigives (reallokeres), med det resultat, at deres indhold mistes, når disketten tilføjes flere filer. Med mindre De instrueres om det, må De ALDRIG bruge VALIDATE på en diskette, der indeholder filer med direkte tilgang. (Bemærk: det er ikke det samme som relative filer beskrevet i kapitel 6. VALIDATE kan uden problemer anvendes på relative filer.)

COLLECT KOMMANDOENS FORMAT:

COLLECT[Ddrevnummer][, Uenhedsnummer]

INITIALISERING

Der findes ingen BASIC 7.0 kommando til initialisering. Derfor henvises til kapitel 2, BASIC 2.0 INITIALIZE kommando.

Page 39
KAPITEL 4

DOS SHELL

DOS Shell er et program, der giver Dem alternative muligheder for at udføre diskettekommandoer. Meddelelser der skal besvares fører Dem trin for trin gennem hver operation, og gør dermed anvendelsen af 1571 enklere og mere forståelig.

Shell er automatisk indlæst, når De isætter disketten, og derefter tænder for eller resetter computeren. De starter og afslutter Shell funktionen ved at trykke på F1 tasten.

VALG AF SPROG:

Shell skriver sine meddelelser på et af fire sprog: engelsk, fransk, tysk eller italiensk. Når De starter Shell, vil sprogene komme frem i rækkefølge og hver stå på skærmen i ca 6 sekunder. Et sprog vælges ved at trykke på mellemrumstasten, når det er på skærmen. De kan skifte til næste sprog uden ventetid, ved at trykke på MARKØR NED tasten.

NB. DOS Shell kan anvendes i 40 og 80 kolonners mode. Den eneste forskel er ændring af skærmbilledet. De kan ændre skærmbilledets størrelse ved først at trykke på ESC - tasten, og dernæst trykke på X - tasten. Dette skal ske før en funktion vælges fra hovedmenuen (se nedenfor).

HOVEDMENU SKÆRM:

Når et sprog er valgt, kommer hovedmenuen frem på skærmen. En funktion vælges ved, at man med markørtasterne anbringer markøren ud for den ønskede funktion, og trykker på mellemrumstasten.

DISKETTE/PRINTER DEFINERING:

Shell indeholder to drev: A og B. De kaldes logiske drev, fordi de kun findes i Shell's regi. De kan lade dem repræsentere et enkelt diskettedrev, to enkelte drev eller en dobbeltdrevs enhed. Går vi ud fra, at De har et enkelt diskettedrev, vil den normale definition af A og B vise en enhed med nummer 8 og et drev med nummer 0. Dette er standarddefinitionen. (Det vil sige, at første gang De starter Shell, er diskdefinitionen således, at den svarer til en enkelt disketteenhed.) Med to enkelte enheder kan De ændre enhedsnummer på det ene af drevene. Drevnummeret kan forblive det samme. Med en dobbelt diskettedrevsenhed kan De ændre drevnummeret på det ene drev.

Definitionen ændres ved, at man, med markørtasterne, flytter markøren hen over den ønskede værdi og derefter trykker på mellemrumstangenten. Efter at De har ændret defineringen, trykkes på F7 - tasten for at låse definitionen. Fortryder De, skal De i stedet for trykke på STOP tasten. Derved forbliver definitionen uændret.

Printer enhedsnummer vælges på samme måde.

Ønsker man at ændre enhedsnummer på det aktuelle drev (det fysiske drev), anbringes markøren på "CHANGE DISK DEVICEM" - linien og der trykkes på mellemrumstasten. Herefter vil en meddelelse komme frem på skærmen og trin for trin vejlede Dem i skift af enhedsnummer. Ændrer De mening, inden De har fuldført trinene, vil et tryk på STOP eller F5 - tasten annullere ændringen af enhedsnummer. F5 vil returnere til det logiske drevvalg og STOP returnerer til hovedmenuens skærmbillede.

Page 40

Ændring af enhedsnummer låser alle aktuelle parametere i denne funktion.

NB: Med mindre diskdefinitionen er angivet for en enkeltdrevsenhed, når De vælger en af de følgende funktioner, vil der komme et spørgsmål på skærmen, der spørger om, hvilket drev De vil anvende. Ved beskrivelse af disse funktioner går vi ud fra, at De har en enkelt diskettestation. Har De mere end een, skal De give et passende svar på spørgsmålet ved brug af markørtasterne og mellemrumstasten.

RUN A PROGRAM (AFVIKLING AF ET PROGRAM):

Denne funktion indlæser og afvikler automatisk en programfil, De har valgt fra en filfortegnelse vist på skærmen (til denne funktion indeholder filfortegnelsen kun programfiler). Brug markørtasterne til at anbringe markøren over det ønskede og tryk herefter på mellemrumstasten for at vælge filen. Hvis De ombestemmer Dem, kan De trykke på F5 og derved annullere valget. Tryk på F7 tasten, når programmet skal indlæses og udføres. Trykker De på STOP tasten, før indlæsningen er færdig, annulleres funktionen.

De kan udskrive en filfortegnelse, hver gang den vises i forbindelse med valg af funktion, ved at trykke på F3 tasten. Forvis Dem om, at printeren er tændt og at papiret er korrekt isat.

FORMAT A DISK (FORMATTERING AF DISKETTE):

Når De vælger denne funktion, fremkommer en meddelelse på skærmen, som beder Dem sætte en blank diskette i diskettestationen. Efter at De har gjort det, skal De trykke på mellemrumstasten, hvorefter Shell vil undersøge, om disketten tidligere har været formatteret. Er dette tilfældet, vil informationen fra diskettens header blive vist på skærmen som en påmindelse om, at der kan være filer på disketten. For at fortsætte med formatteringen skal De nu indtaste et nyt diskettenavn eller acceptere det gamle, og herefter trykke på RETURN. Hvis disketten tidligere har været formatteret, beholder den sin gamle ID kode. Hvis ikke, vil Shell danne en med tilfældige tal. De kan indtaste Deres egen ID kode ved at indtaste et komma og et tocifret tal som de sidste 3 karakterer i diskettenavnet.

CLEANUP A DISK (OPRYDNING PÅ DISKETTE):

Denne funktion gør Dem istand til at validere Block Availability Map (BAM) på en diskette ( se VALIDATE kommandoen i kapitel 2 eller COLLECT kommandoen i kapitel 3).

COPY A DISK (KOPIERING AF EN DISKETTE):

Brug denne funktion, når De vil tage kopier af Deres disketter. Diskettens definition (drev A og B) afgør, hvilken type kopiering der udføres: enkelt drev, dobbelt drev eller to enkelte drev.

Dual Drive or Two Unit Copy (Kopiering med dobbelt drev eller to enkelte drev):

Shell spørger, fra hvilket drev De ønsker at kopiere (brug markørtasterne og mellemrumstasten til at vælge A eller B). Isæt den originale diskette i det ene drev og kopidisketten i det andet drev og tryk på mellemrumstasten. Tryk STOP, hvis De vil annullere denne funktion. F5 tasten eller mellemrumstasten anvendes til at genoptage en diskoperation, hvis en fejl opstår.

Page 41

Single Drive Copy (Kopiering med enkelt drev):

Anvendes en ny uformatteret diskette, vil Shell automatisk formattere den. Disketten vil få samme navn som originaldisketten, medens ID - koden vil blive forøget med 1.

Anvender man derimod en tidligere brugt (formatteret) diskette kræves, at man forinden har rettet diskettens navn (header) og ID kode. Vil man f.eks. kopiere Test/Demo - disketten, hvis header er "1571 TEST / DEMO" DS 2A, skal kopidisketten have navnet "1571 TEST / DEMO" DT 2A, således at navnet på kopidisketten er det samme som navnet på originaldisketten og disk ID er øget med 1, fra DS til DT. Samme regler gælder for andre disketter, navnet på kopidisketten skal være det samme som navnet på originaldisketten, og disk ID øges med 1, AA til AB, 9C til 9D, RS til RT, 09 til 10 o.s.v.

Rettelse af en diskettes navn (header) og ID - kode kan ske via HEADER - kommandoen (se 128 BRUGERVEJLEDNING 3-28 og 17-37), eller ved at formattere disketten og herunder angive ny HEADER og ID - kode (se side 34). Shell viser følgende advarsel på skærmen:"PROGRAMS IN MEMORY WILL BE

Shell viser følgende advarsel på skærmen:"PROGRAMS IN MEMORY WILL BE DESTROYED" (programmer i hukommelsen ødelægges). Tryk STOP eller F5 hvis De vil annullere funktionen på dette sted. Tryk på mellemrumstasten for at fortsætte.

Under denne funktion skal De skiftevis indsætte original - og kopidisketten, efter anvisningerne på skærmen. Det vil kræve fra et til 4 disketteskift, at udføre en kopiering. Hver gang en diskette isættes, kontrolleres dens ID kode for at sikre, at det er den rigtige diskette. Hvis der isættes en forkert diskette, vil en fejlmeddelelse komme frem på skærmen. Skulle dette ske, kan De trykke på mellemrumstasten eller F5 tasten for at vende tilbage til sidst anvendte disketteskift kommando.

Hvis STOP tasten nedtrykkes, vil funktionen blive afbrudt og kopien vil være ufærdig.

COPY FILES (KOPIERING AF FILER):

Denne funktion kopierer udvalgte filer. Kopieringstypen bestemmes af definitionen af diskettedrevet. Når De har valgt det drev, der skal kopieres fra, vises filfortegnelsen, således at De kan vælge filerne med markørtasterne og mellemrumstasten. De kan "rulle" fortegnelsen op og ned ved hjælp af markørtasterne.

Når De har anbragt markøren ved den fil De ønsker at kopiere, trykkes på mellemrumstasten. Hvis De skifter mening, kan De annullere valget af en eller flere filer ved at anbringe markøren over filnavnet og derefter trykke på F5.

Når De har valgt den (eller de) fil(er) der skal kopieres, trykkes på F7 tasten for at starte kopieringsfunktionen. Herefter kommer en meddelelse frem på skærmen hvor der spørges "OK TO COPY FILELIST:N Y". Er svaret N (nej) (svar der vælges hvis ikke andet angives), returnerer Shell til proceduren for filudvælgelse. Er svaret Y (ja), starter kopieringen i overensstemmelse med den type kopiering, der anvendes. Herefter

Hvis een eller flere af filerne i FILELIST allerede befinder sig på den diskette, man ønsker at anvende som kopidiskette vil meddelelsen FILE EXISTS komme frem på skærmen.

Trykkes F5 annulleres det foretagne valg, og udvælgelsen kan gentages.

Trykkes STOP, annulleres funktionen og der returneres til den primære menu.

Dual Drive or Two Unit Copy (Kopiering med dobbelt drev eller to enkelte drev): Når De har besvaret spørgsmålet "OK TO COPY", kommer meddelelsen "IN-

Page 42

SERT COPY DISK INTO DRIVE: X" og "THEN PRESS SPACE" på skærmen. Når De har gjort dette, vises meddelelsen "WANT TO FORMAT THE COPY DISK:N Y" (Har disketten aldrig været formatteret vil SHELL automatisk gøre dette uden at stille spørgsmålet). N (nej) er det svar der vælges, hvis ikke andet angives. Svarer De Y (ja) starter formatteringsfunktionen der, hvor De skal angive et nyt disknavn til brug ved formattering.

Enten De svarer Y(ja) eller N(nej) til spørgsmålet om formattering. vil Shell sammenligne den ledige plads på kopidisketten med den totale størrelse af den (de) udvalgte fil(er). Er der ikke plads til filerne på kopidisketten, vil der komme en advarsel på skærmen, hvorefter De kan trykke på STOP tasten for at afbryde funktionen. eller på mellemrumstasten for at fortsatte.

NB: For alle typer filkopiering gælder, at hvis der ikke er plads til at næste fil kan kopieres. vises "COPY DISK FULL-ANOTHER DISK: Y N". Er svaret N (nej) afbrydes kopieringen. Svares der Y (ja), returneres til "INSERT COPY DISK" meddelelsen.

Single Drive Copy (Kopiering med enkelt drev).

Når De har besvaret spørgsmålet "OK TO COPY". følger en advarsel på skærmen: "PROGRAMS IN MEMORY WILL BE DESTROYED" sammen med instruktionen: "PRESS SPACE TO CONTINUE". Tryk F5 eller STOP tasten, byis De vil afbryde funktionen og bevare det program, der måtte være i hukommelsen.

I modsat tilfælde skal De isætte den originale diskette og kopidisketten i overensstemmelse med meddelelserne på skærmen. Der kræves fra et til fire disketteskift for at fuldende kopieringen.

Når kopidisketten isættes første gang, spørges "WANT TO FORMAT THE COPY DISK:N Y". (Har disketten aldrig været formatteret vil SHELL automatisk gøre dette uden at stille spørgsmålet). Atter, hvadenten svaret er ja eller nej, vil Shell sammenligne den ledige plads på kopidisketten med den totale størrelse af den (de) udvalgte fil(er) og advare Dem, hvis der ikke er plads til filerne på kopidisketten.

DELETE FILES (SLETNING AF FILER):

Denne funktion sletter en eller flere filer. Brug markørtasterne og mellemrumstasten til at udvælge fil(er) i filoversigten. Når De har valgt mellemrumstasten til at udvælge indver i indversigven. Man be man varge filen (filerne) trykkes på F7 tasten, hvorefter følgende meddelelse vises: "OK TO DELELE FILE-LIST:N Y" Svares der N(nej). returneres til valg af filer, dog med det tildigere udvalgte intakt. Er svaret Y (ia), slettes filerne.

Trvkkes F5 annulleres det foretagne valg. og udvælgelsen kan gentages. Trykkes STOP. annulleres funktionen og der returneres til den primære menu

RESTORE FILES (GENOPRET FILER):

Denne funktion genopretter en eller flere filer, der er blevet slettet. En oversigt, der kun består af slettede filer, vises på skærmen, hvorefter De atter med markørtasterne og mellemrumstasten kan udvælge den fil eller de filer, der skal genoprettes.

Når en fil er valgt, vil Shell undersøge om filen kan genoprettes uden at andre filer derved beskadiges. Kan dette ikke lade sig gøre, vil meddelelsen: "CANNOT RESTORE FILE: filnavn id" blive vist på skærmen. Hvis alt er OK. vil udvælgelsen af filer fortsætte.

Efterhånden som filerne udvælges spørges "CHOOSE FIL-TYPE: SEQ PRG USR". Brug markørtasterne og mellemrumstasten ved valget. Relative filer identificeres automatisk. så De behøver ikke at specificere denne type.

Page 43

Vil De annullere valget af en eller flere filer, skal De anbringe markøren over filnavnet, og herefter trykke på F5 - tasten

Tryk på F7 tasten, når De er færdig med udvælgelsen. Meddelelsen "OK TO RESTORE FILE-LIST:N Y" vises da på skærmen. Hvis De svarer N (nej), returneres til filudvælgelsen. Svarer De Y (ja) genoprettes filerne. Trykkes F5 annulleres det foretagne valg, og udvælgelsen kan gentages.

Trykkes F5 annulleres det foretagne valg, og udvælgelsen kan gentages. Trykkes STOP, annulleres funktionen og der returneres til den primære menu.

RENAME FILES (OMDØB FILER)

Denne funktion ændrer navnet på en eller flere filer. Brug markørtasterne og mellemrumstangenten til at udvælge den fil, der skal omdøbes. Meddelelsen "ENTER NEW NAME" vises på skærmen sammen med det oprindelige filnavn. Nu skal De indtaste det nye navn, eller trykke på F5 for at annullere valget og returnere til filudvælgelsen.

Hvert nyt filnavn undersøges for at sikre, at det ikke allerede er anvendt. Er dette tilfældet, vises meddelelsen ERROR:FILENAME NOT UNIQUE -RETRY" på skærmen, og der returneres til meddelelsen "ENTER NEW NAME". Når De har udvalgt filen tastes F7, hvorefter meddelelsen "OK TO

Når De har udvalgt filen tastes F7, hvorefter meddelelsen "OK TO CHANGE FILE-LIST:N Y" fremkommer. Er svaret N (nej), returneres til filudvælgelsen. Svarer De Y (ja), ændres filnavnene. Hvis De trykker på F5 tasten, starter filudvælgelsen fra begyndelsen.

Trykkes F5 annulleres det foretagne valg, og udvælgelsen kan gentages. Trykkes STOP, annulleres funktionen og der returneres til den primære menu.

REORDER DIRECTORY (OMSORTER INDHOLDSFORTEGNELSE):

Denne funktion ændrer filnavnenenes rækkefølge i indholdsfortegnelsen. Når De har valgt denne funktion spørges: "WANT TO ALPHABETIZE DIREC-TORY:N Y". Hvis intet andet angives, antages svaret at være N (nej). Svarer man Y (ja), omsorteres indholdsfortegnelsen automatisk, således at den fremkommer i alfabetisk orden. Ligegyldigt hvilket valg der foretages, får De mulighed for at omsortere indholdsfortegnelsen manuelt. Dette sker ved at man først udvælger en fil med markørtasten og mellemrumstasten. Derefter bruges markørtasten til at "flytte" filnavnet gennem indholdsfortegnelsen til dets nye position. Tryk på mellemrumstasten, når navnet atter skal placeres i indholdsfortegnelsen. Når De trykker på F7 tasten for at afbryde udvælgelsen af filer.

Når De trykker på F7 tasten for at afbryde udvælgelsen af filer, kommer meddelelsen "OK TO RE-WRITE DIRECTORY:N Y". Svarer De Y (ja), skrives den omsorterede fil i diskettens indholdsfortegnelse. Hvis De svarer N (nej), genstartes udvælgelsesproceduren med meddelelsen "WANT TO ALPHABETIZE:N Y", og alle tidligere ændringer bevares.

ALPHABETIZE:N Y", og alle tidligere ændringer bevares. Trykker De på F5 tasten, genstartes udvælgelsesproceduren med meddelelsen "WANT TO ALPHABETIZE:N Y". Hermed er alle tidligere ændringer annulleret.

Et tryk på STOP - tasten vil afbryde funktionen og gå tilbage til den primære menu.

Page 44
DEL TO: AVANCEREDE OPERATIONER OG PROGRAMMERING
KAPITEL 5 SEKVENTIELLE DATAFILER

FILKONCEPT

En fil på en diskette kan sammenlignes med et arkivskab på et kontor et sted, hvor ting gemmes på en planlagt måde. Næsten alt, hvad der lægges på en diskette indgår i en eller anden form for et arkiv, en fil. Indtil nu har De kun brugt programfiler, men der findes andre typer. I dette kapitel kan De lære om sekventielle datafiler.

En datafils primære opgave er at lagre indholdet af programvariabler, så de ikke mistes, når programmet afsluttes. Ved en sekventiel fil forstås en fil, hvori variabelindholdet lagres "sekventielt", d.v.s. i rækkefølge. Har De tidligere anvendt en DATASSETTE båndstation, kender De allerede begrebet sekventielle filer, da sekventielle filer på en diskette svarer nøjagtig til datafiler på et bånd. Uanset om det drejer sig om bånd eller disketter skal sekventielle filer læses fra begyndelsen til slutningen.

Ved oprettelse af sekventielle filer overføres oplysninger (data) byte for byte gennem en buffer til det magnetiske datalagrings-medium. Når de findes på diskettedrevet, arbejder såvel programfiler som sekventielle datafiler og brugerfiler sekventielt. Selv indholdfortegnelsen (directory) virker som en sekventiel fil.

For at kunne anvende sekventielle filer på den korrekte måde, skal vi på de næste få sider lære nogle flere BASIC ord. Derefter vil vi sætte dem sammen til et enkelt, men nyttigt program.

OBS! Ud over sekventielle datafiler findes der to andre filtyper, som lagres sekventielt på disketten. Det er programfiler og brugerfiler. Når De lagrer et program på en diskette, lagres det i rækkefølge fra begyndelse til slut, på samme måde som oplysningerne i en sekventiel datafil. Den største forskel består i den måde, hvorpå man bruger kommandoer for at få tilgang til filen. Brugerfiler kan i endnu højere grad ligne sekventielle datafiler. Brugerfiler anvendes næsten aldrig, men som programfiler kan de behandles som var de sekventielle datafiler, og til visse kan der opnås tilgang ved anvendelse af samme kommandoer.

For den øvede bruger giver ligheden mellem de forskellige filtyper mulighed for at kunne læse en programfil ind i computeren med een karakter (byte) ad gangen for senere at genskrive den i en modificeret udgave.

ÅBNING AF EN FIL

Et af de kraftigste værktøjer i Commodore BASIC er OPEN instruktionen. Med den er det muligt at sende data til næsten hvorsomhelst, næsten som det gøres med en telefonomstiller. Som De kunne forvente, er en kommando, som kan udføre så meget, meget kompleks. I nogle af Deres diskettekommandoer har De allerede anvendt OPEN instruktioner.

Lad os, før De gennemgår OPEN instruktionens format, lige se på nogle af de mulige enheder i et Commodore computer system:

Page 45
Enhedsnummer Navn Anvendelsesområde
0 Tastatur Modtagelse af inddata fra brugeren.
1 DATASSETTE Modtagelse/afsendelse af oplysninger
fra/til kassettebånd.
2 RS232 Modtagelse/afsendelse af oplysninger
fra/til et modem.
3 Skærm Afsendelse af uddata til videobillede.
4,5 Printer Afsendelse af uddata til papirudskrift.
8,9,10,11 Diskettedrev Modtagelse/afsendelse af oplysninger
fra/til en diskette.

På grund af OPEN instruktionens fleksibilitet kan man med en enkelt programinstruktion komme i kontakt med en hvilken som helst af disse enheder, eller ovenikøbet andre, afhængig af, hvilken værdi en bestemt karakter i kommandoen har. Findes karakteren i en variabel, kan der endog skiftes mellem enhederne, hver gang et bestemt delprogram anvendes. På denne måde kan data alternativt, og med samme lethed, sendes til diskette, bånd, printer eller skærm.

HUSK AT KONTROLLERE FOR DISKETTEREIL

I sidste kapitel lærte De, hvorledes man efter diskettekommandoer i et program kontrollerer for diskettefejl. Det er lige så vigtigt at kontrollere for diskettefejl efter anvendelse af filhåndterings-instruktioner. Opdager man ikke en diskettefejl før brug af en anden filhåndterings-instruktion, vil dette kunne betyde tab af data, eller fejl under udførelse af BASIC programmet.

Den måde, hvorpå man lettest kontrollerer disketten, er at efterfølge alle filhåndterings-instruktioner med en GOSUB instruktion for at komme til en fejlkontrol-rutine.

EKSEM PEL:

BASIC 7.0: 840 DOPEN#4, "GRADDAGE DATA", DO, U8, W 850 GOSUB 59990: REM KONTROL AF DISKETTEFEJL

BASIC 2.0: 840 OPEN 4,8,4,"O:GRADDAGE DATA,S,W" 850 GOSUB 59990: REM KONTROL AF DISKETTEFEJL

DISK OPEN INSTRUKTION FOR SEKVENTIELLE FILES. - FORMAT

BASIC 7.0: DOPEN#filnummer,"filnavn" [.Ddrevnummer][.Uenhedsnummer][.W]

BASIC 2.0: OPENfilnummer, enhedsnummer, kanalnummer, "drevnummer:filnavn, filtype, til gang"

Page 46

hvor

"filnummer" er et heltal mellem 1 og 255. Da det vil give alvorlige "filnummer" er et heltal mellem 1 og 255. Da det vil give alvorlige problemer, bør man ikke åbne en diskettefil med et nummer, som overstiger 127. Når filen er blevet åbnet, vil alle andre filkommandoer referere til det angivne nummer. Kun een fil fil bruge et angivet filnummer samtidig. "enhedsnummer" er det nummer, eller den primære adresse, den benyttede enhed har. Dette nummer er et heltal mellem 8-11, og på 1571 normalt 8.

"kanalnummer" er en sekundær adresse, som giver den valgte enhed flere oplysninger om, hvorledes yderligere kommandoer skal udføres. I forbindel-se med diskettefiler vælger kanalnummeret er særlig kanal. ad hvilken kommunikation med denne fil kan ske. Det mulige interval for kanalnumre er 0-15, men 0 er forbeholdt for programindlæsning, 1 for programlagring og 15 for diskette kommandokanalen. Vær endvidere sikker på, at ikke to diskettefiler har samme kanalnummer. med mindre de aldrig vil blive åbnet på samme tid. (Dette kan man sikre sig ved at bruge den enkelte fils filnummer som kanalnummer).

"drevnummer" er drevets nummer, på 1571 altid nummer O. Undlad ikke at medtage det, ellers vil De kun kunne bruge to kanaler samtidig, i stedet for det normale maksimum på tre. Skal en eksisterende fil udskiftes med en med tilsvarende navn, skal "drevnummer" foranstilles et @ (alfa) tegn for OPEN-WITH-REPLACE.

"filnavn" er den valgte fils navn, højst 16 karakterer. Mønstersammenlignings-karakterer er tilladt i navnet. når der ønskes tilgang til eksisterende filer, men ikke når nye skal oprettes.

"filtype" er den ønskede filtype: S = sekventiel. P = program. U = bruger. A = append og L = længde på relativ fil.

"tilgang" er den ønskede tilgangstype. Der findes tre muligheder:

R = Read (1ms). W = Write (skriv) og M = Modify (mndring). Under oprettel-R = Read (Læs), W = Write (skriv) og M = Modify (ændring). Under oprettel-se af en fil anvendes "W" for at skrive data på disketten. Når man vil se en oprettet fil, bruges "R" for at læse data fra disketten. Benyt udelukkende "M" muligheden som en sidste udvej for at genindlæse data fra en ukorrekt lukket (splat) fil. Hvis De prøver dette, bør De kontrollere den ukorrekt lukket (splat) fil. Hvis De prøver dette, bør De kontrollere den enkelte byte under indlæsningen, for at være sikker på, at data stadig er fejlfrie, da sådanne filer altid indeholder fejlramte data, og ikke har nogen korrekt afslutning.

Det er ikke nødvendigt at forkorte "filtype" og "tilgang". De kan staves fuldt ud. så de fremtræder tvdeligt i programlister.

"filnummer", "enhedsnummer" og "kanalnummer" skal være gyldige numeriske konstanter. variabler eller udtryk. Resten af kommandoen skal bestå af et gyldigt strengbogstav(er), variabel eller udtryk.

"w" er en mulighed. som kan anvendes for skrivning til en sekventiel fil. Bruges det ikke, bliver filen åbnet for læsning. Det højeste antal filer, som samtidig kan være åbnede, er 10. indbe-

fattet alle filer til alle enheder. Det højeste antal sekventielle diskettefiler. som samtidig kan være åbnede, er tre (eller to, hvis De ikke medtager drevnummeret i OPEN instruktionen), plus kommandokanalen.

Page 47

EKSEMPLER PÅ ÅBNING AF SEKVENTIELLE FILER:

Ønsker De f. eks. at oprette en fil indeholdende telefonnumre, kan De bruge følgende:

BASIC 7.0: DOPEN#2, "TELEFONNUMRE", DO, U8, W BASIC 2.0: OPEN 2.8.2. "O:TELEFONNUMRE.SEQUENTIAL.WRITE" OPEN 2.8.2. "O:TELEFONNUMRE.S.W"

Hvis de allerede har filen "TELEFONNUMRE" på Deres diskette, kan De undgå feilmeddelelsen "FILE EXISTS" ved at anvende en @OPEN.

BASIC 7.0: DOPEN#2, "@TELEFONNUMRE", DO, U8, W BASIC 2.0: OPEN 2,8,2, CIELEFONNUMRE.S.W"

Dette sletter alle Deres gamle telefonnumre, så vær sikker på, at filen ikke indeholder oplysninger, som ikke må gå tabt. Efter at have skrevet telefonfilen, kan De fjerne disketten og afbryde systemet. For at genindlæse filens oplysninger, kan De genåbne med noget i denne retning:

BASIC 7.0: DOPEN#8, "TELEFONNUMRE", DO, U8 BASIC 2.0: OPEN 8,8,8,"O:TELEFONNUMRE,S,R"

Det spiller ingen rolle, om den anvendte fil og kanalnumre er de samme som dem De tidligere brugte, om den anvenet skal være det samme. Man har mulighed for at bruge en forkortet form af filnavnet, hvis andre filer ikke kan forkortes på samme måde:

BASIC 7.0: DOPEN#10. "TE*". DO. US BASIC 2.0: DOPEN 10,8.6,"0:TE*.S.R"

Har De mange telefonnumre, kan de muligvis ikke rummes i een fil. I så fald kan bruges flere lignende filnavne, og man lader så et program vælge den rigtige fil.

BASIC 7.0: BASIC /.O: 100 INPUT "HVILKEN TELEFONFIL(1-3)";TE 110 IF TE<>1 AND TE <>2 AND TE<>3 THEN 100 120 DOPEN#4. "TELEFON" +STR$(TE). DO. U8

BASIC 2.0: 100 INPUT "HVILKEN TELEFONFII.(1-3)".TE 110 IF TE<>1 AND TE <>2 AND TE<>3 THEN 100 120 OPEN 4.8.2."TELEFON" +STR$(TE)+",S,R"

Ved læsning af en fil med OPEN kommandoen kan drevnummer udelades. På den måde kan brugere, som har en diskettestation med to drev, gennemsøge begge disketter for filen.

Page 48
TILFØJELSE TIL EN SEKVENTIEL FIL

APPEND kommandoen sætter Dem i stand til at genåbne en eksisterende sekventiel fil og tilføje flere oplysninger til dens afslutning. I stedet for at angive "type" og "tilgang" parameterne i OPEN instruktionen, angives ",A" for append (tilføjelse). Derved vil filen genåbnes og der vil blive foretaget positionering ved afslutningen af filens eksisterende data, så der er klar til tilføjelse.

APPEND KOMMANDOENS FORMAT

BASIC 7.0: APPEND#filnummer,"filnavn" [, Ddrevnummer] [, Uenhedsnummer] BASIC 2.0: OPEN filnummer, enhedsnummer, kanalnummer, "drevnummer:filnavn, A"

hvor alt er som på foregående side, med undtagelse af det afsluttende "A", som erstatter "type" og "tilgang" parameterne.

EKSEM PEL:

Er De f.eks. ved at skrive et karakterprogram, ville det være rart simpelthen at kunne tilføje den enkelte elevs nye karakterer til den eksisterende karakterfil. Ønsker De eksempelvis at føje data til den fil, der indeholder karakterer for "PETER HANSEN", indtastes:

BASIC 7.0: APPEND#1,"0:PETER HANSEN",DO,U8 BASIC 2.0: OPEN 1,8,3,"0:PETER HANSEN.A"

I dette tilfælde vil Disk Operativ Systemet (DOS) allokere mindst een sektor (blok) mere til filen, første gang De foretager tilføjelse, selv om De kun tilføjer et enkelt tegn. De skal lægge mærke til, at anvendelse af COLLECT eller VALIDATE kommandoerne ikke korrigerer filstørrelsen. Hvis den spildte plads bliver et problem, kan De let rette det ved at kopiere filen på samme diskette eller til en anden, for derefter at slette den originale fil. Her er en kommandosekvens, som vil kopiere sådanne filer på den originale diskette, med det oprindelige filnavn:

RENAME "PETER HANSEN" TO "MIDLERTIDIG" COPY "MIDLERTIDIG" TO "PETER HANSEN" SCRATCH "MIDLERTIDIG"

SKRIVNING AF FILDATA MED PRINT#

Efter at en sekventiel er blevet åbnet for skrivning (med en "type" og "tilgang" for ",S,W") kan man bruge PRINT# kommandoen for at sende data til lagring på disketten. Hvis De kender BASIC's PRINT instruktion, vil De se, at PRINT# virker på nøjagtig samme måde, bortset fra, at den individliste, der følger efter kommandoordet, sendes til en særlig fil, i stedet for automatisk at blive vist på skærmen. Selv formatteringsmulighederne, som f.eks. skilletegnene, virker på næsten samme måde som i PRINT instruktioner. Dette betyder, at De må sikre Dem, at de individer der sendes, kan forstås af den særlige fil og enhed, der bruges.

Page 49

F.eks. virker et komma mellem variabler i en PRINT instruktion som adskillelse i skærmbilleder, idet det får hvert følgende individ til at stå i det næste, forud bestemte, skærmfelt (typisk i den næste kolonne, hvis tal er deleligt med 10). Medtages komma på samme måde mellem variabler, der skal sendes til en diskettefil, vil det atter virke som adskillelse og indsætte mellemrum mellem dataene. I dette tilfælde er dette imidlertid ikke heldigt, da der derved spildes plads på disketten, hvilket kan give yderligere problemer, når filen læses tilbage til computeren. Brug derfor præcist følgende format, når De sender data til en diskettefil.

PRINT# KOMMANDOENS FORMAT

PRINT#filnummer,dataliste

hvor "filnummer" er det samme filnummer, som blevet angivet ved OPEN instruktionen. Ved enhver given tilgang til en udvalgt fil, skal filnummeret være konstant, fordi det tjener som en genvej til at relatere andre filhåndterings-kommandoer tilbage det den korrekte OPEN instruktion. Når der angives et filnummer, kan computeren finde alt muligt andet vedrørende en fil.

"dataliste" er det samme som ved en PRINT instruktion - en liste indeholdende konstanter, variabler og/eller udtryk, indbefattet tal, strenge eller begge. Det vil imidlertid være bedre, hvis hver enkelt PRINT# instruktion til disketten kun omfatter eet dataindivid. Ønsker De at medtage flere individer, bør de adskilles af en vognretur-karakter, ikke et komma. Det er tilladt at benytte semikolon, men sådanne lagres ikke i filen og giver ikke ekstra mellemrum i filen. Brug dem derfor til at adskille individer i listen, som ellers kunne virke uoverskuelig, som hvis f.eks. en strengvariabel følger umidelbart efter en numerisk variabel.

OBS! Lav ikke et mellemrum mellem PRINT og #, og forkort ikke kommandoen som ?#. Den rigtige forkortelse for PRINT# er pR.

EKSEM PLER:

Til registrering af nogle få karakterer for Peter Hansen, ved anvendelse af en sekventiel diskettefil nr. 1, som i forvejen er åbnet for skrivning, bruges:

200 FOR KLASSE = 1 TO KURSUS

  • 210 PRINT#1, GRAD$(KLASSE)
  • 220 GOSUB 59990:REM KONTROL FOR DISKETTEFEJL
  • 320 NEXT KLASSE

idet det forudsættes, at Deres program indeholder en fejlkontrol rutine som den i sidste kapitel.

Ved anvendelse af PRINT# findes en undtagelse vedr. krav om kontrol for diskettefejl efter hver filhåndterings-instruktion. Når PRINT# bruges, vil en enkelt kontrol efter skrivning af et helt datasæt stadig opdage fejl, hvis kontrollen foretages før andre filhåndterings-instruktioner eller diskettekommandoen benyttes. De kender muligvis PRINT instruktioner hvori flere individer efterfølger hinanden:

400 PRINT NAVN$, GADE$, BY$
Page 50

For at få de samme variabler skrevet i sekventiel diskettefil nummer 5 i stedet for på skærmen, vil den bedste fremgangsmåde være at bruge tre selvstændige PRINT# instruktioner, som følgende:

400 PRINT#5, NAVN$ 410 PRINT#5, GADE$ 420 PRINT#5, BY$

Ønsker De at kombinere individerne, er dette en sikker metode:

400 PRINT#5, NAVN$; CHR$(13); GADE$; CHR$(13); BY$

CHR$(13) er karakteren for en vognretur og giver samme effekt som at anbringe printindividerne i separate linier. Hvis De ofte bruger denne metode, vil De kunne spare både plads og tid ved i forvejen at definere en variabel som værende lig med CHR$(13):

10 CR$=CHR$(13) 400 PRINT#5,NAVN$;CHR$(13);GADE$;CHR$(13);BY$

Grundideen er, at hvis en korrekt sekventiel diskettefil-skrivning omdirigeres til skærmen, vil der kun blive vist eet dataindivid pr. linie med hvert efterfølgende individ på næste linie.

LUKNING AF EN FIL

Når De er færdig med at bruge en datafil, er det meget vigtigt, at den lukkes med CLOSE. Under processen med skrivning af en fil akkumuleres data i en hukommelses-buffer, hvorfra data først skrives på disketten, når bufferen er fuld.

På denne måde vil der næsten altid være et mindre antal data, som endnu ikke er skrevet på disketten, tilbage i bufferen. Disse data vil gå tabt, hvis der slukkes for computersystemet. På lignende måde findes der andre håndterings-rutiner, som f.eks. opdatering af BAM (Block Availability Map) med sektorer brugt af den aktuelle fil, som ikke udføres under selve skrivningen af filen. Dette er årsagen til, at der skal bruges en CLOSE instruktion. Når De er færdig med en fil, vil CLOSE instruktionen skrive resten af bufferens indhold på disketten, opdatere BAM og indsætte filen i directory. Luk derfor altid en datafil, når De er færdig med at bruge den. Gøres det ikke, kan resultatet blive, at hele filen går tabt.

Luk imidlertid ikke diskettestationens kommandokanal før alle andre filer er blevet lukket. I ethvert program bør kommandokanalen være den første fil, der åbnes, og den sidste, der lukkes.

CLOSE INSTRUKTIONENS FORMAT

BASIC 7.0: DCLOSE#filnummer [,Uenhedsnummer] BASIC 2.0: CLOSE filnummer

hvor "filnummer" skal være samme filnummer, som brugtes til den ønskede fil ved angivelse af OPEN instruktionen.

Page 51

EKSEMPLER .

For lukning af datafil nummer 5, som blev brugt som eksempel på foregående side, benyttes:

BASIC 7.0: DCLOSE#5 BASIC 2.0: CLOSE 5

Hvis DCLOSE instruktionen bruges alene i BASIC 7.0 (uden # eller filnummer parametere), vil den øjeblikkelig lukke alle diskettefiler. Med en smule omtanke kan det samme gøres via en programløkke. Da der ikke sker noget ved at prøve at lukke en fil, der ikke er blevet åbnet, kan De blot lukke enhver fil, der kan tænkes at være blevet åbnet. Hvis De altid giver Deres filer numre fra 1 til 5. vil De kunne lukke dem alle med:

9950 FOR I = 1 TO 5 9960 CLOSE I 9900 CLOSE I 9970 GOSHR 59990:REM KONTROL AF DISKETTEFEJL 9980 NEXT I

idet det forudsættes, at Deres program indeholder en feilkontrol-subrutine som den i sidste kapitel.

LASNING AF FILDATA VED BRUG AF INPUT#

Efter at oplysninger er blevet skrevet korrekt i en diskettefil, kan de genindlæses til computeren med en INPUT# instruktion. På samme måde som T# instruktionen ligner PRINT instruktionen, er INPUT# næsten identisk med INPUT, med den undtagelse, at den dataliste, som følger efter komman-doordet, hentes fra en særlig fil i stedet for fra tastaturet. Begge instruktioner indeholder samme begrænsninger - de standser for inddata efter et komma eller et kolon, de accepterer ikke dataindivider, der er så sto-re, at de ikke kan være i BASIC's inddata-buffer og de godtager ikke at ikke-numeriske data indlæses til en numerisk variabel.

INPUT# INSTRUKTIONENS FORMAT

INPUT#filnummer.variabelliste

hvor "filnummer" skal være samme filnummer, som brugtes til den ønskede fil ved angivelse af OPEN instruktionen og "variabelliste" består af et eller flere gyldige BASIC variabelnavne. Skal mere end eet dataelement være inddata til en særlig INPUT# instruktion, må hvert variabelnavn adskilles fra de andre med komma.

EKSEMPLER:

For at genindlæse de karakterer, der blev skrevet i PRINT# eksemplet, skal følgende bruges:

300 FOR KLASSE = 1 TO KURSUS 310 INPUT#1.GRAD$(KLASSE)

  • 320 GOSUB 59990:REM KONTROL AF DISKETTEFEJL 330 NEXT KLASSE
Page 52

idet det forudsættes, at Deres program indeholder en fejlkontrol-subrutine som den i sidste kapitel.

for genindlæsning af de adressedata, der blev skrevet med et andet PRINT# eksempel. er det sikrest at bruge følgende:

  • 800 INPUT#5,NAVN$ 810 GOSUB 59990:REM KONTROL AF DISKETTEFEJL
  • 810 GOSUB 59990:REM KONTROL AF DISKETTEFEJL 830 GOSUB 59990:REM KONTROL AF DISKETTEFEJL
  • 840 INPUT#5.BY$
  • 850 GOSUB 59990:REM KONTROL AF DISKETTEFEJL

men en del programmører ser stort på sikkerheden og bruger:

800 INPUT#5,NAVN$,GADE$,BY$ 810 GOSUB 59990;REM KONTROL AF DISKETTEFEJL

Dette gøres primært, hvis høj hastighed under i programudførelse er af betwoning, men det giver en lille risiko for læsning af ukorrekte data fra

MERE OM INPUTA (OVEDE BRUGERE)

DRILAGTIGE KARAKTERER

Når De regelmæssigt begynder at anvende datafiler, vil De muligvis mme ud for to BASIC fejlmeddelelser, nemlig "STRING TOO LONG ERROR" og "FILE DATA ERROR". Begge vil formentlig standse Deres program ved en INPUT# instruktion, men kan også skyldes, at der har været fejl i en PRINT# instruktoion, da filen blev skrevet.

"STRING TOO LONG" FEJL

En BASIC streng kan indeholde op til 255 karakterer, selv om den længste streng, der kan være inddata via en enkelt INPUT instruktion, er lidt mindre end to tekstlinier. Denne lavere grænse skyldes størrelsen af inddata-bufferen i Commodore's serielle bus computere. Samme begrænsning gælder for INPUT# instruktioner. Indeholder et enkelt dataelement (streng eller tal), der indlæses fra en diskettefil med en INPUT# instruktion, me-re end 88 (BASIC 2) og 160 (BASIC 7) karakterer, vil BASIC standse med en "STRING TOO LONG ERROR".

"FILE DATA" FEJL

Den anden feilmeddelelse "FILE DATA ERROR" skyldes, at der gøres forsøg på at læse en ikke-numerisk karakter ind til en numerisk variabel. I databehandling er et tal karaktererne fra 0 - 9, "+" og "-" tegnene, deci-malpunktet (.), mellemrumskarakteren samt bogstavet "E", der bruges ved videnskabelig notation. Hvis nogen anden karakter optræder i en INPUT# til en numerisk variabel, vil "FILE DATA ERROR" blive vist og programmet vil standse. De sædvanlige Årsager til denne fells fremkomst er uoverensstemmelse i den rækkefølge, hvormed variabler skrives til og læses fra en fil, en manglende vognretur i en PRINT instruktion, som skriver mere end eet dataindivid, eller at et dataindivid indeholder enten et komma eller et kolon uden foranstillet anførelsestegn. Hvis en "file data error" har vist sig, bør De rette den ved at indlæse dataindividet til en strengvariabel og konvertere den tilbage til et tal med BASIC VAL() instruktionen, efter at have fjernet ikke-numeriske karakterer med de strengfunktioner, der er beskrevet i brugerveiledningen til Deres computer.

Page 53
KOMMAER (.) OG KOLONER (:)

Nonmand (,) og tidligere fastslået kan kommaer og koloner give vanskeligheder i en fil, fordi de afslutter det dataelement, i hvilket de optræder, og gør, at resterende karakterer i dataelementet vil blive indlæst til næste INPUT# variabel. De har samme virkning i en INPUT instruktion, hvor de vil frembringe fejlmeddelelsen "EXTRA IGNORED". Imidlertid vil De engang imellem virkelig have brug for et komma eller et kolon i et dataelement, som hvis et navn skal skrives som "Sidst,Først." Måden dette gøres på, er at indlede sådanne dataelementer med et anførelsestegn. Efter et sådant indledende anførelsestegn vil, enten i en INPUT eller INPUT# instruktion, alle andre karakterer end en vognretur eller et nyt anførelsestegn, blive godkendt som en del af det aktuelle dataelement.

EKSEM PLER:

For at sætte et anførelsestegn foran et dataelement, der skal sendes til en fil, indsættes en CHR$(34) i dataelementets begyndelse. For eksempel:

PRINT#2.CHR$(34)+"HANSEN.PETER"

eller

PRINT#2, CHR$(34); "HANSEN, PETER"

Hvis De ofte bruger dette, kan der spares nogen plads og tid ved forud at definere en variabel som lig med CHR$(34), som vi tidligere gjorde med CHR$(13).

20 AN$ = CHR$(34)

400 PRINT#5.AN$+NAVN$

I begge tilfælde vil det tilføjede anførelsestegn blive fjernet fra data af INPUT eller INPUT# instruktionen, men komma eller kolon vil forblive en del af dataindividet.

LAGRING AF NUMERISKE DATA PÅ DISKETTE

Til nu har vi kun gennemgået lagring af strengdata, lad os nu se lidt på numerisk lagring.

I computeren afhænger den plads, der optages af en numerisk variabel, udelukkende af dennes type. Enkle numeriske variabler beslaglægger syv bytes (karakter lokationer) i hukommelsen. Egentlige tabelvariabler bruger fem bytes pr. områdeelement, og elementer i heltalsområder bruger hver to bytes. I modsætning hertil afhænger den beslaglagte plads, når en numerisk variabel af enhver type skrives til en fil, udelukkende af dens længde, ikke dens type. Dette skyldes, at numeriske data skrives i en fil som en streng, som hvis der var blevet udført en STR$() funktion på den. Hvis tallet er positivt, vil den første karakter være en "blank" plads, og er tallet negativt, vil den første karakter være et minustegn (-). Derefter følger tallet, ciffer efter ciffer. Sidste karakter er karakteren for "markør til højre".

Dette format tilader, at diskettedata senere kan læses tilbage til en streng eller en numerisk variabel. Der opstår imidlertid spild af disketteplads, og det kan være vanskeligt at forudsige pladskravene til tal af ukendt længde. Derfor omsætter nogle programmer alle numeriske variabler

Page 54

til strenge, før de skrives til disketten og bruger strengfunktioner for på forhånd at fjerne unødvendige karakterer. På denne måde er det stadig muligt senere at genindlæse disse dataelementer til en numerisk variabel med INPUT#, skønt "file data errors" kan undgås ved at indlæse alle data som strenge og derefter konvertere dem til tal ved anvendelse af VAL() funktionen, når alle oplysninger er på plads i computeren.

For eksempel vil "N$=RIGHT$(STR$(N),LEN(STR$(N))-1) omsætte det positive tal N til en streng N$, uden den sædvanlige foranstillede plads til dets numeriske tegn. I stedet for at skrive PRINT#5,N, skal De så bruge PRINT#5,N$.

LÆSNING AF FILDATA VED ANVENDELSE AF GET#

GET# instruktionen henter data fra diskettedrevet med een karakter ad gangen. På lignende måde som tastatur GET instruktionen i BASIC, godkender den kun en enkelt karakter til en angiven variabel. Til forskel fra GET instruktionen, fortsætter den ikke blot til næste instruktion, hvis der ikke kan hentes data. GET# anvendes primært til at hente sådanne data fra en diskette, som normalt ikke kan læses med en INPUT# instruktion, enten fordi de er for lange til at kunne være i inddata-bufferen eller fordi de indeholder vanskelige karakterer.

GET# INSTRUKTIONENS FORMAT

GET#filnummer.variabelliste

hvor "filnummer" er det filnummer, der blev angivet i den ønskede fils OPEN instruktion, og "variabelliste" er et eller flere gyldige BASIC variabelnavn(e). Skal mere end eet dataelement være inddata til en særlig GET£ instruktion, skal hvert variabelnavn adskilles fra de andre med et komma.

Under normale omstændigheder vil De næsten aldrig se, at en GET eller GET# instruktion indeholder mere end eet variabelnavn. Hvis der behøves mere end een karakter, bruger man normalt en løkke i stedet for yderligere variabler. Som i INPUT# instruktionen er det endvidere sikrere at benytte strengvariabler, hvis den fil, der skal læses, kan tænkes at indeholde en ikke-numerisk karakter.

Data i en GET# instruktion følger byte-efter-byte og omfatter normalt 'usynlige' karakterer som vognretur og de forskellige markørkontroller. Alle, med undtagelse af een, vil blive læste korrekt. Undtagelsen er CHR$(0), den tomme ASCII karakter. Den er forskellig fra en tom streng (en med formatet A$=""), selv om man ofte kalder tomme strenge for nulstrenge. I en GET# instruktion oversættes CHR$(0) uheldigvis til en tom streng. Forholdsreglen består i at teste for en tom streng efter en GET# og erstatte eventuelt fundne med CHR$(0). Det første eksempel herefter illustrerer metoden:

EKSEM PLER:

For at indlæse en fil, som måske indeholder en CHR$(0), som eksempelvis en maskinsprogs programfil, kan De korrigere enhver CHR$(0) byte med:

1100 GET#3,G$:IF G$ = "" THEN G$ = CHR$(0)

Page 55

Hvis det er lykkedes at få en for lang streng indlæst i en fil, kan den tilbagelæses sikkert til computeren med GET# ved anvendelse af en løkke som den følgende:

3300 B$="" 3310 GET#1,A$ 3320 IF A$ <>CHR$(13) THEN B$=B$+A$:GOTO 3310

Grænsen for en sådan teknik er 255 karakterer. Den vil se bort fra CHR$(0) men dette kan være en fordel under opbygning af en tekststreng. Hvis CHR(0) er krævet i filen, kan følgende alternative linie bruges:

3320 IF A$ <>CHR$(13) THEN B$ = B$+(A$ + CHR$(0):GOTO 3310

GET# kan være nyttig ved gendannelse af skadede filer, eller filer med ukendt indhold. Den BASIC reserverede variabel ST (filSTatus variablen) kan benyttes for at indikere, når hele indholdet af en korrekt lukket fil er blevet læst.

500 GET#2,S$ 510 SU=ST:REM HUSK FILSTATUS 520 PRINT S$; 530 IF SU=0 THEN 500:REM HVIS DER ER MERE DER SKAL LÆSES 540 IF SU<>64 THEN PRINT "FEJLSTATUS:ST =";SU

At kopiere ST til SU er ofte en unødvndig sikkerhedsforanstaltning, men skal gøres, hvis nogen anden filhåndterings-instruktion optræder mellem den, som læser fra filen og den, som går tilbage for at læse igen. Det ville for eksempel kræves, hvis linie 520 blev ændret til:

520 PRINT#1.S$;

I modsat fald ville den filstatus, der kontrolleres i linie 530, være den, der tilhører skrivefilen, ikke læsefilen.

Følgende tabel henviser til enkelte fejl eller kombinationer på to eller flere.

MULIGE VÆRDIER AF FILSTATUS VARIABLEN "ST" OG DERES BETYDNING.

SÅ.

HVIS ST =
0 Alt er i orden.
1 Modtagende enhed var ikke tilgængelig (time out)
2 Sendende enhed var ikke tilgængelig (time out)
4 Kassette datafilblok var for kort.
8 Kassette datafilblok var for lang.
16 Uoprettelig læsefejl fra kassette, verify fejl.
32 Kassette kontrolsum-fejl - een eller flere fejlramte
karakterer blev læst.
64 Slutmarkering på fil nået.
128 Enhed ikke tilsluttet eller båndslut-markering
TUNGET DA KASSETTEN.
Page 56

DEMONSTRATION AF SEKVENTIELLE FILER (BASIC 2.0)

Brug nedenstående program til Deres første forsøg med sekventielle filer. Der er anført kommentarer for bedre forståelse. 150 CR$=CHR$(13) 160 OPEN 15.8.15 Danner en vognretur-variabel. 170 PRINT CHR$(147):REM SLET SKÆRM 190 PRINT "**SKRIV EN FIL**" 210 PRINT 210 FRINT 220 OPEN 2.8.2. "@O:SEKV fil.S.W" Åbner demofil med erstat. 230 GOSUB 500 240 PRINT "INDTAST ET ORD. DEREFTER ET TAL" 240 FRINT "INDIAST ET ORD, DEREFTER ET 250 PRINT "ELLER 'END,O' FOR AT STOPPE" 260 PRINT 270 INPUT AS.B Godkender en streng og et tal fra tastaturet. 280 PRINT#2,A$;CR$;B 290 GOSUB 500 Skriv dem i diskettefilen. 300 IF A$<>"END" THEN 270 310 PRINT Til det er færdigt. 20 OLUSE 2 Oprydning. 340 PRINT "**TILBAGELÆS SAMME FIL**" 560 PRINT 370 OPEN 2,8,2,"0:SEKV FIL,S,R" 380 GOSUB 500 Genåbner samme fil for læsning. 390 INPUT#2.A$,B Læser næste streng og tal fra fil. 400 RS=Sm Husker filstatus. 410 GOSUB 500 420 PRINT A$.E Viser filindhold IF RS=0 THEN 390 IF RS<>64 THEN PRINT til det er færdigt. 440 440 IF RSC>64 THEN "STATUS =";RS 450 CLOSE 2 med mindre der er en fejl. Afslut derefter. 455 CLOSE 15 460 END 480 REM**FEJLKONTROL S/R** En BASIC 3.5 version kunne man udskifte linie 500 med: 500 INPUT#15, EN, EM$, ET, ES IF EN>O THEN PRINT EN.EM$.ET.ES:STOP 500 IF DS>0 THEN PRINT DS$:STOP og slette linie 510. 520 RETURN

Page 57

DEMONSTRATION AF SEKVENTIELLE FILER (BASIC 7.0)

Brug nedenstående program til Deres første forsøg med sekventielle filer. Der er anført kommentarer for bedre forståelse. 150 CR$=CHR$(13) Danner en vognretur-variabel. 170 PRINT CHR$(147):REM SLET SKÆRM 190 PRINT "**SKRIV EN FIL**" 210 PRINT 220 DOPEN#2."@SEKV FIL".W Åbner demofil med erstat. 230 GOSUB 500 240 PRINT "INDTAST ET ORD, DEREFTER ET TAL" 250 PRINT "ELLER END,O' FOR AT STOPPE" 270 A$.B Godkender en streng og et tal 280 PRINT#2,A$;CR$;B 290 GOSUB 500 Skriv dem i diskettefilen. 300 IF A$<>"END" THEN 270 Fortsæt til slut. 310 PRINT 320 DCLOSE#2 Oprydning. 340 PRINT "**GENINDLÆS SAMME FIL**" 360 PRINT 370 DOPEN#2,"SEKV FIL" 380 GOSUB 500 Genåbner samme fil for læsning. 390 INPUT#2,A$,B 400 RS = ST Læser næste streng og tal fra fil. Husk filstatus. 410 GOSUB 500 410 GUSUB 500 420 PRINT A$.B Viser filindhold 430 IF RS=0 THEN 390 440 IF RS<>64 THEN PRINT til færdig, med mindre der er en fejl. "STATUS =";RS "STATUS = 450 DCLOSE#2 Afelut 460 END 400 END A80 REM**FEJIKONTROL S/R** 500 IF DS>0 THEN PRINT DS$:STOP 510 RETURN

Page 58
KAPITEL 6 RELATIVE FILER
VÆRDIEN AF RELATIV TILGANG

Sekventielle filer er meget nyttige, hvis man udelukkende arbejder med en fortsættende strøm af data - d.v.s. oplysninger, som kan læses eller skrives på een gang. Imidlertid er der visse situationer, hvor sekventielle filer ikke egner sig til formålet. For eksempel vil man ikke, efter at have skrevet en lang liste med adressemærkater, være glad for at skulle læse hele listens indhold, hver gang man blot skal bruge oplysningerne om en enkelt person. Man behøver i stedet for en slags 'random' tilgang, en måde, hvorpå man kan komme til en udvalgt adresse i filen, uden at skulle gennemlæse filen fra begyndelsen. Sammenlign f. eks. en grammofon med en båndoptager. Med et kassette-

Sammenlign f. eks. en grammofon med en båndoptager. Med et kassettebånd skal man lytte fra begyndelsen til enden, men grammofonens pickup kan når som helst løftes og flyttes til enhvert andet sted på pladen. På dette punkt ligner en diskettestation en grammofon. I dette kapitel vil De lære om en filtype, som benytter denne fleksibilitet.

om en filtype, som benytter denne fleksforfittet. I virkeligheden kan to forskellige random tilgangs filtyper bruges på Commodore diskettestationer; relative filer og random filer. Relative filer er de bedst egnede i forbindelse med de fleste databehandlings operationer, men ægte random tilgangs filkommandoer kan også bruges af erfarne brugere, og emnet vil blive gennemgået i næste kapitel.

FILER. RECORDS OG FELTER

Da De lærte om sekventielle filer, skulle De ikke bekymre Dem om, hvorledes data var organiseret i en fil, blot de variabler, der blev brugt til at skrive filen, var i overensstemmelse med dem, som skulle læse filen tilbage til computeren. Men for at få relativ tilgang til at fungere, behøver man en mere struktureret og forudigelig opstilling af sine data.

høver man en mere struktureret og forudsigelig opstilling af sine data. Den struktur, der skal bruges, ligner meget den, der bruges i et traditionelt arkiveringssystem. På et almindelig kontor kunne f. eks. alle kundeoplysninger være arkiveret i et enkelt arkivskab. I dette skab (fil) ligger alle oplysninger om den enkelte kunde i en hængemappe, hvorpå kundens navn er anført. På lignende måde kan der i hver hængemappe være mange stykker papir, som hver for sig indeholder enkeltoplysninger om kunden, som f. eks. telefonnummeret eller dato for sidste levering.

På det elektroniske kontor er arkivskabet forsvundet, men begrebet om en fil, som indeholder alle oplysninger om en gruppe eller et emne er bevaret. Hængemapperne er også væk, men systemet med opdeling af arkivet i individuelle oplysninger findes stadig. Papirstykkerne med enkeltoplysningerne er erstattet af delfelter i records. Hvert felt er stort nok til at kunne indeholde en delinformation om een record i filen. Derfor er der i hver fil mange records, og i hver record er der typisk mange felter.

En relativ fil klarer recordens organisering for Dem, idet den nummererer dem fra 1 til det højeste recordnummer, men felterne skal De selv organisere. Hver record vil have samme størrelse, men 1571 vil ikke forlange, at de alle er opdelt på samme måde. På den anden side vil de normalt være ens opdelt, og kan man fra starten definere, hvor hvert nøjagtigt begynder, findes der endnu hurtigere måder, hvorpå der kan fås tilgang til et ønsket felt i en record, uden at skulle gennenlæse de øvrige felter. Som dette antyder, er tilgangshastigheden den primære årsag til at placere information i en relativ diskettefil. Særlig velskrevne programmer, som anvender relative filer, er i stand til at finde og læse en bestemt persons oplysninger på under 15 sekunder, noget som et program med sekventielle filer overhovedet ikke kunne hamle op med.

Page 59
FILBEGRANSNINGER

Ved brug af relativer filer skal De ikke bekymre Dem om, hvor på diskettens overflade en given record bliver lagret, eller om den vil passe til den aktuelle diskettesektor, eller om den skal udvides ind i den næste ledige sektor. DOS klarer alt dette. Alt hvad De behøver er at definere længden på den enkelte record, i bytes, og hvor mange records, De har brug for. DOS udfører resten af arbejdet og organiserer tingene på en sådan måde, at den hurtigt kan finde enhver record i filen, såsnart den får recordnummeret opgivet (nummer i filen).

Den eneste begrænsninger, som De skal tage hensyn til, er, at hver record skal have samme størrelse, og den recordlængde, De vælger, skal være mellem 2 og 254 karakterer. Naturligvis skal hele filen også kunne være på een diskette, hvilket betyder, at jo flere records De behøver, des kortere må hver record være.

OPRETTELSE AF EN RELATIV FIL

Når en relativ fil skal bruges første gang, vil OPEN instruktionen oprette filen; derefter benyttes Open instruktionen til at genåbne filen for såvel læsning som skrivning.

FORMATINSTRUKTION FOR ÅBNING AF EN RELATIV FIL

  • BASIC 7.0: DOPEN # filnummer, "filnavn", L recordlængde [,Ddrevnr] [,Uenhedsnummer]
  • BASIC 2.0: OPEN filnummer, enhedsnummer, kanalnummer, "drevnr:filnavn,L," + CHR$ (recordlængde)

hvor 'filnummer' er den aktuelle fils nummer, normalt et heltal mellem 1 og 127; 'enhedsnummer' er nummeret på den ydre enhed, med 1571 normalt 8; 'kanalnummer' vælger en særlig kanal, ad hvilken al kommunikation med filen sker, normalt et tal mellem 2 og 14; 'drevnr', som altid er 0 på Commodere 1571; og 'filnavn', som er navnet på filen, højst 16 tegn. Karakterer for mønstersammenligning er tilladt i navnet, når der skal ske tilgang til en eksisterende fil, men ikke når en ny skal oprettes. Recordlængden er størrelsen i bytes af hver record i filen, incl. vognretur, anførelsestegn og andre specialkarakterer.

Page 60

ANM ARKNINGER:

1. Indled aldrig filnavnet (i BASIC 7.0) eller drevnummeret (i BASIC 2.0) med et alfategn (P); der er ingen grund for at erstatte en relativ fil.

2. L recordlængde (i BASIC 7.0) eller L, +CHR$ (recordlængde) (i BASIC 2.0) er kun krævet, når en relativ oprettes første gang, men kan dog bruges senere, så længe recordlængden er den samme, som da filen blev oprettet. Da der med samme lethed alternativt kan læses fra eller skrives til relative filer, er det ikke nødvendigt at angive Read eller Write mode, når en relativ fil åbnes.

Skrives til relative filer, er det ikke nøvendig at angive head ofler Write mode, når en relativ fil åbnes. 3. filnummer, 'enhedsnummer' og 'kanalnummer' skal være gyldige numeriske konstanter, variabler eller udtryk. Resten af kommandoen skal være en gyldig streng, variabel eller et udtryk. I BASIC 7.0 DOPEN, skal en variabel eller et udtryk - brugt som filnavn - være omgivet af paranteser.

4. På 1571 kan kun en (1) relativ fil være åben ad gangen, skønt en sekventiel fil og kommandokanalen også samtidig kan være åbne. Har De imidlertid en sekventiel og en relativ fil åbne samtidig, kan De ikke fremtage directory.

EKSEM PLER:

For at oprette eller genåbne en relativ fil med navnet "GRADER", som har en recordlængde på 100 bytes, bruges:

BASIC 7.0: DOPEN # 2, "GRADER", L100,D0,U8 BASIC 2.0: OPEN 2,8,2, "GRADER",L," +CHR$(100)

For at genåbne en ukendt relativ fil efter brugerens valg, som allerede er oprettet, bruges:

BASIC 7.0: 200 INPUT "HVILKEN FIL";FI$ 210 DOPEN # 5, (FI$),DO,U8

Basic 2.0: 200 INPUT "HVILKEN FIL";FI$ 210 OPEN 5,8,5,FI$

BRUG AF RELATIVE FILER: RECORD# KOMMANDOEN

Når en relativ fil åbnes første gang, er den ikke helt klar til brug. Både for at spare tid ved senere brug af filen, og for at sikre sig, at filen vil arbejde pålideligt, er det nødvendigt at oprette adskillige records, før filen lukkes for første gang. Som det mindste kræves, at der oprettes så mange records, at de fylder mere end to sektorer på disketten (512 bytes). I praksis fortsætter de fleste programmer og opretter det antal records, som programmet forventes at skulle bruge. Denne fremgangsmåde har yderligere den fordel, at man undgår problemer med for eksempel at udgå for plads på disketten, før hele filen er oprettet.

Page 61

Begynder De blot at skrive data til en netop åbnet relativ fil, vil den opføre sig næsten som en sekventiel fil, og lægge de dataelementer, der er skrevet med den første PRINT# instruktion, i record nummer 1, de som er skrevet med den næste PRINT# instruktion i record nummer 2 o.s.v. Dette betyder, at hver record skal skrives med en enkelt PRINT# instruktion, som indeholder 'vognretur' i dataene for at adskille felterne, som vil blive indlæst senere via een eller flere INPUT# instruktion(er). Det er imidlertid meget bedre tydeligt at angive, hvilket record nummer der ønskes via en RECORD# kommando til disketten. Dette sætter Dem i stand til at opnå tilgang til records i enhver ønsket rækkefølge, idet man man lethed kan springe til ethvert sted i en fil.

RECORD# KOMMANDOENS FORMAT

BASIC 7.0: RECORD # filnummer, record nummer [,offset] BASIC 2.0: PRINT #15, "P" + CHR$ (kanalnummer + 96) + CHR$ (< record nummer) + CHR$ (> record nummer) + CHR$ (offset)

hvor 'filnummer' er det filnummer, der er angivet i den aktuelle DOPEN instruktion for den specificerede fil, 'record nummer' er nummeret på den ønskede record, 'kanalnummer' er det kanalnummer, som er angivet i OPEN instruktionen for den specificerede fil, '< record nummer' er den laveste byte i det ønskede recordnummer, udtrykt som et tobyte heltal, '> record nummer' er den højeste byte i den ønskede record, og den mulige tilføjelse 'offset' værdi, er den byte i recorden, hvorfra læsning eller skrivning skal påbegyndes.

For helt at kunne forstå denne kommando, skal De være klar over, hvorledes de fleste heltal bliver lagret i computere, som er baserede på 6502 og tilsvarende mikroprocessorer. I den binære aritmetik, som mikroprocessoren bruger, er det muligt at udtrykke ethvert heltal uden fortegn fra O til 255 i en enkelt byte. Det er også muligt at lagre ethvert heltal uden fortegn fra O til 65535 i to bytes, hvoraf een byte indeholder den del af tallet, som er deleligt med 256, og en evt. rest i den anden byte. I maskinsprog skrives sådanne tal bagfra, med den byte, der indeholder resten, først, efterfulgt af hen 'høje' byte. I assemblersprogs programmer skrevet med Commodore Assembler, markeres den 'lave' del af et to-byte tal ved at der sættes et mindre-end (<) tegn foran dets adresselabel. På lignende måde markeres den 'høje' del af tallet med et større-end (>) tegn.

SIKKERHEDSANVISNING: OPGIV HVER RECORD# KOMMANDO TO GANGE

For at undgå den fjerneste mulighed af at relative data skal blive ødelagt, er det nødvendigt at angive RECORD# kommandoer to gange, før en record bliver læst/skrevet.

EKSEM PLER:

BASIC 7.0: For at positionere record pointeren på fil nummer 2, record nummer 3, indtastes:

RECORD#2,3

Page 62

BASIC 2.0: For at positionere record pointeren på fil nummer 2, record nummer 3, indtastes:

PRINT #15. "P" + CHR$(98) + CHR$(3) + CHR(0)

CHR$(98) fremkommer ved at addere konstanten (96) til det ønskede kanalnummer (2) (96+2 = 98). Skønt kommandoen synes at virke, selv om 96 ikke lægges til kanalnummeret, gøres dette normalt for at bibeholde overensstemmelse med den måde, hvorpå RECORD# virker i BASIC 7.0.

Da 3 er mindre end 256, er den høje byte af dets binære repræsentation O, og hele værdien kan rummes i den lave byte. Da De ønsker at læse eller skrive fra recordens begyndelse, kræves ingen 'offset' værdi.

Da sådanne beregninger hurtigt forekommer kedelige, er de fleste programmer skrevet, så de udfører dem for Dem. Her følger et programeksempel, som indlæser et recordnummer og konverterer det til den krævede lav-byte/ høj-byte form:

450 INPUT "ØNSKET RECORD NUMMER";RE 460 IF RE <1 OR RE >65535 THEN 450 470 RH = INT(RE/256) 480 RL = RE-256*RH 490 PRINT#15, "P" + CHR$(98) + CHR$(RL) + CHR$(RH)

Under forudsætning af, at RH og RL er beregnede som i foregående eksempel, kan programmer også bruge variabler for kanal, record og krævet offset:

570 INPUT "ØNSKET KANAL, RECORD OG OFFSET"; CH, RE, OF

630 PRINT#15, "P" + CHR$(CH+96) + CHR$(RL) + CHR$(RH) + CHR$(OF)

FÆRDIGGØRELSE AF RELATIV FIL OPRETTELSE

Nu da De har lært at benytte både OPEN og RECORD# kommandoerne, er De næsten rede til at oprette en relativ fil. Den eneste ting, De derudover mangler at være klar over er, at CHR$(255) er en special karakter i en relativ fil. Denne karakter bruges af DOS til at udfylde relative records efterhånden, som de oprettes, før et program udfylder dem med anden information. Hvis De derfor ønsker at skrive den sidste record, De forventer at få brug for i Deres fil, med nonsensdata, som ikke vil virke forstyrrende på Deres senere arbejde, er CHR$(255) det indlysende valg. Herunder vises, hvorledes det virker i et aktuelt program, som De kan kopiere for brug i Deres egne programmer med relative filer:

BASIC 2.0:

1020 OPEN 15,8,15Åbner kommandokanalen1380 INPUT "INDTAST NAVN PÅ RELATIV FIL";FI$Vælger filparametere1390 INPUT "INDTAST MAX.ANTAL RECORDS";NR1400 INPUT "INDTAST RECORDLANGDE";RL

(fortsættes)

Page 63

1410 OPEN 1,8,2,"O:"+FI$+",L,"+CHR$(RL) 1420 GOSUB 59990 1430 RH=INT(NR/256) 1440 RL=NR-256*RH Begynd filoprettelse Kontrol af diskettefeil Beregn længdeværdier 1450 PRINT#15,"P"+CHR$(96+2)+ CHR$(RL)+CHR$(RH) Pog til gidgte record 1455 PRINT#15,"P"+CHR$(96+2)+ CHR$(RL)+CHR$(RH) Repos. af sikkerhedshensyn 1460 GOSUB 59990 1470 PRINT#1.CHR$(255): Sender std.værdi karakter 1470 PRINT, ORA 1480 GOSUB 59990 1500 GOSUB 59990 1510 CLOSE 1 Nu kan filen lukkes aikkont 1520 GOSUB 59990 Kommandokanalen lukkes 9990 END Programmet afaluttes. 59980 REM DISKETTEKONTROL SUBRUTINE 59990 INPUT#15,EN,EM$,ET,ES 60000 IF EN>1 AND EN<>50 THEN PRINT EN, EM$, ET, ES:STOP Fejlkontrol rutine Se hort fra meddelelse. "RECORD NOT PRESENT". 60010 RETURN BASIC 7.0: 1380 INPUT "INDTAST NAVN PÅ RELATIV FIL":FIS Valg af filparametre 1390 INPUT "INDTAST MAX.ANTAL RECORDS"; NR 1400 INPUT "INDTAST RECORDLANGDE"; RL 1410 DOPEN#1,(FI$),L(RL) 1420 GOSUB 60000 Oprettelse af ønsket fil Kontrol for diskettefejl 1450 RECORD#1. (NR) Positioner til sidste 1455 RECORD#1,(NR) 1460 GOSUB 60000 1470 PRINT#1,CHR$(255); 1480 GOSUB 60000 Send standardværdi 1500 GOSUB 60000 1510 CLOSE 1 Nu kan filen lukkes sikkert.

(fortsættes)

Page 64

1520 GOSUB 60000 9980 CLOSE 15 9990 END 59980 REM DISKETTEKONTROL SUBRUTINE 60000 IF DS>1 AND DS<>50 THEN PRINT DS.DS$:STOP

Og kommandokanalen lukkes før programmet sluttes.

Fejlkontrolrutine Se bort fra meddelelsen: "RECORD NOT PRESENT"

60010 RETURN

To linier kræver nærmere forklaring. Når linie 1470 udføres, vil diskettedrevet arbejde i flere minutter, mens alle records i filen oprettes, op til det maksimalantal, der blev angivet i linie 1390. Dette er normalt og behøver kun at gøres een gang. Under denne proces hører De muligvis lyden fra drevmotorens rotation og små klik, når skrive/læsehovedet flyttes fra spor til spor. Endvidere er den ovenanførte linie 60000 forskellig fra den lignende linie i den foregående fejlkontrol subrutine. Her ignoreres diskettefejl nummer 50 totalt, fordi den vil blive genereret, når fejlkanalen kontrolleres i linie 1460. Se bort fra den, da man, hvis den ønskede record ikke findes, kun har fejl, hvis denne record er blevet oprettet tidligere.

UDVIDELSE AF EN RELATIV FIL

Hvad nu, hvis De har undervurderet Deres behov for filstørrelsen og senere ønsker at udvide en relativ fil? Forlang simpelthen det recordnummer, De ønsker, også selv om det ikke eksisterer i filen. Findes der ikke en sådan record, vil DOS oprette den, så snart De prøver at skrive oplysninger til den, og opretter samtidig automatisk alle andre manglende records før dette nummer. Når den første record efter den nuværende slutrecord bliver skrevet, meddeler DOS "50, Record Not Present". Dette er forventet og korrekt.

SKRIVNING AF DATA TIL RELATIVE FILER

Kommandoerne som anvendes til at læse og skrive data til/fra relative filer er de samme PRINT#, INPUT# og GET# kommandoer, som er brugt i det foregående kapitel om sekventielle filer. Den enkelte kommando skal bruges som beskrevet der. Imidlertid er visse aspekter vedr. tilgang til relative filer forskellige fra programmering af sekventielle filer, og disse forskelle vil blive gennemgået her.

FASTLÆGGELSE AF EN RELATIV RECORD

Som tidligere nævnt i dette kapitel har hver relativ record en fastlagt længde, iberegnet alle specialkarakterer. Indenfor denne fastsatte længde findes der to populære måder, hvorpå forskellige individuelle oplysningsfelter kan organiseres. Den ene er et fri-format, hvor de individuelle felter kan variere i længden fra record til record, og hvert felt er adskilt fra det næste med en vognretur-karakter (hver af disse optager een karakterplads i recorden). Den anden fremgangsmåde er at benytte felter med fast længde. Disse felter kan være, eller ikke være, adskilt med vognretur-karakterer. Hvis alle fastlængde-felter ikke er adskilt med vognreturer, vil De være nødt til enten at være sikker på at medtage

Page 65

en vognretur indenfor hver 88-karakter del af en record (88 er for BASIC 2, 160 er for BASIC 7). Gøres dette ikke, er De nødt til at bruge GET# kommandoen for at læse recorden, med et betydeligt tidsspild til følge.

Da den letteste måde at skrive den enkelte relative record på er med en enkelt PRINT# instruktion, vil den anbefalede fremgangsmåde være, at opbygge en kopi af den aktuelle record i hukommelsen, før den skrives til disketten. De kan opsamles i en enkelt strengvariabel ved anvendelse af BASIC's mange strengbehandlings-funktioner, og derefter alle samtidig udskrives fra denne variabel.

Her er et eksempel. Hvis vi skal skrive en fireliniet adressemærkat, bestående af fire felter med navnene "NAVN", "GADE", "BY" og "LAND", og har en total recordlængde på 87 karakterer, kan det organiseres på en af to måder:

MED FASTLÆNGDE-FELTER MED FELTER MED VARIABEL LANGDI
Feltnavn Længde Feltnavn Længde
NAVN
GADE
BY
LAND
27 karakterer
27 karakterer
23 karakterer
10 karakterer
NA VN
GADE
BY
LAND
31 karakterer
31 karakterer
26 karakterer
11 karakterer
Totallængde 87 karakterer Potentiel lgd.
Redigeret lgd.
99 karakterer
87 karakterer

Med fastlængde-records giver feltlængderne nøjagtig recordlængden, når de lægges sammen. Da totallængden netop ligger indenfor Input bufferens grænsestørrelse, er det unødvendigt med vognreturkarakterer. Med record med variabel længde kan De udnytte forskellen af aktuelle adresselængder. Mens et navn indeholder 27 bogstaver, indeholder et andet måske kun 15, og samme variation er der i længden af gade- og bynavne. Skønt records med variabel længde mister een karakter pr. felt til en vognretur, kan de udnytte forskellen mellem den maksimale feltlængde og den gennemsnitlige feltlængde. Et program, som bruger variabel recordlængde, skal beregne totallængden på hver record, efterhånden som den indlæses, for at være sikker på, at totalen af alle felter ikke overstiger den ledige plads.

SKRIVNING AF RECORDEN

Her er et eksempel med programlinier, som indlæser variabel-længde felter til ovenstående filopbygning, samler dem i en enkelt streng og sender dem til record nummer RE i fil nummer 3 (som forudsættes at være en relativ fil, som bruger kanal nummer 3).

BASIC 7.0:

100 INPUT "INDTAST RECORDNUMMER";RE 110: 120 DOPEN#3,"MINRELFIL",L88 130 VR$=CHR$(13) 140 INPUT "NAVN";NA$ 150 IF LEN(NA$)>30 THEN 140 160 INPUT "GADE";G$ 170 IF LEN(G$)>30 THEN 160

(fortsættes)

Page 66
180 INPUT "BY":B$
190 IF LEN(B$)>25 THEN 180
200 INPUT "LAND";L$
210 IF LEN(L$)>10 THEN 200
210 IF LEN(L$)/10 IHEN 200
220 DA$=NA$+VR$+G$+VR$+B$+VR$+L$
230 IF LEN(DA$)<88 THEN 260
240 PRINT "RECORD FOR LANG"
250 GOTO 140
250
260:
270:
280 RECORD#3,(RE),1
290 IF DS=50 THEN PRINT#3,CHR$(255):GOSUB 1000:GOTO 280
300 GOSUB
310 PRINT#3, DA$
320 GOSUB 1000
330 RECORD#3,(RE),1
340 GOSUB 1000
350 DCLOSE#3:END
1000 IF DS<20 THEN RETURN
1002:
1010 PRINT DSS DCLOSE3 END
BASTC 2.0:
100 INPUT "INDTAST RECORDNUMMER";RE
110 OPEN 15,8,15
120 OPEN 3,8,3,"MINRELFIL,L,"+CHR$(
130 VR$=CHR$(13)
                         _"MINRELFIL.L."+CHR$(88)
140 INPUT "NAVN";NA$
150 IF LEN(NA$>30 THEN 140
160 INPUT "GADE";G$
170 IF LEN(G$)>30 THEN 160
170 IF LEN(G$)>30 THEN 160
180 INPUT "BY";B$
190 IF LEN(B$)>25 THEN 180
ען די דייראטער אין ארא און או
200 INPUT "LAND";L5
210 IF LEN(L$)>10 THEN 200
220 DA$=NA$+VR$+G$+VR$+B$+VR$+L$
230 IF LEN(DA$)<88 THEN 260
240 PRINT "RECORD FOR LANG"
250 GOTO 140
260 RH=INT(RE/256)
270 RL=RE-256*RH
280 PRINT#15."P"+CHR$(96+3)+CHR$(RL)+CHR$(RH)+CHR$(1)
290 GOSUB 1000:IF EN=50 THEN PRINT#3, CHR$(255):GOSUB 1000:GOTO 280
300 GOSUB 1000
310 PRINT#3, DA$
320 GOSUB 1000
330 PRINT#15,"P" +CHR$(96+3)+CHR$(RL)+CHR$(RH)+CHR$(1)
                                   (fortsattes)
Page 67

340 GOSUB 1000 350 CLOSE3:CLOSE15:END 1000 INPUT#15,EN,EM$,ET,ES 1002 IF EN<20 OR EN=50 THEN RETURN 1010 PRINT EM$:CLOSE3:CLOSE15:END

For at kunne anvende ovenanførte programlinier til versionen med fastlængde felter, skal nogle få linier ændres som i det følgende:

BASIC 7.0:

100 INPUT "INDTAST RECORDNUMMER": RE
110:
120 DOPEN#3,"MINRELFIL",L88
130 BL$="(27 skiftede mellemrums karakterer)"
140 INPUT "NAVN":NA$
145 LN=LEN(NA$)
150 IF LN>27 THEN 140
155 NA$=NA$+LEFT$(BL$,27-LN)
160 INPUT "GADE":GAS
165 LN=LEN(GA$)
170 IF LN>27 THEN 160
175 GA$=GA$+LEFT$(BL$,27-LN)
180 INPUT "BY":BY$
185 LN=LEN(BY$)
190 IF LN>23 THEN 180
195 BY$=BY$+LEFT$(BL$,23-LN)
200 INPUT "LAND":LAS
205 LN=LEN(LA$)
210 IF LN>10 THEN 200
215 LAS=LAS+LEFT$(BL$, 10-LN)
220 DA$=NA$+GA$+BY$+LA$
260:
280 RECORD#3,(RE),1
290 IF DS= 50 THEN PRINT#3.CHR$(255):GOSUB 1000: GOTO 280
300 GOSUB 1000
310 PRINT#3, DA$
320 GOSUB 1000
330 RECORD#3.(RE).1
340 GOSUB 1000
350 DCLOSE#3:END
1000 IF DS<20 THEN RETURN
1002.
1010 PRINT "FEIL: "DS$:DCLOSE: END
Page 68

BASIC 2.0:

100 INPUT "INDTAST RECORDNUMMER"; RE
110 OPEN 15,8,15
120 OPEN3,8,3,"MINRELFIL,L," +CHR$(88)
130 BL$="(27 skiftede mellemrums karakterer)"
140 INPUT "NAVN":NAS
145 LN=LEN(NA$)
150 IF LN>27 THEN 140
150 IF LN>27 THEN 140
155 NA$=NA$+LEFT$(BL$,27-LN)
160 INPUT "GADE";GA$
160 INPUT "GADE
165 LN=LEN(GA$)
170 TR LN>27 THEN 160
170 IF LN 27 THEN 100
175 GAS=GAS+LEFTS(BLS, 27-LN)
180 INPUT "BY";BY$
185 LN=LEN(BY$)
190 IF LN>23 THEN 180
190 IF LN 23 THEN 180
195 RY$=RY$+LEFT$(BL.23-LN)
200 INPUT "LAND"; LA$
205 LN=LEN(LA$)
210 IF LN>10 THEN 200
215 LA$=LA$+LEFT$(BL$,10-LN)
220 DA$=NA$+GA$+BY$+LA$
260 RH=INT(RE/256)
270 RL=RE-256*RH
280 DEINUT#15 "P" _CHR$(Q6_3)_CHR$(RI)_CHR$(RH)_CHR$(1)
290 GOSUB 1000: IF EN=50 THEN PRINT#3. CHR$(255): GOSUB 1000: GOTO 280
290 GOSUB 1000
300 GOSUB 1000
310 PRINT#3. DAS
320 GOSUB 1000
330 PRINT#15."P" +CHR$(96+3)+CHR$(RL)+CHR$(RH)+CHR$(1)
340 GOSUB 100
350 GOSUB 1000:CLOSE3:CLOSE15:END
1000 INPUT#15,EN,EM$,ET,ES
1002 IF EN<20 THEN RETURN
1010 PRINT "FEIL:"EM$:CLOSE3:CLOSE15:END

Hvis feltindholdet varierer i længden, er variabel feltlængde ofte at foretrække. På den anden side kan fast feltlængde være at foretrække, hvis feltlængderne er stabile. Det er også nødvendigt at bruge fastlængde felter, hvis man ønsker at benytte den mulige offset parameter i Record# kommandoen for at udpege en bestemt byte indenfor en record. Der må imidlertid advares mod at bruge offset på denne måde. Når en hvilken som helst del af en record skrives, overskriver DOS den øvrige plads i recorden. Derfor, hvis De skal bruge offset parameteren, må De aldrig opdatere noget felt i en record, undtagen det sidste, medmindre alle efterfølgende felter også senere skal opdateres fra hukommelsen.

Page 69

Ovenstående programmer sammenligner nøje recordlængden med den ledige plads. Programmer, som ikke gør dette, vil opdage, at DOS udvider korte records til fuld længde ved at indlægge fyldkarakterer og ved at afkorte records, som er for lange til at kunne være på den allokerede plads. Hvis en record afkortes, vil DOS give fejl 51 "RECORD OVERFLOW", mens korte records vil blive accepteret uden en DOS fejlmeddelelse.

LÆSNING AF EN RELATIV RECORD

Når først en relativ record er skrevet til disketten, er det meget enkelt at tilbagelæse den til computerens hukommelse, men igen varierer fremgangsmåden, alt efter om der bruges fast eller variabel feltlængde. Her følger de programlinier, som skal bruges for at genindlæse de variable felter, som ovenfor skabtes fra record nummer RE i fil og kanal 3.

BASIC 7.0:
20 DOPEN#3, "MINRELFIL", L88
30 INPUT "INDTAST RECORDNUMMER": RE
40:
60 RECORD#3,(RE),1
70 GOSUB 1000
80 INPUT#3,NA$,GA$,BY$,LA$
90 GOSUB 1000
120 PRINT NAS: PRINT GAS
130 PRINT NAD: PRINT GAD
140 DCLOSE#3:END
1000 IF DS<20 THEN RETURN
1002
1010 PRINT "FEJL:"DS$:DCLOSE#3:END
10 OPEN 15,8,15
20 OPEN 3,8,3,"MINRELFIL,L,"+CHR$(88)
30 INPUT "INDTAST RECORDNUMMER";RE
40 RH=INT(RE/256)
50 RL=RE-256*RH
>∪ п⊥=кв-2⊃0 *Кн
60 PRINT#15."P" +CHR$(96+3)+CHR$(RL)+CHR$(RH)+CHR$(1)
70 GOSUB 1000
80 INPUT#3, NA$, GA$, BY$, LA$
90 GOSIIR 1000
100 PRINT#15."P" +CHR$(96+3)+CHR$(RL)+CHR$(RH)+CHR$(1)
110 GOSUB 1000
120 PRINT NA$:PRINT GA$

(fortsættes)

Page 70

130 PRINT BYS: PRINT LAS 1000 INPUT#15,EN,EM$,ET,ES 1002 IF EN<20 THEN RETURN 1010 PRINT "FEJL: "EM$: CLOSE3: CLOSE15: END Her følger de linier, som behøves for at indlæse versionen med fast feltlængde: BASTC 7 0. 10: 20 DOPEN#3,"MINRELFIL",L88 20 DUFEN#2, "MINKELFIL", L88 30 INPUT "INDTAST RECORDNUMMER" • RE 40: 50: 60 RECORD#3.(RE).1 70 GOSUB 1000 80 INPUT#3.DA$ 90 GOSUB 1000 90 GOSUB 1000 100 RECORD#3.(RE).1 110 GOSUB 1000 112 NA$=LEFT$(DA$,27) 114 GA$=MID$(DA$,28,27) 116 BY$=MID$(DA$,55,23) 118 LAS=RIGHTS(DAS, 10) 118 LA$=RIGHT$(DA$,10) 120 PRINT NA$:PRINT GA$ 130 PRINT BY$:PRINT LA$ 140 DCLOSE#3.END 1000 IF DS<20 THEN RETURN 1002. 1010 PRINT "FEJL: DS$:DCLOSE#3:END BASIC 2.0: 10 OPEN 15,8,15 20 OPEN 3,8,3,"MINRELFIL,L"+CHR$(88) 30 INPUT "INDTAST RECORDNUMMER";RE 40 RH=INT(RE/256) 50 RL=RE-256*RH 60 PRINT#15,"P" +CHR$(96+3)+CHR$(RL)+CHR$(RH)+CHR$(1) 70 GOSUB 1000 80 INPUT#3, DA$ 90 GOSUB 1000 100 PRINT#15,"P" +CHR$(96+3)+CHR$(RL)+CHR$(RH)+CHR$(1) 110 GOSUB 1000 112 NA$=LEFT$(DA$,27) 114 GA$=MID$(DA$,28.27)

(fortsættes)

Page 71

116 BY$=MID$(DA$,55,23) 118 LA$=RIGHT$(DA$,10) 120 PRINT NA$:PRINT GA$ 130 PRINT BY$:PRINT LA$ 140 CLOSE3:CLOSE15:END 1000 INPUT#15,EN,EM$,ET,ES 1002 IF EN<20 THEN RETURN 1010 PRINT "FEJL:"EM$:CLOSE3:CLOSE15:END</pre>

VÆRDIEN AF INDEKS FILER (RUTINEREDE BRUGERE)

I de sidste to kapitler har De lært, hvorledes man bruger sekventielle og relative filer hver for sig. Men de bruges ofte sammen, idet den sekventielle fil så bruges til at indeholde korte records med oplysninger om, hvilke navne i den relative fil, der er lagret i det enkelte recordnummer. På den måde kan indholdet af en sekventiel fil indlæses til et strengområde og sorteres alfabetisk. Efter sorteringen kan en teknik, kendt under navnet 'binær søgning', bruges for hurtigt at finde et indlæst navn i området, og indlæse eller skrive den tilsvarende record i den relative fil. Avancerede programmer kan indeholde to eller flere af denne art indeksfiler, samtidig sorteret på forskellige kriterier.

Page 72
KAPITEL 7 KOMMANDOER FOR DIREKTE TILGANG

ET VÆRKTØJ FOR RUTINEREDE BRUGERE

Kommandoer for direkte tilgang specificerer individuelle sektorer på disketten, mens oplysninger læses og skrives efter Deres angivelser. Dette giver disse kommandoer næsten fuldstændig fleksibilitet i datahåndtering af programmer, men stiller enorme krav til programmøren, som må holde fuldstændig kontrol med, at intet går galt. Som resultat heraf bruges de normalt kun i komplekse kommercielle programmer, som er i stand til at organisere data uden hjælp fra selve diskettedrevet.

En langt mere almindelig anvendelse af kommandoer for direkte tilgang er i hjælpeprogrammer, som bruges til at gennemgå og ændre dele af disketten, som normalt ikke ses direkte. For eksempel kan sådanne kommandoer bruges til at ændre en diskettes navn uden at slette samtlige programmer, til at låse et program, så det ikke kan slettes eller til at gemme Deres navn i en adresse, hvor det ikke skulle forventes.

I dette kapitel vil vi beskrive DOS kommandoerne for direkte læsning og skrivning på vilkårlige spor og blokke på disketten, så vel som de kommandoer, der bruges til at markere, om blokke er brugte eller ubrugte.

ÅBNING AF EN DATAKANAL FOR DIREKTE TILGANG

Når der arbejdes med direkte datatilgang behøves, at to kanaler er åbnet til disketten; kommandokanalen, som vi har benyttes hele bogen igennem og en anden til data. Kommandokanalen åbnes med den sædvanlige OPEN 15,8,15 eller lignende. En kanal for direkte datatilgang åbnes på næsten samme måde som andre filer, bortset fra at nummertegnet (#), som kan efterfølges af et hukommelses buffernummer, bruges som filnavn.

FORMAT AF OPEN INSTRUKTIONER FOR DIREKTE TILGANG

OPEN filnummer, enhedsnummer, kanalnummer." #buffernummer"

hvor 'filnummer' er filens nummer, 'enhedsnummer' er diskettestationens enhedsnummer, normalt 8; 'kanalnummer' er kanalnummeret, et tal mellem 2 og 14, der ikke bruges af andre filer, som måtte åbne samtidig; og 'buffernummer', hvis det medtages, er et af tallene 0, 1, 2 eller 3, som angiver den hukommelses-buffer i 1571, der skal bruges til denne fils data.

EKSEM PLER :

Hvis man ikke angiver, hvilken diskettebuffer der skal bruges, vælger 1571 selv en:

OPEN 5,8,5,"#"

Eller vi kan selv vælge:

OPEN 4.8.4."#2"

BLOCK-READ (læsning af blokke)

Formålet med en BLOCK-READ er at indlæse indholdet af en angivet sektor til en filbuffer. Skønt BLOCK-READ kommandoen (B-R) stadig er en del af DOS kommandosættet, udskiftes den næsten altid til U1 kommandoen (se kapitel 8).

Page 73

BLOCK-READ KOMMANDOENS FORMAT

PRINT#15. "U1":kanalnummer:drevnummer:spornummer:sektornummer

hvor 'kanalnummer' er det kanalnummer, der blev angivet, da filen, i hvilken blokken blev indlæst, blev åbnet. 'Drevnummer' er drevets nummer, mens 'spornummer' og 'sektornummer' respektive angiver de spor- og sektornumre som indeholder den datablok, der ønskes indlæst til filbufferen.

ALTERNATIVE FORMATER

PRINT#15,"U1:"kanalnummer;drevnummer;spornummer;sektornummer PRINT#15,"UA:"kanalnummer;drevnummer;spornummer;sektornummer PRINT#15,"U1:kanalnummer,drevnummer,spornummer,sektornummer"

Page 74
EKSEM PEL:

Her er et komplet program beregnet for indlæsning af en sektor til diskettehukommelsen med U1, og videre derfra til computerens hukommelse med GET#. (Hvis en vognretur optræder mindst een gang for hver 88 datakarakterer, kan Input# bruges i stedet for GET#).

110 MB=7936:REM $1F00 Opretter hukommelsesbuffer 120 INPUT "SPOR TIL LÆSNING";T 130 INPUT "SEKTOR TIL LÆSNING":S Vale af et apor og en sektor 140 OPEN 15,8,15 150 OPEN 5,8,5,"#" 160 PRINT#15,"U1";5;0;T;S Åbner kommandokanal Åbner kanal for direkte tilgang Indlæser sektor til diskbuffer 170 FOR I=MB TO MB+255 Benvtter en løkke for 180 GET#5,A$:IF A$="" THEN A$=CHR$(0) at kopiere diskhuffer til computerens hukommelse 190 POKE I,ASC(A$) Oprydning 200 NEXT 210 CLOSE 5:CLOSE 15 220 END

Efterhånden som løkken udføres, kopieres indholdet af angive spor og sektorer til computerens hukommelse, idet der begyndes med den adresse, der er sat af variablen MB i linie 160.

BLOCK-WRITE (skrivning i en blok)

Formålet med en BLOCK-WRITE er at lagre indholdet af en filbuffer i en angiven sektor. Det er derfor det modsatte af BLOCK-READ kommandoen. Skønt BLOCK-WRITE kommandoen (B-W) stadig er en del af DOS kommandosættet, erstattes den næsten altid af U2 kommandoen.

BLOCK-WRITE KOMMANDOENS FORMAT

PRINT#15, "U2"; kanalnummer; drevnummer; spornummer; sektornummer

hvor 'kanalnummer' er det kanalnummer, der blev angivet, da filen, i hvilken blokken,der skal læses, blev åbnet. 'Drevnummer' er drevets nummer, mens 'spornummer' og 'sektornummer' respektive angiver de spor- og sektornumre som skal modtage den datablok, der ønskes lagret fra filbufferen.

ALTERNATIVE FORMATER

PRINT#15, "U2: "kanalnummer; drevnummer; spornummer; sektornummer PRINT#15, "UB: "kanalnummer; drevnummer; spornummer; sektornummer PRINT#15, "U2: kanalnummer, drevnummer, spornummer, sektornummer"

NB! I sidste format, hvor alt står i anførelsestegn, må variabler ikke benyttes. Skriv i stedet for tallene direkte. F.eks.

PRINT#15,"U2: 2,0,18,1" (kanal 2, drev 0, spor 18, sektor 1)

Page 75

EKSEM PLER:

For at gendanne indholdsfortegnelsens (directory's) spor 18, sektor 1, fra diskbufferen, som er udfyldt med en BLOCK-READ, bruges:

PRINT#15, "U2";5;0;18;1

På næste side vil De komme tilbage til dette eksempel, efter at have lært at ændre directory på en nyttig måde.

De kan også bruge en BLOCK-WRITE til at skrive et navn i spor 1, sektor 1, en sjældent anvendt sektor. Dette kan gøres for at markere, at denne diskette tilhører Dem. Her er et program, der gør dette. Programmet anvender BLOCK-WRITE kommandoens alternative form:

110 INPUT "DERES NAVN";NA$ Indtast et navn
120 OPEN 15,8,15 Åbner kommandokanalen
130 OPEN 4,8,4,"#" Åbner kanal for direkte tilgang
140 PRINT#4, NA$ Skriver navnet til bufferen
150 PRINT#15,"U2";4;0;1;1 Skriver bufferen til spor 1
160 CLOSE 4 sektor 1 på disketten
170 CLOSE 15 Oprydning
180 END
DE ORIGINALE BLOCK-READ OG BLOCK-WRITE KOMMANDOER (EKSPERTBRUGERE)

Skønt BLOCK-READ og BLOCK-WRITE kommandoerne næsten altid erstattes af respektivt U1 og U2 kommandoerne, kan de originale kommandoer stadig bruges, såfremt De forstår deres virkning fuldt ud. I modsætning til U1 og U2 sætter B-R og B-W Dem i stand til at læse fra eller skrive til mindre end en hel sektor. I forbindelse med B-R bruges første byte i den udvalgte sektor til at indstille bufferpointeren (se næste afsnit) og er bestemmende for, hvor mange bytes der fra denne sektor indlæses til en diskette hukommelses-buffer. Et program kan kontrollere, at der ikke prøves på at læse forbi slutningen af de data, der aktuelt indlæses til bufferen, ved at holde øje med værdien på statusvariablen ST, som skal skifte fra O til 64. Når bufferen skrives tilbage til disketten med B-W, er den først skrevne byte bufferpointerens aktuelle værdi. Kun så mange bytes bliver skrevet i den angivne sektor. B-R og B-W kan derfor være nyttige, når man arbejder med kunde-definerede filstrukturer.

DE ORIGINALE BLOCK-READ OG BLOCK-WRITE KOMMANDOERS FORMATER

PRINT#15. "BLOCK-READ": kanalnummer: drevnummer: spornummer: sektornummer

kan forkortes til:

PRINT#15."B-R":kanalnummer:drevnummer:spornummer:sektornummer

og:

PRINT#15, "BLOCK-WRITE"; kanalnummer; drevnummer; spornummer; sektornummer

Page 76
forkortes som:

PRINT#15."B-W":kanalnummer:drevnummer:spornummer:sektornummer

hvor 'kanalnummer' er det kanalnummer, som blev angivet, da den fil, hvorfra blokken skal læses, blev åbnet. Drevnummer' er drevets nummer og 'spornummer' og 'sektornummer' er de numre, som indeholder den datablok, som ønskes delvist indlæst til eller skrevet fra filbufferen.

VIGTIGE HENVISNINGER:

1. I en ægte BLOCK-READ anvendes første byte i den udvalgte sektor til at bestemme hvor mange bytes, der fra denne sektor indlæses til diskette hukommelses-bufferen. Den kan derfor ikke benyttes for indlæsning af en hel sektor til bufferen, da den første databyte altid opfattes som det antal karakterer, der skal læses, og ikke som en del af data.

2. I en ægte BLOCK-WRITE er, på lignende måde, når bufferen skrives tilbage til disketten, den første byte bufferpointerens aktuelle værdi. Kun så mange bytes bliver skrevet i den angivne sektor. Den kan ikke benyttes til at skrive en hel sektor uændret tilbage på disketten, fordi den første databyte vil blive overskrevet af bufferpointeren.

BUFFER POINTEREN

Buffer pointeren udpeger, hvor næste READ eller WRITE vil begynde i diskette hukommelses-bufferen. Ved at flytte bufferpointeren kan man, i vilkårlig rækkefølge, få tilgang til individuelle bytes i en blok. Dette sætter Dem i stand til at redigere enhver del af en sektor, eller til at organisere den i felter, som en relativ record.

BUFFER-POINTER KOMMANDOENS FORMAT

PRINT#15, "BUFFER-POINTER"; kanalnummer; byte

normalt forkortet til: PRINT#15,"B-P";kanalnummer;byte

hvor `kanalnummer' er det kanalnummer, der blev angivet, da den fil, der reserverer bufferen, blev åbnet. Byte' er det karakternummer i bufferen, der skal peges på.

ALTERNATIVE FORMATER:

PRINT#15, "B-P: "kanalnummer; byte PRINT#15, "B-P: kanalnummer; byte"

Page 77

EKSEM PEL:

Her er et program, som 'låser' det første program (eller den første fil) på en diskette. Det virker ved at læse begyndelsen af directory (spor 18, sektor 1) ind i diskettehukommelsen, sætte bufferpointeren på den første filtype byte (se Appendiks C for detaljer om organisering af directory), og låse den ved at sætte bit 6 og tilbageskrive den.

110 OPEN 15,8,15 Abner kommandokanal
120 OPEN 5,8,5,"#" Åbner kanal for direkte tilgang
130 PRINT#15, "U1";5;0;18;1 Læser spor 18, sektor 1
140 PRINT#15, "B-P";5;2 Peger på byte 2 i bufferen
150 GET#5,A$:IFA$=""THEN A$=CHR$(0) Indlæser den til hukommelsen
160 A=ASC(A$) OR 64 Låser bit 6
170 PRINT#15,"B-P";5;2 Peger igen på byte 2
180 PRINT#5, CHR$(A); Overskriver den i bufferen
190 PRINT#15,"U2";5;0;18;1 Tilbageskriver buffer til diskette
200 CLOSE 5 Oprydning
210 CLOSE 15
220 END

Efter kørsel af ovenstående program kan den første fil på disketten ikke længere slettes. Vil De senere slette denne fil, skal det samme program køres igen, men linie 160 skal udskiftes med nedenstående:

160 A = ASC(A$) AND 191

Ændrer bit 6 til ulåst

ALLOKERING AF BLOKKE

Når De engang har skrevet noget i en særlig sektor på en diskette ved anvendelse af kommandoerne for direkte tilgang, vil De måske gerne markere denne sektor som "allerede brugt", for at undgå, at andre filer bliver skrevet her. Allokerede blokke vil være sikrede, til disketten bliver valideret.

BLOCK-ALLOCATE KOMMANDOENS FORMAT:

PRINT#15, "BLOCK-ALLOCATE"; drevnummer; spornummer; sektornummer

normalt forkortet til:

PRINT#15, "B-A"; drevnummer; spornummer; sektornummer

hvor 'drevnummer' er drevets nummer og 'spornummer' og 'sektornummer' er det spor og den sektor, der indeholder den datablok, der skal indlæses til filbufferen.

ALTERNATIVT FORMAT:

PRINT#15, "B-A:drevnummer; spornummer; sektornummer"

Page 78
EKSEM PEL:

Hvis De prøver at allokere en blok som ikke er tilgængelig, vil DOS angive fejlmeddelelse nr. 65 "NO BLOCK" og sætter spor- og bloknumrene i fejlmeddelelsen til næste ledige spor- og bloknummer. Prøv derfor, før der vælges en blok for skrivning, at allokere denne blok. Er blokken ikke ledig, prøv så i stedet for at læse den næste ledige blok fra fejlkanalen og alloker denne. Alloker imidlertid ikke datablokke i det spor, hvor directory ligger. Er det returnerede spornummer = 0, er disketten fuld.

Her er et program, som udfører pladsallokering på disketten for lagring af en meddelelse:

100 OPEN 15,8,15 Åbner kommandokanalen
110 OPEN 5,8,5,"##" "direkte tilgang"
120 PRINT#5, "JEG TANKER, DERFOR
EKSISTERER JEG" Skriver en meddelelse til buffer
130 T=1:S=1 Begynder ved første spor og sektor
140 PRINT#15,"B-A";0;T;S Prøv allokering
150 INPUT#15, EN, EM$, ET, ES Se om det var i orden
160 IF EN=O THEN 210 Hvis den var, er vi næsten færdige
170 IF EN<>65 THEN PRINT
EN,EM$,ET,ES:STOP "NO BLOCK" (allerede allokeret)
180 IF ET=O THEN PRINT
"DISKETTE FULD":STOP Hvis næste spor er O, er der
ikke mere plads.
190 IF ET=18 THEN ET=19:ES=0 Alloker ikke directory
200 T=ET:S=ES:GOTO 140 Prøv foreslået spor/sektor
210 PRINT#15,"U2";5;0;T;S Skriv buffer til allok. sektor
220 PRINT "GEMT I:",T,S Sig hvor meddelelse lagredes
230 CLOSE5:CLOSE15 og ryd op.
240 END

FRIGØRELSE AF BLOKKE

BLOCK-FREE kommandoen udfører det modsatte af BLOCK-ALLOCATE. Den frigør blokke, De ikke længere har brug for, til genanvendelse af DOS. Kommandoen opdaterer BAM for at vise, at en bestemt sektor ikke er i brug, men sletter i virkeligheden ikke nogen data.

BLOCK-FREE KOMMANDOENS FORMAT

PRINT#15, "BLOCK-FREE"; drevnummer; spornummer; sektornummer

eller forkortet: PRINT#15,"B-F";drevnummer;spornummer;sektornummer

hvor 'drevnummer' er drevets nummer og 'spornummer' og 'sektornummer' er respektivt de spor- og sektornumre, der indeholder den ønskede datablok, som skal skrives til filbufferen.

Page 79

ALTERNATIVT FORMAT:

PRINT#15."B-F:drevnummer:spornummer:sektornummer"

EKSEM PEL:

For at frigive den sektor, hvori vi skrev vort navn i BLOCK-WRITE eksemplet, og som vi allokerede i det første BLOCK-ALLOCATE eksempel, kan følgende kommando anvendes:

PRINT#15."B-F":0:1:1

ANVENDELSE AF RANDOM FILER (ØVEDE BRUGERE)

Ved at kombinere kommandoerne fra dette kapitel er det muligt at fremstille et filhåndterings-program, som bruger randomfiler. Hvad De nu behøver at vide, er hvorledes man holder rede på, hvilke blokke på disketten en sådan fil har brugt. Selv om De ved, at Deres randomfil ikke har allokeret nogen sektor, må De sikre Dem, at der ikke blev foretaget allokering af nogen anden uvedkommende fil på disketten. Den mest anvendte metode til registrering af hvilke sektorer, der er

Den mest anvendte metode til registrering af hvilke sektorer, der er blevet benyttet af en randomfil, er i en sekventiel fil. Den sekventielle fil indeholder en liste med recordnumre og samtidig oplysninger om hver records spor, sektor og byteadresse. Det betyder, at det er nødvendigt at en randomfil kræver tre kanaler; een som kommandokanal, een til randomdata og een til sekventielle data.

Page 80

KAPITEL 8

INTERNE DISKETTE KOMMANDOER

Ekspertprogrammører kan afgive kommandoer, som direkte ændrer 1571's arbejdsmetoder, på næsten samme måde, som øvede programmører kan ændre BA-SIC's virkemåde i computeren med PEEKs, POKEs og SYS-kald. Det er også muligt at skrive maskinsprogsprogrammer som fuldstændigt indlæses til og kører i 1571, enten ved at skrive dem til diskettestationens hukommelse fra computeren, eller ved at indlæse dem direkte fra en diskette til den ønskede diskette hukommelses-buffer. Dette svarer til at indlæse og udføre maskinsprogsprogrammer på Deres computer.

Som da De lærte at benytte PEEK, POKE og SYS i Deres computer, skal der kraftigt advares ved anvendelse af kommandoerne i dette kapitel. Det er fuldstændige maskinsprogskommandoer, og savner fuldstændigt BASIC's sikkerhedsforanstaltninger. Hvis noget går galt, må De regne med at skulle slukke for diskettestationen og tænde for den igen (efter at have fjernet disketten) for atter at overtage kontrollen. Brug ikke disse kommandoer på disketter, som indeholder værdifulde oplysninger. Fremstil hellere en sikkerhedskopi og øv Dem på den. Kendskab til programmering i 6502 maskinsprog vil være en stor hjælp, og De er endvidere nødt til at råde over en god memory map6 for 1571. Nedenunder vises en kort 1571 map.

1571 MEMORY MAP
LOKATION FORMAL
0000-00FF Zero F age arbejdsareal, jobkø, variabler
0100-01FF GCR ov
mode).
erflow areal og stack (1571 mode BAM side et 1571
0200-02FF Komman dobuffer, parser, tabeller, variabler
0300-07FF 5 data buffere, 0-4 - een bruges til BAM
1800-65022A Seriel , kontrolporte
1000-65022A Kontro lporte
8000-FFE5 32Kbyt e ROM, DOS og kontrolrutiner
FFE6-FFFF JMP ta bel, brugerkommando vektorer

NB: 1571 er, som andre ydre Commodore enheder, konstrueret til at understøtte en tilslutningsflade via programmerede kommandostrukturer. De programkommandoer 1571 er forsynet med sikrer en nem og kontrollerbar tilslutningsflade mellem denne ydre enhed og centralenheden. Commodore forbeholder sig ret til at ændre ROM og I/O strukturen på ethvert tidspunkt.

Page 81

MEMORY-READ (læsning fra hukommelsen)

Diskettestationen indeholder såvel 32K ROM (Read-Only-Memory) som 4K RAM (Read-Write-Memory), hvoraf kun 2K bruges. De kan i disse områder få direkte tilgang til enhver adresse, eller til de buffere, DOS har oprettet i RAM under anvendelse af 'memory' kommandoer. MEMORY-READ sætter Dem i stand til at vælge hvilken byte eller hvilke bytes, der skal indlæses fra disketten til computeren. MEMORY-READ kommandoen svarer til BASIC Peek () funktionen, men læser fra diskettestationen hukommelse og ikke fra compurens.

OBS! I modsætning til andre diskettekommandoer kan de kommandoer, som nævnes i dette kapitel, ikke staves i fuld længde. Derfor vil M-R være korrekt, medens MEMORY-READ ikke er en tilladt stavemåde.

MEMORY-READ KOMMANDOENS FORMAT:

PRINT#15."M-R:"CHR$(<adresse)CHR$(>adresse)CHR$(byteantal)

hvor <adresse er den laveste del og >adresse er den højeste del af den adresse, der skal læses fra diskettestationens hukommelse. Den mulige tilføjelse byteantal kan angives, og derved udvælges, hvor mange hukommelsespositioner, der vil blive indlæst, fra 1 - 255. Angives denne parameter ikke, vil 1 karakter blive indlæst. Hvis det ønskes, kan et kolon (:) sættes efter M-R indenfor anførelsestegnene.

ALTERNATIVT FORMAT:

PRINT#15, "M-R:"CHR$(<adresse)CHR$(>adresse)CHR$(byteantal)

Den næste byte-læsning ved brug af GET# instruktionen gennem kanal 15 (fejlkanalen) vil ske fra denne adresse i diskette-controllerens hukommelse, og følgende bytes vil læses fra efterfølgende hukommelsesadresser.

Enhver INFUT# fra fejlkanalen vil give besynderlige resultater, hvis De bruger denne kommando. Dette kan rettes ved at sende en hvilken som helst anden kommando til diskettestationen, dog ikke en anden hukommelseskommando.

EKSEM PLER:

Hvis man ønsker at se, hvor mange forsøg diskettestationen gør på at læse en bestemt sektor, og om 'søgning' et halvt spor til hver side vil blive foretaget, hvis læsningen mislykkes, og om spring til spor 1 og tilbage vil blive forsøgt, før sektoren erklæres ulæselig, kan De anvende følgende linier. De vil læse en speciel variabel i diskettens side nul hukommelse. Denne variabel kaldes REVCNT og findes på den hexadecimale adresse $6A.

Page 82

110 OPEN 15.8.15 Åbner kommandokanal 120 PRINT#15,"M-R:"CHR$(106)CHR$(0) 130 GET#15.G$:IF G$="" THEN G$=CHR$(0) Svarer til G=PEEK(106). 140 G=ASC(G$) 150 B=G AND 128:B$="ON":IF B THEN B$="OFF" Kontroller bit 7. 160 S=G AND 64:S$="ON":IF S THEN S$="OFF" 170 T=G AND 31:PRINT "ANTAL FORSØG ER":T Kontroller bit 6. Kontroller hit 0-5 180 PRINT "ANTAL SPRING"; B$ 190 PRINT "ANTAL SØGNINGER"; S$ 200 CLOSE 15 210 END Her følger et program til mere generel anvendelse. Programmet læser een eller flere adresser hvor som helst i diskettestationens hukommelse: 110 OPEN 15,8,15 120 INPUT"BYTEANTAL FOR LÆSNING(O=SLUT):NL Åbner kommandokanal. Indtast ønsket byteantal 130 IF NL<1 THEN CLOSE 15:END 140 IF NL>255 THEN 120 med mindre, De er færdig, eller for langt. 150 INPUT "START VED ADRESSE";A 160 AH=INT(AD/256):AL=AD-AH*256 Indtast startadresse. Konventering til disketteformat. 170 PRINT#15."M-R"CHR$(AL)CHR$(AH) Aktuel Memory-Read. CHR$(NL) 180 FOR I=1 TO NL Løkke til alle data er 190 GET#15.A$:IFA$="" THEN A$=CHR(0) 200 PRINT ASC(A$) 210 NEXT I og udskriv dem underveis 220 PRINT til evig tid.

MEMORY-WRITE (skrivning til hukommelsen)

MEMORY-WRITE kommandoen svarer til BASIC Poke kommandoen, men virker på diskettestationens hukommelse i stedet for på computeren. M-W sætter Dem i stand til, på een gang, at skrive op til 34 bytes til diskettestationens hukommelse. MEMORY-EXECUTE og visse Brugerkommandoer kan benyttes til at udføre ethvert program, som er skrevet på denne måde.

MEMORY-WRITE KOMMANDOENS FORMAT:

PRINT#15,"M-W:"CHR$(<adresse)CHR$(>adresse)CHR$(byteantal) CHR$(databyte(s))

hvor <adresse er den laveste del og >adresse er den højeste del af den adresse, hvorfra der skal skrives i diskettestationens hukommelse. Byteantal er det antal hukommelsesadresser, som vil blive skrevet (fra 1-34) og databyte er 1 eller flere værdier, som skal skrives i hukommelsen, hver af dem som en CHR$() værdi. Hvis det ønskes, kan et kolon (:) sættes efter M-W indenfor anførelsestegnene.

Page 83

EKSEM PLER :

Vi kan bruge denne linie til at undgå 'springene' under indlæsning af DOSbeskyttede programmer (d.v.s. programmer, der er blevet beskyttede mod kopiering ved dannelse og kontrol af særlige diskettefejl).

PRINT#15, "M-W: "CHR$(106)CHR$(0)CHR$(1)CHR$(133)

Følgende linie kan anvendes til at genskabe dårlige sektorer, som hvis f. eks. en vigtig fil er blevet beskadiget og derfor ikke kan indlæses på normal måde.

PRINT#15, "M-W:"CHR$(106)CHR(0)CHR$(31)

Disse to eksempler vil under visse omstændigheder kunne være meget nyttige. De svarer respektivt til POKE 106,133 og POKE 106,31, men i diskettestationens hukommelse, ikke computerens. Som nævnt i foregående sektions første eksempel indeholder adresse 106 i 1571 diskettedrevet tre separate rutiner for drevet, alle i forbindelse med fejlrettelse. Bit 7 (den højeste bit) betyder, hvis den er sat, at der ikke foretages spring til spor 1. Hvis bit 6 er sat, foretages ingen søgning. I så fald vil drevet ikke forsøge at læse de halv-spor, der ligger over og under det spor, der er udpeget, for at se, om data kan læses på denne måde. De nederste 6 bits er den tæller, som viser hvor mange gange drevet vil prøve at læse hver sektor, før og efter at søgning og spring er forsøgt og opgivet. Da 31 er det største tal, der kan udtrykkes med 6 bits, er dette det maksimale antal forsøg, der kan foretages.

det maksimale antal forsøg, der kan foretages. Ud fra dette eksempel kan De se værdien af kendskab til Peek, Poke og maskinsprog, før man begynder at benytte direkte-tilgangs kommandoer, ligesom De vil kunne se værdien af disses potentielle styrke.

MEMORY-EXECUTE

I RAM eller ROM kan enhver hukommelses-rutine udføres med MEMORY-EXE-CUTE kommandoen. Den svarer til SYS kald til et maskinsprogsprogram eller subrutine i BASIC, men arbejder i diskettestationens hukommelse og ikke i computerens.

MEMORY-EXECUTE KOMMANDOENS FORMAT:

PRINT#15, "M-E: "CHR$(<adresse)CHR$(>adresse)

hvor ´<adresse´ er ordrens lave del og `>adresse´ er ordrens høje del af den adresse i diskettestationens hukommelse, hvorfra udførelse skal påbegyndes.

Page 84

EKSEMPEL:

Her følger en MEMORY-EXECUTE kommando, som absolut ikke udfører noget som helst. Den første instruktion, som udføres er en RTS, som afslutter kommandoen:

PRINT#15."M-E:"CHR$(179)CHR$(242)

En mere plausibel grund for at bruge denne kommando ville være for kunstigt at udløse en fejlmeddelelse. Glem ikke at kontrollere fejlkanalen, da De ellers vil miste meddelelsen:

PRINT#15, "M-E: "CHR$(201)CHR$(239)

De fleste anvendelser kræver imidlertid intimt kendskab til DOS indre handlemåde, og sammensætning med andre kommandoer, som f.eks. MEMORY-WRITE.

BLOCK-EXECUTE

Denne sjældent anvendte kommando vil indlæse en sektor indeholdende en maskinsprogsrutine fra diskette til en hukommelsesbuffer og udføre den fra den første adresse i denne buffer, indtil en RETURN fra subrutine (RTS) instruktionen afslutter kommandoen.

BLOCK-EXECUTE KOMMANDOENS FORMAT:

PRINT#15, "B-E:";kanalnummer;drevnummer;spornummer;sektornummer

hvor 'kanalnummer' er det kanalnummer, der blev angivet, da den fil, hvori den blok der skal indlæses befinder sig, blev åbnet, 'drevnummer' er drevets nummer og 'spornummer' og 'sektornummer' er det spor- og sektornummer, der indeholder den datablok, som skal indlæses til filbufferen og udrøres der.

ALTERNATIVE FORMATER:

PRINT#15, "B-E:";kanalnummer;drevnummer;spornummer;sektornummer PRINT#15, "B-E:kanalnummer,drevnummer,spornummer,sektornummer"

Page 85

EKSEMPLER:

Hvis vi forudsætter, at De har skrevet et maskinsprogsprogram i spor 1, sektor 8 på en diskette, og ønsker at køre den i buffer nummer 1 i diskettestationens hukommelse (begyndende i hexadecimalt $0400), kunne De foretage følgende:

110 OPEN 15,8,15Åbner kommandokanal120 OPEN 2,8,2,"#1"Åbner kanal for direkte tilgang<br/>til buffer nummer 1.130 PRINT#15,"B-E:";2;0;1;8Indlæs og udfør spor 1, sektor 8.140 CLOSE 2Oprydning.150 CLOSE 15160 END

BRUGER KOMMANDOER

De fleste brugerkommandoer er bestemt til at blive anvendt som maskinsprog JMP eller BASIC SYS kommandoer i maskinsprogs programmer, som ligger i diskettestationens hukommelse. Nogle af dem kan imidlertid også benyttes i andre forbindelser. Bruger 1 og Bruger 2 kommandoerne bruges som erstatning for BLOCK-READ og BLOCK-WRITE kommandoerne. UI genstarter 1571 uden at ændre variablerne, UJ laver 'koldstart' af 1571, næsten som havde den været slukket og tændt igen.

Bruger kommando Funktion

u0
genstiller standardværdi på bruger
hop-tabel.
u1 eller ua
u2 eller ub
u3 eller uc
u4 eller ud
u5 eller ue
u6 eller uf
u7 eller ug
u8 eller uh
u9 eller ui
u: eller uj
hop-insol:
block-read erstatning
block-write erstatning
hop til $0500
hop til $0506
hop til $0506
hop til $0509
hop til $050c
hop til $050f
hop til $050f
hop til $1ffa) tabel reset
opstarts vektor

Ved at indlæse disse hukommelsesadresser med en anden maskinsprogs9JMP kommando, som f. eks. JMP $0520, kan De skabe længere rutiner, som opererer i diskettestationens hukommelse, sammen med en hop-tabel, der er let at bruge.

BRUGERKOMMANDOERS FORMAT:

PRINT#15, "Ukarakter"

hvor 'karakter' er en af de ovenfor viste brugerkommandoer.

Page 86

EKSEMPLER:

PRINT#15,"U:" Udgave af DOS RESET kommando.
PRINT#15, "U3" Udfør program med start i buffer 2

UTILITY LOADER

Denne kommando indlæser en bruger-type fil til RAM i diskettedrevet. De to første bytes i filen skal indeholde henholdvis den lave og høje adresse. Tredie byte indeholder det antal karakterer, der skal følge. Derudover skal en efterfølgende kontrolsum medtages. 'Load'adressen er startadressen.

UTILITY LOADER KOMMANDOENS FORMAT:

PRINT#15, "&O:filnavn"

Bemærk: Filnavnsparametret er kun tilgængeligt i 1571 mode.

Page 87
KAPITEL 9

MASKINSPROGS PROGRAMMER

Her følger en liste over disketterelaterede Kernal ROM subrutiner og et praktisk eksempel på disses anvendelse i et program, som indlæser en sekventiel fil fra en diskette til hukommelsen. Læg mærke til, at de fleste kræver en avanceret opstilling af et eller flere processor registre eller hukommelsesadresser, og at de alle kaldes med assemblersprogs JSR kommandoen.

En mere gennemgående beskrivelse af hvad hver enkelt rutine udfører, og hvorledes den enkelte rutines parametere sættes, kan findes i den Programmer's Reference Guide, der kan fås til Deres computer.

DISKETTERELATEREDE KERNAL SUBRUTINER

Label Adresse Funktion
SETLFS = $FFBA
$FFBA
;SÆT LOGISKE FØRSTE OG ANDEN ADRESSER
OPEN - $FFCO - ÅRNING AF LOGISK FIL
CLOSE = SFFC3 LIKNING AF LOGISK FIL
CHKIN = $FFC6 VALG AF INPUT-KANAL
CHKOUT = $FFC9 VALG AF OUTPUT-KANAL
CLRCHN = $FFCC NULSTIL ALLE KANALER & SÆT
STANDARDVÆRDI FOR I/O
CHRIN = $FFCF : HENT BYTE FRA AKTUEL INPUTENHED
CHROUT = $FFD2 ; SEND BYTE TIL AKTUEL OUTPUTENHED
START LDA # 4 ;SAT LANGDE OG ADRESSE
LDX # ;PÅ FILNAVN, LOW
LDY #>FNADR ;OG HIGH BYTES
JSR SETNAM ;FOR NAVNSÆTTER.
LDA #3 ;SÆT FILNUMMER
LDX #8 ;ENHEDSNUMMER DISKETTE
LDY # .0 ; OG SEKUNDÆR ADRESSE
JSR SETLIS OF SAT DEM.
JSR ;UPEN 5,8,0,"TEST"
IGD CHKIN יערדת אדד אסרס דאסוות
NEXT JSB CHRIN •HENT NASTE BYTE FRA FIL
11.12/11 BEO END INDTI SLUT FLIFR FF.L.
JSR CHROUT SEND BYTE TIL SKÆRM
JMP NEXT ; OG GÅ TILBAGE EFTER MERE.
;
END LDA #3 ;NAR FARDIG
JSR CLOSE LUK FIL
JSK CLRCHN SAT STANDARDVARDI FUR 1/U.
n10 JILDAGE ILD DADIG.
,
FNADR
BYT "TEST" :GEM FILNAVN HER
,
Page 88
KAPITEL 10 BIDOM _ KOMMANDORD

BURST - kommandoinstruktionerne i BASIC er en serie kraftfulde. alsidige og komplekse kommandoer, der gør brugeren istand til at formattere. skrive og læse i flere formater. BURST - kommandoerne sendes via kernalkald, mens datas handshakerutiner styres af brugeren. Derved at opnås den maximale ydeevne. Der er ingen parameterkontrol, så BURST - kommandoerne skal anvendes med forsigtighed. En BURST-read af et ikke eksisterende spor vil således bevirke at 1571's drev støjende. men forgæves vil forsøge at finde det.Læsning og skrivning i andre formater sker automatisk, hvis kommandoen skrives i den rette sekvens. Sørg for, at De er fortrolig med alle kommandoer og følg eksemplerne i dette kapitel. Det er vigtigt at følge handshakereglerne nøje for at opnå maximal vdelse.

BYTE BIT 7 6 5 4 3 2 1 0
00 0 1 0 1 0 1 0 1
01 0 0 1 1 0 0 0 0
02 T Е В S 0 0 0 N
03 DE STINATION ISSPOR
04 DE STINATION ISSEKTOR
05 AN TAL SEKTO RER

06 NÆSTE SPOR (VALGFRI)

VÆRDIOMRÅDE: Alle værdier afgøres af den enkelte diskettes format.

KONTAKTER: T - overfør data (1=ingen overførsel). E - ignorer fejl (1=ignorer).

  • B kun bufferoverførsel (1=kun bufferoverførsel). S - valg af aide (kun MFM).
  • N drev nummer.

PROTOKOL. Burgt handshake

  • BETINGELSER: Før man kan læse fra eller skrive på en diskette, skal denne angives ved hjælp af INQUIRE DISK eller QUERY DISK FORMAT kommandoen. Disse kommandoer beskrives senere. Dette skal ske hver gang der skiftes diskette.
  • UDSKRIFT: Før hver overført sektor sendes en burst status byte, efterfulgt af burst data. En fejl bevirker at data ikke sendes med mindre bit E er sat.
Page 89

WRITE

BYTE BIT 7 6 5 4 3 2 1 0
00 0 1 0 1 0 1 0 1
01 0 0 1 1 0 0 0 0
02 Т Е В S 0 0 0 N
03 DESTI NATIONSSE OR
04 DESTI NATIONSSE KTOR
05 ANTAI SEKTORER ł
06 n æ ste SPOR (VA LGFRI)
VÆRDIO
KONTAK
E –
B –
S –
N –
MRÅDE: A
TER: T -
ignorer
kun buff
valg af
drev num
lle værdier a
overfør data
fejl (1=ignor
eroverførsel
side (kun MFM
mer.
fgøres
(1=ing
er).
(1=kun
).
af den en
gen overfø
bufferove
kelte dis
vrsel).
vrførsel).
kettes fo rmat.
PROTOK OL: Ski ft_til output (spout ;), send d ata, skif t til inp ut (spin) ),

  • sæt clock lav, vent på status, udløs clock (ved flere sektorer startes igen med: skift til output o.s.v.).
  • BETINGELSER: Før man kan læse fra eller skrive på en diskette, skal denne angives ved hjælp af INQUIRE DISK eller QUERY DISK FORMAT kommandoen. Disse kommandoer beskrives senere. Dette skal ske hver gang der skiftes diskette.

INPUT: Computer skal sende burst data.

OUTPUT: En burst status byte følger efter hver WRITE operation.

INQUIRE DISK

BYTE BIT 7 6 5 4 3 2 1 0
00 0 1 0 1 0 1 0 1
01 0 0 1 1 0 0 0 0
02 Х x х S 0 1 0 N

AFBRYDERE: S - valg af side (kun MFM)

N - drev nummer.

PROTOKOL: Burst handshake.

OUTPUT: Hver INQUIRE DISK operation efterfølges af en burst status byte.

Page 90

FORMAT MFM

BYTE BIT 7 6 5 4 3 2 1 0
00 0 1 0 1 0. 1 0 1
01 0 0 1 1 0 0 0 0
02 Ρ I D S 0 1 1 N
03 M=1 Т LOG1 ISK STARTS ECTOR
04 MELLEMRU м (VALG FRI, STD. VÆRDI-0)
05 SEKTOR S TØRRELSE *(VAI GFRI, STI .VÆRDI-01 ,256 BYTE SECTORE R)
06 SIDSTE S POR NR. (VALG FRI, STD. VARDI-39)
07 ANTAL SE KTORER **(V/ ALGFRIG, A FHÆNGIG A F BYTE 05 )
08 LOGISK S TARTSPOR (VALC FRI, STD. VÆRDI-0)
09 STARTSPO r offset (VALG FRI, STD. VÆRDI-0)
OA FYLDBYTE (VALC FRI, STD. VÆRDI-$E5 )
0B -? ? SEKTORTA BEL (VALC FRI T-BII SET )
*00-12
01-25
02-51
03-19
8 BYTE SE
7 BYTE SE
2 BYTE SE
42 BYTE S
KTORER
KTORER
KTORER
EKTORER
**STD. •VÆRDI 26-
16-
9-
5-
128 BYTE
256 BYTE
512 BYTE
1024 BYTE
SEKTORER
SEKTORER
SEKTORER
SEKTORER
KONTAK TER: P-pa
I-in
D-ma
S-va
T-se
sk
N-dr
rtiel forma
dex adress
rkering fo
lg af side
ktortabel
al inklude
ev nummer
at (1=par
emærke sk
r dobbel1
inkludere
res)
rtiel)
crevet (1=
t side (1=
et (1=inkl
skrevet)
dobbeltsi
uderet, a
det forma
lle andre
t)
paramet
re
PROTOK OL: KONVE NTIONEL
BETING ELSER: De
fo
nne kommane
r at angive
lo skal i
e diskett
følges af
ten.
INQUIRE e ller QUER Y DISK F ORMAT
UDSKRI FT: Ingen , status og pdatteres a i drevet
FORMAT GCR (ING EN INDHOLD FORTEGNE ELSE)
BYTE BIT 7 6 5 4 3 2 1 0
00 0 1 0 1 0 1 0 1
01 0 0 1 1 0 0 0 0
02 X x x x 0 1 1 N
03 M= 0
Page 91

O4 ID LOW

05 ID HIGH

KONTAKTER: N-drev nummer X-ingen betydning

PROTOKOL: Konventionel

BETINGELSER: Denne kommando skal indledes med INQUIRE DISK eller QUERY DISK FORMAT kommandoen for at angive disketten.

UDSKRIFTER: Ingen. Status opdatteres i drevet.

SEKTOR MELLEMRUM

BYTE BIT 7 6 5 4 3 2 1 0
00 0 1 0 1 0 1 0 1
01 0 0 1 1 0 0 0 0
02 W х x 0 1 0 0 N
04 MELLE MRUM

KONTAKTER: W-skrive kontakt (O=skriv) N-drev nummer. X-ingen betydning

PROTOKOL: Burst handshake (W=1)

BETINGELSER: Dette er et "soft" mellemrum til brug for multi-sector READ og WRITE.

OUTPUT: Ingen (W=O), Mellemrum burst byte (W=1)

Page 92

QUERY DISK FORMAT

BYTE BIT 7 6 5 4 3 2 1 0
00 0 1 0 1 0. 1 0 1
01 0 0 1 1 0 0 0 0
02 F х X S 1 0 1 N
03 OFFSET (VALGFI RI F-BIT SET)

KONTAKTER: F-undertryk flag(F=1 flytter hovedet med offset angivet i byte

PROTOKOL: Burst handshake.

  • BETINGELSER: Afgør diskettens format på et specielt spor. Registrerer også disketter der ikke haver std. format (d.v.s. mindste sektoradresse er forskellig fra nul).
  • OUTPUT: *burst status byte (ingen bytes vil følge, hvis der var en fejl, eller formatet er GCR).
**hvis F bit er sat, status fra offset spor.
г DIC er. Bau, status 11.8 OTTRef spor.

INQUIRY STATUS

BYTE BIT 7 6 5 4 3 2 1 0
00 0 1 0 1 0 1 0 1
01 0 0 1 1 0 0 0 0
02 W С x 0 1 1 0 N
03 NY ST ATUS (W-B IT CLEAR)

KONTAKTER: W-skrivekontakt (0=skriv) C-skift (C=1 og W=O-log in disk) C= 1 og W = 1-returnerer om disken var logged, d.v.s. $B fejl eller gammel status) N-drev nummer. X-ingen betydning.

Page 93

PROTOKOL: Burst handshave (W=1)

BETINGELSER: Dette er en metode til læsning eller skrivning af aktuel status.

OUTPUT: Ingen (W=O), Burst statusbyte (W=1)

CHGUTL UTILITY

BYTE BIT 7 6 5 4 3 2 1 0
00 0 1 0 1 0 1 0 1
01 0 0 1 1 0 0 0 0
02 х X x 1 1 1 1 0
03 UTILI Y KOMMAN DOER: S , R, T, ́м́,́н́,# DEW
04 KOMMAN DOPARAME ምፑጉ

KONTAKTER: X-ingen betydning

UTILITY KOMMANDOER: S'-DOS sektorophold R'-DOS retries T'-ROM signatur analyse M'-valg af mode H'-valg af hoved #DEV-apparat nr.

NB: Byte 02 svarer til ->-

EKSEMPLER: "UO>S"+CHR$(SEKTOROPHOLD)

"UO>R"+CHR$(RETRIES)

"UO>T"(Hvis ROM signatur fejler, blinker indikatorlampen fire

gange)

"UO>M1 = 1571 MODE "UO>MO" = 1541 MODE

*"UO>H0 = SIDE NUL "UO>H1" = SIDE ET (kun 1541 mode)

"UO>"+CHR$(apparatnr.), hvor apparatnr. = 4 - 30

FASTLOAD UTILITY

BYTE BIT 7 6 5 4 3 2 1 0
00 0 . 1 0 1 0 1 0 1
01 0 0 1 1 0 0 0 0
02 Ρ х x 1 1 1 1 1
03-1 ?? FIL N A VN
Page 94

KONTAKTER: P-sekventiel filbit (P=1, behøver ikke at være en programfil) X-uden betydning.

PROTOKOL: Burst handshake.

OUTPUT: Burst statusbyte indleder hver overført sektor. Spor og sektor til sammenkædning, behandles automatisk. I en programfil, skulle loadadresserne blive behandlet korrekt.

STATUS ER SÅLEDES: 000000X-0K 00000010-fil findes ikke 00011111-E0I

Enhver anden statusbyte bør betragtes som en fillæsefejl.

NEDBRYDNING AF STATUSBYTE.

  • BIT 7 6 5 4 3 2 1 0
  • MODE DN SEKTORSTØRRELSE ( CONTROLLER STATUS )

MODE-1=MFM, O=GCR DN-DREV NUMMER

SEKTOR STØRRELSE (KUN MFM) OO..... 128 BYTE SEKTOR O1..... 256 BYTE SEKTOR 10..... 512 BYTE SEKTOR 11......1024 BYTE SEKTOR

CONTROLLER STATUS (GCR)

000X....OK 0010....SEKTOR IKKE FUNDET 0011....INGEN SYNC 0100....DATABLOK IKKE FUNDET 0101....DATABLOK CHECKSUM FEJL 0110....FORMATFEJL 0111....VERIFY FEJL 1000....SKRIVEBESKYTTELSES FEJL 1001....CHECKSUMFEJL I HEADER BLOK 1010....DATA OVERSKRIVER IND I NÆSTE BLOK 1011....DISK ID STEMMER IKKE/DISK SKIFT 1100....RESERVERET 1101....RESERVERET 1110....SYNTAX FEJL 1111....DREV IKKE TIL RÅDIGHED

Page 95

CONTROLLER STATUS (MFM) OOOX.....OK OO11....INTET ADRESSEMÆRKE O100....RESERVERET O101....DATA CRC FEJL O110....FORMAT FEJL O111....VERIFY FEJL 1000....SKRIVEBESKYTTELSES FEJL 1001....CHECKSUMFEJL I BLOK HEADER 1011....DISKSKIFT 1100....RESERVERET 1101....SYNTAX FEJL 1111....DREV IKKE TIL RÅDIGHED

BURST OVERFØRSELSPROTOKOL.

Inden følgende burst-overførselsrutine anvendes, skal De afgøre om den tilsluttede enhed er hurtig eller ej. Den hurtige serielle (byte mode) protokol træffer afgørelsen internt, når De inkluderer en forespørgselsrutine (send-cmd-string;). Denne rutine adresserer enheden som en modtager, og afgør herved hastigheden.

BURST READ

send-cmd-string:
                                  (*bestem hastighed*)
is device hurtig then
    serial-in
                                   *gør 6526 til input*)
                                   *gentag for alle sektorer*)
    repeat
         read-error
                                   *genkald feil byte*)
                                   *ingen fejl*)
         toggle-clock;
                                   *gentag for alle sektorer*)
               wait-byte;
                                  (*poll 6526 som byte*)
                toggle-clock:
                                            *omskifter clock*)
                 store-data
                                   (*etah mag*
        until last-byte:
                                   *sidste byte ?*)
                                   *flere sektorer ?*)
    until last-sector;
    set-clock-høj:
                                  (*frigiv clock-linie*),
else
    read-1541:
                                  (*send læs enhed*)
send-cmd-string:
                                  (*bestem hastighed*)
if device hurtig then
                                   *gentag for multi-sektor*)
                                   *seriel port ud*)
*gentag for multi-sektor*)
              check-clock:
                                   *clock-omskifter ?*)
*send byte*)
            until last-byte
                                   *sidste byte ?*)
                                   *seriel port ind*)
*klar til status*)
       clock-low:
                                   *controller fejl ?*)
*genindstil .clock*)
       clock-high:
     until last-sectors
                                  (*indtil sidste sektor*)
     write-1541
                                  (*skriv enhed*)
Page 96

FORKLARING AF PROCEDURER

send-cmd-string sender en kommandobyte for at bestemme om drevet er

toggle-clock mndrer clockliniens status.

clock-hi ændrer clocks status til logisk 1.

clock-lo ændrer clocks status til logisk 0.

wait-byte skifter 6526 til en klar byte.

read-error kalder toggle-clock og wait-byte, returnerer herefter til centralenheden hvis der ikke er nogen fejl.

lagrer data i et specielt memoryområde.

  • last-byte afhængig af sektorstørrelse, vil forøges og sammenligne værdien med sektorstørrelsen.
  • last-sector formindsker antallet af forlangte overførte sektorer. og stopper når overførslen er slut.
  • sætter seriel 6526 port og driver i input mode.
  • kalder wait-byte og vurderer det foregående controlleriob's status.
  • serial-out sætter seriel 6526 port og driver i output mode.
  • check-clock kontrollerer clockliniens status og returnerer ved omskift af clocklinie.
  • send-byte sender en databyte til 1571.
  • read-1541 sender en læseinstruktion til 1541.

write-1541 sender en skriveinstruktion til 1541.

HANDSHAKE

Den følgende figur viser protokiollen ved burst-transmission. Den er status-afhængig (enkel og hurtig). Når clocklinien skifter, sendes en databyte. Burst protokollen er opdelt i 3 dele: 1. Send Command: send en streng ved anvendelse af eksisterende

  • kernal rutiner.
  • 2. Query: afgør om enheden er hurtig. 3. Handshake Code: følg handshake-reglerne.

Page 97

EKSEMPLE R PÅ I BURST-RUTINE 2
*=$ 1800
; RUTINE
; DREVET
; OPEN 1
; BUFFER
; FØR DE
TIL ]
S KOMM
5,8,19
OG CM
NNE KO
LÆSNING AF N-
MANDOKANAL SF
5
MD-BUF OG CMI
DMMANDO KALDI
-datablokke.
KAL VÆRE ÅBEN.
D-LÆNGDE SKAL VÆRE ANGIVET
SS.
serial
d2pra
clkout
dlicr
dlsdr
stat
buffer
=$0a]
=$dd(
=$10
=$dc(
=$dc=
=$fa
=$fa
lc ;hurt
DO
Dd
=Oc
:Sfb
tig seriel flag
& $fc
lda
ldx
ldy
jsr
lda
jsr
#15
#8
#15
setlfs
#0
setnam
open
;logisk filnummer
;apparat nummer
;sekundær adresse
;dan logisk fil
;intet navn
;angiv filnavn
;åben logisk kanal
;efter k ommand lokanalen er åbnet, skal der komme følgende kald fra "read
read lda
sta
lda
and
sta
ldx
#$00
star
serial
#%10111111
serial
#15
;clear status
;clear bit 6 hurtig seriel flag
jsr
ldx
ldy
chkout
#0
cmd-length
;åben kanal til output
;kommandoens længde
sendit lda
jsr
inx
dey
cmd-buf,x
bsout
;get kommando
;send kommando
bne sendit
Page 98
jsr
bit
bvc
clrchn
serial
error
;send eoi
;kontroller drevets hastighed
;langsomt serielt drev
sei
bit
ldx
lda
eor
sta
dlicr
cmd-buf+5
d2pra
#c lkout
d2pra
;clear interupt kontrolregister
;get # antal sektorer
;1ms seriel port
;skift clocks status
;lagre retur
read-it
wait 1
lda
bit
beq
#8
dlicr
wait 1
;vent på byte
lda
eor
sta
d2pra
≇clkout
d2pra
;læs seriel port
;skift clocks status
;lagre retur
; Kode til kontrol af status byte
; 1. Denne kode undersøger om det er GCR eller MFM mode.
; 2. Godkend sektorstørrelse.
;
  1. Fejlkontrol, hvis OK da fortsæt.
    Ved fejl, undersøg fejlkontakt, fortsæt hvis den er sat,
    ellers afbryd.
; 4. Godkend kontakterne
lda
sta
and
cmp
dcs
dlsdr
stat
#15
#2
error
;get data fra serielt dataregister
;gem status
;check for fejl (3)
top-rd
wait2
ldy *0 ;lige side
ida
bit
beq
#8
dlicr
wait2
;vent på byte
lda
eor
sta
d2pra
#clkout
d2pra
;udfør clockskift
lda
sta
dlsdr
(buffer),y
;get data
;gem data
bne top-rd ;fortsæt for bufferstørrelse
dex
beq
done-read ;udført ?
inc
jmp
buffer+1
read-it
;næste buffer
done-read

u clc

Page 99

.bvte $24 :retur til afsender 'UO',0,0,0,0,0 cmd-buf .bvte *=$1800 : RUTINE TIL SKRIVNING AF N-datablokke. ; DREVETS KOMMANDOKANAL SKAL VÆRE ÅBEN. ; OPEN 15.8.15 ; BUFFER OG CMD-BUF OG CMD-LÆNGDE SKAL VÆRE ANGIVET : FØR DENNE KOMMANDO KALDES. serial =$0alc :hurtig seriel flag d2pra -$4400 clkout =$10 =$fd old-clk clkin =$40 =$dc0d dlsdr =$dc0c stat =$fa huffer =$fb :Sfb & $fc mmureg =$d505 dltimh =$dc05 :timer høj =$dc04 ;timer lav dlcra -$4006 :kontrol register a lda #15 :logisk filnummer ldx #8 ldy #15 ;apparat nummer ;sekundær adresse ;dan logisk fil jør setnam ;angiv filnavn jsr open ;åben logisk kanal ;efter kommandokanalen er åbnet, skal der komme følgende kald fra "write" write lda # $00 sta stat lda serial and #%10111111 :clear bit 6 hurtig seriel flag sta serial ldx #15 jsr chkout :åben kanal til output ldx #0 cmd-length :kommandoens længde cmd-buf,x get kommando bsout :send kommando dey bne sendit isr clrchn :send eoi bit serial :kontroller drevets hastighed

Page 100

sei lda #fclkin sta old-clk :clock starter høj ldy #0 ;lige sider ldx cmd-buf+5 :get # antal sektorer jsr spout lda d2pra ;seriel port ud topwr :check clock cmp d2pra ;debounce bne topwr eor old-clk and #olkin beg topwr lda old clk skift status på gl. clock: eor #clkin sta old-clk lda (buffer).y ;send data sta dladr ALTERNATIV: :anbring koden her eller før spinp 1da #8 wait 1 hit dlice ;vent på transmissionstid bed wait 1 inv bne topwr ;fortsæt for bufferstørrelse ;taleretning vender jsr spinp bit dlicr ;seriel port input :clear afventning iar clkol ;sæt clock lav, klar til modtagelse lda #8 wait 2 hit dlior :vent på statusbyte beq wait 2 lda dladr ;get data fra serielt dataregister sta stat :gem status iar clkhi ;set clock høj Kode til kontrol af status byte 1. Denne kode undersøger om det er GCR eller MFM mode. 2. Godkend sektorstørrelse. 3. Fejlkontrol, hvis OK da fortsæt. Ved fejl, undersøg feljkontakt, fortsæt hvis den er sat. ellers afbrvd. 4. Godkend kontakterne lda stat :gendan status and #15 спр #2 :check for feil (3)

Loading...