Erschienen in 64'er Magazin, Ausgabe unbekannt · Originaldatei: COPYRBOY.TXT
Hinweis: Dies ist das an die Redaktion eingereichte Manuskript, nicht der gedruckte Endtext. Layout, Bildunterschriften, Korrekturen und Kürzungen der Redaktion können in der veröffentlichten Fassung abweichen.
Der Copyright-Boy: Plagiaten auf der Spur
Der »Copyright-Boy« ist ein komfortables Maschinensprache-Utility, das zwei Programme vergleicht und prüft, ob sie gemeinsame Programmteile enthalten. Auf dem Drucker oder Bildschirm wird eine übersichtliche Liste erzeugt, die die doppelten Bereiche aufzeigt. Ein sehr sinnvolles Tool nicht nur zum Sparen von Diskettenspeicherplatz!
Nikolaus M. Heusler
Die Frage ist: Wozu braucht man so etwas? Anwendungsbeispiele gibt es genügend! Stellen Sie sich vor, Sie haben ein Programm in zwei verschiedenen Versionen und möchten vergleichen, welche Routinen und Programmteile der Programmierer unverändert übernommen hat. Man kann damit aber auch beispielsweise aufdecken, wenn ein Programmierer eine Routine (oder auch Grafikdaten wie Sprites oder Zeichensätze) von einem anderen »abgekupfert« hat. Gibt es Teile, die in beiden Programmen vielleicht an unterschiedlichen Adressen auftreten? Der Copyright-Boy findet sie! Eine Einsatzmöglichkeit wäre auch, die Directories zweier Disketten zu vergleichen und damit festzustellen, ob Dateien auf beiden Disketten gespeichert sind.
Obwohl dieses Programm aus Gründen des Komforts und der Geschwindigkeit vollständig in stark optimierter Maschinensprache verfaßt wurde, brauchen Sie zur Anwendung keine Assemblerkenntnisse. Das Programm kann wie normales Basic geladen, gestartet und ggf. kopiert werden. Geben Sie ein:
LOAD "COPYRIGHT-BOY",8
RUN
Auf dem Bildschirm erscheint jetzt unter dem Titelbild die Frage, wie lange ein gefundener identischer Bereich mindestens sein muß, um als solcher gemeldet zu werden. Wählen Sie die Eingabe nicht zu niedrig, da Sie das Tool sonst mit einer endlosen Liste von Fundstellen überhäuft (die Wahrscheinlichkeit etwa bei Eingabe von einer »1«, daß irgend ein beliebiges Byte in beiden Programmen vorkommt, ist fast 100%). Was Sie eingeben, hängt eigentlich von der Anwendung ab. Zum Vergleich von einem Programm in zwei unterschiedlichen Versionen werden Sie wahrscheinlich nur an komplett identischen Routinen interessiert sein, geben Sie also beispielsweise eine 30 ein. Sollen zwei total verschiedene Programm, zum Beispiel zwei Spiele, verglichen werden, so sind durchaus auch kleinere Eingaben wie 10 oder 15 sinnvoll. Achtung: Ist die gewählte Mindestlänge größer als die Länge des kürzeren Programms, kann der Copyright-Boy natürlich keine Gemeinsamkeiten finden. Geben Sie einen numerischen Wert größer Null bis 65535 ein und bestätigen durch Druck auf die RETURN-Taste.
Jetzt sollen die Namen der beiden Dateien eingegeben werden, die zum Vergleich von Diskette geladen werden. Korrekturen können mit der DEL-Taste vorgenommen werden, die HOME-Taste löscht das Eingabefeld. Sie können dabei die normalen Joker »?« und »*« verwenden, bedenken Sie dabei jedoch, daß diese dann später auch etwas unschön in der Überschrift der Tabelle auftauchen. Auch diese Eingaben sind mit RETURN zu bestätigen.
Legen Sie jetzt noch fest, ob die Tabelle auf dem Drucker (Taste D) oder dem Bildschirm (Taste S) ausgegeben werden soll. Als Drucker kann jedes Gerät verwendet werden, das unter der Geräteadresse 4 (Sekundäradresse 0) normalen Ascii-Code versteht und einen automatischen Linefeed durchführt. Besondere Steuerzeichen werden nicht gesendet.
Neben dem Namen der ersten Datei blinkt jetzt ein Cursor. Legen Sie die Diskette ein, auf der sich dieses File befindet, und drücken eine Taste. Der C 64 versucht, das Programm zu laden (das Utility kann nur PRG-Files bearbeiten). Sodann wird in gleicher Weise die zweite Datei geladen. Für beide Programme zusammen steht ein riesiger Speicherbereich von etwa 60 Kilobyte zur Verfügung (entspricht etwa 240 Blöcken auf Diskette). Wird dieser Bereich überschritten, gibt das Programm eine Fehlermeldung aus. Es ist aber ohnehin wenig sinnvoll, solch große Datenmengen zu vergleichen, da die Arbeitszeit des Programms mit dem Produkt aus den Programmlängen ansteigt. Dabei gilt übrigens: Je mehr und je größere identische Bereiche gefunden werden, desto schneller geht's. Einen kleinen Geschwindigkeitsgewinn erzielen Sie noch, indem Sie als Datei 1 das kürzere der beiden Programm wählen.
Nach dem Laden (aus technischen Gründen muß eine eigene Laderoutine verwendet werden, wodurch die meisten Schnell-Ladesysteme überbrückt werden) gibt das Programm die Tabellenüberschrift aus. Diese enthält die Namen der beiden Dateien sowie hexadezimale Angaben über Start- und Endadresse und die eingegebene Mindeslänge für gemeinsame Bereiche. Dann beginnt die Suche. Als Zeichen dafür, daß der Computer noch arbeitet, wird ständig links oben hexadezimal die Adresse in Datei 1 eingeblendet, die gerade bearbeitet wird. Diese Angabe läuft bis zur Endadresse der Datei 1, die Sie der Tabellenüberschrift entnehmen können. Ist dieser Wert erreicht, so ist das Programm fertig.
Gefundene gemeinsame Bereiche werden tabellarisch aufgelistet. Von links nach rechts: Start- und Endadresse des Bereichs in Datei 1, Start- und Endadresse des Bereichs in Datei 2 (jeweils hexadezimal) und dezimal die Länge des Bereichs in Bytes. Ein Stern bedeutet, daß die Identität bei beiden Programmen im gleichen Speicherbereich auftritt. Vorsicht: Der Suchvorgang darf nicht mit RUN STOP/RESTORE abgebrochen werden, ein Absturz könnte sonst die Folge sein.
Nach Beendigung der Suche gibt der Copyright-Boy noch die Anzahl der Fundstellen aus.
Wichtige Zeropagespeicherzellen (Version 1):
02 maximale Länge der Eingabe
03 Flag: Nur Zifferneingabe
04 Cursorspalte für Eingabe
05 Eingabezeichenzähler
06 Anzahl der Fundstellen (high)
8b-8c Mindestlänge eines Fundbereiches
8d-8e numerischer Zwischenspeicher
8f Ausgabegerät 3 oder 4
96-97 Leseposition Datei 2
9b Länge Filename Datei 1
9c Länge Filename Datei 2
9e-9f numerischer Zwischenspeicher
a6-a7 reale Endadresse Datei 2
a8-a9 Endadresse Datei 2 im Speicher +1
aa-ab Startadresse Datei 2 (z.B. 2049)
b0-b1 Lesezeiger Datei 2
b2-b3 Länge des gefundenen Bereichs
b4-b5 augenblicklicher Lesezeiger Datei 2
bd-be Leseposition Datei 1
bf Anzahl der Fundstellen (low)
c3-c4 augenblicklicher Lesezeiger Datei 1
f7-f8 Startadresse Datei 1 (z.B. 2049)
f9-fa reale Endadresse Datei 1
fb-fc Endadresse Datei 1 im Speicher +1
fd-fe Lesezeiger Datei 1