----------------------------------------------------
Kapitel
9
Das
Disketten-Oparating System (DOS 2.OS)
----------------------------------------------------
EINF‹HRUNG
Das
Disketten-Oparating-System (DOS) ist eine Erweiterung des OS. Es gestattet den Zugriff
auf Disketten / Massenspeicher in Form von Dateien, die wie andere Dateien abgerufen
worden können. Es folgt eine Besprechung des DOS und seiner Benutzung.
Das
Disketten-Oparating-System besteht aus drei Teilen: dem residenten Disketten-Handler,
dem File-Manager (FMS) und der Disketten-Utility (DUP). Der residente Disketten-Handler
ist der einzige Teil des OS, der sich im ROM befindet. FMS und DUP befinden sich
auf der Diskette und werden in den Computer geladen, sobald dieser eingeschaltet
wird (BOOT).
Der
residente Disketten-Handler
Der
residente Disketten-Handler ist der einfachste Teil des DOS. Der Disketten-Handler
folgt nicht, wie andere Handler, der normalen CIO-Aufrufssequenz. Das Verhältnis
des Disketten-Handlers zum I/O-Untersystem wird in Abbildung 8.2 in Abschnitt 8.2
dieses Buches dargestellt.
Aus
der Abbildung ist zu ersehen, daF der DCB die Kommunikation mit dem Disketten/Handler
übernimmt. Die Aufruf-Sequenz für den Disketten-Handler lautet wie folgt:
;Benutzer muss DCB erstellen
JSR DSKINV ;System-Routinen
Vektor zum residenten
;Disketten-Handler.
BPL OKAY
;Bei Erfolg verzweigen, Y-Register=l.
;Andernfalls enthält Y-Register den
;Fehlercode, der auch in DCBSTA
;gespeichert wird.
Der
Disketten-Handler führt 5 Funktionen aus:
FORMAT
- Ausgabe eines FORMAT-Befehls an den Disk-Kontroller
READ
SECTOR - Lesen eines
bestimmten Sektors
WRITE
SECTOR - Schreiben
eines festgelegten Sektors
WRITE/VERIFY
SECTOR - Schreiben
eines bestimmten Sektors mit anschlieFender ‹berprüfung
STATUS
- Zustand des Disk-Kontrollers abfragen
Der
Format/Befehl löscht alle Spuren auf der Diskette, woraufhin die Sektoradressen
auf die neuen Spuren geschrieben werden. Durch dieses Kommando wird keine Datei-Struktur
auf die Diskette gebracht.
Die
3 I/O-Befehle für Sektoren können zum Lesen oder Schreiben von Sektoren
von bzw. auf die Diskette oder zum Aufstellen einer eigenen Datei-Struktur verwendet
werden. In Abschnitt 10 des OS-Benutzer-Manuals befindet sich ein Beispiel für
die Benutzung des Disketten-Handlers zum Schreiben einer BOOT-Datei.
Die
Status-Funktion wird zum Feststellen der Zustände der einzelnen Disketten-Stationen
benutzt, kann aber auch für andere Zwecke verwendet werden. Da der Timeout-Wert
für den STATUS-Befehl kleiner als für andere Kommandos ist, ist dieser
gut geeignet, den Anschluss einer bestimmten Disketten-Station festzustellen. Zeigt
der Disketten-Handler eine Timeout-Meldung an, so ist die betreffende Station nicht
angeschlossen.
Die
DUP (Disk Utility Package) ist ein Satz von Hilfsprogrammen für das Arbeiten
mit der Disketten-Station, der auf dem Bildschirm als DOS-Menü erscheint. DUP
führt Kommandos aus, indem das FMS über die CIO aufgerufen wird. Die Befehle
sind:
A.
DIRECTORY (Disketten-Verzeichnis)
B.
ROM CARTRIDGE (Kontrolle an das Modul übergeben)
C.
COPY FILES (Kopieren von Dateien)
D.
DELETE FILES (Löschen von Dateien)
E.
RENAME FILE (Umbenennen einer Datei)
F.
LOCK FILES (Schützen von Dateien)
G.
UNLOCK FILE (Datei-Schutz aufheben)
H.
WRITE DOS FILES (Schreiben von DOS-Dateinn)
I.
FORMAT DISK (Diskette formatieren)
J.
DUPLICATE DISK (Diskette duplizieren)
K.
SAVE BIN-FILE (Sichern von Binär-Dateinn)
L.
LOAD BIN-FILE (Laden von Binär-Dateien)
M.
RUN AT ADRESS (Bei festgelegter Adresse starten)
N.
WRITE MEM.SAV FILE (Schreiben einer MEM.SAV-Datei)
0.
DUPLICATE FILE (Datei duplizieren)
FMS
Das
FMS (File Management System) ist ein nicht-residenter Geräte-Handler, der das
normale Interface "Geräte-Handler-CIO" benutzt. Das FMS ist nicht
im OS-ROM vorhanden. Es wird beim Einschalten geBOOTet, sofern sich eine Diskette
in der Station befindet, auf der das DOS vorhanden ist.
Das
FMS erhält, wie die anderen Geräte-Handler, die I/O-Kontrolldaten von der
CIO. Das FMS verwendet dann den residenten Disk-Handler, um ein Eingabe/Ausgabe für
die Diskette vorzunehmen. Das FMS wird aufgerufen, indem ein IOCB aufgestellt und
die CIO angesprungen wird. Das FMS liefert einige spezielle CIO-Funktionen, die bei
anderen Handlern nicht verfügbar sind:
FORMAT
Das FMS ruft den residenten Disk-Handler auf, damit die Diskette formatiert wird.
Nach einer erfolgreichen Ausführung dieser Aktion schreibt das FMS einige Daten
für die Datei-Struktur auf die Diskette.
NOTE
Das FMS zeigt den augenblicklichen Wert das Datei-Zei gers an.
POINT
Das FMS setzt den Datei-Zeiger auf den festgelegten Wert
Disketten-I/O
Der
Programmierer kann alle standardmäFigen I/O-Aufrufe für Dateien über
die CIO ansprechen. In BASIC werden dazu die I/O-Kommandos, wie z.B. OPEN, CLOSE,
GET oder PUT benutzt. In Assembler ist es erforderlich, daF ein IOCB vom Benutzer
erstellt und die CIO aufgerufen wird. Es folgt eine Einführung in das DOS, bei
welcher der Einfachheit halber BASIC verwendet wird.
Um
eine Ein-/Ausgabe über die Diskettenstation durchzuführen, muF als erste
Aktion das Bereitmachen einer Datei ausgeführt werden. Das BASIC-Format hierfür
lautet wie folgt:
OPEN
#IOCB,ICAX1,0,"D:MYPROG.BAS"
"#IOCB"
wählt einen der 7 verfügbaren IOCBs (in BASIC sind es nur 7, da der Interpreter
selbst IOCB Nr.0 benutzt). ICAX1 ist der Code für die Art des OPENs. Die Bits
für diesen Code sind:
Bit 7 6 5 4 3 2 1 0
x x x x W R D A
Wobei:
A: bedeutet APPEND (Anfügen)
D: bedeutet DIRECTORY (Disketten-Verzeichnis)
R: bedeutet READ (Lesen)
W: bedeutet WRITE (Schreiben)
x: bedeutet nicht benutzt
Die
verschiedenen Werte von ICAX1 werden in Abschnitt 5 des OS-Manuals behandelt. Einige
wichtige Dinge der verschiedenen OPEN-Madi sind:
ICAX1=6
Dieser Wert wird zum ÷ffnen des Disketten-Verzeichnisses verwendet. Die danach
eingelesenen Records sind die Einträge in das Verzeichnis (Directory) der Diskette.
ICAX1=4
READ (=Lese) -Modus.
ICAX1=8
WRITE (=Schreib) -Modus. Jede in diesem Modus bereitgemachte Datei wird gelöscht.
Die ersten geschriebenen Bytes befinden sich direkt am Anfang der Datei. (Wird eine
Datei mit einem schon vorhandenen Namen geöffnet, so wird die alte Datei gelöscht!)
ICAX1=9
WRITE APPEND (=fortgesetztes Schreiben) -Modus. Die Datei bleibt erhalten. Beschriebene
Bytes werden an das Ende der Datei angefügt.
ICAX1=12
UPDATE (=Ergäzungs) -Modus. Dieser Modus gestattet sowohl das Schreiben als
auch das Lesen einer Datei. Das Schreiben/Lesen von Bytes wird am Anfang der Datei
begonnen.
ICAX1=13
Nicht vorhanden.
Es
folgt jetzt eine Behandlung der Datenübertragung. Es gibt zwei Arten von Ein-/Ausgabe,
die durch den Programmierer verwendet werden können: record/ und zeichen-orientierter
I/0.
Zeichenorientierte
Ein-/Ausgabe bedeutet, daF die Daten in einer Datei lediglich Listen von Bytes sind.
Das DOS interpretiert diese Listen als Daten (keine eingebetteten Kontrollzeichen).
Ein Beispiel hierfür (Zeichendaten, alle Werte in Hex-Notation):
00
23 4F 55 FF 34 21
Record
(Datensatz)-orientierter I/0 bedeutet, daF die Daten in Records zusammengefaFt sind.
Ein Datensatz ist eine Reihe von Bytes, die durch ein EOL-Zeichen ($9B) abgeschlossen
wird. Das folgende Beispiel zeigt zwei Datensätzec
00 23 4F 55 FF 34 9B
21 34 44 9B
Datensatz1
Datensatz 2
Record-
und Zeichen-orientierten I/0 von Files kann in willkürlicher Reihenfolge geschehen.
Daten können in Record-Form als Zeichendaten gelesen werden. Gleiches gilt für
die umgekehrte Richtung (Zeichendaten können als Records eingelesen werden).
Der einzige Unterschied zwischen zeichen- und record-orinntiertem I/O besteht darin,
daF Records mit einem $9B-Zeichen abgeschlossen werden. Bei zeichenorientiertem I/O
wird dieses EOL-Zeichen als normaler Datenteil gelesen.
In
BASIC ist es sehr gut möglich, mit record-orientiertem I/O zu arbeiten. Die
Kommandos PRINT und INPUT werden benutzt, um Records von Dateien zu lesen und zu
schreiben. Andererseits ist zeichen-orientierter I/O mit dem BASIC-Interpreter nicht
so einfach möglich, wie er sein könnte. Die Befehle GET und PUT gestatten
das Schreiben oder Lesen eines einzelnen Bytes zur Zeit.
Das
OS besitzt die Fähigkeit ganze Zeichenblöcke zu lesen oder zu schreiben.
Diese Fähigkeit wird durch den BASIC-Interpreter nicht genutzt. Neben der Möglichkeit,
die Länge eines Blockes festzulegen, kann der Benutzer auch die Adresse festlegen.
Um diese Möglichkeit vom BASIC aus anzuwenden, muF der Programmierer ein Assembler-Unterprogramm
schreiben und mit der USR(X)-Funktion aufrufen. Abbildung 8.6 in Abschnitt 8.2 dieses
Buches zeigt ein Beispiel für eine solche Unterroutine.
RANDOM
ACCESS (=freier Zugriff)
Eine
der wichtigsten Verwendungen von Disketten liegt im freien Zugriff auf gespeicherte
Datensätze in beliebiger Reihenfolge. Die Benutzung der I/O-Befehle in Verbindung
mit den speziellen Kommandos NOTE und POINT macht das Erstellen von frei zugreifbaren
Dateien möglich.
Die
Befehle NOTE und POINT zeigen bzw. ändern den Wert des Datei-Zeigers. Das DOS
besitzt einen File-Zeiger für jede geöffnete Datei, die ihm die augenblickliche
Position in der Datei mitteilt. Der Datei-Zeiger besteht aus zwei Parametern: dem
Sektor- und dem Byte-Zähler. Die Sektor-Nummer (ein Wert von 1-719) teilt dem
DOS mit, auf welchen Sektor der Diskette der Datei-Zeiger deutet. Der Byte-Zähler
gibt das anzusprechende Byte innerhalb eines Sektors an (das erste Byte im Sektor
hat den Byte-Zählerwert, das zweite den Wert 1 usw.). Abbildung 9.1 zeigt das
Verhältnis von Datei-Zeiger und Datei. (Alle Werte stehen in hexadezimaler Notation.)
Die
oben gezeigte Datei wurde folgendermaßen mit Hilfe des BASIC erstellt:
10
OPEN #1,8,0,"D:DATEI"
20
? #1;"ABC"
30
? #1;"DEF"
40
? #1:"GHIJK"
:
:
:REM Füllen des restlichen Sektors
:
100
? #1;"AB":REM Dieser Datensatz ueberschreitet die
110
CLOSE #1:REM Begrenzung des Sektors.
Abbildung
9.1:
NOTE-
und POINT-Werte
Die
Sektor-Nr. beträgt in diesem Beispiel 50, weil das DOS diese Datei in Sektor
50 begann. Diese Zahl ändert sich in 51, da die Datei gröFer als ein Sektor
ist. Der Datensatz "AB" überschreitet die Begrenzung des ersten Sektors.
Der
Byte-Zählers des Datei-Zeigers beginnt mit dem Wert Null und wird bis zum Ende
des Sektors inkrementiert ($7D=125). Das DOS reserviert mindestens 3 Bytes pro Sektor
für Header-Daten der Datei. Für Dateien auf der SIO-Station beträgt
der maximale Wert des Byte-Zählers 124 (0 bis 124 = 125 Bytes).Wenn die Datei
das Ende des Sektors erreicht, wird der Byte-Zähler wieder auf 0 zurückgesetzt.
Der
Leser sollte jetzt einen Eindruck davon haben,wie Records auf Diskette gespeichert
und wieder abgerufen werden. Abbildung 9.2 zeigt eine Unterroutine, die Datensätze
sichert, ihre Position speichert und wieder liest. In Anhang VIII befindet sich ein
in BASIC geschriebenes Programm, das einen absolut freien Zugriff gestattet.
1000
REM Diese Routine erstellt Dateien & greift auf sie zu.
1001
REM Es gibt folgende Befehle:
1002
REM CMD=l Schreiben das n-ten Datensatzes
1003
REM CMD=2 Lesen das n-ten Datensatzes
1004
REM CMD=3 Aendern des n-ten Datensatzes
1005
REM
1006
REM RECORD$ ist der Ein-/Ausgabe-Datensatz
1007
REM n ist die Nummer des Datensatzes
1008
REM INDEX ist ein zweidimensionaler, durch
1009
REM DIM INDEX(1,RECNUM) dimensionierter Array,
1010
REM INDEX enthaelt alle Note-Werte jedes Datensatzes
1020
REM IOCB1 ist die vorgegebene Daten-Datei
1030
REM
1200
ON CMD GOTO 2000,3000,4000
2000
REM
2100
REM Schreiben des n-ten Datensatzes
2200
NOTE #1,X,Y
2300
INDEX(SEC,N)=X:INDEX(BYTE,N)=Y
2400
? #1;RECORD$:RETURN
3000
REM
3100
REM Lesen des n-ten Datensatzes
3200
X=INDEX(SEC,N):Y=(BYTE,N)
3300
POINT #l,X,Y
3400
INPUT #l:RECORD$:RETURN
4000
REM
4100
REM Erneuern des n-ten Datensatzes
4200
REM
4300
X=INDEX(SEC,N):Y=INDEX(BYTE,N)
4400
POINT #1,X,Y
4500
? #1;RECORD$:RETURN
Abbildung
9.2:
Beispiel
für NOTE und POINT