Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| intern:systemdoku [2012/03/09 06:42] – volkerp | cpm:systemdoku [2025/04/22 13:36] (aktuell) – [Directory-Einträge] volkerp | ||
|---|---|---|---|
| Zeile 8: | Zeile 8: | ||
| 5100 Aachen | 5100 Aachen | ||
| + | mit eigenen Ergänzungen ! | ||
| ===== Vorwort ===== | ===== Vorwort ===== | ||
| Zeile 126: | Zeile 127: | ||
| Die Speicheraufteilung im CP/M sieht im Überblick so aus: | Die Speicheraufteilung im CP/M sieht im Überblick so aus: | ||
| - | <ditaa noedgesep> | + | <a2s> |
| - | +----------------+ oberes Speicherende | + | #----------------# oberes Speicherende |
| | | ||
| | | ||
| | | ||
| - | +----------------+ | + | #----------------# |
| | | ||
| | | ||
| | | ||
| - | FBASE: | + | FBASE: |
| | | ||
| | | ||
| | | ||
| - | CBASE: | + | CBASE: |
| | | ||
| | | ||
| | | ||
| - | TBASE: | + | TBASE: |
| | | ||
| | | ||
| - | BOOT: | + | BOOT: |
| - | </ditaa> | + | </a2s> |
| An der Adresse BOOT befindet sich grundsätzlich ein Sprung | An der Adresse BOOT befindet sich grundsätzlich ein Sprung | ||
| zur Warmstartroutine des BIOS. Diese Routine lädt nach Beendigung | zur Warmstartroutine des BIOS. Diese Routine lädt nach Beendigung | ||
| Zeile 251: | Zeile 251: | ||
| + | ==== Diskette aus CP/M-Sicht ==== | ||
| + | |||
| + | CP/M kennt nur den logischen Aufbau in Form von Blöcken. Jeder Block besteht aus b Records a 128 Byte. | ||
| + | Mindestens Block 0 enthält in jedem Fall das Directory. Systemspuren, | ||
| + | |||
| + | Siehe [[# | ||
| + | |||
| + | <a2s> | ||
| + | # | ||
| + | Track 0 | n Systemspuren (0..n-1) n=OFS | | ||
| + | | Format und Größe sind CP/M unbekannt! | ||
| + | # | ||
| + | Track n | Block 0 (directory) | ||
| + | # | ||
| + | | Block 1 | | ||
| + | # | ||
| + | | | | ||
| + | | jeder Block hat b=BLM+1 | ||
| + | | Records a 128 Byte (0..BLM): | ganze Blöcke! | ||
| + | | | | ||
| + | # | ||
| + | | Rec 0 | | ||
| + | # | ||
| + | | | | ||
| + | | | | ||
| + | | | ||
| + | | | | ||
| + | | | | ||
| + | | | | ||
| + | # | ||
| + | | Block m m=DSM-1 | ||
| + | # | ||
| + | </ | ||
| + | |||
| + | CP/M rechnet Blocknummer + laufende Rec-Nummer in Track und 128-Byte-Sector um. | ||
| + | |||
| + | ==== Diskette aus techn. Sicht ==== | ||
| + | |||
| + | Aus technischer Sicht besteht eine Diskette aus Spuren. Jede Spur kann unterschiedlich formatiert sein, d.h. einen unterschiedlichen physischen Sektoren-Aufbau haben. Genutzt wird das bei Systemspuren, | ||
| + | |||
| + | CP/M kennt außerdem keine Diskettenseiten! CP/M 1 kannte nur einseitige Disketten mit physischen Sektorlängen von 128 Byte. Ein BIOS hierfür konnte die Werte des BDOS 1:1 an den Floppycontroller durchreichen. Modernere Disketten haben zwei Seiten und größere physischen Sektoren. | ||
| + | |||
| + | Die physischen Sektoren sind bei DDR-Computer-Formaten meist 512 Byte oder 1 KByte groß (Softsektorierung). Das Bios liest und schreibt immer ganze physische Sektoren. Die Reihenfolge der physischen Sektoren ist oftmals auch nicht in natürlicher Folge, sondern passend zur Verarbeitungszeit im Floppy-Controller und in CP/M mit Versatz angeordnet. z.B. sind die Sektoren mit einem Interleave-Faktor 2 angeordnet: 1,3,5,2,4. Physische Sektoren eines Floppy-Laufwerkwerks werden auch ab 1 gezählt; CP/M zählt seine logischen Werte immer ab 0. Die Umrechnung der logischen Blocknummern in Spur und logischen Sektor erfolgt im BDOS; die Zuordnung zu den physischen Sektoren muss das Bios übernehmen (DEBLOCK-Algorithmus). | ||
| + | |||
| + | Die physischen Spuren und Sektoren auf Vorder- und Rückseite einer Diskette müssen durch das BIOS passend umgerechnet werden. z.B. Sektoren der Vorderseite als 1..5, die der Rückseite als 6..10. Das BIOS muss am Floppycontroller bei Sektoren > 5 die Rücksetie selektieren und von der Sektornummer 5 subtrahieren und so die Sektoren techn. richtig zuordnen. | ||
| + | |||
| + | <a2s> | ||
| + | Track/ | ||
| + | # | ||
| + | 0 | | ||
| + | | ||
| + | a-1 | | ||
| + | # | ||
| + | a | Block 0 | Block 1 | ... | n Blöcke | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | # | ||
| + | b | Block n | Block n+1 | ... | m-n Blöcke | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | trk-1 | | Block m-1 | Block m | da max. DSM+1 Records möglich | ||
| + | # | ||
| + | </ | ||
| ==== Dateien ==== | ==== Dateien ==== | ||
| Zeile 274: | Zeile 355: | ||
| - | ==== Die Directory ==== | + | ==== Das Directory ==== |
| Die Information, | Die Information, | ||
| Zeile 280: | Zeile 361: | ||
| Inhaltsverzeichnis (engl. Directory) enthalten. | Inhaltsverzeichnis (engl. Directory) enthalten. | ||
| - | In der Directory stehen alle wichtigen Daten, die das BDOS zur | + | In dem Directory stehen alle wichtigen Daten, die das BDOS zur |
| Bearbeitung der Diskette benötigt. für jedes File sind dies: | Bearbeitung der Diskette benötigt. für jedes File sind dies: | ||
| Zeile 316: | Zeile 397: | ||
| von 128 Bytes gemessen. | von 128 Bytes gemessen. | ||
| - | CP/M 2.2 hat diese Rechenweise für Files ubernommen, unterscheidet | + | CP/M 2.2 hat diese Rechenweise für Files übernommen, unterscheidet |
| aber zwischen Sektoren auf der Diskette und File- | aber zwischen Sektoren auf der Diskette und File- | ||
| ' | ' | ||
| Zeile 330: | Zeile 411: | ||
| allgemein für Diskettendaten benutzt. | allgemein für Diskettendaten benutzt. | ||
| - | Im Zusammenhang mit Disketten ist auch die Bezeichnung ' | + | Im Zusammenhang mit Disketten ist auch die Bezeichnung '**logischer |
| - | Sektor' | + | Sektor**' für einen Record üblich. Damit wird vor allem |
| der Unterschied zwischen einem Sektor auf der Diskette (' | der Unterschied zwischen einem Sektor auf der Diskette (' | ||
| Sektor' | Sektor' | ||
| Zeile 357: | Zeile 438: | ||
| Das BIOS muß beim Lesen jeden physikalischen Sektor in logische | Das BIOS muß beim Lesen jeden physikalischen Sektor in logische | ||
| Sektoren aufspalten und beim Schreiben logische Sektoren | Sektoren aufspalten und beim Schreiben logische Sektoren | ||
| - | zu einem physikalischen | + | zu einem physikalischen |
| CP/M 2.2 unterstützt dieses Zusammenfassen und Aufspalten | CP/M 2.2 unterstützt dieses Zusammenfassen und Aufspalten | ||
| Zeile 366: | Zeile 447: | ||
| ==== Directory-Einträge ==== | ==== Directory-Einträge ==== | ||
| - | Die Directory enthält alle Informationen über die auf der | + | Das Directory enthält alle Informationen über die auf der |
| Diskette gespeicherten Files. Dazu gehören neben dem Filenamen | Diskette gespeicherten Files. Dazu gehören neben dem Filenamen | ||
| und Filetyp die Länge des Files und die von ihm belegten | und Filetyp die Länge des Files und die von ihm belegten | ||
| Zeile 462: | Zeile 543: | ||
| werden im CP/M 1.4 immer als 8-Bit Werte verwaltet. | werden im CP/M 1.4 immer als 8-Bit Werte verwaltet. | ||
| - | Von den 32 Bytes eines Eintrags sind 16 Bytes für die | + | Von den 32 Bytes eines Directory-Eintrags sind 16 Bytes für die |
| Speicherung der vom File belegten Blocknummern vorgesehen. | Speicherung der vom File belegten Blocknummern vorgesehen. | ||
| Pro Eintrag können damit im CP/M 1.4 maximal 16 Blöcke adressiert | Pro Eintrag können damit im CP/M 1.4 maximal 16 Blöcke adressiert | ||
| Zeile 482: | Zeile 563: | ||
| ist also sowohl die Record- als auch die Eintragsnummer anzugeben.\\ | ist also sowohl die Record- als auch die Eintragsnummer anzugeben.\\ | ||
| Die maximale Anzahl von Eintragen pro File ist im CP/M 1.4 | Die maximale Anzahl von Eintragen pro File ist im CP/M 1.4 | ||
| - | auf 16 begrenzt, | + | auf 16 begrenzt, |
| kbytes erreichen kann. | kbytes erreichen kann. | ||
| Zeile 504: | Zeile 585: | ||
| verwaltet, um so die Zahlweise der Recordnummern von 0 bis | verwaltet, um so die Zahlweise der Recordnummern von 0 bis | ||
| 127 zu erhalten. | 127 zu erhalten. | ||
| + | |||
| + | 1 Extend = 128 Records = 16 kByte | ||
| ==== Extendgruppen ==== | ==== Extendgruppen ==== | ||
| Zeile 717: | Zeile 800: | ||
| ==== Sequentieller Zugriff <-> Direkter Zugriff ==== | ==== Sequentieller Zugriff <-> Direkter Zugriff ==== | ||
| - | Im CP/M 1.4 ist es Aufgabe des Programms, die Eintrags- und | + | Im **CP/M 1.4** ist es Aufgabe des Programms, die Eintrags- und |
| Recordnummer im FCB zu setzen. Soll ein bestimmter Record | Recordnummer im FCB zu setzen. Soll ein bestimmter Record | ||
| innerhalb des Files erreicht werden, so muß das Programm die | innerhalb des Files erreicht werden, so muß das Programm die | ||
| Extend- und Recordnummer selbst berechnen und in den FCB | Extend- und Recordnummer selbst berechnen und in den FCB | ||
| einsetzen.\\ | einsetzen.\\ | ||
| - | Aus der absoluten Recordnummer ergibt sich die Extendnummer | + | Aus der absoluten Recordnummer |
| - | aus der Division durch 128. Der Divisionrest ist die Recordnummer | + | aus der Division durch 128. Der Divisionrest ist die Recordnummer |
| innerhalb des Extends. Diese Werte müssen aber immer | innerhalb des Extends. Diese Werte müssen aber immer | ||
| vor dem Öffnen gesetzt sein, damit das BDOS die richtige | vor dem Öffnen gesetzt sein, damit das BDOS die richtige | ||
| Blocktabelle in den FCB überträgt. | Blocktabelle in den FCB überträgt. | ||
| + | |||
| + | < | ||
| + | RRN -> SRN: | ||
| + | RRN = 128 + EX * 128 + CR | ||
| + | | ||
| + | SRN -> RRN: | ||
| + | EX = RRN / 128 | ||
| + | CR = RRN modulo 128 | ||
| + | </ | ||
| Alle höheren Recordnummern können im CP/M 1.4 nur sequentiell | Alle höheren Recordnummern können im CP/M 1.4 nur sequentiell | ||
| Zeile 735: | Zeile 827: | ||
| sequentiellen Zugriff nicht möglich. | sequentiellen Zugriff nicht möglich. | ||
| - | CP/M 2.2 bietet daher mit dem direkten Zugriff (engl. Random | + | **CP/M 2.2** bietet daher mit dem direkten Zugriff (engl. Random |
| Access) eine weitere Zugriffsart, | Access) eine weitere Zugriffsart, | ||
| Files direkt erreicht werden kann. | Files direkt erreicht werden kann. | ||
| Zeile 750: | Zeile 842: | ||
| Das BDOS berechnet aus dieser ' | Das BDOS berechnet aus dieser ' | ||
| - | die ' | + | die ' |
| - | Extend und Recordnummer. | + | Extend |
| - | Zwischen der Random Record Nummer und der Sequential Record | + | Zwischen der Random Record Nummer |
| - | Nummer besteht folgender Zusammenhang: | + | Nummer |
| < | < | ||
| Zeile 831: | Zeile 923: | ||
| Werte sind Verweise auf weitere Tabellen. | Werte sind Verweise auf weitere Tabellen. | ||
| - | Die Sektor-Verschränkungs-Tabelle (XLT) dient zur Umrechnung | + | Die Sektor-Verschränkungs-Tabelle (**XLT**) dient zur Umrechnung |
| von logischen zu physikalischen Sektornummern einer Spur. Die | von logischen zu physikalischen Sektornummern einer Spur. Die | ||
| Länge dieser Tabelle entspricht der Anzahl logischer Sektoren | Länge dieser Tabelle entspricht der Anzahl logischer Sektoren | ||
| Zeile 837: | Zeile 929: | ||
| NHDE ist die Nummer des höchsten belegten Directory-Eintrags+1 | NHDE ist die Nummer des höchsten belegten Directory-Eintrags+1 | ||
| - | und dient der Geschwindigkeitserhohung | + | und dient der Geschwindigkeitserhöhung |
| NHDE wird jeweils beim Einloggen eines Laufwerks und beim | NHDE wird jeweils beim Einloggen eines Laufwerks und beim | ||
| Löschen oder Neuanlegen eines Eintrages neu berechnet. Die | Löschen oder Neuanlegen eines Eintrages neu berechnet. Die | ||
| Zeile 885: | Zeile 977: | ||
| auf ein und denselben DPB verweisen. | auf ein und denselben DPB verweisen. | ||
| - | Im CSV sind die Prüfsummen (engl. Checksum) der einzelnen | + | Im **CSV** sind die Prüfsummen (engl. Checksum) der einzelnen |
| Directory-Records gespeichert.\\ | Directory-Records gespeichert.\\ | ||
| Pro Directory-Record ist im CSV ein Byte vorhanden, das die | Pro Directory-Record ist im CSV ein Byte vorhanden, das die | ||
| Zeile 895: | Zeile 987: | ||
| im Zusammenhang mit dem Warmstart beschrieben. | im Zusammenhang mit dem Warmstart beschrieben. | ||
| - | Der Allocation Vektor (ALV) bildet die Belegungstabelle (besser: | + | Der Allocation Vektor (**ALV**) bildet die Belegungstabelle (besser: |
| Belegungsvektor) der Diskette.\\ | Belegungsvektor) der Diskette.\\ | ||
| Aus dem Belegungsvektor kann das BDOS ersehen, welche Blöcke | Aus dem Belegungsvektor kann das BDOS ersehen, welche Blöcke | ||
| Zeile 919: | Zeile 1011: | ||
| Der Disk Parameter Block (DPB) beinhaltet alle Parameter, die | Der Disk Parameter Block (DPB) beinhaltet alle Parameter, die | ||
| - | Größe | + | Größe |
| die Anzahl der logischen Sektoren pro Spur, die Blockgröße, | die Anzahl der logischen Sektoren pro Spur, die Blockgröße, | ||
| die Anzahl der Blocks auf der Diskette und die Größe der | die Anzahl der Blocks auf der Diskette und die Größe der | ||
| Zeile 974: | Zeile 1066: | ||
| Verschränkungs-Tabelle (XLT). | Verschränkungs-Tabelle (XLT). | ||
| - | BSH und BLM beinhalten beide die Blocklänge BLS (engl. BLock | + | **BSH und BLM** beinhalten beide die Blocklänge |
| Size). Durch diese ' | Size). Durch diese ' | ||
| bestimmte BDOS-interne Rechenoperationen vereinfacht. | bestimmte BDOS-interne Rechenoperationen vereinfacht. | ||
| Zeile 989: | Zeile 1081: | ||
| kurz | kurz | ||
| - | BLS = 128 * 2^BSH - 128 * (BLM+1) | + | BLS = 128 * 2^BSH = 128 * (BLM+1) |
| - | In EXM wird die Anzahl von Extends pro Directory-Eintrag | + | In **EXM** wird die Anzahl von Extends pro Directory-Eintrag |
| definiert.\\ | definiert.\\ | ||
| - | EXM ist abhängig von der Blockgröße und der Anzahl der Blöcke | + | EXM ist abhängig von der Blockgröße und der Anzahl der Blöcke |
| pro Diskette. Je nachdem, ob weniger als 256 Blöcke (8-Bit | pro Diskette. Je nachdem, ob weniger als 256 Blöcke (8-Bit | ||
| Blocknummern) oder mehr als 255 Blöcke (16-Bit Blocknummern) | Blocknummern) oder mehr als 255 Blöcke (16-Bit Blocknummern) | ||
| Zeile 1000: | Zeile 1092: | ||
| die zweite für 16-Bit Blocknummern an.) | die zweite für 16-Bit Blocknummern an.) | ||
| - | BLS EXM | + | BLS EXM |
| 1024 0 - | 1024 0 - | ||
| 2048 1 0 | 2048 1 0 | ||
| Zeile 1007: | Zeile 1099: | ||
| 16384 15 7 | 16384 15 7 | ||
| - | DSM enthält die Anzahl von Blöcken pro Diskette -1 bzw. die | + | **DSM** enthält die Anzahl von Blöcken pro Diskette -1 bzw. die |
| höchste Blocknummer der Diskette.\\ | höchste Blocknummer der Diskette.\\ | ||
| - | Die Gesamtkapazitat | + | Die Gesamtkapazität |
| - | Produkt von BLS und (DSH+1); für den Allocation Vector müssen | + | Produkt von BLS und (DSM+1); für den Allocation Vector müssen |
| (DSM / 8) + 1 Bytes reserviert werden. | (DSM / 8) + 1 Bytes reserviert werden. | ||
| Rein theoretisch ist zwar eine Maximalkapazität von einem | Rein theoretisch ist zwar eine Maximalkapazität von einem | ||
| - | Gigabyte (65536 Blöcke a 16 kbyte) denkbar<del>, diese ist aber | + | Gigabyte (65536 Blöcke a 16 kbyte) denkbar, diese ist aber |
| durch die Verwaltung der Recordnummern im 16-Bit Format auf | durch die Verwaltung der Recordnummern im 16-Bit Format auf | ||
| - | 65536 Records, also 8 Megabyte (65536 * 128 Bytes) beschränkt</ | + | 65536 Records, also 8 Megabyte (65536 * 128 Bytes) beschränkt. |
| - | DRM+1 ist die Anzahl der Directory-Einträge der Diskette. Da | + | // |
| + | P.Schorn, 04/2019: Ich habe ein Experiment mit einer 16 mb und einer 32 mb Disk | ||
| + | gemacht. In beiden Fällen konnte ich zwar STAT überzeugen, | ||
| + | so gross ist, aber ich konnte sie nicht über 8 mb hinaus füllen. Bei | ||
| + | überschreiten dieser Grenze sind dann BDOS Fehler aufgetreten.)) | ||
| + | Mit anderen BDOS-Varianten können größere Laufwerke genutzt werden.((https:// | ||
| + | Reason they only do 16bit math and the limit is the total number of | ||
| + | sectors not the total number of allocation blocks. | ||
| + | If it were the latter it could go to 1GB. If you want that then look | ||
| + | at P2dos, Novados, suprbdos, Zrdos, Dosplus. | ||
| + | chimes in we also had DRIs improved but those only go to 32mb | ||
| + | namely CP/m+ and MPM.)) | ||
| + | // | ||
| + | |||
| + | **DRM**+1 ist die Anzahl der Directory-Einträge der Diskette. Da | ||
| die Eintragsnummern - genauso wie die Blocknummern - von | die Eintragsnummern - genauso wie die Blocknummern - von | ||
| Null an gezählt werden, enthält DRM den um eins verminderten | Null an gezählt werden, enthält DRM den um eins verminderten | ||
| Wert. | Wert. | ||
| - | AL0 und AL1 bilden die ersten beiden Bytes des Allocation | + | **AL0 und AL1** bilden die ersten beiden Bytes des Allocation |
| Vectors und müssen daher, wie der ALV, als Bitvektor gesehen | Vectors und müssen daher, wie der ALV, als Bitvektor gesehen | ||
| werden.\\ | werden.\\ | ||
| Zeile 1034: | Zeile 1140: | ||
| Directory-Blöcke auf 16 beschränkt. | Directory-Blöcke auf 16 beschränkt. | ||
| - | CKS kennzeichnet die Länge des Prüfsummen-Vektors (CSV) und | + | **CKS** kennzeichnet die Länge des Prüfsummen-Vektors (CSV) und |
| damit die Anzahl der zu prüfenden Directory-Records, | damit die Anzahl der zu prüfenden Directory-Records, | ||
| aus der Beziehung CKS = (DRM + 1) / 4 ergibt.\\ | aus der Beziehung CKS = (DRM + 1) / 4 ergibt.\\ | ||
| Zeile 1041: | Zeile 1147: | ||
| CKS auch Null sein. | CKS auch Null sein. | ||
| - | OFF ist die Anzahl der reservierten Spuren auf der Diskette. | + | **OFF** ist die Anzahl der reservierten Spuren auf der Diskette. |
| Dieser Wert ist für das BDOS unerheblich, | Dieser Wert ist für das BDOS unerheblich, | ||
| Setzen der physikalischen Spurnummer zur errechneten logischen | Setzen der physikalischen Spurnummer zur errechneten logischen | ||
| Zeile 1290: | Zeile 1396: | ||
| Versionen 2.0. 2.1, 2.2 usw. | Versionen 2.0. 2.1, 2.2 usw. | ||
| + | FIXME | ||