C64 datatool - Commodore 64 Tabellenkalkulation

Here also in english language


 
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).


Allgemein

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

nach oben

Programstatus

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:

nach oben

Download

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.


nach oben

Anleitung

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.

nach oben

Tabelle bearbeiten

Spaltensetting:

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:

Zeilensetting:

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.

Tabellen bearbeiten - Puffer-Operationen:

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.

nach oben

Tabelle ausführen

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.

nach oben

Text suchen

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.

nach oben

Daten sortieren

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.

nach oben

Files laden

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.

Zunächst müssen Sie die Arbeitstabelle vorbereiten. Sie sehen eine Spalte für eine laufende Nummer vor, und zwar Spalte A, mit der zugeordneten Variable n, Typ numerisch, Spaltenweite 6, mit 2 festen Nachkommastellen. Im ganzzahligen Teil soll die laufende Disknummer, im Nachkommateil die laufende Filenummer gespeichert werden. Ferner sehen Sie Spalte B für den Disk- bzw. Filenamen vor und weisen ihr die Variable na$ zu. Spalte C ist für die Filelänge vorgesehen, numerisch mit Variable bl. Und Spalte D soll den Filetyp mit der zugeordneten Variable ty$ enthalten.
Nachdem der Aufbau der Arbeitstabelle geregelt ist, wenden Sie sich dem Datenimport zu.


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..

Nach dem Import einiger Disketten-Inhaltsverzeichnisse sieht die Arbeitstabelle vielleicht so aus wie der Screenshot links. Sie können nun die Daten nach Belieben weiter verarbeiten. (Allerdings wird bei großen Spielesammlungen nach - grob geschätzt - 50 Disketten Datatool an die Speichergrenzen stoßen.)

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.
Bitte behalten Sie im Auge, daß die Import-Data-Option, anders als beim Laden eines Datatool-Files, den bestehenden Inhalt der Arbeitstabelle nur verändert, wenn die den Spalten zugeordneten Variablen neu beschrieben werden. Man kann also jederzeit zusätzliche Daten in die Arbeitstabelle einlesen, muß aber vorsichtig sein, wie man welche Variable einsetzt.

nach oben

Files sichern

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.

 

nach oben

Tabelle drucken

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.

nach oben

Systemoptionen

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.

nach oben

Fehlermeldungen

Fehlermeldungen können unterschiedliche Herkunft haben: sie stammen entweder vom Basic-Interpreter, vom Drive, oder vom System selbst.

Systemwarnungen:

Systemfehlermeldungen:

nach oben


Franz Kottira kottira@chello.at Frankie´s C64 Seite