Mehr über SYS
Der SYS-Befehl beim C 64 und VC 20 leistet wesentlich mehr, als das Commodore-Handbuch zugeben will. Er bietet zum Beispiel eine einfache Möglichkeit, Parameter an Maschinenprogramme zu übergeben.
Der SYS-Befehl hat folgendes Format:
SYS <Adreßausdruck> [, < Parameterausdrücke > ]
SYS ruft das Maschinensprachprogramm auf, das bei »Adreßausdruck« logisch beginnt. »Adreßausdruck« steht für eine RAM-Adresse im Bereich von 0 bis 65535.
Die wahlweise anzugebenden Übergabeparameter werden nicht von SYS bearbeitet, vielmehr müssen diese Angaben in geeigneter Weise vom aufgerufenen Maschinenprogramm ausgewertet werden. Hierzu sind natürlich genauere Kenntnisse in Assembler-Programmierung erforderlich.
Es kann jedoch eine andere Übergabeform gewählt werden, auch wenn dies im VC 20-Programmierhandbuch verschwiegen und im Handbuch das Gegenteil behauptet wird.
Diese Form der Parameter-Übergabe besteht darin, Akkumulator, X- und Y-Register sowie den Prozessorstatus vorzugeben.
Wie soll das vom Basic aus geschehen? Wenn nicht direkt, dann eben über die Speicherstellen, die SYS als oben genannte Register aufnimmt, bevor ins Maschinenprogramm verzweigt wird, und in die SYS nach Rückkehr (RTS) aus dem Maschinenprogramm die aktuellen Registerinhalte ablegt.
Es gibt also eine Kommunikationsmöglichkeit mit dem Maschinenprogramm vor und nach der Abarbeitung, sie muß nur genutzt werden.
Die vier Speicherbytes nach Bild 1 sind die Schnittstellen zu den Prozessor-Registern.
Bezeichnung | hex.-Adr. | dez. |
---|---|---|
Akkumulator | 030C | 780 |
X-Register | 030D | 781 |
Y-Register | 030E | 782 |
Proz.-Status | 030F | 783 |
Der Prozessor-Status wird dabei durch das Flag-Register dargestellt. Die Bedeutung der einzelnen Bits im Flag-Register geht aus Bild 2 hervor.

Hier nun eine Anwendung der Kommunikation mit Maschinen-Unterprogrammen.
Die Betriebssystem-Routine »Plot« soll genutzt werden, um den Cursor auf eine bestimmte Position zu setzen, ab der dann eine Ein-/Ausgabe erfolgen kann, beziehungsweise es soll abgefragt werden, wo sich der Cursor gerade befindet, wo also die nächste Ein-/Ausgabe erfolgen würde.
Bild 3 zeigt das kleine Beispiel-Listing. In den Zeilen 100 bis 150 wird der Cursor auf Zeile 10, Spalte 5 gesetzt. Anschließend wird zur Demonstration ein kleiner Text ausgedruckt und in den Zeilen 200 bis 260 die aktuelle Cursorposition gelesen.
(Rolf Zweifel)1 rem sys-demo 2 rem 3 rem cursorposition setzen/lesen 4 rem 5 rem 10 a=780:rem akku 20 x=781:rem x-register 30 y=782:rem y-register 40 f=783:rem flag-register 50 up=65520:rem adresse von plot 60 print chr$(147);"zeile 10, spalte 5" 70 : 100 rem carry-bit loeschen 105 rem also cursorpos. setzen 110 pokef,peek(f) and 254 120 pokex,10:rem zeile 10 130 pokey,5:rem spalte 5 140 sys up:rem aufruf cursor plot 150 print"** cursor gesetzt"; 190 : 200 rem carry setzen 205 rem also cursorpos. lesen 210 pokef,peek(f) or 1 220 sys up:rem aufruf plot 230 print:print:print"cursorposition war:" 240 print"zeile:";peek(x) 250 print"spalte:";peek(y) 260 print:end