C64 datatool -
Commodore 64 Tabellenkalkulation
|
Programm: | ![]() |
|
Anleitung: |
Falls Sie eine andere Quelle verwenden, überprüfen Sie http://members.chello.at/wiener.freiheit/datatool_de.htm in Hinblick auf die neueste Version. Es gibt keine Versionsnummer, aber ein Revisionsdatum, aktuell Juni 2003 (06/03).
Der C64 ist ein feiner Computer für Berechnungen des alltäglichen Gebrauchs: Einfach einschalten, und ein kleines Basic-Programm schreiben. Sollen aber bequeme Möglichkeiten zum Eingeben und Edieren von Daten vorgesehen werden, erhöht sich der Programmieraufwand erheblich, und das C64-Basic hat dafür nicht viel zu bieten. Aus diesem Grund begann ich Überlegungen zu einem Programm anzustellen, das mit Maschinensprache eine bequeme Datenverwaltung ermöglicht, in Kombination mit frei programmierbarem Basic für die Datenverarbeitung. Existierende Lösungen dieser Art konnte ich nicht finden.
Als Hobbyprogrammierer schreibe ich Programme primär für den Eigenbedarf. Dieses Programm könnte möglicherweise aber auch für andere C64-User von Nutzen sein. Gewiß, davon gibt es nicht mehr viele, und noch weniger werden einen Bedarf an so einem Programm haben. Aber wie auch immer, es ist da, es kostet nichts, und wer eine Verwendung dafür hat, kann es runterladen und benutzen.
C64 Datatool eignet sich für das Eingeben, Edieren und Drucken jeder Art tabellarischer Daten. In der einfachsten Anwendungsmöglichkeit kann man damit Listen mit Texten oder Zahlen speichern. Jede Art von Berechnung (Tabellenkalkulation, Statistik oder Datenumwandlung) kann in Basic programmiert werden. In der fortgeschrittensten Art der Nutzung ist Datatool nur eine besondere Umgebung für eigene Basic-Programme.
Eine Anleitung zum C64-Basic gibt es hier: Anleitungen - homecomputermuseum.de
Fertig, getestet und oft benutzt, ohne gröbere Mängel festzustellen. Vielen Dank an Tom Butz für seine Verbesserung der englischen Programmtexte. Korrekturen, Anmerkungen oder Vorschläge jeder Art sind willkommen, Mail an kottira@chello.at .
Veränderungen / Verbesserungen in der neuen Revision:
Auf der Diskette sind vier Files:
Alle Programmfiles können mit oder ohne Sekundäradresse geladen werden. Der Lader führt einen Autostart durch, wenn er mit Sekundäradresse geladen wird, aber generell gilt: alle Files sind von Basic aus ausführbar und können mit RUN gestartet werden.
Die Files sind in einem Diskimage "datatool.d64"
gespeichert und gezippt. Download datatool.zip
oder datatool.d64.gz (16 kB)
Wenn Sie die Anleitung ebenfalls speichern möchten: Download
datatool+m.zip
(110 kB). Die Dateien sollten in einen Ordner extrahiert
werden.
Das Programm ist weitgehend selbsterklärend. Oben am Bildschirm ist das Hauptmenü; ein Menüpunkt wird entweder mit den Cursortasten und RETURN ausgewählt oder mit den Funktionstasten. Sie gelangen nun in eine tabellenartige Oberfläche. Ein Feld wird mit RETURN betreten; um die Eingabe zu speichern, drücken Sie nochmals RETURN. In nahezu allen Situationen bringt die Taste CTRL eine Hilfeseite auf den Bildschirm, die aktuelle Optionen und Tastenkommandos zeigt. Jede Eingabe kann mit der PFEIL-LINKS-Taste (links oben in der Tastatur) abgebrochen werden. Wenn Sie einen laufenden Prozess unterbrechen wollen, drücken Sie die STOP-Taste. Das unterbricht Basic, Disk-Zugriff, Druck und einige zeitaufwendige Operationen. Wenn Sie einen Programmabsturz vermuten, können Sie die Kombination STOP + RESTORE verwenden. Das führt gewöhnlich zu einem Reset des Programms. Während einiger Operationen, die einen Umbau der Arbeitstabelle bedingen, ist der Reset blockiert, da eine Unterbrechung eine unbrauchbare Datenstruktur hinterlassen würde. Die Blockierung kann man umgehen, indem man RESTORE öfter als dreimal drückt - mit dem Risiko, daß alle Daten verloren gehen.
Im oberen Teil der Arbeitstabelle sind einige Voreinstellungen zu treffen:
Beispiel: Nehmen
wir an, Sie wollen ein paar numerische Daten in einer Spalte
eingeben und die Quadratwurzel daraus in einer anderen Spalte
berechnen. Nun, zunächst setzen sie beide Spalten auf
numerischen Typ und geben ihre Daten in Spalte A ein. Dann weisen
Sie der Spalte A eine Variable zu, z.B. x,
und der Spalte B eine andere Variable, z.B.
y. Die Basic-Anweisung lautet
y=sqr(x). Wenn die Arbeitstabelle nun ausgeführt wird
(Hauptmenü f2 RUN), passiert folgendes: Der Inhalt der
Datenfelder in Spalte A wird in die Variable x
übertragen, die Basic-Anweisung wird ausgeführt, und der Inhalt
der Variable y wird in Spalte B
gespeichert. Das wiederholt sich Zeile für Zeile. Danach sieht
die Arbeitstabelle so aus:
Links in jeder Zeile ist die Zeilennummer angegeben. Sie reicht von 1 bis 999. Aufgrund des beschränkten Speichervolumens können unmöglich alle 26 Spalten und 999 Zeilen mit Daten gefüllt werden, aber z.B. wären (bei reduziertem Basic-Speicher) 3 Spalten mit je 999 numerischen Daten möglich.
Neben der Zeilennummer ist ein Wahlfeld, mit dem der Zeilentyp festgelegt wird.
Beispiel:
in Ergänzung zum vorherigen Beispiel wollen wir die Spaltensumme
und den Durchschnitt von Spalte A und B berechnen. Die Variablen x und y , die
den Spalten zugeordnet sind, können nicht zum Summieren
verwendet werden, da sie für die Aufnahme des Feldinhalts
reserviert sind. Also verwenden wir eigene Variablen für die
Summe, z.B. xs und ys. Und da Basic auch die Anzahl der
Datenzeilen nicht kennt, muß ein Zähler eingerichtet werden;
nehmen wir dafür die Variable n. Das
Addieren der Summe und das Erhöhen des Zählers muß in jeder
Zeile erfolgen, also fügen wir diese Aufgabe dem Basic im
Spaltensetting hinzu, das in jeder Zeile ausgeführt wird. Die
Summen werden nun in eigenen Variablen addiert, aber um diese
sichtbar zu machen, benötigen wir eine Basic-Anweisung, die sie
in die Spaltenvariablen x und y überträgt. Das geschieht in einer
Basic-Zeile am Ende der Datenreihe. Ihr folgt eine Result-Zeile.
Zur Ermittlung des Durchschnitts muß in einem weiteren Schritt
die Summe durch den Inhalt des Zählers n dividiert
werden. Hier ist das Ergebnis nach dem Ausführen der Tabelle:
Beachten Sie zusätzlich bitte auch die Hinweise, die zum Ausführen einer Tabelle gegeben werden.
Beim Bearbeiten gibt es grundsätzlich zwei verschiedene Modi: Wenn Sie eine Tabelle über das Menü betreten, bewegt sich der Cursor von Feld zu Feld, und das jeweilige Feld blinkt. Nennen wir das "Feldmodus". Wenn Sie RETURN drücken, gelangen Sie in das Feld selbst, der Cursor bewegt sich von Zeichen zu Zeichen, und nur das Zeichen in Cursorposition blinkt. Nennen wir das "Eingabemodus".
Das Schreiben und Edieren im Eingabemodus
funktioniert ähnlich wie mit dem C64-Bildschirmeditor, bloß
daß die Wiederholungsfunktion für alle Tasten aktiviert ist.
Zusätzlich gibt es jedoch einen kleinen Zeichenpuffer,
in den jedes Zeichen gelangt, das mit DEL
gelöscht wird. Solange DEL
kontinuierlich gedrückt wird, nimmt der Puffer bis zu 250
Zeichen auf. Um gelöschte Zeichen wieder einzufügen, muß die
Kombination C= DEL gedrückt werden.
Das erlaubt also ein Rückgängig-Machen eines Löschvorgangs.
Kontinuierlich heißt, daß außer der DEL-Taste
keine andere Taste verwendet wird. Beispiel: Sie löschen die
Zeichen "abc", fahren mit dem Cursor an eine andere
Stelle und löschen "xyz". Dann sind "abc"
endgültig verloren, und der Puffer enthält nur "xyz".
Wenn Sie einen Textabschnitt in den Zeichenpuffer übertragen
wollen, ohne den Text selbst zu löschen, benutzen Sie die
Tastenkombination C= HOME. Sie bewegt,
gleich wie die DEL-Taste, den Cursor
rückwärts - Sie müssen also am Ende des Textes anfangen, den
sie in den Puffer kopieren möchten. Und für den Fall, daß Sie
einen Textabschnitt löschen möchten, ohne den gegenwärtigen
Inhalt des Zeichenpuffers zu überschreiben, können Sie die
Kombination CLR (SHIFT HOME) benutzen,
die sich wie die DEL-Taste verhält,
jedoch nichts in den Puffer verschiebt. INST
(SHIFT DEL) fügt ein Leerzeichen an, was den Puffer nicht
berührt.
Im Feldmodus ist ein anderer Puffer
verfügbar. Er kann Felder, Spalten oder Zeilen aufnehmen. Wenn
Sie ein einzelnes Feld löschen wollen, bewegen Sie den Cursor
dorthin und drücken DEL. Das löscht
den Feldinhalt und verschiebt ihn in den Feldpuffer.
Ähnlich wie oben beschrieben fügt C= DEL
den Pufferinhalt an der gegenwärtigen Cursorposition ein, C= HOME kopiert den Inhalt in den Puffer
ohne das Feld zu löschen, und CLR löscht
den Feldinhalt ohne ihn zu kopieren. Wenn Sie den Cursor in die
Kopffelder von Spalten oder Zeilen bewegen, die den
Großbuchstaben bzw. die Zeilennummer enthalten, können Sie auf
diese Weise ganze Spalten oder Zeilen löschen, kopieren und
einfügen. Beim Löschen mit DEL verschieben
sich die nachfolgenden Spalten bzw. Zeilen. Mit INST können leere Spalten bzw. Zeilen
eingefügt werden.
Bitte beachten Sie, daß DEL im
Feldmodus die Spalte oder Zeile betrifft, in der sich der Cursor
befindet, was etwas unterschiedlich von der Wirkungsweise im
Eingabemodus ist. Und bitte berücksichtigen Sie einige
Einschränkungen, die es bei Feldpuffer-Operationen gibt: Erstens
kann der Puffer nur ein Element aufnehmen, nämlich
entweder ein einzelnes Feld, eine Spalte oder eine Zeile, und man
kann nur dann etwas aus dem Puffer einfügen, wenn das Ziel das
selbe Format wie der Pufferinhalt hat. Beispiel: es ist nicht
möglich, numerische Felder via Feldpuffer in ein Textfeld zu
kopieren. Und wenn Sie eine Spalte von numerischem Typ in eine
Leerspalte kopieren wollen, müssen Sie zuvor die Leerspalte auf
"Number" setzen. Zweitens werden, bedingt durch die
Struktur des Feldpuffers, nur gefüllte Felder übertragen. Auf
diese Weise ist es z.B. möglich, teilweise gefüllte Spalten
oder Zeilen zu vermengen. Falls dieser Effekt unerwünscht ist,
sollten belegte Spalten oder Zeilen mit CLR gelöscht
werden, ehe man sie mit dem Pufferinhalt überschreibt. Und
schließlich ist zu berücksichtigen, daß Pufferoperationen bei
großen Arbeitstabellen einige Rechenzeit beanspruchen können.
Es gibt einige nützliche Tastenkombinationen, nämlich: C= CRSR rechts, C= CRSR unten, and C= RETURN. Bitte entnehmen Sie die Wirkungsweise den Hilfeseiten im Programm selbst, die mit der CTRL-Taste aufgerufen werden. Der Effekt der Tastenkombinationen unterscheidet sich in Eingabe- und Feldmodus.
Eine Tabelle ausführen bedeutet, alle Basic-Anweisungen
auszuführen, die in der Arbeitstabelle gespeichert sind. Der
Vorgang entspricht dem RUN in Basic,
bloß daß in diesem Fall Einzelprogramme in strukturierter
Reihenfolge aufgerufen werden.
Zuvor sind ein paar Einstellungen zu treffen:
Wenn Sie RETURN im Okay-Feld betätigen, beginnt die Ausführung der Arbeitstabelle. Das System löscht den Bildschirm und schreibt die Nummer des Durchlaufs oben an. Falls Sie etwas mehr Interaktion während des Laufs wünschen, können Sie entsprechende print-Anweisungen innerhalb der Arbeitstabelle vorsehen. Abgesehen vom begrenzten Zeichensatz unterliegt die Bildschirmausgabe keinen Beschränkungen; sogar ein input von Bildschirm bzw. Tastatur ist möglich.
Um Basic-Anweisungen in der Arbeitstabelle richtig schreiben zu können, kann es wichtig sein zu verstehen, wie das System funktioniert und wie es das Basic umsetzt. Hier in Kürze:
Letztlich ist noch auf einen bemerkenswerten Umstand hinzuweisen, der die Ausführung der Basic-Anweisungen vom Ablauf eines herkömmlichen Basic-Programmes unterscheidet: Es gibt kein übergeordnetes Stop-Kommando. Die Basic-Sequenzen in den verschiedenen Feldern werden abgearbeitet, und wenn eine Sequenz beendet ist, sei es durch end oder stop oder durch das Erreichen der letzten Basic-Zeile, fährt das System mit der Abarbeitung fort, bis die letzte Tabellenzeile im letzten Durchlauf erreicht ist, oder ein Error eintritt. Um von Basic aus die Gesamtprozedur abzubrechen, muß entweder absichtsvoll ein Error in der Art von: if [Bedingung] then crash produziert werden, was den Durchlauf mit einer Fehlermeldung beendet. Oder man setzt den I/O Status ungleich Null, etwa in der Art: if [Bedingung] then poke 144,1 , was den Durchlauf ohne Fehlermeldung beendet. Abgesehen davon gibt es die Möglichkeit, die Ausführung händisch mit der STOP-Taste zu unterbrechen.
Die Suche erfolgt in der Arbeitstabelle, und zwar sowohl in Daten- wie in Settingfeldern, nicht jedoch in anderen Feldern des Hauptmenüs. Beispielsweise ist es möglich, in der Arbeitstabelle nach (Fragmenten) einer Basic-Anweisung zu suchen, nicht aber nach Inhalten, die im Abschnitt " f5 LOAD FILE" vorkommen.
Der Suchauftrag darf eine Länge von maximal 80 Zeichen haben,
ein Überhang wird ohne Fehlermeldung ignoriert. Die Suche
bezieht sich nur auf Textzeichen, es gibt keine spezielle
Suchfunktionen für Zahlen oder Wertebereiche. Natürlich kann
man auch nach Ziffern suchen. Dabei sollte man nicht vom
festgelegten Layout ausgehen, da die Suchroutine den Feldinhalt
so erfaßt, wie er im Eingabemodus angezeigt wird, und dort gibt
es immer nur linksbündige Darstellung ohne Zahlenformatierung.
Ein Jokerzeichen steht nicht zur Verfügung. Sie können also nur
nach exakten Texten bzw. Textteilen suchen. Groß- und
Kleinbuchstaben werden immer unterschieden.
Während der Suche werden gefundene Inhalte am Bildschirm angezeigt, mit CRSR links/rechts können Sie von einer Fundstelle zur nächsten springen. Wenn Sie statt Search die Replace-Funktion gewählt haben, können Sie zusätzlich mit der Taste RETURN den gefundenen Text durch den ersetzen, den Sie in Sie im Feld "Replace with text" eingetragen haben. Ist das Feld leer, wird der gefundene Text gelöscht.
Sie haben jederzeit die Möglichkeit, die Suche zu beenden und im gegenwärtig angezeigten Feld der Arbeitstabelle zu verbleiben, indem Sie die PFEIL-LINKS-Taste drücken.
Zunächst können Sie auswählen, ob die Daten von niederen zu hohen Werten (ascend) oder umgekehrt von hohen zu niederen Werten (descend) sortiert werden sollen. Dann geben Sie die Spalte an, die für die Sortierung ausschlaggebend sein soll, und betätigen RETURN im Startfeld.
Das System sortiert nur Zeilen vom Data-Typ. Die Position anderer Zeilen (wie BASIC, Result, Label, Pause) wird nicht verändert. Wenn Data-Zeilen von Zeilen anderen Typs unterbrochen sind, sortiert das System blockweise. Völlig leere Data-Zeilen werden nach unten sortiert, egal welche Suchrichtung gewählt wurde. Wenn eine Zeile jedoch belegt ist, wird ein leeres Feld in der ausschlaggebenden Spalte als niedrigster möglicher Wert gezählt.
Wenn Sie hierarchisch in mehreren Ebenen sortieren wollen, müssen Sie die unterste Ebene zuerst sortieren. Das System behält die Reihenfolge der Zeilen bei, sofern die Werte in der jeweils ausschlaggebenden Spalte gleich sind.
Seien Sie gewarnt, daß das Sortieren einer sehr umfangreichen Arbeitstabelle viel Zeit in Anspruch nehmen kann. Der Vorgang kann ohne Gefahr für die Daten mit STOP unterbrochen werden.
Eine wichtige Einschränkung vorab: Datatool kann nicht auf die Datasette zugreifen, da die Speicherbereiche für den Datasettenbetrieb vom System selbst beansprucht werden.
Es gibt zwei verschiedene Möglichkeiten, Daten von Diskette zu laden. Die erste ist, ein von Datatool selbst erzeugtes File mit Load native file zu laden. Sie müssen nur den Filenamen einzugeben und RETURN im Feld Okay zu drücken. Falls der Filename Leerstellen am Anfang oder am Ende enthält, kann er in Anführungszeichen gesetzt werden. (Wenn Sie den exakten Filenamen vergessen haben, wählen Sie f8, Option "VIEW DIRECTORY" und kopieren den Filenamen über den Puffer.) Das System überprüft das geladene File und gibt eine Fehlermeldung, falls es nicht das richtige Format hat.
Als zweite Möglichkeit können mit der Import data-Option beliebige Daten von Diskette importiert werden. Die Anweisungen dazu müssen in die drei dazu vorgesehenen Basic-Felder eingetragen werden. Das erste Feld wird zum Öffnen des Files ausgeführt, das zweite zum Importieren der Daten, und das dritte zum Schließen des Files. So ähnlich wie beim Ausführen der Tabelle wird die Sequenz zum Öffnen nur einmal durchlaufen, die Sequenz zum Einlesen der Daten aber für jede einzelne Data- oder Result-Zeile von 1 bis 999, bis das Fileende erreicht ist und der I/O Status sich ändert. Dann wird die Sequenz zum Schließen des Files ausgeführt.
Beispiel: Nehmen wir
an, Sie wollen das Inhaltsverzeichnis Ihrer Spiele-Disks
importieren, um den Inhalt in halbwegs netter Form
auszudrucken, die Files alphabetisch zu sortieren, eine
Datei für gezielte Suche anzulegen, oder so etwas in der
Art.
|
In der
Öffnungssequenz öffnen sie einen Kanal zum Auslesen des
Directorys "$" von Disk,
und lesen gleich die beiden ersten Bytes ein, die die Ladeadresse
enthalten. Die ist nutzlos und wird nicht weiter verwertet.
Die eigentliche Basic-Sequenz, zum Importieren der Zeilendaten,
verwendet goto-Statements und braucht
daher Zeilennummern. Die Zeilen 2 bis 8 kümmern sich um die
richtige Behandlung der bereits in die Arbeitstabelle
eingelesenen Daten. Es ist ja so, daß mehr als nur ein
Inhaltsverzeichnis in die Tabelle eingelesen werden soll, und
folglich beim wiederholten Ausführen der Input-Option bereits
Daten in der Tabelle vorhanden sind. Wenn dies der Fall ist, wird
die Variable n in den bereits
belegten Tabellenzeilen die laufende Nummer enthalten.
Basic-Zeile 2 speichert die bisher höchste vergebene Nummer in
Variable h. Damit ist die Sache in
den belegten Tabellenzeilen auch schon erledigt, und die Sequenz
bricht in Zeile 4 ab, wenn n einen
Wert größer Null aufweist. Anderenfalls kann das Einlesen der
neuen Daten beginnen. In Basic-Zeile 6 wird eine neue laufende
Nummer vergeben, die aus dem ganzzahligen Teil der bisher
höchsten Nummer +1 und im Nachkommateil aus der laufenden
Filenummer /100 besteht. Diese wird in Variable f hochgezählt,
die anfangs Null enthält und in Zeile 8 für jede Zeile des
Inhaltsverzeichnisses um 1 erhöht wird.
Die Basic-Zeilen 10 bis 90 basieren auf dem Beispielprogramm im
Handbuch zur Floppy 1541. Zeile 10 überliest 2 Bytes, Zeile 20
holt die nächsten zwei Bytes, die die Filelänge enthalten.
Zeile 40 errechnet mit der ASC-Funktion
den numerischen Wert, wobei die Variable c$ einen
Error im Falle eines Null-Bytes verhindert. Zeile 50 prüft, ob
das Fileende erreicht ist, reduziert in diesem Fall die laufende
Nummer auf den ganzzahligen Wert, stellt den "blocks
free"-String bereit und beendet die Sequenz. (Um alles
weitere muß man sich nicht kümmern, da durch den geänderten
I/O-Status die Wiederholung der Sequenz automatisch eingestellt
wird.) Zeile 60 wartet auf ein Anführungszeichen, Zeile 70 setzt
den Filenamen in Variable na$ zusammen,
bis das abschließende Anführungszeichen kommt. Zeile 80
überliest Leerzeichen und Zeile 90 sammelt die Zeichen des
Filetyps in Variable ty$.
Diese Basic-Sequenz wird nun wiederholt durchlaufen, und zwar
für jeden Fileeintrag im Directory. Jeder Eintrag wird in Form
der Variablen n,
na$, bl und ty$ in die Arbeitstabelle übertragen und
in einer Tabellenzeile gespeichert. Wenn sich der I/O-Status
ändert, weil das Directory komplett ausgelesen ist, wird die
Basic-Sequenz zum Schließen des Files durchgeführt. Die ist
einfach und besteht nur aus einer close-Anweisung..
![]() Dieses Beispiel war etwas aufwendig. Aber es
zeigt die prinzipielle Flexibilität der
Input-Data-Option. Daten können auch von anderen
Programmen, z.B. Textverarbeitungen übernommen werden,
oder man kann selber temporäre Dateien anlegen, um Daten
zwischen verschiedenen Arbeitstabellen zu tauschen, unter
Nutzung der als nächstes beschriebenen Export-Option. |
Analog zum Laden gibt es die Möglichkeit, eine Arbeitstabelle
einschließlich aller Settings in allen Menüpunkten als
Datatool-File zu speichern, oder Daten aus der Arbeitstabelle
für weitere Anwendungen zu exportieren. Zum Sichern einer
vollständigen Arbeitstabelle mit Save muß nur
der Filename eingegeben werden (mit Anführungszeichen, falls er
führende oder abschließende Leerzeichen enthält). Gesichert
wird mit einem RETURN im Startfeld der
Wahl: Save, Verify, oder beides. Um ein bestehendes File zu
überschreiben, kann vor dem Filenamen der Zusatz @: verwendet werden. Das System löscht
dann das File auf Diskette vor dem Speichern. (Es verwendet nicht
den fehlerhaften Floppy-Befehl zum Überschreiben.)
Datatool-Files werden als "prg"-File gespeichert und
stellen tatsächlich ausführbare Programme dar. Wenn Sie eine
Session am C64 starten, können sie ebensogut das File laden und
mit run starten, wie zuerst das
Systemprogramm mit load
"datatool",8,1 laden, und das File danach.
Die Export-Option stellt das Gegenstück zur oben beschriebenen Import-Option dar. Es gibt drei Basic-Felder, um Anweisungen einzutragen. Die Sequenz zum Öffnen des Files wird einmal am Anfang ausgeführt, die Sequenz zum Exportieren der Zeilen wird für jede belegte Data- oder Result-Zeile der Arbeitstabelle durchlaufen (Label-, Pause- oder Basic-zeilen werden ignoriert), und am Schluß kommt die Sequenz zum Schließen des Files dran. Die Export-Option kann recht nützlich sein, um Daten mit anderen Programmen oder zwischen Arbeitstabellen auszutauschen, aber es sollten ein paar Regeln im Auge behalten werden:
Die Basic-Anweisungen print#, get#, und input#, sind bequem zum Austauschen von Daten, haben aber auch ihre Finessen. Hier ein kurzer Überblick:
Strings | Zahlen | |
Senden | print#2,x$ sendet den Inhalt der Variable x$ und ein Carriage Return (CR = ASCII 13) hinterher, das beim Empfangen das Ende der Variable signalisiert. (Mit einem Semikolon kann das CR unterdrückt werden: print#2,x$; ) Soll die Variable x$ mit input# empfangen werden, darf sie kein Komma enthalten und auch nicht leer sein (zuvor auf Leerstring prüfen: if x$="" then x$=" " ) | print#2,x sendet
einen Zahlenwert nicht in einem bestimmten numerischen
Format, sondern als Ziffernstring. Um einzelne Bytes (0-255) zu senden, kann der Wert in ASCII-Code umgewandelt und als einzelnes Zeichen gesendet werden: print#2,chr$(x) |
In der print# Anweisung können auch mehrere Variable, durch Semikolon oder Komma getrennt, hintereinander geschrieben werden. Der Effekt ist der, daß die Variablen ohne CR oder sonstigem Trennzeichen gesendet werden und sich beim Empfangen nicht mehr zuordnen lassen. Nur wenn man weiß, daß es sich bei den Variablen um einzelne Bytes handelt, kann das sinnvoll sein. Ansonsten sollte für jede Variable ein eigenes print# Statement verwendet werden. | ||
Empfangen | get#2,x$ empfängt ein einzelnes Zeichen. Eine Ausnahme ist, wenn das empfangene Byte Null ist. Dann enthält x$ nicht ein Zeichen mit dem Code Null, sondern hat eine Länge von Null. Wenn Sie die ASC-Funktion ausführen wollen, müssen Sie das in Form von x=asc(x$+chr$(0)) tun, um eine Fehlermeldung zu vermeiden. | get#2,x erwartet eine einzelne Ziffer im ASCII-Code. Da es eine Fehlermeldung gibt, sobald das empfangene Zeichen vom Ziffernformat abweicht, wird diese Anweisung eigentlich nie verwendet. Um ein einzelnes Byte zu empfangen, verwendet man get#2,x$ und die ASC-Funktion. |
input#2,x$ sammelt Zeichen in der Variable, bis entweder ein Komma (ASCII 44) oder ein CR (ASCII 13) das Ende der Variable signalisiert. Der empfangene String darf weder leer noch länger als 80 Zeichen sein. | input#2,x liest einen Ziffernstring bis zum Trennzeichen ein und wandelt ihn in eine numerische Variable um. Weicht ein Zeichen vom Ziffernformat ab, gibt es eine Fehlermeldung. | |
Bei get# und input# können auch mehrere Variablen, getrennt mit Komma, hintereinander angegeben werden. Das ist kein Gegenstück zur ähnlich aussehenden Option beim print# , denn die aufgereihten Variablen werden genau in der Weise empfangen wie es bei einer Reihe von Einzelanweisungen der Fall wäre. |
Das System bietet keine Treiber für verschiedenen Drucker an,
hat aber trotzdem einige Optionen zur Kontrolle der Druckausgabe.
Die Druckausgabe besteht in jedem Fall aus den Zeilen
"Headline", "Comment", "Title",
sowie aus allen Zeilen der Arbeitstabelle mit Ausnahme von
Basic-Zeilen. Zeilennummer und Zeilensetting werden nicht
gedruckt.
Print from / to row bestimmt den Bereich der gedruckten Zeilen und wird vom System selbst auf Stand gehalten. Natürlich kann der Bereich auch selbst festgelegt werden.
Ähnlich Print from / to column: Der Bereich
der gedruckten Spalten wird vom System gesetzt, kann aber
jederzeit verändert werden. Abgesehen davon gibt es im
Spaltensetting der Arbeitstabelle die Möglichkeit, einzelne
Spalten vom Ausdruck auszuschließen.
Sie werden die Gesamtlänge der Druckzeile im Auge behalten
müssen. Zur Breite jeder Spalte addiert sich ein Zeichen für
die Rasterlinie bzw. das Leerzeichen zwischen den Spalten, und
eines für den äußeren Rand. Sofern Ihr Drucker es erlaubt,
kann die Druckzeile bis zu 160 Zeichen lang werden.
Im Feld Column grid line kann ein einzelnes Zeichen in ASCII-Code angegeben werden, das zwischen den Spalten gedruckt wird. Wird nichts angegeben, druckt das System ein Leerzeichen zwischen den Spalten.
Im Feld Row grid line kann analog ein Zeichen festgelegt werden, das über die ganze Zeilenlänge zwischen den Tabellenzeilen gedruckt wird. Wird das Leerzeichen (ASCII 32) angegeben, so wird eine leere Zwischenzeile gedruckt. Enthält das Feld keine Angabe, so wird überhaupt keine Zwischenzeile gedruckt.
Im Feld Intersection kann ein weiteres Zeichen angegeben werden, das an den Schnittstellen von Spalten- und Zeilenraster gedruckt wird..
Perform / Reset headline erlauben die Eingabe eines ASCII-Codes (oder einer Code-Sequenz), der vor und nach der Tabellenüberschrift an den Drucker gesendet wird. Bei einer Sequenz aus mehreren Codes müssen die Codes mit SHIFT RETURN in getrennte Unterzeilen geschrieben werden. Fehlt die Angabe, ist das Feld ohne Wirkung.
Im Feld Perform / Reset col. titles kann in ähnlicher Weise eine Steuersequenz zur Gestaltung der Spaltenüberschriften angegeben werden.
Das Feld Define print codes kann benutzt
werden, um einzelnen Zeichen einen bestimmten ASCII-Code
zuzuweisen. Hier können z.B. die für den jeweiligen Drucker
gültigen Codes für die Sonderzeichen éäöüßÄÖÜ
eingetragen werden. Das geschützte Leerzeichen SHIFT SPACE wird
systemintern als ASCII-Code 224 verarbeitet, möglicherweise muß
es durch das übliche ASCII 160 ersetzt werden.
Die Eingabeform erfordert, daß zuerst das betreffende Zeichen
angegeben wird, gefolgt (mit oder ohne Leerzeichen dazwischen)
vom numerischen Code. Danach kann bei Bedarf ein Kommentar
angefügt werden, der vom System ignoriert wird. Unbedingt muß
für jedes definierte Zeichen mit SHIFT RETURN
eine eigene Zeile verwendet werden. Fehlerhafte Syntax wird vom
Programm ohne Fehlermeldung ignoriert.
Wenn ASCII set IBM ausgewählt ist, werden die Kleinbuchstaben a-z in ASCII-Code 97-122 umgewandelt, und die Großbuchstaben A-Z in 65-90, während im CBM-Set die Kleinbuchstaben durch die Codes 65-90 und die Großbuchstaben durch 193-218 dargestellt werden.
Die Felder BASIC open printer und BASIC close printer müssen Basic-Anweisungen zum Öffnen und Schließen des Druckfiles enthalten. Die Anweisungen können für verschiedene Drucker jeweils etwas anders aussehen. Möglicherweise muß mehr als ein File geöffnet werden, oder es sind vorab ein paar Kommandos an den Drucker zu senden. Falls mehr als ein File geöffnet wird, ist zu beachten, daß die Druckausgabe der Arbeitstabelle über die Filenummer gesendet wird, die zuletzt geöffnet oder benutzt wurde. Die Ausgabe selbst kann von Basic nicht kontrolliert werden, da es sich um eine Kopie der Bildschirmausgabe handelt. Aber es gibt ohnehin eine Reihe von Möglichkeiten. Beispielsweise kann auch die Export-Data-Option genutzt werden, um Daten an einen Drucker auszugeben, so wie umgekehrt auch die Druckausgabe der Arbeitstabelle in ein Diskfile umgeleitet werden kann, indem man statt eines Druckers ein File auf Diskette öffnet.
Unter diesem Menüpunkt finden sich eine Reihe unterschiedlicher Optionen. Manche werden einfach durch ein RETURN im linken Feld ausgeführt, andere benötigen eine Eingabe im rechten Feld.
Fehlermeldungen können unterschiedliche Herkunft haben: sie stammen entweder vom Basic-Interpreter, vom Drive, oder vom System selbst.
Systemwarnungen:
Systemfehlermeldungen:
Franz Kottira | kottira@chello.at | Frankie´s C64 Seite |