PROJEKT

64'er

DAS MAGAZIN FÜR COMPUTER-FANS ONLINE


Erste Hilfe

64'er Ausgabe 4/April 1984, S. 88-91

Wem wäre das noch nicht passiert: NEW. Nur drei Buchstaben, aber die Arbeit von Stunden oder gar Tagen ist verloren, wenn das Programm noch nicht gespeichert war. Da hilft dann nur noch eines: das VC 20-Programm "Erste Hilfe". Laden, starten - und schon ist das gelöschte Programm wieder da. Wie neu!

Das grenzt nicht etwa an Zauberei, sondern ist möglich, weil ein Basic-Programm im Speicher des VC 20 mit dem Befehl NEW gar nicht gelöscht wird. Obwohl es nicht den Anschein hat, es ist weiterhin vorhanden. NEW setzt lediglich alle Zeiger zurück und schreibt in die beiden ersten Adressen je eine Null. Will man dem Speicher das nun im Verborgenen liegende Programm wieder entlocken, müssen diese Parameter rekonstruiert werden.

Da wären zunächst die beiden Nullen am Beginn. Sie besagen nichts anderes, als daß sich hier das Programmende befindet. Bei noch vorhandenem Programm enthalten diese Zellen die Koppeladresse zur zweiten Zeile, das heißt, die Speicheradresse, an der diese beginnt. Um sie zu finden, muß in der ersten Programmzeile nach der Null gesucht werden, die das Zeilenende markiert. Plus 1 und die Koppeladresse, zerlegt in Low- und Highbyte, kann wieder am angestammten Platz abgelegt werden. Der zweite Schritt besteht darin, das Programmende wiederzufinden. Mit Hilfe jener Koppeladressen am Beginn jeder Zeile ist auch das relativ einfach. Die erste verrät, wo die zweite steht, diese zeigt auf die dritte und so weiter. Das Programmende ist erreicht, wenn das Highbyte der Koppeladresse eine Null ist. Eine Speicherstelle weiter beginnt dann der Sektor, in dem die Variablen abgelegt werden. Diese Adresse wird dem Computer in den Speicherstellen 45 und 46 mitgeteilt. Der Befehl CLR paßt dann alle übrigen Parameter diesem Wert an. Damit ist das gelöschte Programm wieder da und kann gelistet, bearbeitet, gestartet oder abgespeichert werden.

Da eine solche Rekonstruktion von Hand ein recht mühsames Unterfangen ist, nimmt "Erste Hilfe" dem Anwender diese Arbeit ab. Nicht allein aus Gründen der Geschwindigkeit handelt es sich dabei um ein Maschinenprogramm. Vor allem muß es so in den Speicher gebracht werden, daß es das zu rettende Programm nicht überschreibt und dadurch vollends zerstört. Es ist daher in einem Bereich angesiedelt, in dem sich kein Basic-Programm befinden kann, der aber auch - unabhängig von der gerade verwendeten Speichererweiterung - in jedem Rechner vorhanden ist: die vom System nicht benutzten Adressen von 678 bis 767 auf der Speicherseite 1.

"Erste Hilfe" wirkt immer, selbst bei manipulierter Basic-Untergrenze. Aus den Adressen 43 und 44 ($2B/2C) erfahrt das Programm, wo das reparaturbedürftige Objekt beginnt. Das Verfahren nutzt eine Spezialität des 6502-Prozessors: die indirekt-nachindizierte Adressierung. Dabei werden zwei Adressen auf der Zero-Page sozusagen als ein "Briefkasten" benutzt, in dem ein Zeiger auf eine Speicherstelle deponiert wird, deren Inhalt auf diesem (Um-)Weg geladen werden kann. Das geht sehr schnell: Sekundenbruchteile nach dem Start listet sich das wiedererstandene Programm selbst auf dem Bildschirm auf.

