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 Zero- pageadressen 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-1a Daten im aktuellen Blockheader $0016 1.Zeichen der ID $0017 2.Zeichen der ID $0018 Tracknummer des Blocks $0019 Sektornummer des Blocks $001a Pruefsumme des Blockheaders $001c 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 ge- schrieben 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 posi- tioniert werden kann. Diese Tracks wiederum enthalten eine be- stimmte Anzahl von Sektoren,die von Aus- sen 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 er- kennt. Man müßte also bestimmte Byte- oder Bitkombinationen bevorzugt erkennen können, die als Daten-Bytes nicht vor- kommen 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) bezeich- net. 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 befin- det.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 nachfol- gende 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 grundlegen- dem 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 ein- fallen lassen. Damit die Zusammenhaenge verstaendlich werden möchte ich kurz auf die Technik eingehen, die beim Lesen von Bytes ge- schieht. Der Diskcontroller besitzt einen Timer der in bestimmten Zeitabständen fest- stellt, 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 ge- lesen werden soll, so wartet der Disk- controller 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 pas- sieren das zu viele $00 Bytes hinterei- nander 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 aus- gelö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 Schreib- und Leseelektronik stören. Lediglich Sync-Markierungen, also mehr als 8 1-Bit, werden vom DOS uncodiert auf die Diskette geschrieben. Es gibt also zwei Schreibarten: 1.Schreiben von Syncs Es werden 5 $ff Bytes hintereinander ge- schrieben, 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 logischer- weise 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 add- iert und zum Ergebnis noch 2 Bytes der Startadresse hinzugezählt. Dieses Erge- bnis 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