Das Programm in diesem Ordner "live.asm" simuliert das Wachstum von Zellen auf dem Bildschirm. Versuchen Sie, daß Programm uz optimieren und schneller zu machen. Die Regeln der Fortpflanzung sind folgende: Als Austragungsort für das Spiel dient ein unendlich großes zweidimensionales Feld aus quadratischen Zellen, wie ein unendliches Schachbrett. Jede Zelle hat acht Nachbarfelder (orthogonal+diagonal) und kann zwei verschiedene Zustände annehmen: »lebend« oder »tot«. Über dem Ganzen schwebt eine imaginäre Uhr (globaler Taktgeber), bei jedem Tick dieser Uhr erfolgt ein Wechsel zur nächsten (Life-)Generation. Bei jedem Generartionswechsel berechnet der Computer einen neuen Zustand. Die folgenden Regeln beschreiben den Übergang: 1. Geburt - eine tote Zelle mit genau drei Nachbarn geht in den Zustand »lebend« über; 2. Überleben - eine lebende Zelle mit zwei oder drei Nachbarn lebt weiter; 3. Tod - alle anderen Zellen sterben. Wichtig ist, daß alle Änderungen simultan durchgeführt werden. Leider läßt sich auf unserem Amiga kein unendlich großes Feld realisieren, daher müssen in dieser Beziehung Einschränkungen gemacht werden. Bei dem veröffentlichten Programm beschränken wir uns auf ein 255*255 Zellen großes Feld, für die Behandlung der Ränder ergeben sich dabei zwei Möglichkeiten: 1. Alle außerhalb des Feldes liegenden Zellen werden als leer angesehen. 2. Die gegenüberliegenden Ränder werden miteinander verheftet, man erhält einen Torus. Das heißt, ein Objekt, welches das Feld auf der einen Seite verläßt, taucht auf der anderen Seite wieder auf. Wir behandeln in unserem Listing nur den ersten Fall, mit geringfügigen Änderungen erhält man aber auch Fall 2. So seltsam es klingen mag, der zweite Fall ist sogar der einfachere. Kommen wir zu den Umsetzungsmöglichkeiten. Die einfachste Methode besteht darin, alle 255*255 Felder zu durchlaufen und für jede Zelle festzustellen, wie viele ihrer acht Nachbarfelder belegt sind. Damit kommt man dann locker auf eine halbe Millionen Tests, über den hierfür erforderlichen Zeitverbrauch schweigen wir uns lieber aus. Man kann aber auch den Spieß umdrehen: Es werden zwar wiederum alle Zellen durchlaufen, aber nur, wenn man auf eine lebende Zelle stößt, addiert man zum Inhalt ihrer Nachbarfelder jeweils eine 1. Nach Bearbeitung aller lebenden Zellen enthält jedes Feld die korrekte Anzahl von Nachbarn. Dieses Verfahren bringt in der Regel schon einen erheblichen Zeitgewinn, ist aber noch nicht der Weisheit letzter Schluß. Bei genauerer Betrachtung fällt auf, daß eigentlich nur die lebenden Zellen von Interesse sind, denn nur in deren unmittelbaren Nachbarschaft kommt es zu Veränderungen. Das kann zu einer weiteren Optimierung genutzt werden, und damit sind wir auch schon bei unserem Listing angekommen: TURBOLIFE.asm. Die Umsetzung erfolgt aus verständlichen Gründen in Assembler, denn in BASIC bleibt einem bei solchem Rechenaufwand nur: Abwarten und Teetrinken. Turbolife öffnet zu Beginn einen 320*256 großen Screen und färbt sein Anzeigefeld schwarz. Anschließend werden die beiden Arbeitsstapel und ein 256*256 Byte großes Arbeitsfeld initialisiert. Jetzt kann eine LIFE-Konfiguration aus dem Datenfeld eingelesen werden. Durch Drücken der rechten Maustaste wird das Spiel gestartet, durch Drücken der linken Maustaste abgebrochen. Zuerst wird Stapel1, der alle lebenden Zellen einer Generation enthält, abgearbeitet. Es wird eine Adresse vom Stapel1 genommen und diese sowie die Adressen ihrer Nachbarn werden auf den Stapel2 gelegt. Mit Hilfe eines Flags ve rhindern wir, daß eine Adresse mehrmals auf Stapel2 abgelegt wird. Im Arbeitsfeld wird nun zum Inhalt jeder Nachbarzelle eine 1 addiert, so erhält man am Ende die Anzahl der Nachbarn für jede Zelle. Nachdem alle Zellen von Stapel1 bearbeitet wurden, folgt anschließend die Untersuchung der Zellen von Stapel2. Auf diesem Stapel liegen jetzt alle lebenden Zellen sowie deren Nachbarzellen, also genau die Menge, für die eine Berechnung aufgrund der Übergangsregeln notwendig ist. Alle Zellen die außerhalb des Nachbarschaftsbereichs der lebenden Zellen liegen, sind uninteressant und werden bei diesem Verfahren nicht beachtet. Das führt zu einem enormen Geschwindigkeitszuwachs gegenüber den sonst üblichen Verfahren in der LIFE-Programmierung, und selbst das pfeilschnelle (Blitter-)LIFE von Thomas Rokiki hat bei einer weniger dichten Besiedlung des Felds (einige hundert Zellen) klar das Nachsehen. Die Gleiterkanone wird z.B. mit über 50 Generationen pro Sekunde abgearbeitet. Größere Mengen lebender Zellen lassen das Programm natürlich langsamer werden, das Tempo ist aber auch dann noch sehr hoch. Das Programm wurde mit dem PD-Assembler A68K erstellt, doch ist es mit anderen Assemblern ebenso übersetzbar. Am Programmende befinden sich die Daten von drei Beispiel-Konfigurationen. Um eine Konfiguration auszuwählen, müssen Sie die Daten ohne Kommentarzeichen ";" eingeben, die nicht genutzten Daten anderer Konfigurationen sind dagegen mit diesem Zeichen zu versehen. Die ersten beiden Werte bestimmen die Bildschirmposition der Konfiguration, der dritte Wert gibt die Anzahl der noch folgenden Datenworte an. Mit diesen Datenworten werden die Konfigurationen auf Bitebene beschrieben. Beispiel (r-Pentomino): ** 0011 3 ** ergibt 0110 oder 6 * binär 0010 2 Da die Datenworte 16 Bit-Werte sind, kann eine Konfiguration bis zu 16 Zellen breit seien. Die Länge (der dritte Wert) ist, gemessen an der Feldgröße, unbeschränkt. Für größere Breiten (32 Bit) bedarf es nur weniger Programmänderungen. Viel Spaß beim Experimentieren.