SCRSV (TSB)

Aus C64-Wiki
Zur Navigation springenZur Suche springen
SCRSV (TSB)
Syntax: SCRSV <fn>,<dr>,<sa>,<name>+",<ft>,W"
Parameter
fn: Dateinummer
dr: Laufwerk
sa: Sekundäradresse (2, 3 oder 5)
name: Dateiname
ft: Dateityp (U, S, P)
Einordnung
Typ: Anweisung
Kontext: Ein- / Ausgabe
Aufgabe: speichert einen Textbildschirm oder eine Grafik
Abkürzung: sC
Token: $64 $6d (100 109)
Verwandte Befehle
SCRLD - MERGE - LIN - LOAD - SAVE -

Dieser Artikel beschreibt das TSB-Schlüsselwort SCRSV (TSB).
Das entsprechende Simons'-Basic-Schlüsselwort lautet ebenfalls SCRSV.

Typ: Anweisung
Syntax: SCRSV <fn>,<dr>,<sa>,<name>+",<ft>,W"

Beschreibung[Bearbeiten | Quelltext bearbeiten]

1. Alternative

Siehe den gleichlautenden Simons'-Basic-Befehl SCRSV, allerdings sollte dann die Sekundäradresse 0 oder 2 (oder eine beliebige gerade Zahl) lauten. Diese Alternative speichert den Textbildschirm inklusive seiner Farben (zusammen 2048 Bytes in 9 Disk-Blöcken). Das Dateiformat unterscheidet sich von dem des SCRSV in Simons' Basic: die Reihenfolge der gespeicherten Bytes ist anders und die Startadresse wird mitgespeichert.

2. Alternative

Der TSB-Befehl SCRSV ist zusätzlich in der Lage, das aktuelle Grafikbild abzuspeichern. Dazu muss die Sekundäradresse ungerade sein. Es gibt zwei Versionen:

  1. Mit der Sekundäradresse <sa> "3" sichert man nur die Bitmap. TSB speichert 8192 Bytes, d.h. den kompletten Grafikpuffer (unter TSB ab $E000), und erzeugt eine 33 Blöcke große Datei. Siehe dazu das Beispiel Bitmap speichern.
  2. Bitmap und Farben sichert man mit der Sekundäradresse <sa> "5". Zusätzlich zu den 8192 Bytes der Bitmap werden hierbei auch die Farbinformationen aus dem Farb-RAM und dem Video-RAM gespeichert, weshalb TSB hier eine 41 Blöcke große Datei erzeugt. Bei Bildern im Multicolor-Modus muss man nachvollziehbar die Hintergrundfarbe (die nicht mitgespeichert wird) vermerken, am besten im Dateinamen der Bilddatei oder an einer ungenutzten Stelle innerhalb der Datei, damit die Farbnummer nicht in Vergessenheit gerät. Siehe dazu das Beispiel Grafik mit Farben speichern.
Diese Option steht seit TSB 2.20220 zur Verfügung.

Die Dateiformate von TSB und von HSAVE aus Simons Basic Extension sind nicht identisch.

Beachten:

  • Entgegen der TSB-Eigenschaft, bei Befehlen, die die Floppy-Laufwerke ansprechen, die Gerätenummer wegfallen lassen zu können, muss sie bei SCRSV (genau wie bei OPEN) ausdrücklich mit angegeben werden. Intern greift TSB jedoch immer auf das mit USE eingestellte Laufwerk zu. Ist es nicht vorhanden, produziert dieser Zugriff einen Floppy-Error.
  • Das Bandlaufwerk (Datassette) wird unterstützt, wenn man vor dem Abspeichern die Adresse des Kassettenpuffers ($033C in $B2/$B3) mit D!POKE $B2,$033C rekonstruiert.
  • Ein Dateityp muss nicht zwingend angegeben werden. Fehlt die Angabe, wird eine PRG-Datei erzeugt.
  • Ist die angegebene Datei bereits auf der Diskette vorhanden, wird sie nicht überschrieben, das Speichern wird nicht ausgeführt. Um dies anzuzeigen, muss der Fehlerkanal ausgelesen werden (siehe Beispiele).
  • Wird das Farb-RAM von SCRSV benutzt, sollte man nicht aus dem Textmodus heraus speichern, da durch die Befehlseingabe das Farb-RAM verändert werden kann.

