★ APPLICATIONS ★ DEPLOMBAGE ★ SCHWERTRANSPORT (HAPPY COMPUTER) ★ |
Schwertransport (Happy Computer) | Applications Deplombage |
Besitzer eines Schneider CPC 464, die ihren »Maschinenpark« um ein Diskettenlaufwerk erweitert haben, stehen sehr bald vor einem Problem: Wie läßt sich die vorhandene Software von Kassette auf Diskette übertragen? Noch heute (und voraussichtlich auch in Zukunft) ist die meiste Spielsoftware ausschließlich auf Kassette erhältlich. Programme, die Kassettensoftware auf Diskette bringen, wie zum Beispiel »Transmat«, besitzt nicht jeder. Dazu kommt, daß sie nur einen Teil der Software transferieren und das oft auch nur mit erheblichen Eingriffen des Benutzers in die kopierten Programme. Das heißt natürlich nicht, daß hier eine Anleitung für jede erdenkliche Software gegeben werden kann; dazu gibt es zu unterschiedliche Konzepte. Viele Programme haben sehr spezielle Laderoutinen, wie zum Beispiel das Flashloading (bei »Sorcery« und anderen Titeln), oder einfach ein anderes Ladeformat (zum Beispiel »Spy vs Spy«), Auf Grund der Komplexität können wir an dieser Stelle darauf nicht eingehen. Zunächst wollen wir einen Blick auf Software werfen, die ganz »ordinär« blockweise im Standardformat (»SAVE "name",p«) gespeichert ist. Für den Transfer benötigen Sie einige Informationen über das Programm. So prüfen Sie erst einmal mit dem CAT-Befehl, in wieviele Teile sich das Programm gliedert (Laderoutine, Titelbild, Hauptprogramm, etc). Nehmen wir beispielsweise an, das Programm besteht aus zwei Teilen: zum einen aus dem, natürlich geschützten, Basic-Programm und einem anschließenden Maschinensprache-Teil. Den »Schutz« des Basic-Programms müssen Sie aus zwei Gründen entfernen: Erstens läßt es sich nicht mit einfachem »LOAD« und anschließendem »SAVE« übertragen. Dazu kommmt, daß Sie meist kleine Eingriffe vornehmen müssen, deren Zweck Sie später erkennen werden. Den Listschutz entfernen Sie mit Hilfe eines kleinen Programms. Für den CPC 464 benötigen Sie Listing 1, für die CPC 664/6128 Listing 2. Der gelistete Basic-Teil sieht wie folgt aus: Auf den Aufbau des Titelbildes und die Farbdefinition folgt der Ladebefehl und schließlich der Aufruf des Maschinen-code-Programms mit »CALL adresse«. Von besonderem Interesse ist für uns die »Laderoutine«. Sie besteht in aller Regel nur aus der Anweisung »LOAD "!'« und lädt das auf der Kassette folgende Programm. Wie Sie vielleicht wissen, müssen Sie das Ausrufezeichen durch einen Programmnamen ersetzen, der die Bedingungen des Disketten-Betriebssystems erfüllt (acht Zeichen, eventuell mit einer Erweiterung von drei Zeichen getrennt durch einen Punkt). So ist der Basic-Lader bereits aufbereitet und Sie speichern ihn auf Diskette. Die Übertragung des Maschinencodes kostet ungleich mehr Mühe: Sie müssen seine Ladeadresse und Länge herausfinden. Lädt und startet der Basic-Teil das Maschinenprogramm nicht über »LOAD"!" :CALL adresse«. sondern mit »RUN"!"«, benötigen Sie noch zusätzlich die Startadresse. Hilfe finden Sie in Listing 3. Diese Hilfsroutine liest die entsprechenden Informationen aus dem sogenannten Header des jeweiligen Speicherblocks. In unserem Beispiel ist die Ladeadresse 40000 und der Maschinencode 1500 Byte lang. Geben Sie nun folgende Basic-Zeilen ein: 10 OPENOUT "DUMMY":MEMORY 40000-1:CL0SE0UT |
Adresse | Name | Funktion | benötigte Register |
BC6B hex | CAS-NOISY | Unterdrückt Meldungen des Kassetten-Managers (»LOADING NAME BLOCK XX«) oder läßt sie wieder zu | A Wenn ungleich Null, erfolgen keine Meldungen |
BC77 hex | CAS-IN-OPEN | öffnet eine Datei zum Lesen | B Länge des Dateinamens HL Adresse des Namens DE Adresse des 2-KByte-Puffers |
BC83 hex | CAS-IN-DIRECT | Lessen aus der geöffneten Datei | HL Ladeadresse |
BC7A hex | CAS-IN-CLOSE | Schließen der Eingabe-Datei | Keine Übergabe |
BC8C hex | CAS-OUT-OPEN | öffnet eine Datei zum Schreiben | B Länge des Dateinamens HL Adresse des Namens DE Adresse des 2-KByte-Puffers |
BC98 hex | CAS-OUT-DIRECT | Schreiben in die geöffnete Datei | HL Anfangsadresse DE Programmlänge in Byte BC Einsprungadresse (Start) A Dateityp, bei Btnär-Dateien eine 2 |
BC8F hex | CAS-OUT-CLOSE | Schließen der Ausgabe-Datei | Keine Übergabe |
Ladden und Speichern in einem Block | |||
BCA1 hex | CAS-READ | Liest eine headerlose Datei (wirkt nur bei Kassette) | HL ladeadresse DE Dateiiänge in Byte A Satzkennzeichen |
BC9E hex | CAS-WRITE | Schreibt eine headerlose Datei (wirkt nur bei Kassette) | HL Anfangsadresse DE Dateilänge in Byte A Satzkennzeichen |
Aus dem ersten erfahren Sie alles Wichtige über die Nutzung von Betriebssystem-Routinen aus Maschinensprache und zum Teil auch aus dem Basic). Das zweite Buch geht noch ein paar Schritte sefer und zeigt Ihnen auch die trick-wachsten Kniffe. Was macht man zum Beispiel, wenn ein Programm den gesamten Speicher vom Basic-Start bis hin zum DOS-RAM belegt? Wohin dann mit der Transfer-Routine? Gut, wenn -tan in so einem Fall mal eben nachschlagen kann, um festzustellen, daß öe kleine Routine auch im Puffer des Sasic-Editors bei den Adressen ACA4 Dts ADA5 hex (CPC 664 und 6128: -CAS bis AD8B hex) oder im Basic-Stack zwischen AE8B hex und B08A -ex (CPC 664 und 6128: AE6F bis 306E hex) Platz findet.
RUN an den Feind
Die nächste Problemgruppe sind Programme, deren Laderoutine bereitsaus Maschinencode besteht. Natürlich sind auch hier gegebenenfalls die Dateinamen für das Nachladen der restlichen Programmteile zu ändern. Mit einem Monitor-Programm ist das auch für weniger Geübte kein unüberwindliches Problem. Weit weniger erfreulich ist eine Eigenheit des Betriebssystems, die sich spätestens dann bemerkbar macht, wenn Sie das Programm mit »RUN "name"« zu laden versuchen: den Lader mit einem Maschinensprache-Monitor disassemblieren. Dann machen Sie sich auf die Suche nach dem genannten Aufruf. Ihm voraus geht die Zuweisung der Register mit den drei Informationen: Ladeadresse (HL), Länge (DE) und Satzkennzeichen (im Akku). Das Satzkennzeichen dient der Unterscheidung verschiedener Programme. Im Assembler-Quellcode sieht das folgendermaßen aus:
Benutzen Sie zum Überspielen das Programm aus Listing 5. In Zeile 60 ist die Maschinencode-Routine im String a$ abgelegt. Die Zeilen 70 bis 90 fragen dann nacheinander Anfangsadresse, Länge und Satzkennzeichen ab. Sollte das übertragene Programm zu lang sein (Stichwort: DOS-ROM), lädt unsere Routine es in einen anderen Speicherbereich (denken Sie daran, es später wieder zu »liften«), Sind Bildschirm-Inhalte (beispielsweise Titelbilder) zu übertragen, müssen Sie die Abfragen in den Zeilen 130 bis 150 durch feste Angaben ersetzen, da sie sonst das Bild zerstören. Listing 6 speichert als Beispiel einen Bildschirm in einem Block, den Listing 7 wieder lädt. Durch Änderung der Werte für HL, DE und A sind sie universell für jede Binär-Datei verwendbar. Vergessen Sie aber nicht, daß diese Werte, wie beim Z80 üblich, in der Reihenfolge »niederwertiges Byte, höherwertiges Byte« zu übergeben sind.
Sie kennen nun die wichtigsten Methoden, um Kassettensoftware auf Disketten zu überspielen. Natürlich gilt auch hierfür, daß Sie Kopien nur für den Eigenbedarf anfertigen dürfen.
Matthias Rosin/Michael Straßer/ja , HC
|
|