Magic Disk 64

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



Valid HTML 4.0 Transitional Valid CSS!