Umgang mit Bildern
Umgang mit Bildern

Bilder im Textmodus laden und speichern

Bilder im PETSCII-Format:

PETSCII-Art
Bild 1: Uptown/4gente

PETSCII-Art
Bild 2: Among the living/4gente
Die einfachste Möglichkeit, Bilder auf einem C64 anzuzeigen, sind die PETSCII-Bilder. Sie bestehen aus geschickt eingesetzten Zeichen des C64-Zeichensatzes und deren kluger Einfärbung (s. Bilder 1 und 2, mehr dazu auf dieser Seite).

In TSB sind für diese Art Bilder die Befehle SCRLD und SCRSV ("Screen Load" und "Screen Save") zuständig. Sie arbeiten mit Dateien, die insgesamt 2048 Bytes enthalten (9 Blocks auf Disk), je eine Hälfte Textzeichen und Farben. Auf der TSB-Diskette befindet sich dazu das Demo-Programm "screens.dmo". Zum Datenformat hier mehr.

Bilder in gängigen Grafikformaten laden und speichern

Seit Version 2.20515 ist TSB auch in der Lage, ohne Weiteres mit einigen verbreiteten hochauflösenden Grafikformaten umgehen zu können: Standard-Bitmap, Doodle und Hi-Eddi im Hires-Bereich und Blazing Paddles sowie Artist64 im Multicolor-Bereich. Damit können sowohl gängige Bilder nach TSB importiert, wie auch TSB-generierte Bilder in gängige Formate exportiert werden. Hier einige Beispielbilder.

Ergänzend zu einer Überarbeitung der beiden bereits genannten Befehle SCRLD und SCRSV (unten auf dieser Seite mehr dazu, unter Vorgeschichte) braucht es dazu noch die "Zulieferer" SCRLD DEF und SCRSV DEF. Mit diesen Befehlen grenzt man genauer ein, was man genau tun möchte.

Dabei muss man wissen, dass SCRSV und SCRLD beim Speichern bzw. Laden die Daten pageweise (in Blöcken zu je 256 Bytes) verarbeiten. Daher ist es etwas umständlicher, ein Bild zu laden, wenn ein Grafikformat die Daten nicht pageweise abspeichert. Ein solches Grafikformat ist das Koala-Format (Multicolor). TSB kann es nicht mit dem SCRSV-Befehl abspeichern, und Laden mit SCRLD geht nur über einen Umweg (entweder mithilfe einer REU, vor allem wegen der Arbeitsgeschwindigkeit, oder auch mit der TSB-Blockverschieberoutine). Das geht so (REU-Version):

Koala-Bilder laden

Bilder im Koala-Format:

Koala
Bild 3: Eye of the Pirate/Facet
Koala-Bilder brauchen einen "Zwischenstopp". Man lädt sie an eine ungenutzte, groß genug dimensionierte Stelle in den Speicher, z.B. nach $2000 mit: load "koalabild",use,0,$2000 (die Daten reichen dann bis $4711) oder mit scrld def $20,40,0,3: scrld 1,use,3,"koalabild": scrld restore (dann reichen die Daten bis $47FF). Wenn das Hauptprogramm diesen Ort nicht zulässt, da dadurch Programmvariablen oder sogar Programm-Code in Mitleidenschaft gezogen würden, müsste man die Bilddaten auf herkömmliche Art byteweise laden und dabei direkt verteilen.

Letztendlich: Das Bild liegt nun an $2000, dies ist der Code, wie es weitergeht:

...
230 hires1,0: multi on: koala
240 do null
300 nrm: color 11,12,0
310 end

1300 proc koala
1310  memdef 8000,$2000,    0,4:    memsave
1320  memdef 1000,$3f40, 8000,4:    memsave
1330  memdef 1001,$4328, 9000,4:    memsave
1340  memdef 8000,$e000,    0,4:    memload
1350  memdef 1000,$c000, 8000,4:    memload
1360  memdef 1000,$d800, 9000,4,128:memload
1370  memdef    1,$d021,10000,4,128:memload
1380 end proc

(Die Einrückungen nur wegen der Übersichtlichkeit.)

Am Anfang wird der Grafikbildschirm (gleich im Multicolor-Modus) eingeschaltet (Z. 230). Dann beginnt die Verarbeitung der Bilddaten (in der Prozedur "koala").

Zuerst schicken wir alle 10001 Daten des geladenen Koalabildes in die REU (hier nach Bank 4 ab Adresse 0, Z. 1310 bis 1330), hier doch aufgesplittet, damit wir einen besseren Überblick behalten (muss aber nicht, es könnten alle 10001 Bytes in einem Rutsch in die REU geschaufelt werden und wir könnten uns die Zeilen 1320 und 1330 sparen). Von dort aus lagern wir die Einzelteile des Bildes an die für TSB erforderlichen Stellen um: die Bitmap nach $E000 (Z. 1340), die gemeinsamen Multifarben nach $C000 (Z. 1350), die individuellen Pixelfarben nach $D800 (Z. 1360) und die Hintergrundfarbe nach $D021 (Z. 1370). Und dann warten wir in Z. 240 auf einen Tastendruck zum Beenden der Anzeige. Fertig. So lädt man Bildformate, die eigentlich einen für TSB ungünstigen Aufbau haben (man muss diesen Aufbau nur kennen).

