Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
cpm:write_a_bios:disketten [2025/04/24 09:30] – [BIOS-Funktionen] 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.
  
-====== Sektoren ======+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. 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.
Zeile 18: Zeile 26:
  
  
-Zur vereinfachten Umsetzung auf Diskettenlaufwerke und deren physikalischen Aufbau in Seiten, Spuren, und physikalische Sektoren rechnet das BDOS den absoluten logischen Sektor in **Spuren und relative logischen Sektoren** um.+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: In jeder Spur werden die einzelnen logischen Sektoren wieder ab 0 gezählt:
-Die Diskette wird unterteilt in Spuren 0..t-1  und jweils einzelne logischen Sektoren (Records)  0..SPT-1.+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)\\ OFF Anzahl der reservierten Spuren am Anfang der Diskette (engl. track OFFset)\\
Zeile 70: Zeile 78:
  
 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! 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 117: 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.
  
  
 ===== BIOS-Funktionen ===== ===== BIOS-Funktionen =====
  
-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.+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.
  
 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  Das BIOS erhält die Information, wo konkret auf die Datenspeicher zugriffen werden soll, via BIOS-Funktion 
   * SETDSK (Laufwerk, 0...15),    * SETDSK (Laufwerk, 0...15), 
 +sowie
   * SETTRK (Track, Spur OFF...x, berechnet aus Blocknummer + Systemspuren OFF),    * SETTRK (Track, Spur OFF...x, berechnet aus Blocknummer + Systemspuren OFF), 
   * SECTRAN (Transformation der aktuellen log. Record-Nummer 0...BSM, Sektorversatz, skewing)    * SECTRAN (Transformation der aktuellen log. Record-Nummer 0...BSM, Sektorversatz, skewing) 
   * und SETSEC (Sector, transformierte Record-Nummer).   * und SETSEC (Sector, transformierte Record-Nummer).
  
-Das BDOS ruft diese genannten BIOS-Funktionen nur innerhalb der BDOS-Routine SEEK und 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.+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. 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.
Zeile 160: Zeile 182:
  
 in: BC = logischer Sektor 0..\\ in: BC = logischer Sektor 0..\\
-    DE = XLT-Translate-Tabelle, 0, wenn es keine Tabelle gibt\\+ DE = XLT-Translate-Tabelle, 0, wenn es keine Tabelle gibt\\
 out: HL = transformierter Sektor out: HL = transformierter Sektor
  
Zeile 174: Zeile 196:
  
 Ein SECTRAN-Funktion für Software-Sektor-Versatz bei 8-Zoll-Floppies steht bereits weiter oben. 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.1745487049.txt.gz
  • Zuletzt geändert: 2025/04/24 09:30
  • von volkerp