Anleitung zum »Twin Search System, Version 2.1« Dieses nur 15 Blocks kurze Utility gestattet auf sehr einfache und komfortable Weise die Suche nach Programmen, die (ggf. auch unter verschiedenen Namen) auf einer oder mehreren Disketten mehrfach vorkommen. Viele Sonderfunktionen machen dieses Programm für alle C 64 Anwender interessant. Nikolaus M. Heusler Die Anwendungsgebiete für das Programm sind vielfältig. Beispielsweise sind die sogenannten »Bibliotheken« weit verbreitet. Auf einer oder mehreren Disketten werden zum Beispiel Sprites gesammelt. Im Laufe der Zeit sammeln sich da dann mehrere hundert Sprites an, und bald verliert man den Überblick, ob man nicht vielleicht einige Sprites doppelt, weil zum Beispiel aus verschiedenen Quellen stammend, archiviert hat. Das selbe gilt zum Beispiel für eine Diskette, auf der Zeichensätze gesammelt werden, die aus kommerziellen Programmen ausgebaut wurden. Erwischt man zwei Programme, die den selben Zeichensatz verwenden (soll gar nicht so selten vorkommen!), und kann sich nicht mehr daran erinnern, daß man diesen Font ja bereits vor einiger Zeit archiviert hat, so verschwendet man neun Blocks: Der Satz ist doppelt gespeichert. Auch könnten Sie mit dem »Twin Finder« (Zwillingsfinder) ja einfach einmal alle Ihre Utility-Disketten durchgehen. Vielleicht entdecken Sie ja, daß Sie bestimmte Programme auf mehreren Disketten gespeichert haben. Insgesamt eignet sich das Programm also sehr gut dazu, Diskettenspeicherplatz zu sparen, da die Duplikate gelöscht werden können. Sie können das »TSS« aber auch »nur« dazu einsetzen, alle Files anzeigen zu lassen, die gleich lang sind und/oder (lediglich) die selbe Startadresse haben. Grundsätzlich könnte man dazu wie folgt vorgehen: Man lädt ein Programm nach dem anderen in den Speicher und vergleicht dieses nacheinander mit allen Programmen auf der Diskette Byte für Byte. Aber das kostet viel, viel Zeit, da jedes Programm nicht nur einmal, sondern zum Beispiel bei 20 Files 20 mal vollständig gelesen werden muß! Die Zeit, die diese Methode beansprucht, steigt quadratisch mit der Anzahl der zu testenden Files. Etwas schneller geht es, wenn Sie alle Files auf der Diskette ein einziges Mal in den Speicher des C 64 einlesen und dann im RAM miteinander vergleichen. Nur, wie sollen Sie zum Beispiel 150 HiRes-Grafiken zu je 32 Blocks (= gesamt 4800 Blocks oder 1200 Kilobyte) in den 64 K Speicher des C 64 einlesen? Das »Twin Search System« arbeitet hier mit einem ebenso einfachen wie »genialen« Trick: Es werden zwar alle Files »gescannt«, also Byte für Byte gelesen. Aus den Programmbytes bildet das Tool dann jedoch auf vier verschiedene Weisen vier Prüfsummen, nur diese werden zusammen mit Filenamen, Startadresse und Länge des Files im RAM abgelegt. Nachdem alle Files gescannt sind, vergleicht das Programm dann nur diese Prüfsummen. Haben zwei Programme die selben vier Prüfsummen und sind sie zudem gleich lang, so kann man davon ausgehen, daß es sich um zwei identische Files handelt. Durch geschickt gewählte Algorithmen (siehe unten) wird verhindert, daß zum Beispiel die Zahlenkombinationen 24, 35 und 35, 24, die ja summiert den selben Wert 59 ergeben, als identisch angesehen werden. Die Wahrscheinlichkeit, daß zwei verschiedene Files trotzdem die selben vier Prüfsummen haben und zudem noch gleich lang sind, geht gegen Null. Dies kann mathematisch aufgrund der Berechnungsverfahren sogar bewiesen werden. Dieser Fall trat bei einer Großzahl von getesteten Programmen nicht ein einziges Mal auf. Laden Sie das in reiner Maschinensprache geschriebene »TSS« mit dem Befehl LOAD "TSS 2.1",8 und starten Sie es wie ein Basicprogramm mit RUN. Der Befehl LIST bringt hier keine Befehle zum Vorschein. Nach einem Programmabbruch, dem Programmende oder einem Ausstieg mit oder Reset kann das »TSS« mit SYS 2257 wieder aktiviert werden, so es sich noch im Speicher befindet. Auf dem Bildschirm ist jetzt das Titelbild zu sehen. Legen Sie die erste Diskette mit zu testenden Files ein und drücken eine Taste. Jetzt soll die Directory-Maske eingegeben werden. Dazu gehen Sie so vor wie beim Scratch-Befehl: Die Joker »?« und »*« dürfen gesetzt werden. Die Eingabe von »OP.*« übernimmt alle Files, deren Namen mit »OP.« anfangen. »M??ER« übernimmt zum Beispiel »MAYER«, »MEIER«, »MEYER«, »MJWER« und so weiter. Auch der Filetyp kann angegeben werden, hinter dem Namen und einem Gleichzeichen: zum Beispiel selektiert »H*=P« alle PRG-Files, deren Namen mit H beginnen. Die Trennung verschiedener Masken mittels Kommata ist hier leider nicht möglich. Nach der Eingabe drücken Sie . Im Normalfall übernehmen Sie aber einfach das Sternchen mit , dann werden sämtliche Files selektiert. Die Eingabe eines Dollarzeichens ($) bewirkt, daß das Directory der eingelegten Diskette auf dem Bildschirm ausgegeben wird. Ca. alle 22 Zeilen hält die Ausgabe an und kann durch Tastendruck fortgesetzt werden. Die Taste ermöglicht den vorzeitigen Abbruch. Das Programm reagiert übrigens gelegentlich etwas anfällig auf Directory-Manipulationen, wie etwa CHR$(160) oder Nullbytes im Filenamen, oder Kommentare im Directory, wie man sie mit dem »Disc Wizard« erzeugen kann. Daher sollten Sie möglichst nur ganz normal gespeicherte Files durchgehen lassen, dann kann nichts passieren. Das Programm ist natürlich so programmiert, daß Abstürze unmöglich sind, wenn Sie sich an die Anweisungen auf dem Bildschirm halten. Diskettenfehler werden grundsätzlich abgefangen und angezeigt. Dennoch können eben Files, deren Einträge im Directory manipuliert sind, nicht in allen Fällen getestet werden. Aufpassen sollten Sie auch bei Files, bei denen im Directory als Starttrack und -sektor die Null angegeben ist (solche Files erzeugen manche Directory-Manipulatoren etwa bei den Trennstrichen): diese Files können weder von »TSS«, noch vom normalen DOS geladen werden. Nach der Eingabe dieser Vorwahl werden nun das Directory wie gewünscht geladen und die Filenamen eingelesen. Treten hier Diskettenfehler auf, werden diese angezeigt und müssen mit einem Tastendruck quittiert werden. Danach kann die Operation wiederholt werden. Files, die vor dem Typ ein Sternchen stehen haben (sog. nicht geschlossene Write-Files) können nicht gelesen werden, hier erscheint eine blinkende Meldung, die durch Tastendruck bestätigt wird. Das File wird übersprungen. Nach dem Einlesevorgang erscheint die Anzahl der Files, deren Namen bereits gespeichert sind, und die Frage, ob eine weitere Diskette getestet werden soll. Drücken Sie hier auf die Taste , so erscheint die Aufforderung, die Floppy zu wechseln. Daraufhin wird wieder der Directory-Name eingegeben. Somit können auch doppelte Files erkannt werden, die sich unter dem gleichen oder verschiedenen Namen auf mehreren Disketten befinden. Antworten Sie dagegen mit , ist der Vorgang des Namen-Einlesens beendet. Jetzt prüft das Programm, ob sich mindestens zwei Files im Speicher befinden. Wenn nicht, erscheint eine entsprechende Meldung, denn es hat wohl wenig Sinn, mit einem oder gar keinem File diesen Vergleich durchzuführen. Übrigens dürfen nicht mehr als 250 Files bearbeitet werden, auch eine Überschreitung dieses Maximalwertes erkennt das »TSS«. Mit der Taste können Sie jetzt bei Bedarf abbrechen. Haben Sie also mit geantwortet, wird jetzt gewählt, nach welchem Verfahren geprüft werden soll. Wie bereits erwähnt, werden vier Prüfsummen gebildet, außerdem kann anhand der Startadresse und der Filelänge auf Gleichheit geprüft werden. Mit den Tasten <1> bis <6> werden jetzt diese sechs Verfahren ein- oder ausgeblendet, jede erdenkliche Kombination (außer: alles sechs ausgeschaltet) ist erlaubt. Ein Verfahren ist eingeschaltet, wenn das Feld mit der Nummer markiert, also revers unterlegt ist. Die Beschreibung der sechs Verfahren: 1: Das erste Verfahren betrifft die Länge des Files in Bytes. Es wird einfach gezählt, bei Gleichheit ist diese Prüfung erfüllt. Der Zähler der Anzahl Bytes hat eine Breite von 16 Bit, läuft also erst bei Files ab 258 Blocks über und beginnt wieder bei Null: INC SUMME1:BNE LABEL:INC SUMME1+1 LABEL ... 2: Eine einfache Prüfsumme: Es werden alle Bytes des Files addiert. Bei Überträgen von einem Byte wird noch eins dazuaddiert. Der Algorithmus sieht folgendermaßen aus: LDA BYTE:CLC:ADC SUMME2:ADC #0:STA SUMME2 3: Hier werden alle Bytes des Files EOR-miteinander verknüpft: LDA BYTE:EOR SUMME3:STA SUMME3 4: Während bei den Algorithmen 2 und 3 Dreher nicht erkannt werden (diese errechnen etwa bei den aufeinanderfolgenden Zahlen 45, 34 und 63 immer die selbe Summe, egal, in welcher Reihenfolge diese Zahlen im Programm aufeinanderfolgen), berücksichtigt die Methode 4 auch die Stellung eines Bytes im Programmtext. Dazu wird zunächst die bisherige Summe um ein Bit nach links rotiert, Überträge wandern rechts wieder in das Byte hinein, und zum Ergebnis wird dann das jeweilige Programmbyte addiert: LDA SUMME4:ASL:ADC #0:ADC BYTE:STA SUMME4 5: Der fünfte Algorithmus ist eine Mischung aller vorangegangenen Methoden. Die bisherige Anzahl der Bytes im File (nur das Lowbyte) wird mit dem gelesenen Byte EOR-verknüpft. Vom Ergebnis subtrahiert der Computer die bisherige fünfte Prüfsumme, rotiert das Ergebnis nach links und speichert es als neue fünfte Prüfsumme ab: LDA SUMME1:EOR BYTE:CLC:SBC SUMME5:ASL:ADC #0:STA SUMME5 6: Die sechste Methode, die nach dem Programmstart abgeschaltet ist (das Feld mit der »6« ist nicht markiert), vergleicht die Startadressen der Files. Bei den obigen Auszügen der Algorithmen bedeutet BYTE das momentan gelesene Programmbyte, SUMME1 bis SUMME5 sind die gespeicherten Prüfsummen, die vor dem Scannen des Files alle auf Null gesetzt werden. Die obigen Programmausschnitte werden für jedes Bytes des Files neu durchlaufen, übrigens unabhängig davon, ob das jeweilige Verfahren eingeschaltet ist oder nicht. Wie gesagt, es können mehrere oder alle Verfahren miteinander kombiniert werden. Schalten Sie etwa nur das zweite und das sechste ein, so bekommen Sie alle Files mit gleicher Startadresse als Zwillinge gemeldet, deren EOR-Verknüpfung den selben Wert ergibt: Die Verfahren 1, 3, 4 und 5 werden dann nicht berücksichtigt. Im Normalfall ist es aber am sichersten, die Voreinstellung zu übernehmen, die das Programm anbietet, nämlich die Verfahren 1 bis 5 einzuschalten und auf das sechste Verfahren (Startadresse) zu verzichten. Dann werden mit 100 prozentiger Treffer- und praktisch Null-prozentiger Fehlerquote alle wirklich identischen Files unabhängig von ihrer Startadresse angezeigt. Die Auswahl beenden Sie mit der Taste . Drücken Sie , wird in den Automatikmodus geschaltet. Ist dieser aktivert, wartet das Programm im Folgenden nicht mehr auf Eingaben des Benutzers, sondern gibt automatisch alle möglichen Daten auf dem Drucker aus. Dieser Modus kann nicht gewählt werden, wenn Sie mehr als eine Diskette gewählt haben, da dann zum Diskwechsel eine Taste gedrückt werden muß. In diesem Fall reagiert der Computer nicht auf . Jetzt werden alle gewählten Files gescannt. Dies kann je nach Filelänge einige Zeit dauern. Diskettenfehler werden auch jetzt angezeigt, führen allerdings in dieser Phase nicht zum Abbruch, sondern zu der Alternative »Weiter« (Taste ) oder »Abbruch« (Taste ). Wird die Taste betätigt, fährt das Programm mit dem nächsten File fort, das übersprungene Files wird als gesperrt gekennzeichnet und nicht für die Zwillingsprüfung verwendet. Immer, wenn Sie beim Einlesen der Directories die Diskette wechselten, erscheint an dieser Stelle jetzt die Aufforderung, eben solches wieder zu tun. Achten Sie peinlich genau auf die Reihenfolge der Diskette, wird versehentlich eine falsche Diskette eingelegt, zeigt das Programm eine »FILE NOT FOUND«-Meldung an. Legen Sie dann erst die richtige Floppy ein, kann das betroffene File nicht mehr gescannt werden und erhält den Sperrvermerk. Nachdem alle Files gescannt sind, erscheint ein kleines Menü. Sie haben jetzt die Möglichkeit, alle Files in einer Gesamtübersicht auf dem Bildschirm (Taste ) oder dem Drucker (Taste ) auszugeben. In dieser Übersicht folgen hinter dem Namen die Startadresse, die Länge in Byte, die um eins erhöhte errechnete Endadresse und die vier Prüfsummen (alle Angaben hexadezimal). Wird die Übersicht auf dem Schirm ausgegeben, fehlen aus Platzgründen die Prüfsummen. Außerdem müssen Sie hier nach der Ausgabe und ca. alle 22 Zeilen eine Taste drücken. Gesperrte Files (bei denen Fehler beim Scanning auftraten) erkennen Sie schon in der Übersicht an einem entsprechenden Vermerk an Stelle der Startadresse und Länge. Ist der Automatikmodus eingeschaltet, gibt der C 64 die Liste automatisch auf dem Drucker aus. Nach der Ausgabe der Liste oder dem Überspringen mit der Taste kommen Sie jetzt in das Menü des eigentlichen Zwillingsfinders. Dieser kann sein Ergebnis wiederum auf dem Drucker (Taste oder wenn der Auto-Modus eingeschaltet ist) oder Schirm (Taste ) ausgeben. Weiter besteht hier die Möglichkeit, mit der Taste abzubrechen, die Taste führt zurück in die Gesamtübersicht, und die Taste startet das Utility neu. Bei Anwahl der Twin-Find Funktion vergleicht der Computer jede Prüfsumme mit allen anderen gespeicherten Prüfsummen, oder, besser gesagt, nur diejenigen, die Sie bei der Verfahrensauswahl eingeschaltet haben. Werden Übereinstimmungen festgestellt, gibt der Computer dies aus. Am Ende der Liste erscheint die Gesamtzahl der geprüften Files und die Anzahl der Unikate, also jener Files, die nur genau einmal auftauchten. In der Überschrift dieser Liste werden auch die Verfahren aufgeführt, nach denen sie zusammengestellt wurde. Bei der Bildschirmausgabe soll auch hier ca. alle 22 Zeilen eine Taste gedrückt werden, um ein »Durchscrollen« der Liste zu vermeiden. Danach befindet sich das Programm wieder im »Twin-Menü«, ein eventuell aktivierter Automatik-Modus wird abgeschaltet. Sie sehen, das »TSS« ist ein komfortables, vielseitiges und praktisches Utility, das Sie sicherlich gern einsetzen werden. Im folgenden noch die Speicherbelegung (gültig für die Version 2.1, hexadezimal): 0002-0003 temporär 0004-0005 Zeiger für $0e3e 0006 Flag: Automatik 00a6 Modus (gewählte Verfahren) 00a7 momentan bearbeitetes File 00a8 File, mit dem dieses momentan verglichen wird 00a9 Devicenummer für Ausgabe der Liste 00aa Speicher für X-Register 00ab Stackpointerspeicher 00b0 Highbyte für $0fc4 00b1 Flag: Hilfsmenü bei Diskfehler 00b2-00b3 Endadresse 00b4 Zeilennummer für Scrolling 00b5-00b6 Speicher für $0002/3 00f7-00f8 Zeiger auf Datenbereich/Hilfsspeicher für Directory 00f9 Anzahl der Files 00fa gelesenes File-Byte 00fb Anzahl der Disketten 00fc Anzahl der Duplikate eines Files 00fd Anzahl der Duplikatsgruppen 00fe Anzahl Dubletten insgesamt 02c0-02c7 Prüfsummen des aktuellen Files 0334-0339 Zwischenspeicher für Berechnung der Prüfsummen 0801-08d0 Basic-Lader 08d1-16ac Programm »TSS 2.1« 08d1-08d3 Sprung zur Hauptroutine bei $1118 08d4-0e10 Texte 0e11-0e25 Filenamen für Directory und Fehlerkanal 0e26-0e2d Zweierpotenzen 0e2f-0e3d Hexzahlen 0e3e-1117 Hilfsroutinen 0e3e Routine: String ausgeben 0e54 auf Taste warten 0e5f Diskfehler 0e97 Programmabbruch 0fc4 berechnet Zeiger auf Filenamen und Datenbereich 0fff Verfahren ausgeben 1021 Duplikate ausgeben 10a1 Directory zeigen 1118-16ac Hauptprogramm 1118 Start Hauptprogramm 118d Directory lesen 1252 Verfahren wählen 12d3 Files scannen 134a Prüfsummen bilden 13b9 Menü für Gesamtübersicht 13e7 Gesamtübersicht ausgeben 150a Menü für Duplikat-Suche 154c Duplikate suchen 1684 Endadresse ausgeben 1697 Bildschirm-Scroll-Stop 16ac letztes Programmbyte 6e00-6eff Flags: File bereits mit anderen verglichen 6f00-6fff Flags: File gesperrt 7000-8099 Speicher für 250 Filenamen 8100-88d0 Speicher für 250 mal 6 Prüfsummen (je acht Bytes) 8e00-8eff Tabelle mit den Nummern der Kopien eines Programmes 8f00-8fff Filenummern mit Diskettenwechsel