ZPATCH 1.7b - Update
von Mario Leubner
Wer das Z-System kennt und die sehr guten dazugehörigen Tools, der kennt bestimmt auch das Programm ZPATCH oder einfach ZP. Damit lassen sich Dateien komfortabel patchen, also im Bytemodus Änderungen vornehmen. Ein Beispiel dazu wäre das Anpassen von Steuerzeichen an den eigenen Rechner oder das Ändern von Texten in Programmdateien, um zum Beispiel englische Meldungen durch deutsche zu ersetzen. Natürlich muß man dabei genau wissen, was man ändern kann - eine gewisse Erfahrung gehört also schon dazu.
ZP hat aber noch zwei weitere Betriebsarten: den Speichermodus und den Laufwerksmodus. Im Speichermodus kann man direkt auf den Speicher des Rechners zugreifen - beim KC natürlich nur auf den TPA im D004. Interessant ist dies für den Koppel-RAM mit seinen speziellen Arbeitszellen oder bei entsprechender Kenntnis auch andere Teile des Betriebssystems und des Arbeitsspeichers. Auch hier gilt, daß nur bei entsprechender Kenntnis Änderungen vorgenommen werden sollten. Sonst kann man das System ganz leicht zum Absturz bringen, denn ZP überwacht nicht was der Anwender eingibt!
Der dritte Anwendungsfall ist der Zugriff auf jeden beliebigen Sektor eines Datenträgers. Darauf will ich etwas näher eingehen und die möglichen Kommandos erläutern. Zunächst sollten wir uns jedoch verdeutlichen, wie ein Datenträger aufgebaut ist. Als Beispiel nehmen wir unsere 780K-Diskette. Wie sind diese 780K aufgeteilt? Und wie verwaltet unser Betriebssystem diese?

Bild 1: Aufbau einer 5,25''-Diskette
Bild 1 zeigt den Aufbau einer 5,25``-Diskette. Unter der quadratischen Schutzhülle befindet sich die eigentliche Diskette, eine runde Scheibe mit magnetisch empfindlicher Schicht. Nur an wenigen Stellen besitzt die Schutzhülle Öffnungen. Da wäre als erstes das große mittlere Loch genannt, was zum Antrieb der Diskette gebraucht wird. Liegt die Diskette im Laufwerk, dann kann über das Langloch der Schreib-Lese-Kopf die Daten abtasten. Der Kopf bewegt sich dabei von innen nach außen, also von einer Spur zur anderen, während sich die Diskette dreht. Seitlich befindet sich eine Schreibschutzkerbe. Wird diese zugeklebt, dann kann die Diskette nur noch gelesen jedoch nicht überschrieben werden. Das kleine Loch in der Mitte ist das Indexloch, es kennzeichnet den Anfang einer Spur. Eine 780K-Diskette besitzt bekanntlich 80 Spuren, diese werden von 0 bis 79 gezählt wobei die äußerste Spur immer die Spur 0 ist. Jede Spur ist in Sektoren aufgeteilt, für unsere Diskette sind das 5 Sektoren zu je 1024 Byte. Das ist zunächst die physische Organisation der Diskette, es werden also immer 1024 Byte zusammenhängend gelesen oder geschrieben. Außerdem besitzt unser Laufwerk zwei Schreib-Lese-Köpfe, die gleichzeitig Vorder- und Rückseite der Diskette abtasten - das nennt man ein doppelseitiges Format. Das ganze läßt sich für andere Diskettenformate oder auch Festplatten wiederholen. Man muß nur die entsprechenden Werte für die Anzahl der Spuren, Sektoren und Schreib-Lese-Köpfe einsetzen und kann die Kapazität berechnen:
Für unsere Diskette ergibt sich also 5 * 1024 * 80 * 2 = 800K. Doch unser Format wird mit 780K angegeben und nicht mit 800K? Das liegt daran, daß 2 Spuren als Systemspuren reserviert sind. Diese beiden Spuren stehen damit nicht für die Datenspeicherung zur Verfügung und man müßte eigentlich rechnen: 5 * 1024 * 78 * 2 und erhält richtig die 780K.
Mit dem physischen Diskettenformat kann unser CP/M-Betriebssystem nicht viel anfangen, da es zu viele verschiedene Formate gibt. Aus diesem Grund einigten sich die Entwickler auf eine einheitliche Aufteilung in logische Sektoren. Die Festlegung besagt, daß ein logischer Sektor immer 128 Byte groß ist. Die Umrechnung zwischen logischen und physischen Sektoren erfolgt im BIOS, also dort wo die Zugriffe auf den Datenträger stattfinden. Das BIOS rechnet also aus der logischen Sektornummer die entsprechende physische Sektornummer und die Diskettenseite aus. Beim Lesen und Schreiben werden also immer 128 Byte als logische Einheit übertragen, ein Zugriff auf den Datenträger erfolgt aber erst, wenn die physische Sektorgrenze erreicht ist. Im Falle der 780K-Diskette also erst nach 8 logischen Sektoren wenn der Reihe nach gelesen bzw. geschrieben wird.
Kommen wir zurück zum Programm ZP. Ruft man ZP mit einer Laufwerksbezeichnung auf, also etwa mit dem Kommando ZP B:, dann erhält man das in Bild 2 gezeigte Anfangsbild.

