Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
cpm:write_a_bios:disketten [2025/04/24 07:20] – angelegt volkerp | cpm: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: | ||
+ | s.a. [[cpm: | ||
+ | |||
+ | Über den [[cpm: | ||
+ | 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/ | ||
+ | |||
+ | <a2s> | ||
+ | # | ||
+ | | Rec 0 | Rec 1 | ... | Rec nnn | | ||
+ | # | ||
+ | </ | ||
+ | |||
+ | |||
+ | 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 | ||
+ | |||
+ | 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 | | ||
+ | # | ||
+ | </ | ||
- | ====== Sektoren ====== | ||
- | Aus CP/M-Sicht besteht die Diskette aus Spuren 0..t-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 | + | 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; | + | |
+ | OFF Anzahl der reservierten Spuren am Anfang der Diskette (engl. track OFFset)\\ | ||
+ | SPT Anzahl der logischen Sektoren pro Spur (engl. Sectors Per Track) | ||
+ | |||
+ | < | ||
+ | # | ||
+ | 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 | | ||
+ | # | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Sektorversatz beim Formatieren: | ||
+ | |||
+ | 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:// | ||
+ | |||
+ | 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, | ||
+ | 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, | ||
+ | |||
+ | https:// | ||
+ | |||
+ | {{: | ||
===== Interleave/ | ===== Interleave/ | ||
Zeile 67: | Zeile 139: | ||
Die Macrobibliothek DISKDEF.LIB erzeugt bei weniger als 256 Sektoren/ | Die Macrobibliothek DISKDEF.LIB erzeugt bei weniger als 256 Sektoren/ | ||
+ | **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-/ | ||
- | ===== Ü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.) | + | 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, | ||
+ | * 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, | ||
+ | * 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/ | ||
BDOS22 | BDOS22 | ||
Zeile 92: | Zeile 175: | ||
</ | </ | ||
+ | **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, | ||
+ | |||
+ | SECTRAN Logisch-zu-physischer Sektor wurde durchgeführt, | ||
+ | |||
+ | in: BC = logischer Sektor 0..\\ | ||
+ | DE = XLT-Translate-Tabelle, | ||
+ | out: HL = transformierter Sektor | ||
+ | |||
+ | Das folgende Beispiel stammt aus einer [[cpm: | ||
+ | Im CP/A gibt es keine Translate-Tabellen, | ||
+ | |||
+ | < | ||
+ | sectran: | ||
+ | ld l, c | ||
+ | inc hl ; | ||
+ | ret | ||
+ | </ | ||
+ | |||
+ | 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. |