SPRSAV

Aus C64-Wiki
Zur Navigation springenZur Suche springen
SPRSAV
Syntax: SPRSAV <von>,<nach>
Parameter
<von>: numerischer Ausdruck im Wertebereich von 1 bis 8 oder Zeichenkettenausdruck
<nach>: numerischer Ausdruck im Wertebereich von 1 bis 8 oder Zeichenkettenvariablenbezeichnung
Einordnung
Typ: Anweisung
Kontext: Sprites
Aufgabe: Sprite-Rasterdaten als Zeichenkettenvariable ablegen bzw. aus dieser entnehmen
Abkürzung: sprS
Token: $fe $16 (254 22)
Verwandte Befehle
SSHAPE

Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl SPRSAV ab Commodore BASIC V7.0 oder höher.


Mit der Anweisung SPRSAV können Rasterdaten eines Sprites entweder in eine Variable vom Typ einer Zeichenkette abgelegt oder aus einer solchen wieder hergestellt oder direkt zwischen Sprites aber auch zwischen Zeichenketten kopiert werden.

Die 2 möglichen Parameter <von> und <nach> haben dabei mehrfache Bedeutungen, entweder

  1. als numerischer Ausdruck die Nummer des Sprites (erlaubt sind die Werte von 1 bis 8, ansonsten kommt es zur Fehlermeldung ?ILLEGAL QUANTITY ERROR) oder
  2. bei <von> als Zeichenkettenausdruck und bei <nach> nur als Bezeichnung einer Zeichenkettenvariablen.

Weniger oder mehr als 2 Parameter führen zu einem Abbruch mit ?SYNTAX ERROR.

Die in der Zeichenkettenvariable abgelegten Daten entsprechen dem SSHAPE-Datenformat, allerdings für eine feste Ausdehnung im Ausmaß von 24×21 Pixel. Damit ergibt sich eine Zeichenkettenlänge von 67 Byte.
SPRSAV erwartet bei einer Variablenangabe für den Parameter <von> stets, dass der Inhalt tatsächlich das geforderte Format aufweist. Ist dies nicht der Fall, beschwert sich der Befehl zwar nicht, aber es kommt zu unerwünschten und unerwarteten Ergebnissen (das Sprite-Aussehen ist korrumpiert).
Ein besonderer Fall ergibt sich bei der nicht unbedingt sinnvollen, aber erlaubten Parameterkonstellation SPRSAV <Stringvariable>,<Stringvariable>, da dabei die Zeichenkette nicht wirklich dupliziert, sondern lediglich der String-Descriptor in die Zielvariable kopiert wird und damit beide Variablen auf die gleiche Zeichenkette verweisen. Bei einer etwaigen Garbage Collection (z.B. auch ausgelöst durch einen Aufruf mittels FRE(1)) kann der Speicherbereich für Zeichenketten korrumpiert werden, was sogar zu einem Absturz führen kann (siehe Beispiele).

Die Sprite-Rasterdaten können auch aus einer Hires- oder Multicolor-Grafik mit Hilfe des SSHAPE-Befehls entnommen werden, wobei hier exakt die Dimension von 24×21 bzw. 12×21 eingehalten werden muss.


Beispiele[Bearbeiten | Quelltext bearbeiten]

SPRSAV 3,4

Kopiert die Sprite-Rasterdaten von Sprite 3 zu Sprite 4.

SPRSAV 4,S$

Legt die Daten des Sprites 4 in Zeichenkettenvariable S$ ab.

SPRSAV S$,5

Überträgt die Daten aus Zeichenkettenvariable S$ in Sprite 5.

SPRSAV S$+"",SB$

Erstellt eine "Sicherungskopie" der Rasterdaten aus einer Variable.
Achtung: Die Quelle muss ein temporärer Zeichenkettenausdruck sein (deshalb diese an sich nichts am Ergebnis des Ausdrucks verändernde Zeichenkettenverkettungsoperation), da es sonst zum Duplikat des String-Descriptors kommt und schlimmsten Falles einen Absturz des BASIC-Interpreters zur Folge haben könnte.
Einfacher und frei von Nebenwirkungen ist natürlich die schlichte Zuweisung

SB$ = S$

die der obigen Variante vorzuziehen ist.

100 GRAPHIC 1,1
120 DRAW 1, 0,0 TO 23,20
130 DRAW 1, 0,20 TO 23,0
135 BOX 1, 0,0, 23,20
140 SSHAPE A$, 0,0,23,20
150 SPRSAV A$,1
160 SPRITE 1,1,11,0,1,1,0
170 MOVSPR 1,160,100
175 MOVSPR 1,57#4
180 GETKEY K$
190 GRAPHIC 0

Ein "X" am Hires-Bildschirm in ein Sprite übernehmen, das dann ca. in Bildschirmmitte beginnend in Bewegung gesetzt wird.

Sprite-Rasterdaten ausgeben (ergänzend zum obigen Beispiel):

200 PRINT "STRING LENGTH:" LEN(A$)
210 A=POINTER(A$)
220 BANK 1
230 S=PEEK(A+1)+256*PEEK(A+2)
240 L=PEEK(A)
250 FOR I=S TO S+L-1-4
260 IF C=0 THEN PRINT USING "### ";I-S;
270 PRINT RIGHT$(HEX$(PEEK(I)),2) " ";
280 C=C+1: IF C=3 THEN C=0: PRINT
290 NEXT
300 PRINT HEX$(PEEK(I)+256*PEEK(I+1))
310 I=I+2
320 PRINT HEX$(PEEK(I)+256*PEEK(I+1))
STRING LENGTH: 67
  0 FF FF FF
  3 C0 00 03
  6 A0 00 05
  9 98 00 19
 12 84 00 21
 15 82 00 41
 18 81 00 81
 21 80 81 01
 24 80 42 01
 27 80 24 01
 30 80 18 01
 33 80 24 01
 36 80 42 01
 39 80 81 01
 42 81 00 81
 45 82 00 41
 48 84 00 21
 51 98 00 19
 54 A0 00 05
 57 C0 00 03
 60 FF FF FF
0017
0014

Der Versatz der Werte (Index) in der 1. Spalte ist dezimal angegeben, die Rasterdaten byte-weise in Dreiergruppen (eine horizontale Sprite-Linie) hexadezimal. Am Ende die X- und Y-Ausdehnung (minus 1) werden als 16-bit Hexadezimalwerte angezeigt.