Bild 2: Anfangsbild von ZP
In der oberen Statuszeile stehen hinter der Programmversion als erstes das Laufwerk, danach Spur, Sektor und Blocknummer. Als Anfangseinstellung wird die erste Spur nach den Systemspuren angewählt, in unserem Falle die Spur 2. In dieser Spur beginnt das Diskettenverzeichnis. Jeder Verzeichniseintrag ist 32 Byte groß, in einem 128 Byte großen Sektor haben also 4 Einträge Platz. Im Bild kann man 4 Dateinamen erkennen, diese gehören zu den ersten 4 Dateien welche sich auf der Diskette befinden. Das erste Byte kennzeichnet den USER-Bereich und ist bei den ersten drei Einträgen 0. Der vierte Eintrag beginnt mit E5. Das ist die Löschmarkierung, die Datei wurde also nicht wirklich gelöscht sondern nur dieses eine Byte verändert. Nach der USER-Nummer folgen 8 Zeichen für den Dateinamen und 3 für den Dateityp, hierbei kann auch das Bit 7 eines Zeichens gesetzt sein um ein Dateiattribut zu kennzeichnen. Anschließend folgen 4 Bytes zur Dateigröße, den genauen Zusammenhang will ich an dieser Stelle nicht näher erläutern.
Zur Verwaltung von Dateien nutzt das BDOS von CP/M eine weitere Struktureinheit, den Block. Ein Block kann verschieden groß sein, die Größe ist unter anderem abhängig von der Kapazität des Datenträgers und der Anzahl der möglichen Verzeichniseinträge. Festgelegt wird die Blockgröße im Diskettenparameterblock (DPB) im BIOS. Dort ist zum Beispiel für unsere 780K-Diskette eine Blockgröße von 2 KByte festgelegt. Eine Datei besteht aus einer bestimmten Anzahl von Blöcken. Eine Datei mit nur einem einzigen Zeichen benötigt demnach einen Block und belegt 2K auf der Diskette. Bis zu 2048 Zeichen haben in diesem Block Platz, dann wird ein weiterer Block gebraucht. Um die Blöcke den Dateien zuordnen zu können, schreibt CP/M die Blocknummern ins Verzeichnis. Ab dem 16. Byte, also in der zweiten Zeile jedes Eintrages bei der Darstellungsweise von ZP stehen die Blocknummern in hexadezimaler Schreibweise. Für den ersten Eintrag mit dem Dateinamen !!!TIME&.DAT ist das die Blocknummer 0002h. Der nächste Eintrag belegt die Blocknummern 0003h, 0004h, 0005h und 0006h usw. Reicht ein Verzeichniseintrag nicht aus um alle Blocknummern aufzunehmen, wird ein weiterer angelegt.
Unter der Sektoranzeige von ZP werden die zur Verfügung stehenden Kommandos in drei Menüspalten angezeigt. Ganz links stehen die Tasten, mit denen man Spur- und Sektorweise blättern kann. Es sind die im Z-System üblichen Ersatz-Cursortasten. Mit den Tasten im mittleren Menü kann man einen bestimmten Sektor direkt anwählen:
D = Drive | wählt ein neues Laufwerk, |
T = Track | wählt eine andere Spur, |
R = Record | steht für die Sektornummer und |
B = Block | wechselt zu einem anderen Block. |
Will man also wissen, was in einer Datei steht, die man im Verzeichnis gefunden hat, so liest man einfach die Blocknummer ab und gibt diese mit dem Kommando B ein. Die umständliche Umrechnung von Blocknummer in Spur und Sektor übernimmt dabei ZP. Die Blocknummern beginnen direkt nach den Systemspuren und werden mit 0 beginnend fortlaufend gezählt. Das Verzeichnis beginnt also immer mit der Blocknummer 0. Unsere 780K-Diskette ermöglicht 128 Verzeichniseinträge, das sind 4096 Byte oder 2 Blöcke zu je 2 KByte. Damit umfaßt das Verzeichnis die Blöcke 0 und 1. Ab dem Block 2 können Daten gespeichert werden. Die Datei !!!TIME&.DAT enthält die Datumseinträge als Ergänzung zum Verzeichnis. Diese Datei muß immer direkt nach dem Verzeichnis stehen, ist stets der erste Verzeichniseintrag und belegt die ersten Blöcke nach dem Verzeichnis. Wenn diese Datei korrekt erzeugt wurde, ist der erste Verzeichniseintrag einer 780K-Diskette mit dem in unserem Beispiel identisch.
In der rechten Menüleiste stehen die Kommandos zum Editieren, Suchen und zum Wechsel des Modus. Interessant ist in dem Zusammenhang eine Suche über den ganzen Datenträger! Man kann z.B. eine Zeichenkette suchen lassen und notiert sich die Blocknummern in denen sie gefunden wird. Dann geht man wieder zum Block 0, also den Beginn des Verzeichnisses, und sucht nach der Blocknummer, um die dazugehörige Datei zu ermitteln.
ZP ist in der Version 1.7a auf der V-Disk Nr. V047 vorhanden. Zur Nutzung mit großen Datenträgern, also Festplatten, habe ich eine Erweiterung der Arithmetik vorgenommen. Je nach Blockgröße funktionierte die Berechnung der Blocknummern nur bis zu einer bestimmten Grenze, da die Multiplikation auf 16 Bit beschränkt war - für Disketten völlig ausreichend. Durch meine Erweiterung auf 32 Bit tritt auch bei großen Festplatten kein Überlauf mehr auf und die Zuordnung der Blöcke erfolgt korrekt. Die aktualisierte Version 1.7b stelle ich dem KC-Club zur Verfügung, eine Nutzung ist allerdings nur möglich, wenn das Z-System läuft.