80-Bus Journal

  

Januar 1983 · Ausgabe 1

SORT

von Christian Peter

Im Journal 3-82 wurde ein Da­ten­ver­wal­tungs-Programm vorgestellt. Das Programm „SORT“ kann zur Erweiterung dienen. Dies ist zunächst die Version, die ich schon fertig habe und die auch schon einige Zeit problemlos läuft. Ich möchte (wenn ich die Zeit finde) noch folgende Zusätze programmieren:

  • Sortierfolge laut Tabelle (damit auch Umlaute richtig einsortiert werden)
  • Sortierung mehrer Felder (wenn Gleichheit im ersten Feld: Sort nach zweitem Feld; z.B.: Beier Franz vor Beier Otto, …)

Es ist meiner Meinung nach auf jeden Fall notwendig das Source-Listing abzudrucken, damit jeder die nötigen Änderungen für seine Bedürfnisse machen kann.

Programmbeschreibung

Das Programm „SORT“ ist ein positionsunabhängiger Bubble-Sort (d.h. es ist relocierbar oder wie man das auch immer ausdrücken will). Es benötigt ca. 512 Byte Hauptspeicher und einen daran anschließenden Platz für Variablen in der Größe von 24 Byte.

Folgene Konventionen wurden für die Programmbeschreibung eingehalten:

Die Datei wird als „File“ bezeichnet,
ein einzelner Eintrag heißt „Record“,
die einzelnen Felder heißen „Fields“.

Das Programm kann Files beliebiger Größe sortieren, solange sie in den Hauptspeicher passen und jeder Record maximal 256 Byte lang ist.

Bevor das Programm aufgerufen wird, müssen zuerst die Feldbestimmungen definiert werden. Das Programm ist so ausgelegt, daß es möglichst große Freiheiten erlaubt, wo ein Field im Record steht.

Folgende Variablen müssen eingegeben werden:

* STARTStartadresse des Files im Hauptspeicher
* ENDEndadresse + 1 (!)
* RECSEPASCII-Zeichen zur Trennung der einzelnen Records
* FLDSEPASCII-Zeichen zur Trennung der einzelnen Fields
* POSMRKASCII-Zeichen, das die Startposition des zu sortierenden Feldes markiert (z.B. Blank)
* DISPLCentweder +1, 0 oder −1 gibt an, in welcher Richtung vom gefundenen FLDSEP das Feld liegt
* FLDCNTgibt an, vom wievielten FLDSEP aus in Richtung DISPLC nach POSMRK gesucht wird

Das Programm findet das Feld, nach dem der File sortiert werden soll, indem es zuerst den nächsten RECSEP sucht, von dort aus der Anzahl von FLDCNT entsprechend nach FLDSEP’s sucht. Wenn DISPLC=0, dann ist das Feld gefunden. Wenn DISPLC=-1, dann sucht das Programm rückwärts bis zum nächsten Zeichen POSMRK, das erste Zeichen nach POSMRK ist dann das erste Zeichen des Feldes. Wenn DISPLC=+1 , dann sucht das Programm POSMRK in aufsteigender Richtung.

Wenn zwei Records ausgetauscht werden (sortieren), wird der erste Record anschließend an das Ende des Files zwischengespeichert, während der zweite Record an die Stelle des ersten kopiert wird. Es ist daher nötig, daß hinter dem File noch Platz (ca. 256 Bytes) gelassen wird.

Während des Sortiervorganges läuft ein Zähler mit, damit man weiß, daß das Programm auch wirklich läuft. Am Ende des Sortiervorganges erscheint die Meldung „END OF SORT“.

Beispiel für die Definition der Felder

Es soll eine Adressdatei sortiert werden, die folgenden Aufbau aufweist:

+/NAME/STRASSE/ORT/+/NAME/STRASSE/ORT/+ …

„+“ist in dem Fall der Recordseparator RECSEP und wird mit 2B definiert
„/“steht für Carriage-return und ist der Fieldseparator; FLDSEP ist daher 0D und wird mit 0D definiert

Die Datei soll nun alphabetisch sortiert werden. Das Feld NAME kann folgenden Inhalt haben: event. TITEL, VOR­NA­ME, NACH­NA­ME. Um den Nachnamen zu finden, können wir nicht von vorne anfangen zu suchen, weil wir nicht wissen, ob ein Titel vorhanden ist oder nicht. Aber es ist bekannt, daß der Nachname direkt vor dem zweiten FLDSEP steht. Daher definieren wir FLDCNT mit 2 und DISPLC mit −1 und POSMRK mit 20H (wenn VOR­NA­ME und NACH­NA­ME durch ein Blank getrennt sind).

Bemerkungen

Es ist für diesen Sort unerheblich, ob alle Records gleiche Länge haben. Wichtig ist nur, daß alle Records, soweit sie die Feldbestimmungen betreffen, gleich aufgebaut sind.

Es werden keinerlei Fehlermeldungen ausgegeben, wenn die Feldbestimmung n nicht zutreffen sollten. Wichtig ist auch, daß die Variable START direkt auf ein RECSEP-Zeichen zeigt und die Variable END auf das nächste Zeichen nach dem letzten RECSEP.

Eingabe der Variablen

Das Programm wurde (wie gesagt) positionsunabhängig geschrieben. Alle Variablen werden daher relativ zum Programmbeginn abgespeichert. Um nicht immer ausrechnen zu müssen, wo jetzt was zu stehen hat, werden die Variablen am Programmbeginn automatisch in den Datenbereich übertragen. An dieser Stelle, kann man daher seine Werte eingeben (Zeilen 330 bis 420 im Source-Listing).

Anmerkung zum Programmaufbau

Das Source-Listing mutet vielleicht ein bißchen seltsam an, wenn man es genauer betrachtet:

Es sind einige Sprünge im Programm, die wieder auf Sprünge führen. Diese Technik wurde deshalb angewandt, um alle Unterprogramm-Aufrufe relativ machen zu können. Nachdem die relative Distanz aber beschränkt ist, konnte das nur mit Hilfe von solchen Brücken realisiert werden.

Änderungen

Soll das Programm als Unterprogramm laufen, dann müssen vor dem Aufruf alle Register gerettet werden (einschließlich IX) und die Zeile 2390 „SCAL 5BH“ muß durch mehrere POPs und durch ein RET ersetzt werden.

Wenn der Zähler nicht mitlaufen soll, müssen die Zeilen 2210 bis 2280 weggelassen werden.

NASCOMPL: 
mh 
mh 
mh 
 
(Red.:In der nächsten 
Ausgabe darf er wieder 
mehr sagen!)

Seite 16 von 28