###   Projekte und Informationen rund um den KC85   ### 

SUB-Dateien - Platzsparend verwaltet

von Frank Dachselt

SUB-Dateien sind ja bekanntlich in der Lage, unter CP/M mit wenigen ,,Handgriffen`` recht komplizierte wiederkehrende Abläufe auf Kommandozeilenebene zu steuern. Da sie naturgemäß nur aus wenigen Zeilen bestehen, kommt es insbesondere bei Laufwerken mit hoher Kapazität, wie z.B. der Festplatte, zu einer recht platzverschwendenden Abspeicherung. Fünf SUB-Dateien belegen auf der Festplatte mit 4K-Blöcken also bereits 20 K, während der effektiv genutzte Speicherraum bei zwei belegten Sektoren je Datei nur etwas mehr als 0,5 K beträgt.

Das ist eigentlich die klassische Situation, in der für gewöhnlich Pack- und Archivierungsprogramme zur Anwendung kommen, um einer solchen Verschwendung von Disketten- bzw. Festplattenkapazität zu entgehen. Ich möchte heute einen etwas anderen Weg vorstellen, der neben der Schonung der Laufwerkskapazität auch noch eine einfache Form der Projektverwaltung bietet. Voranstellen möchte ich noch, daß das Verfahren sehr an eine spezielle Arbeitsweise unter CP/M am KC gebunden ist, sich dafür aber an viele ähnliche Situationen anpassen läßt. Und nicht zuletzt soll die nachfolgende Beschreibung auch zum Experimentieren mit vielleicht noch weniger bekannten Programmen anregen.

Die Ausgangssituation, die hier am Beispiel einer Programmentwicklung mit dem Assembler dargestellt wird, ist die folgende: Alle Quelltexte - also die des sich gerade in der Bearbeitung befindlichen Programms als auch die von anderen Programmierprojekten - befinden sich entweder auf einer Diskette oder auf der Festplatte. Zur Bearbeitung der Quelltexte wie auch zum Assemblieren und Linken bevorzuge ich aber das RAM-Floppy. Das hat mehrere Vorteile: Neben der höheren Zugriffsgeschwindigkeit werden so auch alle temporären Dateien nur ins RAM-Floppy geschrieben und gelangen nicht auf die Diskette oder die Festplatte.

Damit gibt es schon einmal mindestens drei Arbeitsabläufe, für die sich das Anlegen einer SUB-Datei lohnt:

  • Initialisieren: Alle zur Bearbeitung vorgesehenen Dateien werden nach LW A: kopiert.

     

  • Übersetzen (Assemblieren/Linken): Bei Programmierprojekten wird hier aus den bearbeiteten Quelltexten das ausführbare Programm erzeugt. An dieser Stelle bestehen je nach Anwendung oder Projekt die meisten Variationsmöglichkeiten. Im allgemeinen findet an dieser Stelle die Verarbeitung von aktuellen bzw. veränderten Quelldateien - in welcher Form auch immer - statt.

     

  • Update: In angemessenen Abständen und am Ende der Bearbeitung werden die veränderten Quelltexte auf Diskette bzw. Festplatte kopiert.

Denkbar wären weitere SUB-Dateien, die z.B. das übersetzte Programm testen oder es im Anwenderbereich installieren. Um nun nicht drei einzelne SUB-Dateien auf der Diskette bzw. der Festplatte speichern zu müssen, habe ich alle drei zu einer zusammengefaßt. Wie das aussieht, kann dem angegeben Listing entnommen werden. Die Zeilennummern sind nachträglich eingefügt worden und in der eigentlichen Datei nicht enthalten.

  1:     c0:copy a0:sub.ini=ini-hpkc.sub
  2:     g       a0:=hpkc*.mac,hpkc*.inc,irmbuf*.mac
  3:     a0:
  4:     c0:grep -f ;\#0 sub.ini >reini.sub[-b]
  5:     c0:change ';\#0: *' '' reini.sub[-b]
  6:     c0:submit reini
  7:     c0:rm $$$$$$.sub
  8:     ;
  9:     ;      reini.sub
 10:     ;
 11:     ;#0    c0:grep -f ';\#1' sub.ini >asm.sub[-b]
 12:     ;#0    c0:change  ';\#1: *' '' asm.sub[-b]
 13:     ;#0    c0:change  \044\044 \044 asm.sub[-b]
 14:     ;
 15:     ;#0    c0:grep -f ';\#2' sub.ini >update.sub[-b]
 16:     ;#0    c0:change  ';\#2: *' '' update.sub[-b]
 17:     ;#0    c0:change  \044\044 \044 update.sub[-b]
 18:     ;
 19:     ;      asm.sub
 20:     ;
 21:     ;#1    1
 22:     ;#1    c0:capture asm.log
 23:     ;#1    t
 24:     ;#1    ;
 25:     ;#1    ; Erstellen der Datei HPKC11.COM
 26:     ;#1    ;
 27:     ;#1    c1:m80 A:HPKC0,A:HKCP0=HPKC0V11

 ...

 37:     ;#1    c1:link131 a:hpkc11=a:hpkc0,a:hpkc1p,a:irmbufp
 38:     ;#1    c0:capture /q
 39:     ;
 40:     ;      update.sub
 41:     ;
 42:     ;#2    ; Update der HPKC-Quellen auf LW D0: oder Diskette
 43:     ;#2    ;
 44:     ;#2    ; Aufruf: submit update <laufwerk (d0, b, e)>
 45:     ;#2    ;
 46:     ;#2    c0:copy $$1:ini-hpkc.sub=a0:sub.ini
 47:     ;#2    g       $$1:=a0:hpkc*.mac,a0:hpkc*.inc,irmbuf*.mac /r