Erweiterte Nutzung[Bearbeiten | Quelltext bearbeiten]

Die beiden zusätzlichen (ab TSB v2.20515 verfügbaren) Befehle

erweitern die Möglichkeiten von SCRSV (TSB). Sie funktionieren durch Modifikation der SCRLD/SCRSV-Routine und machen damit die sonst nötigen POKEs überflüssig.

Mit SCRSV DEF kann man Modifikationen mit den folgenden Wirkungen erstellen:

  • Die Startadresse wird beim Speichern im Append-Modus weggelassen
  • Die Anzahl der 256-Byte-Blöcke (Pages) für die Bitmap-Größe wird von 32 auf einen selbst gewählten Wert gesetzt
  • Die Anzahl der 256-Byte-Blöcke für das Video-RAM bzw. Farb-RAM wird von 4 auf einen selbst gewählten Wert gesetzt
  • Die Verarbeitung des Farb-RAMs wahlweise unterdrücken
  • Das High-Byte der Speicheranfangsadresse vom Video-RAM wird von $04 auf einen selbst gewählten Byte-Wert gesetzt
  • Das High-Byte der Speicheranfangsadresse der Bitmap wird von $E0 auf einen selbst gewählten Byte-Wert gesetzt

Wie das im Einzelnen geht, ist bei der Beschreibung der Parameter in SCRSV DEF erklärt.

Mit SCRSV RESTORE werden alle Werte wieder zurückgesetzt.

Eine typische erweiterte Nutzung hat dann die folgende Form:

SCRSV DEF hi,bl,m,sa
SCRSV 2,8,2,"dateiname,P,W"
SCRSV RESTORE
  • Es ist wie bisher möglich, eine Grafik in zwei Dateien zu speichern, die erste für die Bitmap, die zweite (mit einer Dateilänge von 9 Blöcken) für die Farben. Siehe dazu das Beispiel Grafik in zwei Dateien speichern.
  • Tatsächlich kann man aber auch zwei SCRSV-Durchgänge in eine Datei speichern, indem der zweite mit dem Namensanhang ",P,A" für "Append" durchgeführt wird. Allerdings muss bei der anzuhängenden Datei die Ausgabe der Startadresse unterdrückt werden, was mit dem Modus 2 im Befehl SCRSV DEF erledigt wird. So kann man z.B. das Format für Doodle-Bilder (Video-RAM + Bitmap) erzeugen. Siehe dazu das Beispielprogramm Doodle-Grafik speichern mit TSB.
  • Der Bildschirmspeicher ab $CC00, wo er nach MEM liegt, kann mit Hilfe von SCRSV DEF gesichert werden. Siehe dazu das Beispiel Textbildschirm speichern nach MEM.
  • Wenn man in SCRSV DEF mit dem Modus 1 die Verarbeitung des Farbbereichs 1 (Farb-RAM) unterdrückt, kann man ein Bild im Format von Hi-Eddi+ speichern. Es belegt auf der Diskette 37 Blöcke. Siehe dazu das Beispiel Hi-Eddi+-Grafik speichern mit TSB.
  • Mit Hilfe von SCRSV DEF lässt sich ein beliebiger frei zugänglicher Speicherbereich von wählbarer Größe (in 256-Byte-Blöcken) - z.B. ein Zeichensatz - sichern. Angenommen, ein 2KB großer Zeichensatz liegt an Adresse $3000 im Speicher. Mit SCRSV DEF $30,8,1,3: SCRSV 3,8,3,"zeichensatz,P,W": SCRSV RESTORE kann er gesichert und jederzeit an eine beliebige andere Stelle zurückgeladen werden (mit SCRLD DEF und SCRLD).

Entwicklungsgeschichte[Bearbeiten | Quelltext bearbeiten]

