Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
cpm:write_a_bios:disketten [2025/04/24 07:20] – angelegt volkerpcpm:write_a_bios:disketten [2025/04/25 07:56] (aktuell) – [Laufwerke] volkerp
Zeile 6: Zeile 6:
  
 Ein Laufwerk A: sollte aber immer vorhanden sein. Ein Laufwerk A: sollte aber immer vorhanden sein.
 +Das originale Skeletal CBIOS stellt bei Warmstart Laufwerk 0 (A:)  aktiv.
 +
 +Für jeden Laufwerktyp (jedes Diskettenformat) gibt es im BIOS einen Infoblock, den [[cpm:systemdoku#der_disk_parameter_block|Disk Parameter Block DPB]].
 +s.a. [[cpm:write_a_bios:teil_1#der_disk_parameter_block|]]. Dieser Infoblock enthält die aus CP/M-Sicht relevanten Informationen zum Zugriff auf das Laufwerk. Technische Daten zum Laufwerk gibt es hier nicht!
 +
 +Über den [[cpm:systemdoku#der_disk_parameter_header|Disk Parameter Header DPH]] eines Laufwerks erfolgt die Zuordnung eines Disk Parameter Blocks.
 +Mehrere Laufwerke können dabei denselben DPB nutzen (d.h. das gleiche Format haben).
 +
 +Umgekehrt kann ein physisches Laufwerk unter mehreren Laufwerksbuchstaben und mit unterschiedlichen Formaten angesprochen werden. Dann gibt es mehrere DPHs mit jeweils unterschiedlichen DPBs. Die Abbildung auf ein einziges physisches Laufwerk übernimmt das BIOS in Eigenregie.
 +===== Sektoren =====
 +
 +Aus CP/M-Sicht besteht ein Laufwerk zunächst nur aus **logischen Sektoren pro Laufwerk** (sogenannte Records, 128 Byte groß). CP/M zählt diese absoluten logischen Sektoren ab 0 .. Laufwerksgröße=Blockanzahl*Blockgröße/128.
 +
 +<a2s>
 +            #-------------------------------#
 +            | Rec 0 | Rec 1 | ... | Rec nnn |
 +            #-------------------------------#
 +</a2s>
 +
 +
 +Zur vereinfachten Umsetzung auf Diskettenlaufwerke und deren physikalischen Aufbau in Seiten, Spuren, und physikalische Sektoren rechnet das BDOS die absoluten logischen Sektoren in **Spuren und relative logischen Sektoren** um.
 +
 +In jeder Spur werden die einzelnen logischen Sektoren wieder ab 0 gezählt:
 +Die Diskette wird unterteilt in Spuren 0..t-1  und jeweils einzelne logischen Sektoren (Records)  0..SPT-1.
 +
 +OFF Anzahl der reservierten Spuren am Anfang der Diskette (engl. track OFFset)\\
 +SPT Anzahl der logischen Sektoren pro Spur (engl. Sectors Per Track)
 +
 +<a2s>
 +            #---------------------------------#
 +Track OFF   | Rec 0 | Rec 1 | ... | Rec SPT-1 |
 +            #---------------------------------#
 +Track OFF+1 | Rec 0 | Rec 1 | ... | Rec SPT-1 |
 +            #---------------------------------#
 +            |                 ...             |
 +            #---------------------------------#
 +Track t     | Rec 0 | Rec 1 | ... | Rec SPT-1 |
 +            #---------------------------------#
 +</a2s>
  
-====== Sektoren ====== 
  
-Aus CP/M-Sicht besteht die Diskette aus Spuren 0..t-1  und einzelnen logischen Sektoren (Records a 128 Byte)  0..SPT-1. 
-  
 Das BDOS berechnet aus Block- und Recordnummer des FCB zuerst eine absolute logische Sektornummer der Diskette. Mit der Anzahl von logischen Sektoren pro Spur (SPT, siehe DPB) wird daraus die Spur- und logische Recordnummer innerhalb einer Spur bestimmt. Das BDOS berechnet aus Block- und Recordnummer des FCB zuerst eine absolute logische Sektornummer der Diskette. Mit der Anzahl von logischen Sektoren pro Spur (SPT, siehe DPB) wird daraus die Spur- und logische Recordnummer innerhalb einer Spur bestimmt.
  
-Aus physikalischer Sicht besteht eine Diskette aus Seiten, Spuren, physikalischen Sektoren.+Aus ** physikalischer Sicht** besteht eine Diskette aus Seiten, Spuren, physikalischen Sektoren.
  
 Bei 8-Zoll-Disketten ist das Format fest vorgegeben: die physikalischen Sektoren sind 128 Byte groß, die Sektornummern laufen von 1..26. Bei 8-Zoll-Disketten ist das Format fest vorgegeben: die physikalischen Sektoren sind 128 Byte groß, die Sektornummern laufen von 1..26.
  
 Auf Mini- und Microdisketten sind die physikalischen Sektoren größer als 128 Byte. Häufig sind sie 512 Byte oder 1KByte groß. Auf Mini- und Microdisketten sind die physikalischen Sektoren größer als 128 Byte. Häufig sind sie 512 Byte oder 1KByte groß.
-Physikalischen Sektoren zählen meist von 1..n. Die Sektornummern können beim Formatieren frei vergeben werden, sie wird auf der Diskette am Anfang eines jeden Sektors gespeichert. Die Sektoren können also gleich mit Versatz auf der Diskette angelegt werden, so dass durch die Pause, die beim Verarbeiten der gelesenen Daten besteht und in dieser Zeit sich die Diskette auch weitergedreht hat, dann die hochgezählte nächste Sektornummer unter dem Lesekopf des Laufwerks angekommen ist und sofort gelesen werden kann. +Physikalischen Sektoren zählen meist von 1..n. Die Sektornummern können beim Formatieren frei vergeben werden, sie wird auf der Diskette am Anfang eines jeden Sektors gespeichert.  
-(Sektorversatz beim Formatieren; im BIOS muss kein Sektorversatz beachtet werden).+ 
 +OFF Anzahl der reservierten Spuren am Anfang der Diskette (engl. track OFFset)\\ 
 +SPT Anzahl der logischen Sektoren pro Spur (engl. Sectors Per Track) 
 + 
 +<a2s> 
 +            #-----------------------------#-----#-----------------------------------# 
 +Track OFF   | phys. Sektor 1              | ... | phys. Sektor n                    |  
 +            | Rec 0 | Rec 1 | ... | Rec r | ... | Rec m | Rec m+1 | ... | Rec SPT-1 | 
 +            #-----------------------------#-----#-----------------------------------# 
 +Track OFF+1 | phys. Sektor 1              | ... | phys. Sektor n                    |  
 +            | Rec 0 | Rec 1 | ... | Rec r | ... | Rec m | Rec m+1 | ... | Rec SPT-1 | 
 +            #-----------------------------#-----#-----------------------------------# 
 +            |                               ...                                     | 
 +            #-----------------------------#-----#-----------------------------------# 
 +Track t     | phys. Sektor 1              | ... | phys. Sektor n                    |  
 +            | Rec 0 | Rec 1 | ... | Rec r | ... | Rec m | Rec m+1 | ... | Rec SPT-1 | 
 +            #-----------------------------#-----#-----------------------------------# 
 +</a2s> 
 + 
 + 
 +**Sektorversatz beim Formatieren:** Die Sektoren können gleich mit Versatz auf der Diskette angelegt werden, so dass durch die Pause, die beim Verarbeiten der gelesenen Daten besteht und in dieser Zeit sich die Diskette auch weitergedreht hat, dann die hochgezählte nächste Sektornummer unter dem Lesekopf des Laufwerks angekommen ist und sofort gelesen werden kann. Im BIOS muss kein Sektorversatz beachtet werden
 + 
 +Da dieser Sektorversatz rein durch das Laufwerk abgebildet wird, ändert sich auch am obigen Bild nichts, auch wenn auf der Diskette physisch die Sektoren in abweichender Reihenfolge vorliegen! 
 + 
 +Beispiel:  
 + 
 +Tool: HxCFloppyEmulator_soft.zip von https://hxc2001.com/download/floppy_drive_emulator/ 
 + 
 +Man startet HxCFloppyEmulator.exe und lädt das Disketten-Image (hier im Beispiel ein Teledisk-Format). Danach klickt man auf Track Analyzer. 
 +Eventuell muss die Ansicht angepasst werden: View-Mode: dummy disk. Mit der Maus kann dann die Diskette inspiziert werden. 
 + 
 +Diskette: Z9001-Systemdiskette, 2 Seiten, 80 Spuren, 5 Sektoren, Sektorgröße 1024 Byte, 800K, keine Systemspuren.\\ 
 +Im Bild ist Spur 0, Seite 0, Sektor 1 ausgewählt. Er enthält den Beginn des Directories. Man erkennt die Verteilung der Sektoren auf der Diskette und ihre pysikalische Anordnung 1,4,2,5,3. 
 + 
 +https://www.sax.de/~zander/z9001/tip/tipd.html, "Ein weiteres Diskettenabbild (TD0)" z9_dsk.td0 
 + 
 +{{:cpm:write_a_bios:vfd1.jpg?638|}}
  
 ===== Interleave/Skew ===== ===== Interleave/Skew =====
Zeile 67: Zeile 139:
 Die Macrobibliothek DISKDEF.LIB erzeugt bei weniger als 256 Sektoren/Track eine Byte-Liste, bei mehr als 256 Sektoren würde eine Liste mit 16-Bit-Werten erzeugt. Die Bios-Funktion SECTRAN muss dann auch darauf ausgelegt sein. Die Macrobibliothek DISKDEF.LIB erzeugt bei weniger als 256 Sektoren/Track eine Byte-Liste, bei mehr als 256 Sektoren würde eine Liste mit 16-Bit-Werten erzeugt. Die Bios-Funktion SECTRAN muss dann auch darauf ausgelegt sein.
    
 +**Fazit** Beim Software-Sektorversatz würfelt das BIOS die Verwendung der physikalischen Sektoren durcheinander. Diese liegen physikalisch in Reihenfolge 1,2,3,... auf Diskette vor, aber werden inhaltlich nicht mehr in dieser Reihenfolge genutzt. Man muss die Translate-Tabelle kennen, um die Daten wieder lesen zu können. Im Gegensatz dazu übernimmt beim Hardware-/Formatier-Sektorversatz der Floppycontroller das Lesen in logischer Reihenfolge.
  
  
-===== Überschrift =====+===== BIOS-Funktionen =====
  
-Die Sektor-Verschränkungs-Tabelle (XLT) dient zur Umrechnung von logischen zu physikalischen Sektornummern einer Spur. Die Länge dieser Tabelle entspricht der Anzahl logischer Sektoren die im DPB (s.u.) definiert sind.+Die Sektor-Verschränkungs-Tabelle (XLT, s.o.) dient zur Umrechnung von logischen zu physikalischen Sektornummern einer Spur. Die Länge dieser Tabelle entspricht der Anzahl logischer Sektoren die im DPB definiert sind (SPT).
  
 Das BDOS berechnet aus Block- und Recordnummer des FCB eine absolute logische Sektornummer der Diskette. Das BDOS berechnet aus Block- und Recordnummer des FCB eine absolute logische Sektornummer der Diskette.
Zeile 77: Zeile 150:
 Mit der Anzahl von logischen Sektoren pro Spur (siehe DPB) kann daraus die Spur- und Sektornummer bestimmt werden.  Mit der Anzahl von logischen Sektoren pro Spur (siehe DPB) kann daraus die Spur- und Sektornummer bestimmt werden. 
  
 +Das BIOS erhält die Information, wo konkret auf die Datenspeicher zugriffen werden soll, via BIOS-Funktion 
 +  * SETDSK (Laufwerk, 0...15), 
 +sowie
 +  * SETTRK (Track, Spur OFF...x, berechnet aus Blocknummer + Systemspuren OFF), 
 +  * SECTRAN (Transformation der aktuellen log. Record-Nummer 0...BSM, Sektorversatz, skewing) 
 +  * und SETSEC (Sector, transformierte Record-Nummer).
 +
 +Das BDOS ruft die letzten drei genannten BIOS-Funktionen nur innerhalb der BDOS-Routine SEEK und alle vier immer **vor** Aufruf von READ oder WRITE in dieser Reihenfolge auf. Ein BIOS speichert daher normalerweise die Werte für Laufwerk, Spur, Sektor zwischen und greift bei Lese- und Schreiboperationen darauf zu, sie könnten aber auch gleich direkt an den Laufwerkscontroller übergeben werden.
 +
 +Pro Format/Laufwerkstyp gibt es dazu üblicherweise im BIOS eine Funktion zur Adressberechnung, die aus logischer Spurnummer und transformierter Record-Nummer die physisch anzusprechenden Werte ermittelt. Bei Disketten sind das Seite, Spur, phys. Sektor, Pos. innerhalb des physikalischen Sektors.
  
 BDOS22 BDOS22
Zeile 92: Zeile 175:
 </code> </code>
   
 +**SECTRAN**
 +
 +SECTRAN übernimmt eine Umrechnung der logischen Sektornummer pro Spur in eine transformierte Nummer. Bei 8-Zoll-Floppies mit Software-Sektorversatz erfolgt das über eine Versatz-Tabelle, bei anderen Geräten oder Systemen wird einfach der übergebene Sektor unverändert zurückgegeben oder aber um 1 erhöht.
 + 
 +SECTRAN Logisch-zu-physischer Sektor wurde durchgeführt, um die allgemeine Reaktion von CP/M zu verbessern. Standard-CP/M-Systeme nutzen einen Skew-Faktor 6, wo sechs physische Sektoren zwischen jeder logischen Leseoperation übersprungen werden. Der Skew-Faktor lässt zwischen den Sektoren genügend Zeit für die meisten Programme, um ihre Puffer zu laden, ohne den nächsten Sektor zu vermissen.
 +
 +in: BC = logischer Sektor 0..\\
 + DE = XLT-Translate-Tabelle, 0, wenn es keine Tabelle gibt\\
 +out: HL = transformierter Sektor
 +
 +Das folgende Beispiel stammt aus einer [[cpm:cpa|]]-Implementation.\\
 +Im CP/A gibt es keine Translate-Tabellen, da die Sektornummernverwaltung verallgemeinert im nicht-Standard-DPB enthalten ist (auch fuer physische Sektorlaenge <>128). Es wird im BIOS immer ab Sektor 1 gezählt. Das bringt hier Vorteile bei der weiteren Bearbeitung. Deshalb steht in sectran ein inc hl. Die Zählung ab 1 muss bei den direkten Zugriffen (Adressberechnung, Read, Write) beachtet werden!
 +
 +<code>
 +sectran: ld h, b
 + ld l, c
 + inc hl ;Sektoren zaehlen in CP/A ab 1
 + ret
 +</code>
 +
 +Ein SECTRAN-Funktion für Software-Sektor-Versatz bei 8-Zoll-Floppies steht bereits weiter oben.
 +
 +:!: Da weder Translate-Tabelle noch die physikalische Sektornummer im BDOS gebraucht und daher auch nicht genutzt wird, kann man die Konvertierung Logisch-zu-physischer Sektor auch anders lösen und das Feld XLT des DPHs für eigene Zwecke nutzen. 
  • cpm/write_a_bios/disketten.1745479215.txt.gz
  • Zuletzt geändert: 2025/04/24 07:20
  • von volkerp