----------------------------------------------------

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