SCRSV und SCRLD des originalen Simons' Basic sind nur für den Textbildschirm ab $0400. Die erste Erweiterung - die auch in TSB übernommen worden ist - wurde im 64'er-Magazin 3/85 veröffentlicht. Programmierer Hans Haberl hat die Möglichkeit, zusätzlich über die Wahl der Sekundäradresse auch die Bitmap speichern zu können, so implementiert, dass sie mit in den vorhandenen Speicherplatz (154 Bytes) von SCRSV und SCRLD passte. Um das zu erreichen, hat er (1.) die Save- und Load-Routinen in eine gemeinsame Programmschleife gepackt, und (2.) auch die Verarbeitung der Farbspeicher Video-RAM und Farb-RAM in einer Schleife statt in zwei getrennten erledigt.

  • Der erste Punkt ist der Grund dafür, dass SCRSV DEF und SCRLD DEF sowie SCRSV RESTORE und SCRLD RESTORE austauschbar sind und dass sämtliche Modifikationen sich immer sowohl auf SCRSV als auch auf SCRLD auswirken.
  • Der zweite hat zur Folge, dass das gespeicherte Grafikdatei-Format sehr eigentümlich und zu keinem anderen bekannten kompatibel ist. Nach der Bitmap (8192 Bytes) kommt der Farbspeicher (2×1024 Bytes) in einem "gemischten" Format: ein Byte aus dem Farb-RAM und eines aus dem Video-RAM. Wegen dieser Reihenfolge gibt es im Artikel SCRSV-LD DEF die Bezeichnungen "Farbbereich 1" und "Farbbereich 2". Die zusätzlichen Befehle sind nötig, wenn man Formate bekannter Grafikprogramme nutzen will. Doch selbst mit der erweiterten Nutzung gibt es einige Einschränkungen:
    • Da SCRLD immer die Bitmap zuerst lädt, kann kein Grafikformat geladen werden, das dies anders macht, wie z.B. Doodle.
    • Da wegen der nötigen Speicherplatz-Optimierung immer nur ganze Pages verarbeitet werden, können nur Dateiformate mit einem Bitmap-Bereich von 8192 Bytes und Farbbereichen von 1024 Bytes erzeugt bzw. geladen werden. Das als Quasi-Standard für Multicolor-Grafik geltende Koala-Format (8000 Bytes Bitmap, 1000 Bytes Video-RAM, 1000 Bytes Farb-RAM, 1 Byte Hintergrundfarbe) z.B. ist nicht dabei.

Erst nachdem durch umfangreiche Optimierungen von Arndt Dettke in TSB ausreichend neuer Speicherplatz frei geworden war, konnten weitere Entwicklungen erfolgen:

  • Grafik mit Bitmap und Farbe speichern bzw. laden per Sekundäradresse 5. Hierzu musste die Routine zur Bitmap-Verarbeitung ausgelagert werden, was zusätzliche 34 Bytes benötigte.
  • Zusätzliche Befehle SCRSV-LD DEF und SCRSV-LD RESTORE. Dies verbrauchte 74 und 33 Bytes.

GoDot Lader[Bearbeiten | Quelltext bearbeiten]

In GoDot gibt es (seit Mai 2022) Unterstützung für TSB-Bilder: den Lader ldr.TSB und den Saver svr.TSB. Man kann sowohl Hiresbilder als auch Multicolor-Bilder laden/speichern, sie werden beim Laden jeweils automatisch erkannt. Mit einem weiteren Lader (für Textbildschirme) kann man auch diese Bildschirmmasken bzw. PETSCII-Art-Bilder nach GoDot laden und in viele andere Formate konvertieren und auch in guter Qualität drucken.

Die Bilder müssen mit SCRSV und der Sekundäradresse 5 (wegen der Farben) gesichert worden sein, z.B.

SCRSV 1,dr,5,"Bildname,P,W"

Eine mit Sekundäradresse 3 gespeicherte Bitmap kann man mit in GoDot mit ldr.HiresBitmap oder ldr.MCBitmap laden.

Dateiformate[Bearbeiten | Quelltext bearbeiten]

Die Dateiformate besitzen keine Namenskennung und sind ungepackt. Sind beide Farbbereiche vorhanden (wie bei sa=2 oder sa=5), so ist der Farbteil 2048 Bytes groß und besteht abwechselnd aus einem Byte vom Farb-RAM und einem Byte vom Video-RAM.

