SYS
SYS | |
Syntax: | SYS <Speicheradresse> Ab BASIC 7.0: SYS <Speicheradresse>[,[<AC>] [,[<XR>] [,[<YR>] [,<SR>]]]] |
Parameter | |
<Speicheradresse>: numerischer Ausdruck im Wertebereich von 0 bis 65535 | |
<AC>: numerischer Ausdruck im Bereich 0 bis 255 | |
<XR>: numerischer Ausdruck im Bereich 0 bis 255 | |
<YR>: numerischer Ausdruck im Bereich 0 bis 255 | |
<SR>: numerischer Ausdruck im Bereich 0 bis 255 | |
Einordnung | |
Typ: | Anweisung |
Kontext: | System |
Aufgabe: | Aufruf von Maschinenspracheprogrammen oder Systemroutinen |
Abkürzung: | sY |
Token: | $9e (158) |
Verwandte Befehle | |
USR, RREG |
Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl SYS unter BASIC V2 des Commodore 64.
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[Bearbeiten | Quelltext bearbeiten]
SYS 64738
Reset durch Aufruf der KERNAL-Routine RESET.
Weitere Beispiele siehe KERNAL (Nutzung von BASIC aus).
SYS 49152, F1, A$
Ruft eine Maschinenspracheroutine an der Adresse 49152/$C000 auf. Die aufgerufene Routine kann (in BASIC V2) durch eigene Aufrufe des Interpreters die angehängten Parameter auslesen. Eine für diesen Aufruf passende Maschinenspracheroutine kann dabei zum Beispiel wie folgt aussehen (hier ohne Fehlerbehandlung):
* = $C000 JSR $AEFD ; Komma prüfen JSR $AD8A ; Fließkommazahl nach FAC1 holen JSR $B7F7 ; FAC1 nach Word in Adresse $14/$15 konvertieren ; ...hier etwas mit $14/$15 machen... JSR $AEFD ; Komma prüfen JSR $AD9E ; Ausdruck evaluieren JSR $B6A3 ; Zeichenkette holen und freigeben, Adresse in $22/$23, Länge in Akku ; ...hier etwas mit $22/$23/Akku machen... RTS
POKE 211, SP : POKE 214, ZE: SYS 58640
Setzt den Bildschirmcursor gemäß den Variablen SP für die Spalte und ZE für die Zeile per Unterroutine im KERNAL, welche auch von der Einsprungstelle PLOT verwendet wird. Die KERNEL-Sprungleiste wird hier nicht verwendet, um sich das zusätzliche Löschen des Carry-Flags beim Aufruf zu ersparen.
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).
Weblinks[Bearbeiten | Quelltext bearbeiten]
ABS | AND | ASC | ATN | CHR$ | CLOSE | CLR | CMD | CONT | COS | DATA | DEF | DIM | END | EXP | FN | FOR | FRE | GET | GET# | GOSUB | GOTO | IF | INPUT | INPUT# | INT | LEFT$ | LEN | LET | LIST | LOAD | LOG | MID$ | NEW | NEXT | NOT | ON | OPEN | OR | PEEK | POKE | POS | PRINT | PRINT# | READ | REM | RESTORE | RETURN | RIGHT$ | RND | RUN | SAVE | SGN | SIN | SPC | SQR | STATUS/ST | STEP | STOP | STR$ | SYS | TAB | TAN | THEN | TIME/TI | TIME$/TI$ | TO | USR | VAL | VERIFY | WAIT