Das Programm prüft nicht, ob tatsächlich eine Löschung erfolgt ist. Man kann seine Funktionsfähigkeit also auch an einem intakten Basic-File erproben. Er wird zwar wie ein gelöschter behandelt, aber nicht verändert, da alle Werte so rekonstruiert werden, wie sie im Normalfall auch vorhanden sind. Sollte das aufgelistete Ergebnis Abweichungen vom Urzustand aufweisen, dann sind diese auf irreparable Zerstörungen zurückzuführen. Nach dem versehentlichen Löschen sollten keine Manipulationen mehr vorgenommen werden. Ein LIST-Versuch schadet nicht, aber jede von nun an verwendete Variable überschreibt den ungeschützt im Speicher liegenden File. "Erste Hilfe" kann natürlich nicht erkennen, wenn solche Veränderungen bereits eingetreten sind. Ein Aussprung unter Anzeige eines "Syntax Errors" erfolgt nur, wenn in der ersten Programmzeile nach der maximal zulässigen Zahl von 88 Bytes noch keine End-Null vorgefunden wurde. So kann es vorkommen, daß sich der Computer in einem weitgehend zerstörten File verirrt und festläuft. Der Verlust durch das notwendige Abschalten ist dann kein allzu großer, denn ein solches Programm wäre ohnehin nicht mehr zu retten gewesen.

Störungen des Programms "Erste Hilfe" sind bisher nur vom Commodore-Modul "Super-Erweiterung" (VC 1211 A) bekannt. Vor dem Laden des Maschinenprogramms muß dieses Modul durch den im Direktmodus eingegebenen Befehl SYS 64818 abgeschaltet werden, wobei zu beachten ist, daß dadurch ein eventuell heraufgesetzter Basic-Start normalisiert wird und gegebenenfalls wieder angepaßt werden muß, bevor "Erste Hilfe" zur Anwendung kommt.

Assembler-Programmierer können das Maschinenprogramm nach dem dokumentierten Listing 1 eingeben und vom Monitor aus abspeichern. Für Basic-Programmierer stehen zwei verschiedene Versionen zur Auswahl. Das als "Kassettenversion" bezeichnete Listing 2 kann auch für die Diskette benutzt werden, wenn die Zeile 110 abgeändert wird in POKE 186,8. Hier wird die Gerätenummer hinterlegt. Die Adressen 187 und 188 enthalten die Adresse des Namens, unter dem das Programm abgespeichert werden soll. Dieser Name ist in der REM-Zeile mit der Nummer 0 abgelegt. Sie ist deshalb unbedingt erforderlich, weil gezielt danach gesucht wird. Die Speicherstelle 183 weist die Länge des Filenamens aus, 185 die Sekundäradresse 1, die dafür sorgt, daß das Programm nicht wie gewöhnlich an den Basic-Start, sondern nach Adresse 678 geladen wird. Von dort aus wird auch abgespeichert: 193/194 enthalten die Startadresse, 174/175 die Endadresse plus 1.

Bei Verwendung einer Diskette kann man sich die vielen POKEs jedoch sparen und die Bytes in Form von ASCII-Codes direkt auf die Floppy schreiben (siehe Listing 3). Dieses Verfahren ist ausschließlich für die Diskette geeignet. Der DATA-Block (Listing 4) ist in beiden Fällen derselbe. Gespeichert werden sollte der File unter dem angegebenen Namen, der die Startadresse enthält, die dadurch nicht in Vergessenheit geraten kann. Für das Laden von Diskette ist LOAD "H*",8,1 einzugeben. Vorteilhafter ist hier das Laden von der Kassette, weil ein einfaches LOAD ohne weitere Angaben genügt. Die Sekundäradresse ist nicht erforderlich, da das Betriebssystem des VC 20 im Bandheader das absolut zu ladende Maschinenprogramm erkennt. Mit SYS 6789 wird dann umgehend "Erste Hilfe" geleistet.

(Helmut Welke)

© Originalartikel: WEKA Verlagsgesellschaft, 64'er
© HTML-Veröffentlichung: Projekt 64'er online
Erfassung des Artikels: Sascha Hoogen (8-Bit-Nirvana)



8-Bit-Nirvana | 8-Bit-Forum | 8-Bit-Flohmarkt | Impressum