Format Startadresse Bitmap Farb-RAM Video-RAM Blöcke auf Diskette
sa=2 Textschirm $0400 1024 Bytes 1024 Bytes 9
sa=3 Grafik Bitmap $E000 8192 Bytes 33
sa=5 Grafik Farbe $E000 8192 Bytes 1024 Bytes 1024 Bytes 41
sa=5 dto. ohne Farb-RAM (*1) $E000 8192 Bytes 1024 Bytes 37

(*1) Lässt sich nur mit POKE-Patches realisieren.

Beispiele[Bearbeiten | Quelltext bearbeiten]

Die hier aufgeführten Beispiele können in der vorliegenden Form ausgeführt werden. Besonders bequem geht das, wenn man mit dem Emulator VICE arbeitet und dort "Paste" (Reiter "Edit") benutzt:

  • TSB in VICE starten.
  • Kopieren des Programmbeispiels (aus dem Artikel, nicht aus dem Quelltext!)
  • Einfügen in einen geeigneten Texteditor - etwa Notepad++, in Kleinschrift wandeln und "Kopieren" ausführen.
  • Bei einem Doppelpunkt als erstem Zeichen hinter der Zeilennummer wird das Leerzeichen zwischen Zeilennummer und Doppelpunkt falsch dargestellt und muss noch einmal überschrieben werden.
  • Mit der Paste-Funktion den Programmtext in VICE einfügen. Der dort enthaltene Tokenizer generiert den passenden BASIC-Code.
  • Eventuell müssen noch nicht darstellbare Zeichen, die in geschweiften Klammern angegeben sind, im BASIC-Programm durch ihren korrekten Code ersetzt werden - wie z.B. {PI} in Zeile 140 vom Blazing Paddles Beispiel.

Textbildschirm speichern[Bearbeiten | Quelltext bearbeiten]

Normal[Bearbeiten | Quelltext bearbeiten]

Das Beispiel basiert auf dem im Simons' Basic Handbuch unter SCRSV angegebenen Programm.

100 CLS
110 FILL 6,10,20,4,160,2
120 FILL 10,10,20,4,160,1
130 FILL 14,10,20,4,160,6
140 WAIT 198,1
150 SCRSV 2,8,2,"TRICOLOR-TSB.SRC,P,W"

Zeile 150 sichert den Bildschirmspeicher auf die Diskette im mit USE (default: 8) definierten Laufwerk.

Mit einer Unterroutine, die den Fehlerkanal ausliest:

160 CLS: FEHLER
170 IF FF>0 THEN PRINT FF;FB$
180 END
190 PROC FEHLER
200 OPEN 1,8,15
210 INPUT#1,FF,FB$,SP,SE
220 CLOSE 1
230 END PROC

Nach MEM[Bearbeiten | Quelltext bearbeiten]

Nach MEM liegt der Bildschirmspeicher bei $CC00. Mit den in Zeile 150 durch SCRSV DEF definierten Werten sichert SCRSV diesen Bereich. In Zeile 152 wird SCRSV auf die Standardwerte zurückgesetzt.

100 MEM
110 FILL 6,10,20,4,160,2
120 FILL 10,10,20,4,160,1
130 FILL 14,10,20,4,160,6
140 WAIT 198,1
150 SCRSV DEF $CC,4,0,2
151 SCRSV 2,8,2,"TRI-CC.SRC,P,W"
152 SCRSV RESTORE
160 CLS: FEHLER
170 IF FF>0 THEN PRINT FF;FB$
180 END
190 PROC FEHLER
200 OPEN 1,8,15
210 INPUT#1,FF,FB$,SP,SE
220 CLOSE 1
230 END PROC

Bitmap speichern[Bearbeiten | Quelltext bearbeiten]

100 HIRES 15,0
110 FOR R=10 TO 90 STEP 5
120 CIRCLE 160,100,R,100-R,1
130 NEXT
140 COLOUR 12,12: WAIT 198,1
150 NRM: COLOUR 11,12: PRINT"SAVING ...";
160 SCRSV 3,8,3,"BITMAP3,P,W"
170 FEHLER
180 IF FF>0 THEN PRINT FF;FB$
190 END
200 PROC FEHLER
210 OPEN 1,8,15
220 INPUT#1,FF,FB$,SP,SE
230 CLOSE 1
240 END PROC

bitmap3.png

