Ich möchte ein Programm auf dem Atari TT entwickeln und es ggf. in unserer Firma unter einem PC486 weiterbearbeiten. Ist das möglich?
Generell läßt sich ein Programm unter GFA-BASIC nur in den Grundelementen auf den PC exportieren. Hierfür benötigen Sie natürlich das GFA-BASIC für PCs. Die Daten speichern Sie mit »SAVE, A« im Interpreter ab und »MERGE‘n« diese auf Ihrem PC wieder ein. Die Ausgabe auf dem Monitor müssen Sie jedoch computerspezifisch anpassen.
Wenn ich auf meinem Großbildschirm den Bildinhalt mit »SGET« retten will, erhalte ich immer eine Fehlermeldung. Was mache ich falsch?
In GFA-BASIC hat ein String generell eine maximale Größe von 32000 Zeichen (Byte). Diese Größe reichte bisher aus, um ein Bild in den ST-Auflösungen in einen String zu schreiben. Wollen Sie ein Bild mit der Größe 1280 x 960 Pixel (Großbildschirm) retten, benötigen Sie 153600 Byte - zuviel für SGET.
Sie haben nun zwei Möglichkeiten: Die einfachste Methode ist das Speichern mehrerer Teilausschnitte mittels »GET x, y, wh, a$«. Die zweite, uns sinnvoller erscheinende Lösung, wäre das Verschieben des Bildinhalts. Zwei entsprechende Listings sehen Sie nachfolgend. Bei »sget« müssen Sie zunächst den Speicherplatz der derzeitigen Bildgröße errechnen. Unsere Rechnung bezieht sich nur auf Monochrom. Wollen Sie auch Farbbilder verschieben, müssen Sie die Farbtiefe berücksichtigen. Haben Sie nun sichergestellt, daß ein ausreichend großer Speicherplatz in einem Block verfügbar ist, reservieren Sie mit »MALLOC()« den benötigten Speicherplatz. Den Bildinhalt verschieben Sie nun mit Hilfe von »BMOVE«. Als Rückgabeparameter erhalten Sie die Adresse, an die der Bildinhalt kopiert wurde sowie die Größe des kopierten Bereichs. Unter »rueck!« erfahren Sie, ob das Kopieren geklappt hat. Mittels der Prozedur »sput« kopieren Sie den Bildinhalt wieder auf den Bildschirm. Hierfür müssen Sie die zuvor in sget erhaltenen Werte übergeben.
PROCEDURE sget (VAR ret_adr%, bild_speicher%, rueck!)
bild_speicher% = ((WORK_OUT(O) +1) * (WORK_OUT(1) +1 ))/8
IF MALLOC(-1) >= bild_speicher%
ret_adr% = MALLOC(bild_speicher%)
BMOVE XBIOS (3), ret_adr%, bild_speicher%
rueck! = TRUE
ELSE
ALERT 3, "| Nicht genug Speicher | Block frei!", 1, "Abbruch", wahl%
rueck! = FALSE
ENDIF
RETURN
PROCEDURE sput (ret_adr%, bild_speicher%)
BMOVE ret_adr%, XBIOS (3), bild_speicher%
~MFREE (ret_adr%)
RETURN
Um ein Programm vor Raubkopierern zu schützen, verwenden viele Firmen ein Installationsprogramm, das beispielsweise die Adresse in das Originalprogramm kopiert. Wie funktioniert das in GFA-BASIC?
Um den fertigen Programmcode nachträglich zu verändern, zu patchen, bedarf es dreier Programmteile. Nach dem Compilieren eines GFA-BASIC-Programms ist der Programmcode gegenüber dem GFA-BASIC-Code sehr stark verändert. Jedoch bleibt ein im Source-Code reservierter »INLINE« so bestehen, wie er angelegt ist. Diese Tatsache bildet die Grundlage allen »Patchens«. Hierzu müssen wir zuvor in dem Programm, das geschützt werden soll, einen INLINE reservieren. In unserem Beispiel haben wir uns für 100 Zeichen entschieden. Dieser INLINE enthält zu Beginn einen definierten Text, damit wir seinen Platz im Compilat eindeutig identifizieren können. In unserem Beispiel verwenden wir das Wort »TEST«, gefolgt von 96 Leerzeichen. Wichtig ist, daß dieser Eintrag mit einem Null-Byte endet. Nachdem Sie dieses Programm einmal gestartet haben, müssen Sie die Programmzeile zum Festlegen des Inhalts des INLINE wieder löschen, da sonst bei jedem Programmstart immer wieder der Text »Test« in den INLINE geschrieben wird. Der eigentliche INLINE bleibt natürlich erhalten, solange Sie das Programm im »*.GFA«-Format speichern.
´100 Zeichen zum Patchen freihalten
INLINE inline_adr%, 100
CHAR { inline_adr% } = "Test" + SPACE$(96)
inline_text$ = CHAR {inline_adr%}
PRINT inline_text$; "*"
~INP (2)
Nun müssen Sie Ihr Programm compilieren. Der zweite Programmteil (im Archiv »Listings« auf der TOS-Diskette) sucht nach der Startadresse des INLINE. Nachdem Sie das zu patchende Programm ausgewählt haben, definieren Sie den Text, nach dem das Programm suchen soll. Wir haben, wie schon oben erwähnt, »Test« genommen. jetzt ermitteln wir die Länge des gesamten Programms. Um das gesamte Programm zu prüfen, reservieren wir uns mit »MALLOC« einen ausreichend großen Speicherblock. Jetzt laden wir mittels »BLOAD« die Datei in den reservierten Speicherbereich und suchen nach dem String text$. Nachdem dieser gefunden ist, erhalten wir die Adresse dieser Stelle und die relative Position des INLINE im Programmcode. Mit diesen Informationen erstellt das Programm ein LST-File, mit dem sich ihr eigentliches Programm patchen läßt.
FILESELECT "Bitte Programm auswählen", "*.PRG", "UNGEPATC.PRG", wahl$
IF wahl$ <> ""
OPEN "U" wahl$
SEEK 2770
PRINT " "; ! »Hier kommt der Text hin«
CLOSE
ENDIF
In die Zeile »PRINT.. « fügen Sie in die Anführungszeichen den Text ein, der in Ihr Programm gepatcht werden soll. Beachten Sie, daß dieser Text mit einem Diskettenmonitor frei zu lesen und zu ändern ist. Einen wirksameren Schutz erreichen Sie durch vorheriges Verschlüsseln des Textes.
(ah/Sandro Lucifora)