Dieses Programm ist eine echte Hilfe für den C64-Benutzer, der sich einmal etwas näher mit der internen Dateiorganisation des 1541-Laufwerks beschäftigen möchte.
Die Idee zu diesem Programm kam mir, als ich nach einem »SCRATCH«-Befehl mit Bedauern feststellen mußte, ein in mühevoller Arbeit erstelltes Programm versehentlich mitgelöscht zu haben. Doch glücklicherweise hatte ich kurz zuvor erfahren, wie man ein gelöschtes File auf der 1541-Floppy regeneriert:
Filetyp im Directoryeintrag im Direktzugriff wieder setzen und anschließend ein »VALIDATE« ausführen.
Es begann also die Suche nach besagtem Byte, sowie die intensive Erkundung der Dateiorganisation und des Direktzugriffs.
Nun, nach mehreren Monaten Arbeit liegt endlich das fertige Programm vor. Es druckt eine Vielzahl von Floppy-Informationen auf einem Epson-Drucker aus. Auf eine Bildschirmausgabe wurde aus Gründen der Übersichtlichkeit verzichtet.
Was bietet das Programm
Ganze Dateien aufzeigen:
Hierbei fragt das Programm nach dem gewünschten Filenamen. Bei korrekter Eingabe werden folgende Informationen ausgedruckt: Filename, Filetyp, Filelänge in Blocks, Spur, Sektor, laufende Blocknummer und natürlich der Inhalt sämtlicher von dieser Datei belegten Blöcke in ASCII-Codes und -Zeichen (je 8 Byte). Eine Seite wird mit genau 2 Blocks beschrieben, dann erfolgt automatisch ein Seitenvorschub. Bei ungerader Blockanzahl kann ein Seitenvorschub auch vom Benutzer ausgelöst werden. Bei Dateiende springt das Programm wieder ins Menü zurück.
Einzelne Blöcke ausgeben:
Dieser Modus unterscheidet sich vom vorigen dadurch, daß hier bestimmte Sektoren ausgewählt werden können. Und dies auf zwei verschiedene Arten:
Eingabe von Spur und Sektor:
Geben Sie, durch Komma getrennt, Spur- und Sektornummer des auszudruckenden Blocks ein;
Eingabe von Filename und Blocknummer: Das Programm liest aus der Directory, wieviele Blocks das angegebene File belegt und zeigt dies am Bildschirm an. Nun können Sie wählen, welchen dieser Blöcke Sie sehen möchten.
Bytereihen ausdrucken:
Mit diesem Menüpunkt können Sie gezielt bestimmte Bytes einer Datei oder eines Sektors herauspicken. Die Form der Eingabe von Parametern ist identisch mit der des Teilprogrammes »Einzelne Blöcke ausgeben«. Zusätzlich müssen Sie das erste und letzte auszudruckende Byte eines Sektors festlegen (0-255). Das erste Byte kann auch zugleich das letzte sein, was die Ausgabe nur eines Wertes bewirkt.
Blockbelegung von Files:
Von einer Datei belegte Sektoren werden ihrer Reihenfolge entsprechend, im Format: laufende Blocknummer, Spur/Sektor, ausgegeben. Auch eine Routine zur Berechnung der tatsächlichen Filelänge in Bytes ist in dieses Teilprogramm integriert. Das zweite Byte des letzten Blockes gibt die Anzahl der von der Datei in diesem Block benötigten Bytes an. Daraus ergibt sich folgende Formel für die Filelänge: (Gesamtzahl belegter Blocks — 1) * 254 + 2. Byte letzter Block.
Einschränkung für relative Dateien: Spur und Sektor von Side-Sektor-Blöcken werden nicht angezeigt. An ihrer Stelle erscheint das Kürzel »SSB«, so daß man wenigstens weiß, wieviel SSB das DOS zur Verwaltung der Datei benötigt.
Directory:
Dieser Befehl bringt Ihnen eine erweiterte und vor allem übersichtlichere Directory Ihrer Disketten zu Papier. Selbstverständlich ohne das Programm zu zerstören. Sie enthält Informationen über:
Diskettenname und ID
Nummer des Eintrages
Filename
Filelänge in Blocks
Filelänge in Bytes = (Filelänge in Blocks — 1) * 254 + 127)
Es wird davon ausgegangen, daß der letzte Block zur Hälfte belegt ist. Die Angabe weicht also um maximal 126 Bytes von der tatsächlichen Länge ab.
1. Datenblock des Files
Filetyp
Freie Einträge
Freie Blöcke
Bei relativen Dateien finden Sie im Anschluß an den Filetyp zwei zusätzliche Angaben:
Erster Side - Sektor - Block (Spur/Sektor)
Recordlänge
BAM (Block Available Map)
Das Format des Blockbelegungsplanes ist wie folgt festgelegt: Horizontal werden die einzelen Sektoren aufgetragen, vertikal die Spuren 1—35. Ein Stern kennzeichnet einen belegten Sektor, das Minuszeichen einen freien. Mit »/« markierte Sektoren sind nicht vorhanden, da die Anzahl der Sektoren je Spur zum Diskettenmittelpunkt hin abnimmt. Dem Wert rechts neben jeder Spur können Sie entnehmen, wieviele Blöcke auf dieser noch nicht belegt sind. Die Summe der freien Sektoren finden Sie ganz unten. Sollte einmal die Gesamtzahl der freien Blöcke nicht mit der Angabe in der Directory übereinstimmen, so ist mit der Diskette ein »VALIDATE« durchzuführen, um den korrekten Zustand wieder herzustellen.
Benötigte Hardware
Erstellt und getestet wurde das Programm auf einem C 64 mit Floppy VC 1541 und Epson RX-80 (mit Data-Becker-Interface).
Eine Umsetzung auf andere Druckertypen dürfte keine großen Schwierigkeiten machen, da die meisten Steuerzeichen für Druckerfunktionen in den Zeilen 4220-4370 untergebracht sind. Weitere Steuerzeichen, welche vereinzelt im Programmtext vorkommen, sind durch die Form (c$="string":c3=Zahl:gosub4030) leicht zu erkennen. Durch diese Druckparameter werden vor allem Schriftart und Zeilenabstand gesteuert.
In diesen Zeilen wird in den Grafikmodus des Druckers umgeschaltet und eine Punktmatrix (CHR$(254) oder CHR$(255) für die senkrechten Linien, CHR$(64) für die waagrechte Linie übermittelt.
Zu bemerken wäre noch, daß bei Verwendung des neuen Data-Becker-Interfaces die OPEN-Befehle in den Zeilen 710 und 7 6 0 geändert werden sollten:
710 OPEN 1,4,2: ...
760 OPEN 4,4,2: ...
Auch die Initialisierung des Druckers in den Zeilen 3960 bis 3990 muß entsprechend den Angaben im Handbuch abgeändert werden.
Mit diesen Hinweisen sollte die Anpassung an andere Drucker keine Schwierigkeit mehr darstellen.
Zum Schluß möchte ich noch auf ein Buch hinweisen, das mir erst die nötigen Grundlagen zu diesem Programm vermittelte: »Das große Floppy-Buch« von Data Becker. Eine wirklich ausgiebige und informative Quelle für alle jene, die sich intensiver mit der Floppy-Programmierung befassen wollen.
Ich denke, daß Sie das Programm nun sinnvoll einsetzen können, zumal es auch Routinen enthält, die man in andere Programme übernehmen kann.
(Johann Auer / ev)
Zeile(n)
Bedeutung
10-100
Titelvorspann
170
Aufruf ’Initialisierung’
190
Aufruf ’Menü’
210
Sprungbefehl zu Teilprogrammen (Startadressen)
280-430
Initialisierung
460-770
Menü
710-750
Prüfen ob Drucker eingeschaltet
800-960
Ganzes File ausgeben (Teilprogramm)
990-1350
Einzelne Blöcke ausdr. (Teilprogramm)
1050-1080
Eingabewahl: 1) Spur/Sektor 2) Filename/Blocknr.
1380-1680
Bytereihen (Teilprogramm)
1440
Sprung zu Eingabewahl (Zeilen 1050-1080)
1710-2130
Blockbelegung von Files (Teilprogramm)
2050
Spur/Sektor des nächsten Datenblocks laden
2160-2870
Direktory aufzeigen (Teilprogramm)
2430-2650
8 mal 32 Zeichen eines Directoryeintrages lesen — Zerlegung dieses Strings
2 900-3430
BAM (Teilprogramm)
3150-3220
4 Bytes für je eine Spur lesen und in Binärstring umwandeln
3390-3430
Anzahl Sektoren pro Spur berechnen
3460-3490
Ende (Teilprogramm)
Tabelle 1. Programmbeschreibung
3520-3760
File vorhanden (Directory durchsuchen)
3780-3790
Floppy initialisieren
3810-3850
Sektor in Pufferspeicher laden — Pufferzeiger setzen
3870-3910
2 Bytes aus Pufferspeicher holen
3930-3940
Floppykanäle schließen
3960-3990
Drucker initialisieren
3980
Drucker auf halbe Geschwindigkeit stellen (kann weggelassen werden)
4010-4030
Parameterisierte Schriftenübermittlung zum Drucker
4050-4200
Kopfzeilen für Menüpunkte 1—4 drucken
4220-4370
Verschiedene Druckparameter für Schriftart
4390-4630
Bytenummer, Bytes und ASCII-Zeichen für Teilprogramme 1—3 drucken
4490-4560
8 Zeichen aus Pufferspeicher holen und umwandeln
4650-4750
Basic-Token der Operatoren in Zeichen umwandeln und String aufaddieren
4770-4830
Filename eingeben
4840-4890
Hinweis, wenn File nicht vorhanden
4910-4950
Für Teilprogramm 1 prüfen, ob bereits 2 Sektoren pro Seite gedruckt sind
4970-5040
Eingabe Blocknummer für Teilprogramm 2 und 3, Laden dieses Blocks
5060-5090
Abfrage Seitenvorschub
5110-5160
Tastaturabfrage auf J/N
5180-5210
F1 - Funktionstastenabfrage
5230-5260
Aufforderung gewünschte Diskette einzulegen
5280-5300
F1 - Fertig - Abfrage
5320-5410
Diskettenname und ID lesen
Tabelle 2. Unterprogramme
Name
Bedeutung
NU$
String mit 8 Nullen und 8 Punkten
A
Teilprogrammnummer
FT$(I)
Filetypen
BN
aktuelle Blocknummer
AN
Anfangswert für Laufvariable in UP »Bytes ausdrucken
EN
Endwert für Laufvariable in UP »Bytes ausdrucken«
BP
Block Pointer (Zeiger im Pufferspeicher)
SP
Spur
SE
Sektor
S1/S2
ASC-Codes aus UP »2 Bytes holen«
MSE
Maximale Anzahl Sektoren pro Spur
EB
Erstes zu druckendes Byte in Teilprogramm »Bytereihen«
LB
Letztes zu druckendes Byte in Teilprogramm »Bytereihen«
RE
Anzahl Blöcke pro Zeile bei Teilprogramm 4
AR
Anzahl der Reihen in Teilprogramm 4
FL
Filelänge in Blocks
DN$
enthält den Diskettennamen
ID$
ID der Diskette
FB
freie BLöcke
ET$
ein kompletter Directoryeintrag
EN$
Eintragsnummer
FT$
Filetyp (String)
FT
Filetyp (Zahi)Tabelle 3.
F$
FilenameDie wichtigsten
LA$
Filelänge in BlocksVariablen
BY$
Filelänge in Bytes
RL$
Recordlänge
GF
Gesamtzahl freier Blöcke der Diskette
L$
Bitmuster der belegten Sektoren einer Spur (0 = Sektor belegt, 1 = frei)
P$
aus Directory gelesener Filename in UP »File vorhanden«