Magic Disk 64

home to index to text: MD9307-KURSE-FLOPPY_INTERN_4.txt
             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

Valid HTML 4.0 Transitional Valid CSS!