SYS
Der BASIC-Befehl SYS dient zum Aufruf von Maschinenspracheprogrammen oder von Systemroutinen des C64 entweder im Eingabemodus oder in einem BASIC-Programm. Das Maschinenspracheprogramme wird solange ausgeführt bis dort der Befehl RTS (Assemblerbefehl: Rückkehr vom Unterprogramm) erfolgt. Danach wird das BASIC-Programm weiter ausgeführt.
Es kann eine beliebige Speicheradresse des Zahlenbereichs von 0 bis 65535 angesprungen werden. Allerdings sollte die Speicheradresse dort ein funktionstüchtiges Maschinenspracheprogramm enthalten, das in einem RTS-Befehl endet, da ansonsten nur noch ein Systemneustart hilft. Ergibt der Ausdruck für die Speicheradresse keine Zahl wird mit der BASIC-Fehlermeldung ?TYPE MISMATCH ERROR abgebrochen. Ist die Zahl nicht in dem oben angegebenen Speicherbereich, so erscheint die Meldung ?ILLEGAL QUANTITY ERROR. Fehlt jegliche Parameterangabe, so wird dies mit ?SYNTAX ERROR quittiert.
Weitere Parameter können angegeben werden, müssen aber vom Maschinenprogramm aus mit Hilfe der entsprechenden Interpreter-Routinen (wie sie auch für BASIC-Erweiterung Verwendung finden) verarbeitet werden. Das angesprungene Programm gibt dabei die entsprechende Syntax und samt Wertebereiche für Parameter vor. Etwaige übrig gebliebene Parameterangaben führen sonst zu einem ?SYNTAX ERROR.
In den Speicherzellen 780 bis 783 können per POKE die Werte von Akkumulator (AC), X- und Y-Register sowie das Statusregister (SR) hinterlegt und nach Ausführung des SYS-Befehls mit PEEK wieder abgefragt werden. Zusätzliche Parameter für das Maschinenspracheprogramm können, sofern die aufgerufene Routine das unterstützt, direkt an den SYS-Befehl angehängt werden.
Speicherstellen der Register abhängig von der jeweiligen BASIC-Variante:
BASIC | Akkumulator A | Register X | Register Y | Statusregister SR |
---|---|---|---|---|
BASIC V2 (C64) | 780 $030C | 781 $030D | 782 $030E | 783 $030F |
BASIC 3.5 (264-Serie) | 2034 $07F2 | 2035 $07F3 | 2036 $07F4 | 2037 $07F5 |
BASIC 7.0 (C128) bezogen auf aktuelle Bank des letzten BANK-Aufrufs | 6 $0006 | 7 $0007 | 8 $0008 | 5 $0005 |
Erweiterung ab BASIC 7.0
Ab BASIC 7.0 kann der SYS-Befehl mit zusätzlich angegebenen Parametern AC, XR, YR und SR Werte für die Prozessorregister A, X, Y und SR setzen. Jeder dieser Zusatzparameter darf einen Wert von 0 bis 255 annehmen, andernfalls wird mit Fehler ?ILLEGAL QUANTITY ERROR abgebrochen. Bleibt ein Parameter leer, wird das Register nicht gesetzt, sondern erhält den Retourwert des letzten SYS-Aufrufs. Die Register werden beim C128 in den Speicherstellen 5, 6, 7 und 8 für die Register SR, A, X und Y zwischen gespeichert und können von dort als “Ergebnis” mit der Anweisung RREG oder mittels PEEK-Funktion (in jeder Speicherbank eingeblendet) ausgelesen werden.
Auch hier können weitere Parameter (nach Angabe aller optionalen Parameter) angegeben werden, müssen aber auch ebenso vom Maschinenprogramm aus mit Hilfe der entsprechenden Routinen für BASIC-Erweiterung vollständig weiter verarbeitet werden, da sonst mit ?SYNTAX ERROR abgebrochen wird.
Beispiele
SYS 64738
Reset durch Aufruf der KERNAL-Routine RESET.
Weitere Beispiele siehe KERNAL (Nutzung von BASIC aus)
SYS F1,A$,15
In der Variable F1 ist eine Adresse einer Maschinenspracheroutine hinterlegt, die dann auch noch die folgenden Parameter, nämlich ein Zeichenkettenvariable erwartet und eine Zahl auswertet. Beispielsweise als besondere INPUT-Implementierung, die für eine Formulareingabe die freie Cursor-Bewegung einschränkt oder die eingebbaren Zeichen entsprechend sinnvoll einschränkt.
BASIC 7.0
SYS 7168,1,2,3,255
verzweigt in den Monitor durch die Ausführung von BRK (Opcode 0 an der Startadresse) und die Registeranzeige zeigt übereinstimmend die SYS-Parameter …
BREAK
PC SR AC XR YR SP
; 01C02 FF 01 02 03 F6
Um nur das Y-Register neu zu setzen:
SYS 7168,,,9
Weitere Parameter für die aufgerufene Routine übergeben:
SYS F1,,,,,A$,15
Die vier Kommas überspringen die optionalen Parameter für die Registerwerte (und lassen diese unberührt).