Floppy Intern (Teil IV)
Ich heisse Sie herzlich Willkommen zu
4 . Teil unseres Floppykurses.
Beginnen möchte ich mit den wichtigsten
Adressen, die die Floppy-Zeropage bietet.
Ich werde im folgenden nur einige Zeropageadressen erklären, da es einfach zu
aufwendig wäre, alle darzustellen.
Ich verweise Sie jedoch auf das Buch
' Floppy Intern', in dem die komplette
Zeropage beschrieben steht. Dieses Buch
ist normalerweise in guten Büchereien
zu haben.
Doch hier nun die wichtigsten Adressen:
Adresse: Bedeutung:
$0000 Jobspeicher für Puffer 0 $0001 " " " 1 $0002 " " " 2 $0003 " " " 3 $0004 " " " 4 $0005 " " " 5 $0006/7 T+S fuer Befehl in Puffer 0 $0008/9 " " " " " 1 $000a/b " " " " " 2 $000c/d " " " " " 3 $000e/f " " " " " 4 $0010/11 " " " " " 5
$0012/13 ID der Disk im ASCII-Format $0016-1 a Daten im aktuellen Blockheader $00161 . Zeichen der ID $00172 . Zeichen der ID $0018 Tracknummer des Blocks $0019 Sektornummer des Blocks $001 a Pruefsumme des Blockheaders $001 c Flag f. Schreibschutz auf Disk Soviel zu den Zeropageadressen.
Das Aufzeichnungsverfahren
In dem folgenden Abschnitt wollen wir
uns damit befassen, wie die Bits von der
Floppyhardware auf die Diskette geschrieben und von dort wieder gelesen
werden.
Nachdem eine Diskette formatiert wurde, ist sie in 35 Tracks unterteilt, die als
konzentrische Ringe angeordnet sind. Der
äußerste Track hat die Nummer 1 und der Innerste die Nummer 35 . Zum Ansteuern
der einzelnen Tracks hat das Laufwerk
einen sog. Steppermotor, mit dem der
Schreib/ Lesekopf über jeden Track positioniert werden kann.
Diese Tracks wiederum enthalten eine bestimmte Anzahl von Sektoren, die von Aussen nach innen abnehmen, da auf einen
äußeren Track mehr Sektoren passen als
auf einen Inneren.
Es stellt sich nun die Frage, wie man den
Anfang eines Sektors auf einem Track erkennt. Man müßte also bestimmte Byteoder Bitkombinationen bevorzugt erkennen
können, die als Daten-Bytes nicht vorkommen können. Mit 8 Bit ist es möglich
256 Bytekombinationen darzustellen, die
aber jedoch auch alle Datenbytes sein könnten. Der Schlüssel zur Lösung liegt
darin, ein Byte nicht durch 8, sondern
für die Diskettenaufzeichnung durch mehr
Bits darzustellen. Dieses Verfahren wird
als " Group Code Recording"( GCR) bezeichnet.
Jeder Sektor besteht aus einem BLOCK-HEADER und dem dazugehörigen DATENBLOCK.
Sowohl der Block-Header als auch der
Datenblock besitzen zu Beginn eine SYNC-Markierung.
Stößt der der Schreib/ Lesekopf auf eine
solche SYNC-Markierung, dann muß sie nur
noch feststellen ob es sich um einen
Blockheader oder Datenblock handelt.
Unterschieden werden sie durch das Byte
das sich gleich hinter Markierung befindet. Den Blockheader erkennt man an einem
$08 und den Datenblock an einem $07 Byte
Danach folgt noch die Prüfsumme die zur
Lesefehlerkontrolle dient. Die nachfolgende Tabelle zeigt den Aufbau eines
Headders und eines Datenblocks.
**************************************** * Sync * * * $08 * H * * Pruefsumme * e * * aktueller Sektor * a * * aktueller Track * d * * ID1 * e * * ID2 * r * * Luecke * * * * * **************************************** **************************************** * * D * * Sync * a * * $07 * t * * Track * e * * Sektor * n * * 254 Byte Daten * b * * Pruefsumme * l * * Luecke * o * * * c * * * k * ****************************************
Nachdem sie sich nun mit dem grundlegendem Aufbau der Diskette vertraut gemacht
haben, möchte ich etwas näher auf die
Synchronmarkierungen eingehen.
Wie wir schon wissen, bestehen die Syncs
aus 5$ ff Bytes. Stellen Sie sich nun
vor, man hätte einen Block voll mit $ ff
Bytes. Die Floppy könnte die Syncs von
den Datenbytes nicht mehr unterscheiden
und das Ergebnis wäre eine totales
Chaos bei der Datenorganisation. Aus
diesem Grund haben sich die Entwickler
der Floppystation die GCR-Codierung einfallen lassen.
Damit die Zusammenhaenge verstaendlich
werden möchte ich kurz auf die Technik
eingehen, die beim Lesen von Bytes geschieht.
Der Diskcontroller besitzt einen Timer
der in bestimmten Zeitabständen feststellt, ob ein Magnetisierungswechsel
stattgefunden hat.
Bei gleichbleibender Richtung wird ein
0- Bit, bei veränderter Richtung ein 1- Bit
dargestellt.
Wenn also ein Byte von der Diskette gelesen werden soll, so wartet der Diskcontroller eine bestimmte Zeit die zum
Lesen von 8- Bit erforderlich ist.
Leider kann ein Laufwerk nicht absolut
gleichmässig gedreht werden, deshalb
wird es notwendig nach jedem Magneti-- sierungswechsel den Timer neu einzu-- stellen, um Lesefehler zu vermeiden.
Logischerweise darf es also nicht passieren das zu viele $00 Bytes hintereinander folgen, da sonst zu lange keine
Laufwerkskontrolle mehr durchgeführt
wird.
Natürlich sind auch zu viele 1- Bit nicht
gestattet, so sonst ein Sync-Signal ausgelöst werden würde. Deshalb müssen die
Daten, bevor sie auf Diskette geschrieben
werden, GCR-Codiert werden.
Durch diese Technik wird ausgeschlossen, daß zu viele 0- Bit und 1- Bit direkt
hintereinander folgen und somit die
Schreibund Leseelektronik stören.
Lediglich Sync-Markierungen, also mehr
als 81- Bit, werden vom DOS uncodiert
auf die Diskette geschrieben. Es gibt
also zwei Schreibarten:
1 . Schreiben von Syncs Es werden 5$ ff Bytes hintereinander geschrieben, die der Orientierung dient.
2 . Schreiben von Daten Hier werden die Byte-Inhalte codiert, da
sie von den Syncs unterschieden werden
müssen. Hier nun die Umrechnungstabelle
für die Binär-GCR Umwandlung:
Hexadezimal: Binaer: GCR:
$0 0000 01010 $1 0001 01011 $2 0010 10010 $3 0011 10011 $4 0100 01110 $5 0101 01111 $6 0110 10110 $7 0111 10111 $8 1000 01001 $9 1001 11001 $a 1010 11010 $b 1011 11011 $c 1100 01101 $d 1101 11101 $e 1110 11110 $f 1111 10101
Wie sich erkennen laesst, handelt es sich
bei der GCR-Codierung um einen 5- Bit
Code. Jedes 4- Bit Nibble das umgewandelt
wird, wird praktisch zu einem 5- Bit GCR-Nibble, d. h. ein Byte was vorher aus
8- Bit bestand, wird durch die Codierung
zu 10- Bit.
Beim GCR-Codieren werden deshalb jeweils
immer 4 Byte gleichzeitig umgewandelt.
Als Ergebnis erhält man dann logischerweise 5 Byte.
Durch diese Technik erhält man für den
Diskcontroller ungefährliche Werte. Zum
Schluss fehlt eigentlich nur noch die
Prüfsumme, die ebenfalls zur Erkennung
von eventuellen Fehlern bestimmt ist.
Hier nun die Berechnung der Prüfsumme:
Es werden alle Bytes des Programms addiert und zum Ergebnis noch 2 Bytes der
Startadresse hinzugezählt. Dieses Ergebnis besteht aus einem Low - und Hibyte.
Das Lowbyte ist die Prüfsumme, zu der
noch der Übertrag im Hibyte addiert
werden muß. Das Endergebnis muß immer
kleiner als 256 sein. Damit sind wir mal
wieder am Ende des Kursteils angelangt.
Nachdem wir uns nun hervorragend mit dem
Aufbau und der grundlegenden Technik, die sich dahinter verbirgt, bestens
auskennen, möchte ich ab dem nächsten
Teil mit dem Entwickeln von nützlichen
Utilities beginnen.
Bis dahin, Ihr Frank Boldewin