Grafik mit Farben speichern[Bearbeiten | Quelltext bearbeiten]

Das folgende Beispiel basiert auf einem Programm aus dem Buch Grafik auf dem C64 von Walter Bachmann.
Beachten: Vor dem Ausführen muss das {PI} in Zeile 130 durch π ersetzt werden.

100 REM--- TURTLE-MC-SAVE ---
110 HIRES 1,0: COLOUR11,0: MULTI10,8,2
120 A=10: B=A/1.6: AD=2: BD=AD/1.6
130 TD = 241: T=90:T0={PI}/180
140 REM TD:182/241/90.4
150 X0=90: Y0=100: C=1
160 REC 0,0,159,199,3
170 LOOP
180 : X = X0 + A*COS(T*T0)
190 : Y = Y0 + B*SIN(T*T0)
200 : EXIT IF X<0 OR X>159 OR Y<0 OR Y> 199
210 : LINE X0,Y0, X,Y, C
220 : X0 = X: Y0 = Y
230 : T = T + TD
240 : A = A + AD
250 : B = B + BD
260 : C=C+1:IF C>3 THEN C=1
270 END LOOP
280 COLOUR 12,0: WAIT 198,1: COLOUR11,0
290 REM --- SPEICHERN 
300 SCRSV 3,8,5,"TURTLE-MC,P,W"
310 NRM: COLOUR 11,12,0
320 END

turtle5.png

Grafik in zwei Dateien speichern[Bearbeiten | Quelltext bearbeiten]

Das Beispiel basiert auf dem im Simons' Basic Extension Manual unter HSAVE angegebenen Programm.

10 BG=0:HIRES 15,BG
20 FOR R=10 TO 90 STEP 5
30 CIRCLE 160,100,R,100-R,1
40 NEXT
50 COLOUR 12,12: WAIT 198,1: COLOUR 11,12
60 TSBSAVE
70 NRM: END
1500 PROC TSBSAVE
1510 SCRSV 1,I8,3,"IMAGE"+STR$(BG)+",P,W"
1520 SCRSV DEF $C0,4,0,2
1530 SCRSV 1,I8,2,"IMAGETOOLS,P,W"
1540 SCRSV RESTORE
1545 END PROC

Die Prozedur TSBSAVE speichert die Grafik samt Farben unter dem angegebenen Namen in zwei Dateien auf die Diskette von jenem Gerät, das mit USE festgelegt wurde. Der Wert der Variablen i8 wird hierfür nicht berücksichtigt. In Variable BG befindet sich die Nummer der Hintergrundfarbe.

Hi-Eddi+ Grafik speichern mit TSB[Bearbeiten | Quelltext bearbeiten]

Grafik im Format von Hi-Eddi+ speichern:

100 HIRES 15,0
110 FOR R=10 TO 90 STEP 5
120 CIRCLE 160,100,R,100-R,1
130 NEXT
140 COLOUR 12,12: WAIT 198,1
150 NRM: COLOUR 11,12
160 REM ---
170 CLS: PRINT"SAVING IMAGE ..."
180 SCRSV DEF $C0,4,1,2: REM KEIN FARBRAM
190 SCRSV 3,8,5,"HIRES5.HED,P,W"
200 SCRSV RESTORE
210 FEHLER
220 END
230 REM ---
240 PROC FEHLER
250 OPEN 1,8,15
260 INPUT#1,FF,FB$,SP,SE
270 IF FF>0 THEN CLS: PRINT FF;FB$
280 CLOSE 1
290 END PROC

Doodle Grafik speichern mit TSB[Bearbeiten | Quelltext bearbeiten]

Grafik im Doodle-Format speichern:

