FETCH (BASIC 7.0)

Aus C64-Wiki
Zur Navigation springenZur Suche springen
FETCH (BASIC 7.0)
Syntax: FETCH <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 von einer REU ins RAM kopieren
Abkürzung: fE
Token: $fe $21 (254 33)
Verwandte Befehle
STASH, SWAP

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


Der Befehl FETCH initiiert einen Datentransfer aus dem externen Speicher einer REU in das interne RAM. 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 geschrieben werden.
  • <Start_extern>: Startadresse im externem Speicher, ab dem die Daten gelesen 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 | Quelltext bearbeiten]

BANK 0:FETCH 8000,8192,0,1

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

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

Belegt die Funktionstaste 3 mit einer Befehlszeile, mit der sich ein vorher in der Bank 0 der Speichererweiterung gesichertes Programm wieder in den BASIC-Speicher laden lässt.

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

Überschreibt 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 (siehe STASH-Beispiel). 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:FETCH 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.