STASH

Aus C64-Wiki
Wechseln zu: Navigation, Suche
STASH
Format: STASH <Anzahl>, <Start_intern>, <Start_extern>, <REU-Bank>
Parameter
<Anzahl>: numerischer Ausdruck im Wertebereich von 0 bis 65535
<Start_intern>: numerischer Ausdruck im Wertebereich von 0 bis 65535
<Start_extern>: numerischer Ausdruck im Wertebereich von 0 bis 65535
<REU-Bank>: numerischer Ausdruck im Wertebereich von 0 bis 15
Einordnung
Typ: Anweisung
Kontext: Speichererweiterung REU
Aufgabe: Daten in die REU kopieren
Abkürzung: sT
Verwandte Befehle
FETCH, SWAP

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


Der Befehl STASH initiiert einen Datentransfer aus dem internen Speicher in das externe RAM einer REU. Ist kein entsprechendes Gerät am C128 angeschlossen, bleibt die Anweisung wirkungslos.

Die Anweisung kennt folgende Parameter:

  • <Anzahl>: Anzahl zu transferierender Bytes, bei 0 werden 65536 Bytes verschoben.
  • <Start_intern>: Startadresse im internen Speicher, ab dem die Daten gelesen werden.
  • <Start_extern>: Startadresse im externem Speicher, ab dem die Daten geschrieben werden.

Die Werte dieser 3 Parameter müssen im Bereich von 0 bis 65535 liegen, andernfalls kommt es zur Fehlermeldung ?ILLEGAL QUANTITY ERROR.

  • <REU-Bank>: 64 KByte große Bank der Speichererweiterung, in die die Daten geschrieben werden. Der Wert darf im Bereich von 0 bis 15 liegen, sonst kommt es zu einem ?ILLEGAL QUANTITY ERROR. Die Einschränkung auf den Maximalwert von 15 ist eigentlich sinnlos, da eine REU zumindest theoretisch bis zu 255 Bänke besitzen kann.

Alle Parameter müssen angegeben werden, ansonsten kommt es zu einem ?SYNTAX ERROR.

Anmerkungen:

  • Die interne Speicherkonfiguration für den Transfer wird durch einen vorhergehenden BANK-Befehl festgelegt. In der ersten ROM-Version von 1985 funktioniert dies aber nicht richtig: Einerseits muss der I/O-Bereich während des Transfers aktiv sein, zum anderen wird bei RAM-Zugriffen immer Bank 0 angesprochen. In späteren Revisionen des C128 wurde dieser Fehler behoben.
  • Es wird dringend empfohlen, den Transfer nur im SLOW-Modus durchzuführen.
  • Eine RS232-Kommunikation sollte vor Ausführung des Befehls gestoppt werden, da die dabei entstehenden NMIs zu Problemen führen.
  • Überschreitet die interne Adresse während des Kopiervorgangs den Maximalwert von 65535, wird bei Adresse 0 der aktuellen RAM-Bank fortgesetzt.
  • Überschreitet dagegen die externe Adresse den Maximalwert von 65535, wird die REU-Bank um 1 inkrementiert. Allerdings unterstützt der REC nur acht Bänke, so dass auf Bank 7 Bank 0 folgt. Bei einer entsprechend aufgerüsteten REU folgt auf Bank 15 dann Bank 8, auf Bank 23 dann Bank 16 usw.


Beispiele[Bearbeiten]

BANK 0:STASH 8000,8192,0,1

Kopiert 8000 Bytes ab Adresse 8192 (Beginn der Bitmap im Grafikmodus) in die REU-Bank 1 ab Adresse 0.

KEY 1,"GRAPHIC CLR:BANK 0:STASH 2,4624,4624,0:STASH 45000,7168,7168,0"+CHR$(13)

Belegt die Funktionstaste 1 mit einer Befehlszeile, mit der sich das aktuelle BASIC-Programm in die Bank 0 der Speichererweiterung sichern lässt.

BANK 1:STASH (POINTER(AR(1))-POINTER(AR(0)))*1000,POINTER(AR(0)),0,0

Legt eine Kopie von 1000 Elementen (Index 0 bis 999) der Fließkomma-Feldvariablen AR ab Adresse 0 in Bank 0 der REU ab. Mittels FETCH kann dann der Inhalt des Arrays wieder hergestellt werden. Funktioniert auch mit Integer-Arrays, jedoch nicht mit Zeichenketten-Arrays, da damit nur eine Kopie der Verweise auf die eigentlichen Zeichenketten entstehen würde.

BANK 1:STASH POINTER(AR(999))+POINTER(AR(1))-2*POINTER(AR(0)),POINTER(AR(0)),0,0

Wie Beispiel vorher, aber "failsafe", da ein Überschreiten der Arraygrenzen (was bei einem Zurückholen der Daten zum Systemabsturz führen könnte) durch Auslösen eines ?BAD SUBSCRIPT ERROR abgefangen wird.