Bilder im Textmodus laden und speichern
Bilder im PETSCII-Format:

Bild 1: Uptown/4gente
Bild 2: Among the living/4genteDie 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:

Bild 3: Eye of the Pirate/FacetKoala-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).
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.
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.