CODINGLISTINGS ★ Daten im direkten Zugriff ★

Daten im direkten Zugriff (Happy Computer)Coding Listings
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

Relative Dateiverwaltung ist mit dem DOS der Schneider-Diskettenstation nicht ohne weiteres möglich. Im ROM sind die notwendigen Routinen aber schon vorgesehen. Mit einer Befehlserweiterung kann man sie leicht benutzen. Adressen komfortabel zu speichern ist dann beispielsweise kein Problem mehr.

Dem komfortablen Basic des CPC fehlt eine wichtige Routine, die relative Dateiverwaltung. Leider sieht Amsdos diese Möglichkeit nicht vor, selbst nicht über die Sprungvektoren.

Es gibt aber dennoch einen brauchbaren Weg relative Dateien zu erzeugen. Beim Studium der ROM-Routine der Diskettenstation fällt auf, daß Amsdos-Dateien in sogenannten Records (das sind Aufzeichnungseinheiten zu je 128 Bytes) auf Diskette geschrieben sind. Dies geschieht unabhängig von der Größe der physikalischen Sektoren, die 512 Bytes umfassen.

Glücklicherweise gibt es Amsdos-Routinen, die — ähnlich wie unter CP/M — einen bestimmten Record einer Datei lesen und beschreiben können, ohne die davorliegenden erst lesen zu müssen. Dies ist Voraussetzung für den Direktzugriff.

Eine relative Datei wird zunächst einmal als sequentielle Datei angelegt, Dies geschieht am einfachsten, indem wir mit SPACE$ Leerstrings erzeugen, die exakt der gewünschten Datensatzlänge entsprechen. Um die relative Datei später wahlweise auch sequentiell lesen zu können, fügen wir an jeden Leerstring noch em Carriage Return (CR)-Zeichen (DHR$(13)) und ein Line Feed (LF)-Zeichen (CHR$(10)) an. Allerdings ist das für die relative Datei nicht unbedingt erforderlich. Immerhin werden dadurch für jeden Datensatz zwei Bytes mehr benötigt.

Wir schreiben nun die Anzahl von Leerstrings (einschließlich CR und LF) in die sequentielle Datei, die die relative Datei an Datensätzen erhalten soll, Dann können wir mit der Befehlserweiterung »|RECWRITE« jeden einzelnen Datensatz beschreiben und mit »|RECREAD« wieder lesen.

Übrigens muß die Datensatzlänge keinesfalls mit der Recordlänge von 128 Bytes übereinstimmen. Sie kann frei zwischen 1 und 255 Zeichen gewählt werden; selbst wenn ein Datensatz über zwei oder drei Records verteilt ist. Die Befehlserweiterung ist deshalb so aufgebaut, daß ein String mit gegebener Länge ab dem n-ten Zeichen der Datei geschrieben beziehungsweise gelesen wird. Das erste Zeichen in der Datei hat dabei den Wert Null. Das Maschinencode-Programm errechnet hieraus automatisch den zugehörigen Record und die Position in diesem, ab der gelesen oder geschrieben werden soll.

Bei jedem Schreib- und Lesevorgang werden drei hintereinanderliegende Records in einen Puffer gelesen beziehungsweise von dort aus wieder auf die Diskette geschrieben, Die Anzahl der Bytes ist in der Stringlänge gegeben.

