von Tim-Philipp Müller Hallo und herzlich willkommen zur neuesten Programmer's Corner II! (Dieter-Thomas Heck und Konsorten hätten Euch nicht besser begrüßen können.) Alle reden vom Sommerloch, wir unter- nehmen etwas dagegen. Heute im Angebot: Ein KOALA-Bild-Loader und als absolutes Special eine KOALA-Save-Routine! Die Routinen sind diesmal leider nicht in Turbo-Basic, da dieses für unsere Zwecke doch etwas langsam ist. Wer's nicht glaubt, soll KOALLOA.TBS laden... Dafür gibt's aber QUICK 2.0-Sources. (Auch Nicht-Quick-Programmierer werden das im Atascii-Format abgelegte Listing schnell durchschauen.) Wenn Sie ein frisch gezeichnetes Graphics-15 (Gr.8)- Bild auf Diskette bannen wollen, ist es meist immer das gleiche: Egal, was man gezeichnet hat- und sei es ein leerer Screen, auf der Disk werden 62 Sektoren 'verbraucht'. Natürlich gab es bald ein paar pfiffige Kerle, die sich eine einfache, aber effektive, Crunch-Routine geschrieben haben. Anfangs verwendeten nur die zwei 'Maltafel'- Programme (AtariArtist und KoalaPad) dieses Bild-Format, heute ist es gang und gebe. Tja, wie wird denn nun komprimiert? Anstatt 6+6+6+6+6+6+6 kann man auch 7*6 schreiben. 1+2+3+5+7+11 hingegen kann man natürlich nicht mehr so schön zusammenfassen. Die Routine arbeitet auf Byte-Basis und faßt gleiche Blöcke zusammen, ungleiche Blöcke werden so gelassen wie sie sind. Es gibt zwei (sinnvolle) Arten, Koala- Pictures auf dem Bildschirm aufzubauen (und von diesem zu saven), und zwar: 1.- Angefangen wird links-oben in der Ecke. Nun geht's zum unteren Bildrand, wobei immer eine Zeile übersprungen wird. Ist man unten angekommen, werden die ausgelassenen Zeilen gefüllt. Dann erst geht's in der nächsten Spalte nach dem gleichen Prinzip weiter. Das Überspringen der Zeilen ermöglicht es, auch die oft verwendeten Karo- Muster (ein Punkt weiß- einer blau..) zu komprimieren: wBwBwBwBwBwBwBwB BwBwBwBwBwBwBwBw wBwBwBwBwB.... BwBwBwBwBw.... Wie sie bemerkt haben, ist jede 2.Zeile identisch. 2.- Angefangen wird wieder links-oben in der Ecke. Nun geht's weiter nach rechts ans Ende der Zeile und dann am Anfang der nächsten Zeile weiter.... (dieses Format taucht aber nur selten auf.) Die ersten 27 Bytes eines KOALA-Files enthalten einen Info-Header, dessen Bytes folgende Bedeutung haben: 0-6 konstant: $FF,$80,$C9,$C7,$1A,0,1 7 Bildaufbau-Art (1 oder 2, s.oben) 8 Grafikstufe (15 oder 8) 9+10 Anzahl Spalten (0,40 - HI+LO !!) 11+12 Anzahl Zeilen (0,192 - HI+LO !!) 13-17 Colour 0-4 (Register 708-712) 18+19 Gesamtlänge der Daten (LO+HI) 20-26 konstant: 0,0,$9B,$9B,$9B,$9B,$A2 (Beachtet werden meist nur das 7.Byte und die Farb-Bytes...) Nun folgt ein Byte,dessen ersten 7 Bits eine Länge x darstellen, das 7.Bit($80) gibt an, ob gefüllt werden soll (dann handelt es sich um komprimierte Daten) oder nicht. Ist die Länge gleich 0, werden zwei weitere Bytes eingelesen, die eine 16-Bit Länge darstellen. Das erste Byte ist hierbei das HI-, das zweite das LO- Byte. Soll gefüllt werden (Füll-Flag=0), wird das nächste Byte der Datei x-mal (x war die eingelesene Länge) in die jeweils nächste Position des Screens gepoket (je nach Bildaufbau). Soll nicht gefüllt werden, wird x-mal das nächste Byte aus der Datei in die nächste Position des Screens gebracht. Das war eigentlich auch schon alles... Noch ein Wort an alle, die meinen, das Einladen von Koala-Bildern sei ein 'lahmer und nerviger' Vorgang- auch in Maschinensprache. Dieser Einschlaf- Effekt entsteht dadurch, daß jedesmal beim Auslesen eines neuen Bytes erst durch die CIO, dann durchs DOS ge- sprungen werden muß. Lädt man z.B. gleich zwei Sektoren (250 Bytes/SD) in einen eigenen Zwischenbuffer, geht das ganze gleich rasanter vonstatten (siehe QUICK-Routine). Ideal wäre es, alle Daten gleich in einen Buffer zu lesen, wie z.B. bei Screendump II. (bei kurzen Programmen oder Intros ist dazu ja allemal genug Platz im RAM. Und ein KOALA-File kann nie länger sein (in Sektoren gemessen) als ein Micropainter-Picture...) Good Byte