1570/71
Brugervejledning
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.
| INTRODUKTION | 1 |
|---|---|
| DEL ET: BASIC BETJENINGSVEJLEDNING. | |
KAPITEL 1: UDPAKNING, INSTALLATION OG IBRUGTAGNING AF 1571 |
33677890
1112213 |
KAPITEL 2: BASIC 2.0 KOMMANDOER |
14
15 16 17 19 21 23 23 |
KAPITEL 3: BASIC 7.0 KOMMANDOER |
25
25 27 28 29 30 31 32 |
| 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 |
| 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 |
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 |
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 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.
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.
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:
APPENDIX A TIL G - giver detaljeret referenceinformation. Appendix A viser f.eks. hvordan drevnummer angives ved brug af to kontakter på drevets bagside.
DEL ET GENEREL BETJENINGSVEJLEDNING.
KAPITEL 1. UDPAKNING, INSTALLATION OG IBRUGTAGNING AF 1571
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.
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.
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.
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 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.
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.
| 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.
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
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.
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.
SEARCHING FOR "HOW TO USE" LOADING
READY
Ø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.
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.
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)
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.
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.
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
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.
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).
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.
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.
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.
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.
SAVE 90:Drevnummer:filnavn",enhedsnummer hvor alle parametere er sædvanlige, med undtagelse af "erstat"-tegnet "". Drevnummer skal angives her.
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.
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.
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.
En nyttig alternativ form for kommandoen er:
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
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.
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".
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 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
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"
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 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.)
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.
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.
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.
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.
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.
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.
De vil da kunne se, om den nye version er der, men ikke optager samme plads som den version, der befinder sig i hukommelsen.
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"fil navn"[Ddrevnummer][,Uenhedsnummer][,relokerflag]
Følgende version af kommandoen verificerer en fil, der netop er blevet gemt:
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 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.
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 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 - 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.
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:
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.
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.
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" 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.
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.
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 - 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.
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:
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:
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 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.
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.
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.
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).
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.
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.
Ø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.
Æ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.
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.
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.
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).
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.
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.
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-
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.
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
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.
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.
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.
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.
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:
| 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.
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"
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.
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.
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.
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.
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:
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"
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.
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#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.
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
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:
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.
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)
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:
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)
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.
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".
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.
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.
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.
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
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$.
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#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:
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)
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Å.
| 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. |
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
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
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.
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.
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.
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.
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.
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.
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$
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.
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.
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.
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.
BASIC 7.0: For at positionere record pointeren på fil nummer 2, record nummer 3, indtastes:
RECORD#2,3
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)
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)
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)
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"
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.
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.
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.
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
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.
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)
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)
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
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.
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.
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)
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)
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.
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.
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.
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.
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"
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).
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.
PRINT#15,"U1:"kanalnummer;drevnummer;spornummer;sektornummer PRINT#15,"UA:"kanalnummer;drevnummer;spornummer;sektornummer PRINT#15,"U1:kanalnummer,drevnummer,spornummer,sektornummer"
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.
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.
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)
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 |
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
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.
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 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.
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å.
PRINT#15, "B-P: "kanalnummer; byte PRINT#15, "B-P: kanalnummer; byte"
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"
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 |
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.
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.
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
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.
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.
| 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.
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.
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.
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.
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 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.
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.
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.
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.
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.
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"
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.
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.
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.
| 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 |
| , |
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).
PROTOKOL. Burgt handshake
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) | ), |
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.
| 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 |
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)
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.
| **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.
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 |
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.
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
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*)
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.
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
| 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 |
|
| ;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 |
|
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. | ||
| ; |
|
||
| ; | 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
.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
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...