SWAP

Aus C64-Wiki
Zur Navigation springenZur Suche springen
SWAP
Syntax: SWAP <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 im internen Speicher mit jenen in einer REU vertauschen
Abkürzung: sW
Token: $fe $23 (254 35)
Verwandte Befehle
FETCH, STASH

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


Der Befehl SWAP initiiert einen Datenaustausch des externen RAMS einer REU mit dem internen Speicher. 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 ausgetauscht.
  • <Start_intern>: Startadresse im internen Speicher, ab dem die Daten gelesen und geschrieben werden.
  • <Start_extern>: Startadresse im externem Speicher, ab dem die Daten gelesen und 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.
  • Der Datentransfer benötigt doppelt so lange wie bei FETCH und STASH, da auf jede Speicherzelle zweimal (Lesen + Schreiben) zugegriffen werden muss.


Beispiele[Bearbeiten | Quelltext bearbeiten]

BANK 0:SWAP 8000,8192,0,1

Vertauscht 8000 Bytes ab Adresse 0 der REU-Bank 1 mit dem Speicherbereich ab 8192 in RAM-Bank 0 (Beginn der Bitmap im Grafikmodus).

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

Vertauscht 1000 Elemente (Index 0 bis 999) der Fließkomma-Feldvariablen AR mit den Werten, die vorher ab Adresse 0 in Bank 0 der REU abgelegt wurden. Funktioniert auch mit Integer-Arrays, jedoch nicht mit Zeichenketten-Arrays, da damit nur die (mittlerweile wahrscheinlich veralteten) Verweise auf die eigentlichen Zeichenketten wiederhergestellt würden.

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

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