Hier ein Beispiel, das diesen Vorgang verdeutlichen soll. Angenommen, wir haben eine Datensatzlänge von 200 Bytes, einschließlich CR und LF, und möchten den 38. Datensatz lesen und ihn in der Stnngvariablen a$ ablegen. Zunächst muß mit »a$ = SPACE$(198> ein Leerstring mit 198 Zeichen (200 abzüglich CR und LF) erzeugt werden. Als nächstes werden drei aufeinanderfolgende Records in den Puffer gelesen, beginnend mit dem, der das 7600,(=38* 200) Zeichen der Datei enthält. Nun ist aber 7600/128 = 59 Rest 48 weshalb wir die Records 59, 60 und 61 einiesen müssen. Da die Bytezählung der Records nicht bei 1, sondern bei Byte 0 beginnt, greifen wir auf Record 59, Byte 47 zu. Der 38. Datensatz ist somit in Record 59, Byte 47 bis 127 (80 Bytes) und Record 60, Byte 0 bis 117 (118 Bytes) (ohne CR, LF) gespeichert. Es erübrigt sich, in diesem Fall auf den dritten Record zu* zu greifen. Er wird aber immer mitgelesen und -geschrieben. Zum Schluß wird der Datensatz aus dem Recordpuffer in den vorher angelegten Leerstring zur weiteren Bearbeitung übertragen.

Beim Schreiben werden zuerst die drei betroffenen Records von Diskette gelesen. Dann wird der Inhalt des Datensatzes in den Puffer an der Stelle abgelegt, von wo sie wieder auf Diskette geschrieben werden. Die Größe der relativen Datei ist lediglich durch die Aufzeichnungskapazität der Diskette beschränkt, die beim Schneider 180 KByte (Datenformat) beträgt.

Beachten Sie aber, daß sowohl vor Schreib- als auch Lesezugriffen in relativen Dateien immer die OPENIN-Anweisung nötig ist. Niemals darf aber OPENOUT benutzt werden, da dies eine neue Datei an-legen würde.

Ebenfalls unter allen Umständen zu vermeiden ist ein Schreibzugriff auf eine höhere Datensatznummer, als für die die Datei ausgelegt ist. Deshalb sollten Sie eine Sicherheitsabfrage in Ihre Programme einbauen, die so etwas verhindert. Wenn darüber hinaus beim Anlegen der Datei immer zwei zusätzliche Records reserviert werden, sind Sie vor unangenehmen Überraschungen sicher, wenn Sie auf einen der letzten Sätze zugreifen.

Bevor nun die Arbeit mit den neuen Befehlen an einem Beispiel beginnt, müssen Sie den Basic-Lader (Listing 1) für das Maschinenprogramm ein geben. Die Routine lieg*, dann ab A000 hex. Möchten Sie die Erweiterung in Ihre eigenen Programme einbinden, gibt es drei verschiedene Wege. Entweder Sie benutzen den Basic-Lader und laden später Ihr eigenes Programm, Ein anderer Weg: Sie hängen den Lader mit Hilfe von »CHAINMERGE« an Ihre Programme an und rufen ihn dann als Unterprogramm auf. Dazu müssen Sie die Programmzeilen der Routine mit »RENUM« neu ordnen, so daß sie höhere Zeilennummern benutzt als Ihr BASIC-Programm. Achten Sie aber darauf, daß Sie in Zeile 240 NEW durch RETURN ersetzen.

Die letzte und bequemste Möglichkeit besteht darin, den Lader abzuarbeiten und als Binärdatei auf Diskette zu schreiben. Dies geschieht mit »SAVE "ERWBIN",B,&A000,&17F«. Sie können dann in Ihr Programm eine Ladeanweisung für das des Maschinencode-Programms einsetzen. Zuvor muß jedoch die Speicherobergrenze auf 9FFFhex herabgesetzt werden.

In Listing 2 finden Sie ein Beispiel, das eine relative Datei als sequentielle Datei anlegt. Zeile 20 reserviert einen Ein-/Ausgabepuffer, worauf Zeile 30 die sequentielle Datei »reldatei« öffnet. Anschließend werden in einer FOR...NEXT-Schleife
300 Datensätze mit folgendem Inhalt auf Diskette geschrieben:

1. Datensatz
2. Datensatz
.
.
.
300. Datensatz

Jeder Datensatz ist 14 Zeichen lang. Beim sequentiellen Schreiben wird automatisch ein CR und LF angefügt, so daß wir beim relativen Lesen und Schreiben von einer Datensatzlänge mit 16 Zeichen ausgehen müssen. Zeile 70 schreibt schließlich sicherheitshalber noch zwei Leerstrings mit je 128 Bytes auf Diskette.

Nun wollen wir die Datei per Direktzugriff lesen. Wir beginnen mit dem 300. Datensatz und hören mit dem 1. auf (Listing 3). Zeile 20 öffnet wieder die Datei »reldatei«, diesmal aber zum relativen Lesen. Zeile 40 definiert den String a$, in dem die Datensätze abgelegt werden sollen. Die absolute Position zdes Datensatzes in der Datei errechnet sich in

Zeile 50. Zeile 60 liest den Datensatz aufgrund der Angaben in z und a$.

Als letztes Beispiel noch ein Programm, das es Ihnen erlaubt, einen bestimmten Datensatz neu zu schreiben. Achten Sie darauf, die relative Datei auch hier mit OPENIN zum Schreiben zu öffnen (Listing 4).

Das Programm fragt, welcher Datensatz neu geschrieben werden soll. Es folgt eine Abfrage auf Gültigkeit der Datensatznummer. Dann wird der betreffende Satz zunächst gelesen, um den Inhalt zu kennen. Geben Sie ihn daraufhin neu ein. Zeile 100 formt ihn in die richtige Länge von 14 Zeichen um, wonach er in Zeile 110 auf Diskette abgelegt wird.

Als ausführliches Beispiel für eine relative Dateiverwaltung soll das komplette Adressenverwaltungsprogramm (Listing 5) dienen. Es ist modular aufgebaut und menügesteuert. In leicht abgeänderter Form kann es auch für jede andere Art von Dateiverwaltung eingesetzt werden.

Das Programm benutzt eine indexsequentielle Dateiverwaltung. Indexsequentiell bedeutet, daß die Nummer und ein spezieller Index von jedem Datensatz zusätzlich in einer sequentiellen Datei abgelegt werden. Diese werden dann zusammen mit der relativen Datei auf Diskette geschrieben. Dieser Index dient als Suchkriterium zum Auffinden eines Datensatzes.

Für unser Adressenverwaltungsprogramm wurde der Nachname als Index gewählt. Bevor nun Datensätze angelegt oder bearbeitet werden können, lädt man die Indexdatei in den Arbeitsspeicher des Computers, Sie bleibt dort so lange, wie wir mit der relativen Datei arbeiten und wird im Anschluß daran wieder auf Diskette zurück geschrieben.

Wenn wir nun einen Datensatz anlegen, »weiß« die Indexdatei bereits, welche Einträge belegt und welche noch frei sind, Sie sucht den nächstverfügbaren Eintrag heraus und legt dort den Datensatz ab. Gleichzeitig erhält auch die Indexdatei einen neuen Eintrag, der den Nachnamen als Index und die dazugehörige Datensatznummer enthält.

Suchen wir nun umgekehrt einen Datensatz (beispielsweise zum Namen Müller), so wird zunächst die Indexdatei durchsucht, um festzustellen, ob der Satz überhaupt in der Datei vorhanden ist. Ist dies der Fall, so steht auch gleichzeitig die Nummer des fortlaufenden Eintrags zur Verfügung, Dieser kann dann leicht aufgerufen werden.

Werfen wir einen Blick auf das Menü, das Sie nach dem Starten des Programms auf dem Bildschirm finden (Bild 1).

Es ist bereits bekannt, daß wir, um1 Eintragungen vornehmen zu können, eine relative Datei anlegen müssen. Genau dies geschieht durch den Menüpunkt 5. Zusätzlich wird hier noch die Indexdatei erzeugt und auf Diskette geschrieben. Wenn Sie sich nun das Disketten-ln-haltsverzeichnis ansehen, enthält es eine relative und eine sequentielle Datei. Beide sind neu angelegt und haben noch keine Einträge. Damit es keine Verwechslungen mit den Dateinamen gibt, erhält die relative Datei einen frei wählbaren Namen und die sequentielle Indexdatei den gleichen Namen mit der Extension »,IND«. Heißt eine Datei »KUNDEN«, so erhält die relative Datei den Namen »KUNDEN,«, die Indexdatei die Bezeichnung »KUNDEN.IND«.

Bevor Sie nun Datensätze anlegen oder bearbeiten können, müssen Sie auf jeden Fall Menüpunkt 4 anwählen, der die relative Datei öffnet, öffnen ist hier nicht nur unbedingt im Sinne der OPENIN- oder OPEN-OUT-Anweisung zu verstehen, sondern bedeutet vielmehr eine Initialisierung der Adressendatei. Dabei wird die Indexdatei in den Speicher geladen und gleichzeitig festgestellt, welche Einträge belegt und welche noch frei sind.

Nach dem Öffnen können Sie Me nüpunkt 1 anwählen, worauf Sie aufgefordert werden, verschiedene Daten einzugeben (Bild 2).

Direkt unter der Überschrift befindet sich eine Zahl, die angibt, der wievielte Datensatz gerade bearbeitet wird. In diesem Fall ist es der fünfzehnte. Bevor Sie nun die eigentlichen Daten eingeben, erscheint unter der fortlaufenden Nummer zunächst die Aufforderung, den Code für die Anrede einzugeben, während der Rest des Bildschirms noch leer bleibt. Bei der Anrede können Sie unter sechs Möglichkeiten auswählen: |

CodeAnrede
0keine
1Herrn
2Frau
3Fräulein
4Herrn und Frau
5Firma

Diese Codes sollten Sie sich vorher merken oder notieren, da sie einfacher einzugeben sind, als immer wieder die gesamte Anrede. Nach dem Drücken der Enter-Täste erscheint als nächstes die Aufforderung zur Eingabe des (Nach-)Na-mens. Sie geben ihn ein und drücken wiederum die Enter-Taste. Das gleiche wiederholt sich dann für die Straße und den Ort mit Postleitzahl. Ist ein Datensatz komplett, erscheint unten im Bildschirm der Hinweis, entweder die Enter- oder die Leertaste zu drücken. Letztere führt Sie wieder zurück ins Menü, die Enter-Taste gleich zum nächsten Datensatz. Der Vorgang wiederholt sich dann von vorne, allerdings mit einer um eins erhöhten Datensatznummer.

Achten Sie aber darauf, daß die einzelnen Eingabewerte eine bestimmte Anzahl von Zeichen nicht überschreiten dürfen:

Name15 Zeichen
Vorname15 Zeichen
Straße20 Zeichen
PLZ/Ort21 Zeichen

Kommen wir zum zweiten Menüpunkt, der zum Ändern und Löschen von Adressen dient, Sie werden zunächst aufgefordert, den betreffenden Namen als Suchindex einzugeben. Daraufhin schaut das Programm nach, ob dieser Name in der Datei vorhanden ist. Wenn nein, erscheint ein Hinweis »Nicht gefunden« und Sie können den nächsten Namen suchen oder ins Menü zurückkehren.

Wurde der Name dagegen gefunden, wird der komplette Datensatz auf dem Bildschirm ausgegeben (ähnlich wie unter Menüpunkt 1, wobei der Cursor eine Zelle unter dem Anredecode steht), Wünschen Sie keine Änderung vorzunehmen, drücken Sie einfach die Enter-Taste, Anderenfalls schreiben Sie den neuen Datenwert unmittelbar unter den alten und drücken ebenfalls die Enter-Taste, Nach Beendigung des Korrekturvorgangs können Sie wie in Punkt 1 entweder fortfahren (Enter-Taste) oder ins Menü zurückkehren.

Soll ein Datensatz gelöscht werden, wählen Sie ebenfalls Menüpunkt 2 und überschreiben den Anredecode mit dem Buchstaben 1, Dann drücken Sie die Enter-Taste, worauf der betreffende Datensatz aus der Indexdatei entfernt wird. In der relativen Datei bleibt er jedoch zunächst erhalten; er ist aber für einen neuen Eintrag freigegeben und kann mit einer neuen Adresse überschrieben werden.

Menüpunkt 3 sortiert die Datensätze in alphabetischer Reihenfolge nach dem Shell-Sortierverfahren. Sortiert wird lediglich die Indexdatei. In der relativen Datei ändert sich nichts.

Die letzten beiden Menüpunkte dienen zum Ausdrucken der Datei. Punkt 6 liefert einen normalen Listenausdruck, während Sie mit Punkt 7 Etiketten beschriften können. Dabei wird davon ausgegangen, daß die Etiketten genau 9 Druckzeilen auseinanderliegen. Jedoch kann das Programm auch für andere Etikettengrößen leicht angepaßt werden.

Bei Abschluß der Bearbeitung ist unbedingt die E-Taste zu drücken, damit die Indexdatei wieder auf Diskette geschrieben wird, Wird dies unterlassen, können beim Wiedereinlesen schlimme Folgen auftreten; besonders dann, wenn Datensätze gelöscht oder geändert wurden.

Hier noch ein paar Anmerkungen zum Listing. Zunächst wird das Maschinencode-Programm »ERWBIN« geladen und initialisiert (siehe oben), falls es sich noch nicht im Speicher befindet. Anschließend wird die maximale Anzahl der Datensätze auf 200 festgelegt (sie kann jedoch gegebenenfalls geändert werden), Es folgt die Definition der einzelnen Stringlängen.

Das Anlegen der relativen Datei erfolgt wiederum sequentiell. Gleichzeitig wird auch die Indexdatei erzeugt und auf Diskette geschrieben, Abgelegt im Feld n$(i), in das sie auch später zur Bearbeitung der Datei eingelesen wird, verbleibt sie während der gesamten Bearbeitungsdauer im Speicher. Da die Indexdatei noch leer ist, wird als erster Wert die Zahl Null hineingeschrieben, gefolgt von 200 Elementen, die aus 15 Sternchen und der fortlaufenden Datensatznummer bestehen.

0


1


2


3

und so weiter.

Die Sternchen kennzeichnen einen leeren oder als gelöscht gekennzeichneten Eintrag, Wird der Eintrag später belegt, erscheint oben statt der Null die Anzahl der belegten Einträge und statt der Sternchen der betreffende Name als Suchindex.

Beim »Öffnen« der relativen Datei wird lediglich die Indexdatei eingelesen, Vorausgesetzt wird, daß, wenn sich eine Indexdatei auf der Diskette befindet, auch die zugehörige relative Datei vorhanden sein muß. Wird die Indexdatei nicht gefunden, erscheint die Amsdos-Fehlermeldung »(Filename) not found«.

Jürgen Hückstädt, HC

★ PUBLISHER: Happy Computer
★ YEAR: 1986
★ CONFIG: AMSDOS + 64K
★ LANGUAGE:
★ AUTHOR: Jürgen Hückstädt
 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» RSX-Daten  im  direkten  Zugriff    (Happy  Computer-Sonderheft)    GERMANDATE: 2021-03-20
DL: 139
TYPE: ZIP
SiZE: 8Ko
NOTE: 40 Cyls
.HFE: Χ

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Fdc - 23 - Ecraser les Secteurs (SOS Programmeurs)
» Coding » Fdc - 12 - la Routine d'Ecriture de Secteurs (SOS Programmeurs)
» Coding » Clefs2 10 - Cpm22 Format Secteur
» Coding » Clefs2 47 - Rsx de Lecture et d'Ecriture Secteur
» Coding » Fdc - 11 - la Routine de Lecture Tous Secteurs (SOS Programmeurs)
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 251 millisecondes et consultée 629 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.