Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
cpm:systemdoku [2024/04/10 06:36] – [Records] 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 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 |
< | < |