Damit unterschiedliche Adressen beim C64 und C128 kein Problem darstellen, gibt es einen Befehl, der fuer Gemeinsamkeit sorgt. Eine Nummer, gefolgt vom Befehl syscon, liefert folgende Werte:
0 syscon : 64 beim C64, 128 beim C128
1 syscon : Anfang des freien Speichers
2 syscon : Ende des freien Speichers
3 syscon : Adresse fuer Zeichenzahl im
Tastaturpuffer
4 syscon : Adresse des Tastaturpuffers
5 syscon : Adresse fuer Zeichenfarbe
Was der CP-Programmierer au{CBM-V}er den CP-Befehlen braucht, sind fertige Routinen f{CBM-X}r Stringbearbeitung und Ein- und Ausgaben. Die Routinensammlung cprout enth{CBM-F}lt sozusagen die Grundausstattung:
Stringfunktionen
Strings sind eine durch ein Nullbyte abgeschlossene Zeichenkette. Zur Stringbearbeitung dienen vier grundlegende Funktionen len, $<, inchar und val.
len
---
Die Funktion len liefert die Laenge eines String:
"abc" len
Das Ergebnis waere hier drei.
$<
--
Diese Funktion kopiert Strings. Sie faellt etwas aus dem Rahmen, da sie wie ein Operator mit zwei Parametern in den Registern NR und HR arbeitet:
ziel quelle $<
Der Quellstring wird an die Zieladresse kopiert. Es heisst aufzupassen, dass dort ausreichend Platz ist. Die Funktion liefert das mit Null markierte Ende des neuen Strings als Ergebnis. Dieses kann sogleich benutzt werden um mehrere Strings zu einem einzigen zu vereinen:
ziel string1 $< string2 $< string3 $<
Soll an einen bereits bestehenden String etwas angefuegt werden, geschieht dieses durch:
ziel ( len ) + zusatz $<
inchar
------
Hiermit laesst sich die Position eines Zeichens in einem String bestimmen:
( "String" , 'n' inchar )
Ist das Zeichen dort nicht vorhanden, so ist das Ergebnis Null. Anderenfalls erhaelt man die Position in der Zeichenkette. Hier waere das Ergebnis fuenf. Um diesen Wert zum Zugriff auf die Position im String zu verwenden, muss er um eins verringert und zur Stringadresse addiert werden:
str ( , 'a' inchar ) nif nix + 1 -
val
---
Es wird der Zahlenwert einer in Form von Ziffernzeichen vorliegenden Zeichenkette errechnet. Vorangestellte Leerzeichen sind erlaubt. Ein nachfolgendes Leerzeichen sowie ein Nullbyte signalisieren das Ende:
" 12 Disketten " val
Das Ergebnis ist hier zwoelf. Benoetigt wird val besonders in Verbindung mit Zahleneingaben.
scan
----
Scan durchsucht einen Speicherbereich von an bis en nach einer Zeichenkette zk der L{CBM-F}nge zl. Das Ergebnis einer erfolglosen Suche ist Null, eine erfolgreiche Suche liefert die gefundene Adresse:
( an , en , zk , zl scan )
Bildschirm, Cursor und Farbe
modswap
-------
Beim C64 ohne Wirkung, schaltet modswap beim C128 zwischen 40- und 80-Zeichenmodus um.
color
-----
Einstellen von Zeichen-, Hintergrund- und Rahmenfarbe fuer den 40-Zeichen-Bildschirm:
( zf , hf , rf color )
Es sind Werte von eins bis 16 moeglich.
Die Angaben fuer hf und rf koennen entfallen. Also auch ( zf , hf color ) und ( zf color ).
at
--
Cursorpositionierung: ( y , x at )
Der Cursor wird in Zeile y und Spalte x positioniert.
posxy
-----
Der Befehl posxy liefert die Spaltenposition. Die Zeilenposition wird durch NR uebergeben und kann somit durch posxy swap erhalten werden.
tab
---
Der Befehl x tab positioniert den Cursor in der Spalte x der aktuellen Zeile.
Ausgabefunktionen
putc
----
Die Funktion putc gibt ein Zeichen auf das aktuelle Ausgabegeraet aus. Der Aufruf erfolgt in der Form:
'a' putc
putl
----
Ein ganzer String wird ausgegeben, etwa:
"Hallo" putl
putn
----
Putn gibt eine Zahl in dezimaler Form aus:
1000 putn
60 34 + putn
print
-----
Eine ganze Liste von Strings laesst sich ausgeben:
( str1 , str2 , str3 print )
fprint
------
Dezimale Zahlenwerte koennen mit Hilfe des Steuerzeichens % bequem in die Stringausgabe eingebunden werden:
( "Summe % + % = %" , 5 , 3 , + fprint )
Die Zahlenwerte oder rechnerischen Ausdruecke werden im Anschluss an den String einfach der Reihenfolge nach als Parameter uebergeben.
Eingabefunktionen
getc
----
Die Funktion getc liest ein Zeichen vom aktuellen Eingabegeraet ein.
key
---
Wie getc, nur wird auf ein Zeichen ungleich Null gewartet.
getl
----
Getl nimmt eine ganze Eingabezeile an:
( ziel , limit getl)
Vergleichbar ist getl mit dem BASIC-Befehl input. Anzugeben ist ausser der Zieladresse die erlaubte Anzahl von Zeichen. Dass ausser den gelesenen Zeichen eine zusaetzliche abschliessende Stringendemarkierung geschrieben wird, gilt es zu beruecksichtigen. Wenn also Platz fuer acht Zeichen ist, darf als Limit hoechstens sieben gewaehlt werden. Als Ergebnis liefert getl die Stringendeadresse, sodass an die Eingabe gleich noch etwas angehaengt werden kann, etwa:
( file , 16 getl ) ",s,w" $<
Sollte die Eingabe laenger sein, als durch limit angegeben ist, wird dennoch bis zum abschliessenden Return weitergelesen, damit der naechste Datensatz fuer den naechsten Zugriff bereitsteht.
getn
----
Zum Einlesen von Dezimalzahlen und Umwandeln in Zahlenwerte dient getn ohne weitere Parameter. Damit eruebrigt sich:
string ( , 7 getl ) swap val
Externe Geraete
open
----
Damit wird eine logische Datei geoeffnet. Die Syntax ist:
( lfn , ga , sa , stringliste open )
Genau wie in BASIC kann alles uebrige ausser der logischen Filenummer und der Geraeteadresse entfallen, etwa:
( 4 , 4 open )
Es koennen mehrere Teilstrings durch Komma getrennt angegeben werden:
( 8 , 8 , 8 , filename , ",s,w" open )
close
-----
Der close-Befehl dient zum Schliessen einer logischen Datei:
8 close
Das ist auch fuer den BASIC-Programmierer sicher nichts neues.
Kanalbefehle
------------
In BASIC ist das Oeffnen und Schliessen der Kanaele bereits in den entsprechenten Befehlen (print#8,a$) enthalten. Dies ist auch mit ein Grund, weshalb etwa get#8,a$ so langsam ist. In CP oeffnen und schliessen dagegen Sie die Kanaele. Hierfuer dienen die Befehle #, #o und #i.
Der Befehl # schliesst die Kanaele und waehlt Bildschirm und Tastatur als Standardgeraete.
Der Befehl #o oeffnet einen Ausgabbekanal. Anzugeben ist vorher die Logische Filenummer, also etwa:
4 #o
Alle Ausgaben werden im Anschluss auf die entsprechende Datei umgelenkt, bis die Datei geschlossen wird, oder andere Kanaele eingestellt werden.
Der Befehl #i oeffnet einen Eingabekanal, etwa:
8 #i
Hier erfolgen im Anschluss alle Eingaben von der entsprechenden Datei.
Die Befehle close, #i und #o enthalten als erstes den Befehl #, sodass kein Datensalat auf dem seriellen Bus enstehen kann.
stat
----
Liefert nach IO-Operationen den Inhalt der auch in BASIC bekannten Statusvariablen ST.