100 HIRES 15,0:LOW COL 2,0,0
110 REC 0,0,319,199,1
120 FOR R=10 TO 90 STEP 5
130 LOW COL 15,0,0
140 CIRCLE 160,100,R,100-R,1
150 NEXT
160 COLOUR 12,12: WAIT 198,1:COLOUR 11,12
170 REM --- VIDEO-RAM ---
180 SCRSV DEF $C0,4,1,2: REM HIRES VIDEO-RAM, KEIN FARB-RAM
190 SCRSV 2,8,2,"CIRCLES.DD,P,W"
200 SCRSV RESTORE
210 FEHLER:IF FF>0 THEN END
220 REM --- APPEND BITMAP ---
230 SCRSV DEF $E0,32,2,3: REM KEINE STARTADRESSE
240 SCRSV 3,8,3,"CIRCLES.DD,P,A"
250 SCRSV RESTORE
260 FEHLER
270 NRM:PRINT"IMAGE SAVED"
280 END
290 REM ---
300 PROC FEHLER
310 OPEN 1,8,15
320 INPUT#1,FF,FB$,SP,SE
330 IF FF>0 THEN DO
340 : NRM: COLOUR 11,12
350 : PRINT FF;FB$
360 DONE
370 CLOSE 1
380 END PROC

Das so erzeugte Bild kann nicht mit SCRLD geladen werden, da dabei immer die Bitmap am Anfang der Datei erwartet wird.

Blazing Paddles Grafik speichern mit TSB[Bearbeiten | Quelltext bearbeiten]

Die Turtle-Grafik malen und speichern im Blazing-Paddles-Format

  • Ab Zeile 310: Die Hintergrundfarbe wird ins Byte $FF80 geschrieben (310). Das Farb-RAM wird nicht verärbeitet (SCRSV DEF Modus 1). Bitmap und Video-RAM werden gespeichert mit sa=5 (320-340).
  • Ab Zeile 380: Das Farb-RAM wird im Farbbereich 2 (SCRSV DEF High-Byte: $d8, Modus: 2) angehängt mit sa=2, wobei die Ausgabe der Startadresse unterdrückt ist (380-400).
  • Zeilen 330,390,530: Mit Hilfe der Funktion D!PEEK wird die Zeilennummer LN in den Zeilen mit SCRSV ermittelt und in der Floppy-Fehlermeldung mit ausgegeben.

Beachten vor dem Ausführen: {PI} in Zeile 140 muss durch π ersetzt werden.

100 REM--- TURTLE-SAVE+APPEND ---
106 REM --- BILD MALEN ---
110 BK=0: REM HINTERGRUNDFARBE
120 HIRES 1,BK: COLOUR11,BK: MULTI10,8,2
130 A=10:B=A/1.6:AD=2:BD=AD/1.6
140 TD = 241:T=90:T0={PI}/180
150 REM TD:182/241/90.4
160 X0=90:Y0=100:C=1
170 REC 0,0,159,199,3
180 LOOP
190 : X = X0 + A*COS(T*T0)
200 : Y = Y0 + B*SIN(T*T0)
210 : EXIT IF X<0 OR X>159 OR Y<0 OR Y>199
220 : LINE X0,Y0, X,Y, C
230 : X0 = X: Y0 = Y
240 : T = T + TD
250 : A = A + AD
260 : B = B + BD
270 : C=C+1:IF C>3 THEN C=1
280 END LOOP
290 REM --- SPEICHERN ---
300 COLOUR 12,0: PAUSE1;: COLOUR11,0
310 POKE $FF80,BK: REM HINTERGRUNDFARBE
320 SCRSV DEF $C0,4,1,2: REM NUR VIDEORAM
330 SCRSV 3,8,5,"PI.TURTLE,P,W":LN=D!PEEK(57)
340 SCRSV RESTORE
350 FEHLER
360 IF FF>0 THEN CALL ABBRUCH
370 REM COLOUR 12,0:PAUSE1;:COLOUR11,0
380 SCRSV DEF $D8,4,2,2: REM PLUS FARBRAM
390 SCRSV 2,8,2,"PI.TURTLE,P,A":LN=D!PEEK(57)
400 SCRSV RESTORE:DO NULL
410 FEHLER
420 IF FF>0 THEN CALL ABBRUCH
430 NRM:COLOUR11,12,0:CLS:PRINT"... SAVED"
440 END
450 REM ---
460 PROC FEHLER
470 OPEN 1,8,15
480 INPUT#1,FF,FB$,SP,SE
490 CLOSE 1
500 END PROC
505 REM ---
510 PROC ABBRUCH
520 NRM: COLOUR 11,12,0: CLS
530 PRINT FF;FB$;" - ERROR IN LINE";LN
540 END
550 END PROC