
|
Disk cursus (2) Genic Clubguide, 00-00-00
DISKCURSUS DEEL 2
In dit deel van de cursus disk-gebruik bespreken we een
routine om uw eigen etiket te ontwerpen op de diskette. Nee,
geen etiket-maker voor Dynamic Publisher, een routine die uw
eigen kopregel in een hok plaatst en die U ziet als U het
files commando geeft, met daaronder de files die op de
diskette staan. Zo kunt U uw diskettes nummeren, namen geven
etc. Het staat in ieder geval erg netjes en professioneel.
We proberen U zo wat meer inzicht te geven in de werking van
de directory-sectoren en die van de BOOT-sector.
Laten we eerst eens bekijken hoe we dit gaan doen. Op een PC
is het maken van een disk-etiket niet moeilijk, daar kunt U
gewoon aangeven dat U een bepaald gedeelte in de directory
als etiket wilt gebruiken. Op de MSX echter moeten we wat
omslachtiger te werk gaan. Het is mogelijk om, als we direct
in de directory sectoren poken, alle ASCII tekens te
gebruiken. Dat wil zeggen dat we ook kleine letters kunnen
neer zetten etc., terwijl we, als we een file saven, slechts
hoofdletters en een beperkt aantal tekens kunnen gebruiken.
Maar het geeft nog een andere mogelijkheid. De ASCII-codes 0
t/m 31 zijn behalve tekens ook stuurcodes.
Wat wil dat dan zeggen, vrij simpel. Voorbeeldje: Als je in
basic intypt "print CHR$(7)" krijg je een beep. chr$(13)
geeft een return, chr$(8) geeft een Backspace etc. En met
name dit laatste is voor ons van belang. Als je het commando
files geeft komen de files op het scherm met een punt tussen
extensie en file-naam en een spatie tussen de verschillende
files, ter illustratie:
FILE1 .EXT FILE2 .EXT
Als U het files commando geeft in BASIC, krijgt U ongeveer
het volgende resultaat, als er tenminste files aanwezig
zijn. Als we nu een etiket willen maken moeten er natuurlijk
niet om de 12 tekens een spatie en een punt staan. Dus dan
moeten de punten en spaties weg worden gewerkt. Dan is de
Backspace optie natuurlijk erg handig. Als het eerste teken
van de extensie (EXT), Backspace is dan wordt het punt
gewist en gaat de cursor een positie naar links. Hetzelfde
is mogelijk bij de spatie als we het eerste teken van de
filenaam chr$(8) maken, dit veroorzaakt een soortgelijk
effect. Ook dit zullen we even duidelijk laten zien.
Stel we willen de titel "DISKETTE NUMMER ZES" plaatsen in de
eerste twee files.We gaan dan als volgt te werk:
FILE1 : De filenaam wordt DISKETTE, dan volgt er als we het
files commmando geven een punt. Dit kunnen we
weghalen door CHR$(8) (Back-space) te plaatsen als
eerste teken van de extensie. Dan hebben we nog 2
posities over om de twee volgende tekens te
plaatsen:" N". Het komt er dan als volgt terecht in
de directory sector:
FNAAM: 01:CHR$(&H44) "D" 07:CHR$(&H54) "T"
02:CHR$(&H49) "I" 08:CHR$(&H45) "E"
03:CHR$(&H53) "S" EXT: 09:CHR$(&H45) Backspace
04:CHR$(&H4B) "K" 10:CHR$(&H20) " "
05:CHR$(&H45) "E" 11:CHR$(&H4E) "N"
06:CHR$(&H54) "T"
Voor een file zijn in de directory 32 tekens
gereserveerd, als we een etiket maken dan is het
natuurlijk niet nodig om de rest van de
gereserveerde ruimte te vullen. Immers, de file
hoeft niet geladen te worden. Op de plek van de
datum, tijd, size enzovoort blijft gewoon nul staan.
FILE2 : De filenaam wordt een backspace (CHR$(8)) om de
spatie die tussen de files geplaatst wordt te
verwijderen. De daaropvolgende tekens zijn "UMMER Z"
, dan volgt er als we het files commando geven een
punt. Dit kunnen we weer weghalen door chr$(8)
(Backspace) als eerste teken van de extensie te
plaatsen. Dan hebben we nog twee posities over om de
twee laatste tekens te plaatsen. Het komt dan als
volgt terecht in de directory-sektor:
FNAAM: 33:CHR$(&H08) Backspace 39:CHR$(&H41) " "
34:CHR$(&H55) "U" 40:CHR$(&H5A) "Z"
35:CHR$(&H4D) "M" EXT: 41:CHR$(&H08) Backspace
36:CHR$(&H4D) "M" 42:CHR$(&H45) "E"
37:CHR$(&H45) "E" 43:CHR$(&H53) "S"
38:CHR$(&H52) "R"
De getallen beginnen nu op 33 om dat dat het gebied
is waarin de 2e file zich in de directory sector
bevindt, zoals we in deel een besproken hebben.
Om toch nog maar even wat te herhalen: Een sector bestaat
uit 512 bytes, zo ook een directory sector. Hierin is het
grootste deel van de file gegevens opgenomen zoals naam,tijd
enzovoort. Deze gegevens nemen per file 32 bytes in beslag,
er past dus 16 keer gegevens over een file in een directory
sector. De naam en extensie van de file staan op de 2e tot
en met de 12e byte. We beginnen in een sector te tellen op
0, zodat bij de eerste file de naam staat op byte 1 t/m 11,
bij de tweede file op byte 33 t/m 43 etc.
Nog maar even voor de duidelijkheid: De files zoals boven
kunnen dus alleen maar rechtstreeks in de directory-sector
worden gepoked. Disk-basic accepteert niet alle ASCII-codes
en dus kunnen tekens als chr$(8) (Backspace) niet in de file
naam worden geplaatst. Files die voor dit doel gebruikt
worden, als etiket en dus niet om te laden, noemen we zgn.
Dummy-files.
Dan volgt nu het programma, dat natuurlijk ook op diskette
staat, maar zo is het wat handiger om een en ander nader te
verklaren:
80 REM INITIALISTIE
90 REM
100 REM SCREEN 0:WIDTH 80:KEY OFF:CLEAR 5000:CLS
Om te zorgen dat er wat geheugen vrij is moeten we een clear
geven, anders volgt er een OUT OF MEMORY error.
120 REM INPUT TEKST
130 REM
140 LOCATE 54,1:PRINT CHR$(219):LOCATE 0,0:LINE INPUT I$
150 IF LEN(I$)>54 THEN I$=LEFT$(I$,54) ELSE S=27-LEN(I$)/2:
I$=SPACE$(S)+I$+SPACE$(S)
REGEL 140: Er wordt eerst een vierkantje getekend, dit geeft
aan hoelang de tekst mag zijn (54 tekens), vervolgens wordt
met line input de tekst ingelzezen die U intypt.
REGEL 150: Er wordt gekeken of de tekst langer is dan 54
tekens. Zo ja, dan worden de eerste 54 tekens gebruikt
(LEFT$). Zo nee, dan wordt de tekst gecentreerd.
154 REM Etiket maken
155 REM
160 FOR I=1 TO 56:B$=B$+CHR$(220):C$=C$+CHR$(223):NEXT I
165 D$=SPACE$(6)
170 Q$=CHR$(32)+CHR$(9)+CHR$(219)+C$+CHR$(219)+D$+CHR$(9)+
CHR$(219)+CHR$(32)+I$+CHR$(32)+CHR$(219)+D$+CHR$(9)+
CHR$(9)+CHR$(219)+B$+CHR$(219)+D$
180 A$=LEFT$(Q$,144):B$=MID$(Q$,145,LEN(Q$)-144):B$=B$+
SPACE$(143-LEN(B$))+CHR$(13)
REGEL 160: De onder en bovenkant van het etiket wordt in
elkaar gezet,waarbij C$ de onderkant is (een streep) en B$
de bovenkant (een streep).
REGEL 165: D$ wordt gedefinieerd als 6 spaties.
REGEL 170: Hier wordt het hele etiket in een string gezet.
We zullen het geheel even vertalen : Spatie, Tab, Vierkant,
bovenkant, vierkant, 6 spaties, Tab, vierkant, spatie,
tekst, spatie, vierkant, 6 spaties, Tab, Tab,
vierkant,onderkant,vierkant, 6 spaties. Zo zit het hele
etiket in een string.
REGEL 180: In A$ komen de eerste 144 tekens van het etiket,
dit past precies in een directory sector. In B$ komt de
andere helft, aangevuld met spaties en een return om aan het
begin van de regel uit te komen.
200 REM CHECK OF ER NOG NIKS OP DE DISK STAAT EN OF DEZE
GEFORMATTEERD IS
210 REM
220 ON ERROR GOTO 250
230 FILES"A:"
240 END
250 IF ERR<>53 THEN END
Dit spreekt voor zich, als er niks op de disk staat en deze
is geformateerd (Fout is File not Found (53)) dan gaat het
programma door anders stopt het. Als er al wat op de
diskette zou staan, dan zouden de eerste 32 files gewist
worden (de eerste 2 directory sectoren).
270 REM ZET ETIKET IN EERSTE TWEE DIRECTORY SECTOREN
280 REM
290 I$=DSKI$ (1,0):Q=PEEK (&HF351)+ 256 * PEEK (&HF352)
291 AF=PEEK (Q+16):SF=PEEK (Q+22)+ 256 * PEEK (Q+23)
292 S1=AF * SF + 1:I$=DSKI$(1,S1):X=0
300 FOR I=0 TO 15: POKE Q + (32*I),8
301 FOR J=1 TO 7: A=ASC ( MID$ (A$,J+(I*9),1) ): POKE
Q+J+(32*I),A: NEXT J
302 POKE Q+8+(32*I),8
303 FOR J=9 TO 10: A=ASC ( MID$ (A$,(J-1)+(I*9),1)): POKE
Q+J+(32*I),A: NEXT J
304 NEXT I
310 X=X+1: IF X=2 THEN DSKO$ 1,(S1+1):FILES:END ELSE DSKO$
1,S1: I$=DSKI$(1,S1+1): A$=B$: GOTO 300
Een heel aantal commando's die we maar een beetje gespreid
hebben over de regels.
REGEL 290: Laad de BOOT-sektor, zet in Q het adres waar de
informatie uit de sektor in het geheugen staat.
REGEL 291: Bepaal Aantal Fats en Aantal sektoren per FAT.
REGEL 292: Bepaal eerste directory sektor en lees deze in.
REGEL 300: Dit is een geheel tot regel 304, hierin gebeurt
het volgende:
- I is het nummer van de file die we beschrijven in
de directory sector.
- Er wordt vervolgens de tekst uitgelezen, eerst
een Backspace gepoked (8) dan de eerste zeven
tekens, dan (inde extensie) weer een backspace,
en dan de laatste twee tekens.
REGEL 310: Hier wordt gekeken of de tweede directory sector
( de files 17 t/m 32 ) nog beschreven moet
worden. Zo ja dan wordt de eerste weggeschreven,
B$ wordt A$ (Het tweede deel van de tekst) en de
routine begint opnieuw. Zo niet, dan wordt de
tweede directory sector weggeschreven, het
resultaat wordt getoond en het programma eindigt.
Er valt natuurlijk veel te experimenteren met deze routine,
U kunt ook zelf de buitenkant van het etiket ontwerpen. Ook
is het mogelijk beeps tussen de tekst te plaatsen, dit geeft
ook wel een leuk effect ( Gebruik hiervoor chr$(7)).
Natuurlijk geeft het alleen een goed effect in screen 0 op
80 kolommen, probeer maar eens een aanpassing te maken voor
40 kolommen. Dit programma staat ook op deze Clubguide onder
de naam ETIKET.MSX. Veel plezier met de routine en tot de
volgende keer, waarin we een routine bespreken om te kijken
op welke sectoren een file staat. Hierbij wordt ook de FAT
nader toegelicht.
Voor suggesties, vragen, opmerkingen of toevoegingen,
Ronald Egas
De Blauwe Wereld 53
1398 EP Muiden
Tel.02942-3813 ( s'avonds en in de weekends)
|