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