Auf der TSB-Diskette findet sich das Programm "image viewer.dmo", das Bilder der Formate Hi-Eddi, OCP Art Studio (Hires/Multi), Doodle und Koala anzeigt. Dort kann man sich im Quellcode anschauen, welche anderen Code-Einstellungen dafür genommen werden müssen (der Code-Schnippsel oben zu Koala ist dort entnommen und hier leicht modifiziert worden).

<nach oben>


Tabelle der Möglichkeiten

Was kann man in TSB mit Grafik tun?


PETSCII-Formate Laden Speichern
TSB-Format
(Hintergrundfarbe bg im Bildernamen)
SCRLD 1,dr,2,"name bg"
bg=val(right$("name bg",2))
color 16,bg and 15
name$="name"+STR$(bg)
SCRSV 1,dr,2,name$+",p,w"
BYP-Format
(Hintergrundfarbe bg an $C3FF)
SCRLD 1,dr,2,"name"
bg=peek(display+1023)
color 16,bg and 15
POKE $C3FF,bg
SCRSV 1,dr,2,"name,p,w"

Hires-Formate Laden Speichern
TSB-Format SCRLD 1,dr,5,"name" SCRSV 1,dr,5,"name,p,w"
Bitmap (monochrom) SCRLD 1,dr,3,"name" SCRSV 1,dr,3,"name,p,w"
Zeichensätze nach MEM
(2048 Bytes lang, nach $E000)
SCRLD DEF $E0,8,0,3
SCRLD 1,dr,3,"name"
SCRSV DEF $E0,8,0,3
SCRSV 1,dr,3,"name,p,w"
Hi-Eddi (mit Farbe, 37 Blocks) SCRLD DEF $C0,4,1,2
SCRLD 1,dr,5,"name"
SCRSV DEF $C0,4,1,2
SCRSV 1,dr,5,"name,p,w"
Doodle Doodle laden mit SCRLD
nicht in einem Durchgang
möglich (Grund: Bitmap
kommt nicht zuerst)
SCRSV DEF $C0,4,1,2
SCRSV 1,dr,2,"name,p,w"
SCRSV DEF $E0,32,2,3
SCRSV 1,dr,3,"name,p,a"

Multicolor-Formate Laden Speichern
TSB-Format SCRLD 1,dr,5,"name"
(Hintergrundfarbe aus
dem letzten Byte d. Video-
rams auslesen: $C3FF)
SCRSV 1,dr,5,"name,p,w"
(Hintergrundfarbe im
letzten Byte d. Videorams
vermerken: $C3FF)
Bitmap (Multicolor) SCRLD 1,dr,3,"name" SCRSV 1,dr,3,"name,p,w"
Blazing Paddles
(auch Artist64)
Blazing Paddles laden mit
SCRLD nicht in einem
Durchgang möglich (Farbram
wird nicht mitgeladen)
SCRSV DEF $C0,4,1,2
SCRSV 1,dr,5,"name,p,w"
SCRSV DEF $D8,4,2,2
SCRSV 1,dr,2,"name,p,a"

Zusammenhängende Daten
(z.B. Zeichensätze)
Laden Speichern
vier Pages
(1024 Bytes, hier: ab $C000)
SCRLD DEF $C0,4,0,3
SCRLD 1,dr,3,"name"
SCRSV DEF $C0,4,0,3
SCRSV 1,dr,3,"name,p,w"
auch: ein Basic-Programm
(hier: 3 KB lang)
SCRLD DEF $08,12,0,3
SCRLD 1,dr,3,"name"
SCRSV DEF $08,12,0,3
SCRSV 1,dr,3,"name,p,w"

Wichtig: Alle mit SCRSV/SCRLD DEF vorgenommenen Einstellungen müssen nach Ausführung des zugehörigen SCRSV/SCRLD-Befehls mit der Anweisung SCRSV/SCRLD RESTORE wieder auf die Vorgabewerte zurückgestellt werden. Die SCR-Befehle können alle - anders als LOAD - mitten im laufenden Programm verwendet werde, ohne den Programmlauf damit zu beenden oder zu unterbrechen.

<nach oben>


Vorgeschichte

Ursprünglich waren SCRSV und SCRLD in Simons' Basic Befehle, die dazu dienten, Textbildschirme und deren Farben (sogenannte Bildschirmmasken) abzuspeichern bzw. zu laden. Sehr früh schon veröffentlichte dann Hans Haberl (der Autor von Print- und Pagefox) einen Patch für die Befehle, der es erlaubte. auch Bitmaps (ohne Farben) auf Diskette zu bringen. Dieser Patch wurde in TSB übernommen.

Dann tat sich lange Zeit nichts, bis ich auf die Idee kam, mit ein paar POKEs die Eigenschaften der gespeicherten bzw. geladenen Daten zu modifizieren (siehe die vier Möglichkeiten bei den Tipps zu Zeichensätzen). Schließlich ergänzte Peter Hagemann den Reigen an zusätzlichen SCRSV-Fähigkeiten mit der Einführung der Sekundäradresse 5 für das Speichern von Bitmaps einschließlich ihrer Farben.

Nicht überschaubare POKE-Wüsten würden den Spaß an diesen neuen Fähigkeiten sicherlich verderben, daher setzte Peter Hagemann schließlich noch zwei neue TSB-Befehle oben drauf, die dem Programmierer die POKEerei abnehmen: eben SCRSV/SCRLD DEF und SCRSV/SCRLD RESTORE.

<nach oben>