Diese Datei ist eigentlich nichts weiter als eine SUB-Datei, die sich in zwei Teile gliedert. In den Zeilen 1 bis 7 stehen Kommandos, die beim Aufruf abgearbeitet werden. Alle weiteren Zeilen sind durch das vorangestellte Semikolon Kommentarzeilen und haben auf den unmittelbaren Ablauf nach dem SUBMIT-Start keinen Einfluß. Sie stellen vielmehr eine Art von Datensätzen dar, die die Kommandofolgen für weitere SUB-Dateien enthalten. Dazu sind alle betreffenden Zeilen unmittelbar nach dem Semikolon mit einer Flagfolge (,,#0``, ,,#1`` bzw. ,,#2``) versehen, an die sich noch eine beliebige Anzahl von Leerzeichen und Tabulatoren anschließen kann.

Diese SUB-Datei, die für das gezeigte Beispiel den Namen INI-HPKC.SUB trägt, steht nun zusammen mit den Programmquelltexten auf dem Laufwerk zur dauerhaften Speicherung. Bei ihrem Aufruf mittels SUBMIT muß dieses Laufwerk das aktuelle Laufwerk sein. Danach laufen folgende Aktionen ab: Zunächst (Zeile 1) wird die SUB-Datei selbst nach Laufwerk A: kopiert und dabei in SUB.INI umbenannt. In Zeile 2 folgt nun die vom jeweiligen Projekt abhängige Initialisierung, im gezeigten Beispiel also das Kopieren der benötigten Quelltexte ins RAM-Floppy (G ist der erneute Start von COPY, das sich ja bereits im TPA befindet, mit neuen Parametern). Nach dem Wechsel des aktuellen Laufwerks wird in den Zeilen 4 und 5 die erste SUB-Datei aus der im RAM-Floppy stehenden Datei SUB.INI herausgelöst.

Das GREP-Kommando (General Regular Expression Print) sucht zunächst alle Zeilen, in denen die Zeichenfolge ,,;#0`` vorkommt und schreibt diese in die Datei REINI.SUB (Ausgabeumleitung mit ,,>``). Das Flag -f unterdrückt dabei die sonst übliche zusätzliche Ausgabe des Dateinamens und die Dateioption [-b] das Anlegen einer BAK-Datei. Der Backslash, der jedem normalen Zeichen in der zu suchenden Zeichenkette ohne Wirkung vorangestellt werden kann, ist ein Trick, der verhindert, daß das GREP-Kommando auch die Zeilen 4 und 5 in SUB.INI findet. Wer sich mit der Syntax von GREP bereits auskennt, wird an dieser Stelle vielleicht vorschlagen, die zu suchende Zeichenkette mit ,,^`` beginnen zu lassen, damit sie nur am Zeilenanfang gefunden wird. Leider ist ,,^`` in SUB-Dateien zur Angabe von Steuerzeichen reserviert, so daß es nicht als normales Zeichen auftreten kann.

Das Ergebnis von GREP ist also die Datei REINI.SUB, in der die Zeilen 11, 12, 13, 15, 16 und 17 der Datei SUB.INI stehen. Das nachfolgende CHANGE-Kommando in Zeile 5 bearbeitet die so entstandene Datei, indem es alle Zeichenketten ,,;#0`` sowie eventuell nachfolgende Leerzeichen und Tabulatoren entfernt (Ersatz durch den Leerstring '').

Die nun vorliegende Datei REINI.SUB ist eine abarbeitbare SUB-Datei und wird in der nächsten Zeile auch gleich aufgerufen. Das ist übrigens ein großer Vorteil der von Mario Leubner überarbeiteten SUBMIT-Version: Aufrufe von SUB-Dateien können jetzt auch verschachtelt werden! Damit werden jetzt also als nächstes die Kommandos der Zeilen 11 bis 17 ausgeführt, die ihrerseits in der eben beschriebenen Weise zwei weitere SUB- Dateien (ASM.SUB und UPDATE.SUB) aus SUB.INI erzeugen, indem sie die Flagfolgen ,,#1`` und ,,#2`` verarbeiten. Die jeweils zweiten CHANGE-Kommandos (Zeilen 13 und 17) ersetzen doppelt auftretende Dollarzeichen durch einfache. Sollen in den zu erzeugenden SUB-Dateien Parameter übergegben werden, so müssen die Platzhalter zunächst mit einem doppelten Dollarzeichen angegeben werden, damit SUBMIT nicht schon beim Aufruf von INI-HPKC.SUB versucht, diese zu ersetzen. Die Zeilen 46 und 47 enthalten eine solche Parameterübergabe, um beim Sichern der Quelltexte das Ziellaufwerk (hier ohne Doppelpunkt) angeben zu können. Die Angabe ,,\044`` ist der oktale ASCII-Wert für das Dollarzeichen und verhindert so alle erdenklichen Verwicklungen in den Zeilen 13 und 17.

Nachdem die in Zeile 6 eingeschobenen Kommandos abgearbeitet worden sind, geht es mit Zeile 7 weiter. Das RM-Kommando (remove) löscht die Datei $$$.SUB und bricht auf diese Weise die ganze SUBMIT-Abarbeitung ab. Damit wird die sonst auftretende zeitraubende Ausgabe der restlichen Kommentarzeilen auf der Konsole unterdrückt. An dieser Stelle würde natürlich auch das residente Kommando E oder SUBMIT \A die gleiche Wirkung zeigen, aber RM verzichtet hier auf eine Rückfrage beim Löschen, so daß die Stapelverarbeitung nicht stehenbleibt.

Damit wären die SUB-Dateien für die beiden oben genannten Punkte Übersetzung und Update im RAM-Floppy erzeugt. Doch wozu nun die Datei REINI.SUB? Mit ihr ist es auf bequeme Art und Weise möglich, die soeben erzeugten SUB- Dateien zu verändern. Das ist zum Beispiel notwendig, wenn bei der Übersetzung ein zusätzliches Kommando abgearbeitet oder auch nur eine Option verändert werden soll, aber auch, wenn eine neue Datei entsteht, die in das Programmierprojekt aufgenommen werden soll. Meist sind dann mehrere SUB-Dateien zu verändern, aber alle diese Änderungen können jetzt in einer einzigen Datei vorgenommen werden, nämlich in SUB.INI, die sich zu diesem Zweck im RAM-Floppy befindet. Hat man alle Änderungen - sowohl für die Initialisierung in den Zeilen 1 bis 7 als auch für die noch zu erzeugenden SUB-Dateien ab Zeile 21 - vorgenommen, wird mit SUBMIT REINI die Aktualisierung der SUB-Dateien im RAM-Floppy gestartet. Und beim nächsten Update mittels SUBMIT UPDATE wird die geänderte Datei SUB.INI - im Beispiel als INI-HPKC.SUB - mit auf das gewünschte Laufwerk zur dauerhaften Speicherung kopiert und steht somit beim nächsten Mal in geänderter Form zur Verfügung.

Zugegeben, das vorgestellte Verfahren sieht auf den ersten Blick etwas kompliziert aus und ist sicherlich auch gewöhnungsbedürftig. Aber vielleicht hat doch der eine oder andere Lust, es nachzuvollziehen und sei es nur, um ein paar neue Möglichkeiten bei der Anwendung von verschiedenen Programmen kennenzulernen. Im Archiv SUB.PMA ist dazu die Datei INI-ASM.SUB enthalten. Sie ist ein voll funktionsfähiges Skelett ohne projektspezifische Kommandos. Lediglich ein paar Anpassungen bei den Laufwerken und Userbereichen der verwendeten COM-Dateien sind eventuell noch notwendig. Das vorgestellte Verfahren funktioniert in gleicher Weise auch unter MicroDOS, wobei hier die Vorteile bei der Abspeicherung zumindest teilweise kompensiert werden, da die zusätzlich benötigten COM-Dateien auf Diskette vorgehalten oder vorher ins RAM-Floppy übertragen werden müssen. Das COPY-Commando ist dann durch ein geeignetes MicroDOS-Kommando (z.B. mit PIP.COM) zu ersetzen.

Inhalt des Archives SUB.PMA

INI-ASM.SUB
Skelett einer SUB-Datei zur Initialisierung eines Projekts im RAM-Floppy.

 

SUBMIT.COM
Von Mario Leubner überarbeitete SUBMIT-Version für den KC 85, die bereits in den KC-News 4/97 veröffentlicht wurde (im Archiv ML22.PMA). Damit ist unter anderem die Verschachtelung von SUBMIT-Aufrufen möglich. Beim Aufruf ohne Parameter erscheint eine kurze Hilfeseite.

 

RM.COM
Programm zum Löschen von Dateien. Bei der Angabe der Dateinamen sind Jokerzeichen erlaubt. Beim Aufruf ohne Parameter erscheint eine kurze Hilfeseite.

 

Da auf der Beilagendiskette noch genügend Platz war, habe ich auch das Archiv TTOOLS.PMA aus den KC-News 1/96 kopiert, in dem unter anderen die Programme GREP und CHANGE sowie eine Beschreibung enthalten sind.