C 64/VC 20
Tips & Tricks
7/84, S. 131

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
Bild 1. Die Schnittstelle zu den Prozessor-Registern

Der Prozessor-Status wird dabei durch das Flag-Register dargestellt. Die Bedeutung der einzelnen Bits im Flag-Register geht aus Bild 2 hervor.

Bild 2. Das Flag-Register beim 6502

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
Bild 3. Listing Cursorposition setzen/lesen
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →