Nikolaus Heusler Archiv

Erschienen in 64'er Magazin, Ausgabe unbekannt · Originaldatei: DISKBASI.TXT

Hinweis: Dies ist das an die Redaktion eingereichte Manuskript, nicht der gedruckte Endtext. Layout, Bildunterschriften, Korrekturen und Kürzungen der Redaktion können in der veröffentlichten Fassung abweichen.

————————————————————————————
TEIL 1: AUSFÜHRLICHE ANLEITUNG MIT WORKSHOP
————————————————————————————

Diskbasic 64 - erleichtert den Umgang mit dem Laufwerk

»Diskbasic« ist eine Basic-Erweiterung, die den C 64 um 22 Befehle und Funktionen bereichert. Mit Hilfe dieser Befehle erlernen Sie dann die Systemprogrammierung des Laufwerks.

Bevor wir die Anwendung der Befehle in der Praxis beschreiben (der Hauptteil dieses Artikels), zunächst zu einer kurzen Beschreibung von Diskbasic selbst, damit es später nicht mit Grundsätzlichem Probleme gibt. Obwohl Diskbasic in reiner Maschinensprache geschrieben ist, kann es wie ein normales Basicprogramm geladen, gestartet und ggf. kopiert werden.

LOAD "DISKBASIC",8
RUN

Auf dem Bildschirm erscheint eine Einschaltmeldung. Diskbasic reagiert ziemlich empfindlich auf andere Soft- oder Hardware-Erweiterungen, diese sollten Sie vor dem Start also ggf. abschalten oder entfernen. Das Programm wurde in erster Linie für ein 1541-Laufwerk geschrieben, die Zusammenarbeit mit anderen Laufwerken sollte aber keine Probleme bereiten.
Die neuen Befehle können wie normale Basicbefehle angewendet und eingesetzt werden. Ausnahme: Soll ein neuer Befehl direkt nach THEN stehen, muß er mit einem Doppelpunkt von THEN abgetrennt werden. Bei einigen Befehlen (z.B. BASIC, SCRATCH, HEADER) erscheint eine Sicherheitsabfrage, die durch Tastendruck J oder N beantwortet werden soll.

Die neuen Befehle

FPOKE ADR,X: Schreibt den Wert X (0 bis 255) in die Speicherzelle ADR (0 bis 65535) der Floppy 1541. Beispiel: FPOKE 0,192 führt einen Bump für Puffer 0 aus.
FSYS ADR: führt ein Maschinenprogramm im Floppy-Speicher (RAM oder ROM) ab ADR aus. Beispiel: FSYS $EA6E ruft die Diagnose-Fehler Routine auf (rote LED blinkt langsam).
MERGE: Hängt ein auf Diskette gespeichertes Basicprogramm an das im Speicher stehende an. Syntax wie LOAD-Befehl.
START: Lädt ein auf Diskette gespeichertes Basicprogramm und startet es mit RUN. Syntax wie LOAD.
DIR: Anzeige des Directories auf dem Bildschirm
DISK: Anzeige des Fehlerkanals
FRESET: Führt einen Reset des Drives aus (UJ) und wartet eine Sekunde
BASIC: Schaltet Diskbasic ab. Neustart ggf. mit SYS 49152.
HEADER "NAME": formatiert eine Diskette
SCRATCH "FILENAME": löscht (ein) File(s) von Diskette
COLLECT: führt Validate aus
INIT: initialisiert die Diskette
SET X: stellt alle angeschlossenen und eingeschalteten Laufwerke auf die neue Gerätenummer X (normal: 8) ein
DEVICE X: die Befehle von Diskbasic sprechen ab jetzt die Gerätenummer X an (normal: X=8)
DRIVE X: die Befehle von Diskbasic sprechen ab jetzt das Laufwerk X (0 (normal) oder 1) an. Dieser Befehl eignet sich für Doppel-Laufwerke.

Weiter sind einige Erweiterungen der Basic-Funktionen dazugekommen, die ganz normal hinter PRINT, in numerischen Termen oder als Argumente verwendet werden dürfen (Beispiel: PRINT DS, FPOKE $1C00,FPEEK($1C00)+5, A=E-ADR"FILENAME" und so weiter).

Hexadezimalen Werten wird das Dollerzeichen vorangestellt, binären das Prozent. Beispiel: PRINT $AB1E wirkt wie PRINT 43806, PRINT %1001 wirkt wie PRINT 9. Kommt in einer hexadezimalen Zahl die Folge DEF vor, muß zwischen D und E ein Leerzeichen gesetzt werden (Verwechslungsgefahr mit DEF FN). Beisiel: LET C = $4D EF ergibt C = 19951.
DS ergibt den Disk-Status. Beispiel: entnehmen Sie die Diskette aus dem Laufwerk und geben ein: INIT:PRINT DS ergibt 74, da die Fehlermeldung 74,DRIVE NOT READY,18,00 im Puffer steht.
ADR "FILENAME" ergibt die Ladeadresse (Startadresse des Files) von FILENAME. Beispiel: R = 1 + ADR"DISKBASIC":PRINT R ergibt 2050, da die Startadresse des Programms 2049 ist.

Zuletzt seien noch die beiden Tastenfunktionen erwähnt. Durch Druck auf <f1> wird der Disk-Status abgerufen, <f3> zeigt das Directory am Bildschirm an.

Im Rahmen Ihrer Experimente mit Diskbasic werden Sie die neuen Fehlermeldungen bemerken, die das Programm ausgibt, z.B. ILLEGAL DRIVE NUMBER, falls der Parameter hinter DRIVE ungleich 0 oder 1 ist. Die Meldung FIRST REMOVE PROTECT! erscheint immer dann, wenn der Schreibschutz aktiviert ist und Sie einen Schreib-Befehl auf Diskette (z.B. HEADER) ausführen wollen. Die Meldung ?SYSTEM ERROR weist darauf hin, daß Sie das Programm nicht zweimal hintereinander mit SYS 49152 aktivieren dürfen.
Diskbasic arbeitet mit anderen Erweiterungen zusammen, die nicht den Speicherbereich $C000-$CFFF belegen, da es die Systemvektoren dynamisch verbiegt. Dazu muß erst die andere Erweiterung geladen und aktiviert werden, danach Diskbasic.

Systemprogrammierung für die Commodore Floppy VC 1541

Nun kommen wir endlich zur Praxis. Für die folgenden Beispiele wird die Befehlserweiterung Diskbasic vorausgesetzt!

Das Gelernte in der Praxis

Es gibt auf dem C 64, wie Sie vielleicht wissen, verschiedene, na, nennen wir's mal Hierarchiestufen des Bedienens und Programmierens. Die höchste und einfachste Stufe ist beispielsweise das Bedienen von fertigen Programmen, die zweithöchste das Programmieren in Basic, dann kommt das Programmieren in Maschinensprache mit einem Assembler und als unterste Stufe das Schreiben von Maschinenprogrammen unter Verwendung eines Monitors (diese Methode ist die langwierigste, aber effektivste Stufe). Wozu programmiert man dann in einer der unteren Stufen, wo es doch viel einfacher ist, in Basic zu schreiben als in Assembler (Maschiensprache)? Ein Basic-Benutzerprogramm, das bedient wird, bietet eben nur bestimmte Mögichkeiten, die der Programmierer vorgesehen hat, während man in Maschinensprache zwar mit mehr Aufwand jedoch alles programmieren kann, was auch immer erwünscht ist.

Zwei Ebenen in der 1541

Was hat dieser Exkurs mit der 1541 zu tun? Sehr viel: Diese Hierarchie existiert natürlich auch bei der Laufwerksprogrammierung. Blutige Anfänger werden ihr Laufwerk wohl nur benutzen, um mit SAVE und LOAD Programme zu speichern und laden. Weiter Fortgeschrittene kennen auch schon die Programmierung der sequentiellen Dateien, und die Systembefehle wie S, N, I, V und so weiter. Und dann gibt's noch eine Gruppe, die Experten, die sich auch schon mit relativen Dateien auskennen und (jetzt wird's wichtig!) wissen, wie man mit M-R, M-W, U1, U2, B-R und B-W und so weiter auf jeden Speicherplatz der Diskettenstation (des ROMs und RAMs) und auf jeden Block (jeden Sektor, jede Stelle) der Diskette (in diesem Fall die Magnetscheibe, die man ins Laufwerk steckt) zugreift. Daß Sie die Befehle zum Lesen und Schreiben jedes Diskettenblocks (U1, U2 bzw. B-R und B-W) und die Befehle zum Lesen und Schreiben des Floppy RAMs zumindest verstehen (M-R, M-W), sei im Folgenden vorausgesetzt. Bei der Erweiterung DISKBASIC V2 werden die Befehle M-R und M-W durch FPOKE und FPEEK ersetzt. Der Befehl zum Ausführen von Maschinenprogrammen im FloppyRAM (M-E, Memory Execute) heißt hier FSYS. Genaueres zu den Floppy-Systembefehlen findet sich im Bedienungshandbuch zur Diskettenstation. Ansonsten kann's eigentlich losgehen.

Zugriff auf Spur 36 bis 41

Wenn Sie etwa den Track 18, Sektor 1 in den Floppyspeicher einlesen wollen, geben Sie gewöhnlich diese Befehlsfolge:
OPEN 15,8,15,"I":REM initialisieren
OPEN 3,8,3,"#":REM Direktzugriffsdatei
PRINT#15,"U1 3 0 18 1":REM Block lesen

Mit GET#3, INPUT#3 und PRINT#3 können Sie nun auf den Block schreiben oder von ihm lesen. Soll auf ein bestimmtes Byte positioniert werden, findet der B-P-Befehl Anwendung. Mit »U2 3 0 18 1« werden die Daten wieder auf die Diskette zurückgeschrieben. Diese Methode ist die zweiteleganteste Methode zum direkten Diskettenzugriff, aber auch die am meisten verbreitete. Sie hat aber einen Nachteil: Eine Diskette hat nicht nur 35 Spuren (Tracks), die meisten Disketten können sogar 40, einige sogar 41 oder 42-spurig beschrieben werden! Das wollen wir gleich ausprobieren. Die folgenden Experimente sollten auf einer völlig leeren Diskette ohne wichtige Daten durchgeführt werden. Formatieren Sie diese Diskette bis Track 40, dazu eignet sich beispielsweise das im 64'er Magazin vorgestelle Programm Disk Demon, auch verschiedene Kopier- oder Schnellformatierprogramm bieten ein entsprechende Funktion. Zur Sicherheit sollten die neuen Tracks 36 bis 40 (oder 41) auf Lese- und Schreibfähigkeit getestet werden, falls das mit dem Formatierprogramm möglich ist.
Dann versuchen Sie, wie oben beschrieben, doch mal, mit »U1 3 0 37 9« die Spur 37, Sektor 9 in den Floppyspeicher zu lesen! (Die Tracks 36 bis 41 haben je 17 Sektoren, die von 0 bis 16 durchnumeriert werden). Das Lesegerät quittiert den Versuch mit der Fehlermeldung 66,ILLEGAL TRACK OR SECTOR. Die Spur 37 ist vom DOS nicht vorgesehen, sie kann nicht gelesen werden, obwohl sie tatsächlich vorhanden und sogar schon formatiert ist. Wir werden nun eine anfangs etwas kompliziert aussehende Methode kennenlernen, doch auf diese Tracks zugreifen zu können.

Der Disc-Controller

Im Floppy-RAM gibt es einige Speicherzellen, in denen das Hauptprogramm der Station, welches auch Ihre Befehle auswertet (S, N, I, V etc.) und Dateien verwaltet einem zweiten, Interrupt gesteuerten Unterprogramm mitteilt, was dieses nun zu tun hat. Das Unterprogramm wird auch »Disc Controller«, kurz »DC« genannt. Aufgaben des DC sind: Tracks auf der Disk suchen (den Lesekopf an die richtige Position fahren), die Motoren kontrollieren, einzelne Tracks und Sektoren lesen und schreiben und sogar Disketten formatieren. Auch verwaltet der DC, der bei größeren Laufwerken als eigener zweiter Prozessor realisiert ist, die Hardware, also Leuchtdioden (LEDs), Motoren und Schreib- und Lesesignale vom »Tonkopf«. Wohlgemerkt: Dieses Unterprogramm wird vom Interrupt-Timer, der beim C 64 Dinge wie das Cursorblinken, Tastatur und so weiter steuert, einige Male in der Sekunde aufgerufen. Der DC schaut dann in den erwähnten Speicherzellen der Zeropage nach, ob das Hauptprogramm etwas von ihm will, wenn nicht, wird der Interrupt sofort beendet, sonst wird der »Job« ausgeführt. Nach Abarbeitung des Befehles wird eine Fehlernummer oder das OK-Kennzeichen in den selben Speicherzellen zurückgegeben. Das Hauptprogramm wartet, wenn es einen Job an den DC übergeben hat, bis sich die Speicherzelle verändert hat, und prüft, ob der DC einen Fehler gemeldet hat. Wenn ja, wird die entsprechende Meldung an den C 64 gesendet.

Ein Beispiel

Diese etwas trockene Materie soll an einem konkreten Beispiel verdeutlicht werden. Der Anwender gibt vom C 64 aus den Befehl, das Directory zu laden. Der C 64 schickt an die Diskettenstation den Auftrag, eine Datei mit dem Dollarzeichen zum Lesen zu öffnen. Das Inhaltsverzeichnis findet sich üblicherweise auf Track 18 der Diskettenstation und beginnt dort bei Sektor 0. Das Hauptprogramm der Floppy will also zunächst einmal Track 18, Sektor 0 lesen. Dazu schreibt es die beiden Parameter 18 und 0 in die Zeropage-Speicherzellen 6 und 7 des Floppy-RAMS. Sodann wird eine bestimmte Codezahl (nämlich 128), die den Befehl »Lesen« symbolisiert, in die Floppy-Speicherzelle 0 geschrieben. Der DC, der laufend die Speicherzelle 0 ausliest, stellt fest, daß eine Änderung eingetreten ist. Er erkennt die 128 als den Befehl, einen Sektor zu lesen. Die Angaben, welchen Sektor auf welchem Track holt sich der DC aus den Speicherzellen 6 und 7. Er führt nun seine Routinen aus, die den Steppermotor auf Track 18 bewegen, warten, bis Sektor 0 unter dem Kopf erscheint, der dann gelesen und decodiert wird. Gelang das alles einwandfrei, schreibt der DC eine Null in Speicherzelle 0, ein Zeichen dafür, daß alles zur Zufriedenheit ablief. Trat ein Fehler auf, etwa weil die Diskette nicht vorhanden oder nicht formatiert war, wird eine Fehlercodenummer ungleich Null in Adresse 0 vermerkt. Das Hauptprogramm wartet so lange, bis der DC den Lesevorgang beendet und seine Rückmeldung in Zelle 0 zurückgegeben hat. Abhängig davon, ob es die Null (fehlerfrei) oder etwas anderes war, wird dann entweder der gelesene Block weiter verarbeitet oder eine Fehlermeldung an den C 64 zurückgeschickt.
Durch diese auf den ersten Blick umständliche und ungünstige Unterteilung zwischen Hauptprogramm und DC bringt den Vorteil mit sich, daß die 1541 praktisch zwei Programme gleichzeitig ausführen kann. Viele moderne Großrechner und PCs arbeiten übrigens auch nach einem ähnlichen Prinzip!

Der Anwender als DC

Die Schutzvorrichtungen, die die Track- und Sektornummern prüfen, befinden sich nicht im DC, sondern im Hauptprogramm, das den DC steuert. Wenn Sie aufgemerkt mitgelesen haben, müßte es bei Ihnen eben geklingelt haben. Wie wäre es, wenn einfach wir einmal Hauptprogramm spielen und den DC steuern! Das geht einfach, indem wir die Jobnummern in die Speicherzellen schreiben. Wie das geht, erfahren Sie jetzt.
Dazu ein Ausschnitt aus der Speicherbelegung im Floppy-RAM:

Zelle Funktion
0 Jobcode Puffer 0, Fehlermeldungsrückgabe
1 Jobcode Puffer 1, Fehlermeldungsrückgabe
2 Jobcode Puffer 2, Fehlermeldungsrückgabe
3 Jobcode Puffer 3, Fehlermeldungsrückgabe
4 Jobcode Puffer 4, Fehlermeldungsrückgabe
6, 7 Track und Sektorangabe für den Job für Puffer 0
8, 9 Track und Sektorangabe für den Job für Puffer 1
10,11 Track und Sektorangabe für den Job für Puffer 2
12,13 Track und Sektorangabe für den Job für Puffer 3
14,15 Track und Sektorangabe für den Job für Puffer 4

Die entsprechenden Speicherzellen für Puffer Nr. 5 (Zellen 5 und 16 bis 17) sind also nicht benutzt, denn die 1541 hat nur fünf (Nummern 0 bis 4) Puffer), aber dennoch vorhanden (werden nicht vom DC abgefragt).

Jobs und Puffer

Unsere Aufgabe soll sein: Lesen von Track 37, Sektor 9 in den Puffer Nummer 2. Hier eine Auflistung aller Jobcodes:

Code Hex dez. Funktion
80 128 Lesen eines Sektors in den Puffer
90 144 Schreiben des Pufferinhaltes in einen Sektor, danach automatisch:
A0 160 Verify eines Sektors mit Pufferinhalt
B0 176 Positionieren auf einen Track & Sektor
C0 192 Kopftransport (BUMP)
D0 208 Programm im Puffer ausführen
E0 224 Jobprogramm ausführen, nachdem Laufwerk bereit ist.

Ab jetzt wird das Diskbasic aktiv. Wir benutzen die Befehle FPOKE und FPEEK zum Schreiben der Jobcodes ins Floppyram.

Das erste Programm

Zuerst etwas Einfaches zur Übung: Wir wollen den Schreib/Lesekopf zur Justierung zum Anschlag zurückfahren (BUMP). Dabei entsteht das typische »Rattern«, das Sie von der Formatierung oder Lesefehlern kennen:

10 FPOKE 6,18:REM Tracknummer für Puffer 0
15 FPOKE 0,$C0:REM Jobcode für "BUMP"
20 IF FPEEK(0) = $C0 THEN 20:REM warten bis Job fertig
25 IF FPEEK(0) = 1 THEN PRINT"FEHLERLOS.":END
30 PRINT "FEHLER NUMMER"FPEEK(0)
35 END

Probieren Sie das Programm aus, nachdem Sie wie oben gezeigt Diskbasic aktiviert haben!
Jetzt wollen wir Track 37, Sektor 9 in den Puffer 2 einlesen:

10 FPOKE 10,37:REM Track für Job für Puff. 2
15 FPOKE 11,9:REM Sektor
20 FPOKE 2,$80:REM Jobcode für Puffer 2 für »Lesen«
25 IF FPEEK(2) = $80 THEN 25:REM warten bis Job fertig
30 IF FPEEK(2) = 1 THEN PRINT"FEHLERLOS.":END
35 PRINT "FEHLER NUMMER"FPEEK(2)
40 END

Nun haben Sie tatsächlich den Track 37, Sektor 9 im Puffer 2 des Disk Laufwerkes. Bisher wissen wir zwar, daß es fünf Puffer gibt, die von 0 bis 4 durchnumeriert sind, wir wissen aber noch nicht, was ein Puffer überhaupt ist. Ein Puffer ist einfach ein Speicherbereich von 256 Byte (1 Page) im RAM der 1541. Ein solcher Bereich wird benötigt, damit beispielsweise das Hauptprogramm den vom DC gelesenen Sektor auch auswerten kann. Wir werden bei unseren Experimenten bevorzugt mit Puffer 2 arbeiten, da er im normalen Betrieb der 1541 nicht belegt ist. Hier die Adressen der Puffer:

Puffer Adresse
0 $0300-$03FF (Hauptarbeitspuffer)
1 $0400-$04FF (aktueller Dir. Teil)
2 $0500-$05FF (normal frei)
3 $0600-$06FF (letzter Dir. Block)
4 $0700-$07FF (Track 18, Sektor 0 nach I)
5 bei 1541 nicht vorhanden

Mit dem Befehl FPEEK(X) können Sie nun für X = $0500-$05FF den Sektor aus dem Floppy-RAM lesen, mit FPOKE verändern und mit dem Jobcode für Schreiben ($90), den Sie im obigen Programm in Zeile 20 und 25 für $80 (Lesen) einsetzen, auf Disk zurückschreiben. Das Blinken der roten LED im Fehlerfalle erzeugt übrigens auch das Hauptprogramm, nicht der Diskkontroller, genau wie das Anschalten der LED vor Diskzugriff. Dies müssen wir, wenn uns etwas daran liegt (Schönheitsfehler), per Hand simulieren. Wenn Sie im Fehlerfalle zur Fehlernummer, die das Programm ausgibt, 18 addieren, bekommen Sie die Fehlernummer, die das Hauptprogramm auf Kanal 15 den Computer normalerweise mitteilt.

Tips und Hinweise

Hier noch einige Hinweise: Es wurde schon erwähnt, daß auf dieser Ebene keine Schutzmaßnamhen mehr existieren. Wenn Sie also versuchen, Track 100 zu lesen, versucht dies der DC auch, die Folge wäre, daß der Steppermotor versucht, den Lesekopf auf Track 100 zu positionieren. Die Folge wäre ein verstellter Kopf. Passen Sie also auf! Noch etwas gibt es zu beachten: Bei der Floppy können Sie durch Programmierung im Gegensatz zum Computer mechanische Teile bewegen. Diese sind einem Verschleiß unterworfen, so daß Sie bei der Programmierung mit viel Sorgfalt vorgehen sollten, um Beschädigungen auszuschließen.
Zum Schluß noch ein Tip: Mit der folgenden Zeile wird der Schreib/Lesekopf der Floppy schneller bewegt, da der IRQ und damit der DC nun schneller ausgeführt werden:

OPEN 1,8,15
PRINT#1,"M-W"CHR$(5)CHR$(28)CHR$(3)CHR$(25)CHR$(0)CHR$(25)
CLOSE 1

Nikolaus Heusler

Literatur:
Disk-Demon, 64'er 8/87
DMS, 64'er 9/89
In die Geheimnisse der 1541 eingetaucht, 64'er Sonderheft 25
Alles über die 1541, Karsten Schramm, Markt & Technik Verlag
Das große Floppy-Buch, Data Becker

———————————————————————————————————
TEIL 2: HIER NOCH EINE KURZANLEITUNG NUR FÜR DAS PROGRAMM
———————————————————————————————————

Direkten Zugriff auf den Floppyspeicher: Diskbasic 64

»Diskbasic 64« ist eine Basic-Befehlserweiterung, die mit Hilfe der neuen Basicbefehle FPOKE, FPEEK und FSYS extrem komfortabel direkten Zugriff auf den Speicher (RAM und ROM) der Floppy erlaubt. Jetzt kann endlich auch der Basicprogrammierer bequem das Laufwerk voll ausreizen. Einige interessante Sonderfunktionen sind enthalten.

Dieses Programm definiert neue Basicbefehle, die das Arbeiten mit der Floppystation 1541 erleichtern. Sie können in Basic-Programmen oder im Direktmodus verwendet werden (wie normale Basic-Befehle).

Laden Sie die Erweiterung, zu deren Betrieb keinerlei Assemblerkenntnisse erforderlich sind, mit dem Befehl

LOAD"DISKBASIC",8

Der Start erfolgt mit RUN. Eine Einschaltmeldung erscheint. Jetzt sind die neuen Befehle aktiv. Dabei gilt die übliche Einschränkung für Basic-Befehlserweiterungen: Soll ein neuer Befehl direkt hinter THEN stehen, muß er mit einem Doppelpunkt von THEN abgetrennt werden.

Hier die neuen Befehle:

FRESET ergibt einen Floppyreset (entspricht UJ)
FPOKE X,Y Schreibt in die Floppyspeicherzelle X den Wert Y.
(ähnlich wie Memory-Write)
DIR Gibt das Directory ohne Programmverlust auf dem Bild-
schirm aus.
INIT Initialisiert die Floppy (entspricht I)
COLLECT Validiert die Diskette (entspricht Validate)
DEVICE X Die Diskbefehle wirken jetzt auf Gerät Nr. X (4-191).
Dieser Wert ist am Anfang auf 8 eingestellt.
DRIVE X Die Befehle wirken auf DRIVE X (0-1). Achtung: Nicht
alle Befehle berücksichtigen den DRIVE Befehl. Manche
wirken immer auf Drive 0.
DISK Gibt den Fehlerkanal aus.
FSYS X Springt in ein Maschinenprogramm, das im Floppyspei-
cher ab Zelle X steht und mit 96 (RTS) endet. (entspricht M-E)
SCRATCH A$ Das Programm A$ wird gelöscht. (entspricht S)
HEADER A$ Formattiert die Disktte unter dem Namen A$. A$ kann
nach einem Komma die ID enthalten. (entspricht N)
SET X Gibt dem aktuellen Laufwerk die Nummer X. Funktioniert
nur, wenn der DEVICE-Befehl vorher auf die alte Nummer
angewendet wurde.
START "..." Wie LOAD (mit Autostart)
MERGE "..." Wie LOAD (neues Programm wird angehängt)

Neue Funktionen:

DS Diese Variable enthält die Nummer des letzten Disk-
errors, z.B. PRINT DS
% ..... deutet ..... als Binärzahl, z.B. %100101 entspricht 37
$ ..... deutet ..... als HEX Zahl, z.B. $A6BF8 entspricht 683000
FPEEK (X) ergibt den Wert der Floppyspeicherzelle X (Memory-Read)
ADR "TEST" ergibt die Startadresse des Programmes "TEST".
Bsp.: PRINT ADR "DISKBASIC"

Speicherbelegung:

776/777 Vektor EGONE (Befehlsauswertung)
778/779 Vektor EVAL (Funktionsauswertung)
788/789 Vektor IRQ (Interrupt)
49152 Initalisierung
49223 - Befehlsausführung
50799 - Neue IRQ-Routine (für Funktionstasten)
49284 - Formelauswertung
50000 - Unterprogramme
52000 - Texte der Befehle
52700 - Weitere Texte
52992 - I/O Latch
2024 Flag, ob <f1> gedrückt
2025 Flag, ob <f3> gedrückt
181 Device Nummer
182 Drive Nummer
251/2 Arbeitsspeicher
20/1 Arbeitsspeicher
34/5 Arbeitsspeicher
247 Flag: 1 = SCRATCH, 0 = HEADER
247-50 Arbeitsspeicher für MERGE
2 Arbeitsspeicher

Bei Betätigung von <f1> wird der Fehlerkanal ausgegeben, durch Druck auf <f3> erscheint (natürlich ohne Programmverlust) das Directory. Die Befehle MERGE und START eignen sich auch für die Datasette.

Neue Fehlermeldungen:

?SYSTEM ERROR Es ist aus technischen Gründen nicht erlaubt,
Diskbasic zweimal hintereinander zu starten.
?ILLEGAL DRIVE NUMBER ERROR
Der Parameter beim DRIVE-Befehl darf nur 0 oder 1
lauten.
?DISK ERROR Sie sollten Ihr Laufwerk reparieren lassen, bei
der DS-Funktion ist die Fehlernummer > 255

Bei den Befehlen HEADER, COLLECT und SCRATCH wird über die FPEEK Funktion zuerst geprüft, ob auf der Diskette ein Schreibschutz klebt. Dann wird der Basic-Programmablauf nicht unterbrochen, aber die Meldung »FIRST REMOVE PROTECT« ausgegeben.

Beispiele aus der Praxis

Mit FPOKE $1C00, %11010100 (entspricht FPOKE7168,212) schaltet den Hauptmotor ein. Mit FPOKE 7168,224 schalten Sie ihn wieder ab. Mit dem Befehl PRINT FPEEK(7168)AND 16 können Sie erkennen, ob sich auf der Diskette ein Schreibschutzkleber befindet, dann erscheint 0, oder nicht, wenn 16 erscheint. Andere Werte sind nicht möglich.

Hier ein kleines Basicprogramm dazu:

10 A = FPEEK (7168) : I = 128
20 PRINT (AANDI)/I;: I = I/2 :IF I=.5 THEN PRINT : GOTO 10
30 GOTO 20

Nach dem Start dieses Programmes erscheinen acht Zahlenreihen auf dem Schirm, die den acht Bits der Speicherzelle $1c00 der Floppy entsprechen. Jede dieser acht Zahlenreihen hat eine Bedeutung (von links nach rechts):

Ziffer Zweck

1 SYNC Markierung erkannt
2 Immer 1 (Timing-Steuerung)
3 Immer 1 (Timing-Steuerung)
4 Wenn 0: WRITE PROTECT ON
5 Wenn 1: rote LED an
6 Wenn 1: Laufwerkshauptmotor an
7 Spule 1 des Steppermotors
8 Spule 2 des Steppermotors

Übrigens: Die oben angesprochene WRITE-PROTECT-Prüfung beruht auf dem Testen der Ziffer #4. Es soll noch angemerkt werden, daß der Steppermotor, der den Schreib/Lesekopf bewegt, nur bei eingeschaltetem Hauptmotor bewegt werden kann.
Die verwendete FPOKE-Adresse 7168 ist der Port B der Floppy VIA #2 (vergleichbar mit der CIA eines C 64) und übernimmt Steuerungsaufgaben der Mechanik.

Das Demoprogramm, das nach dem Laden und Starten von Diskbasic geladen und mit RUN gestartet wird, enthält eine komfortable Oberfläche, mit deren Hilfe Sie bequem auf wichtige mechanische Komponenten im Laufwerk Einfluß nehmen können. Studieren Sie dieses Programm, wenn Sie sich beispielsweise für die Programmierung der beiden Motoren oder die Abfrage der Lichtschranke oder des Lesekopfes im Laufwerk interessieren. Die Steuerung erfolgt über folgende Tasten:

M - schaltet den Hauptmotor ein und aus
<+> - bewegt den Lesekopf um einen halben Track nach außen
<-> - bewegt den Kopf einen halben Track nach innen (Richtung Track 1)
S - setzt den Sync-Zähler auf Null (siehe unten)
E - schaltet den Hauptmotor aus und beendet das Programm

Das Programm zeigt laufend den Zustand von Hauptmotor, Schrittmotor, roter LED und Schreibschutzlichtschranke an. Dazu werden die acht Bits der Speicherzelle 7168 ($1c00) ausgelesen und wie in obiger Tabelle erklärt ausgelesen. Bei laufendem Hauptmotor »schwebt« gelegentlich eine Sync-Markierung (wird zur Synchronisation der Diskettendaten verwendet) am Lesekopf vorbei, das Programm zählt diese Ereignisse. Der entsprechende Zähler (lassen Sie das Programm doch mal einige Zeit bei eingeschaltetem Hauptmotor laufen!) wird mit der S-Taste auf Null zurückgestellt. Die vom Lesekopf ankommenden Daten werden nach dem Umschalten des PCR (Port Control Register) auf die Betriebsart »Lesen« mit dem Befehl FSYS $FE00 (siehe Floppy-ROM-Listing) direkt aus Adresse $1c01 (Lesekopf-Daten) entnommen und entsprechen in keinster Weise den auf Diskette gespeicherten Daten (dazu ist Basic viel zu langsam). Der Grund dafür, daß auch bei nicht eingelegter Floppy Daten vom Lesekopf kommen liegt wahrscheinlich in Störungen der Verstärkerelektronik. Aber wie gesagt, in Basic sind genauere Untersuchungen mangels Geschwindigkeit nicht möglich.