Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung Nächste ÜberarbeitungBeide Seiten der Revision | ||
cpm:write_a_bios:teil_1 [2015/03/03 08:05] – [Der Disk Parameter Block] volkerp | cpm:write_a_bios:teil_1 [2021/09/20 09:30] – [Tabelle] volkerp | ||
---|---|---|---|
Zeile 60: | Zeile 60: | ||
nur die zuerst anzuwählende Disk- und Usernummer in die Speicheradresse | nur die zuerst anzuwählende Disk- und Usernummer in die Speicheradresse | ||
0004h eingetragen zu werden. | 0004h eingetragen zu werden. | ||
+ | |||
+ | |||
+ | * Systemmeldung ausgeben | ||
+ | * IOBYTE Geräte initialisieren | ||
+ | * die verschiedenen Systemparameter, | ||
+ | * Register C auf Null setzen, um Laufwerk A zu wählen | ||
**WBOOT** wird beim Warmstart (z.b. ^C oder JP 0000) aufgerufen. Die BDOS- | **WBOOT** wird beim Warmstart (z.b. ^C oder JP 0000) aufgerufen. Die BDOS- | ||
Zeile 75: | Zeile 81: | ||
Nach dem Neuladen von CCP und BDOS werden die Systemsprünge für JP 0000 und CALL 5 eingerichtet, | Nach dem Neuladen von CCP und BDOS werden die Systemsprünge für JP 0000 und CALL 5 eingerichtet, | ||
das aktuelle Laufwerk wieder selektiert und die Steuerung ans CCP übergeben. | das aktuelle Laufwerk wieder selektiert und die Steuerung ans CCP übergeben. | ||
+ | |||
+ | * Laden von CCP und BDOS | ||
+ | * Initialisieren von JP 0, JP 5 | ||
+ | * IOBYTE 0003h setzen | ||
+ | * CDRIVE 0004h setzen (Highnibble = aktuelle Benutzernummer, | ||
+ | * C = aktuelles Laufwerk. WBOOT sollte CDRIVE auslesen und sicherstellen, | ||
+ | * Sprung nach CCP | ||
+ | |||
< | < | ||
Zeile 264: | Zeile 278: | ||
übergebene Sektornummer ins Registerpaar HL zu kopieren. | übergebene Sektornummer ins Registerpaar HL zu kopieren. | ||
- | im CP/A wird einfach der übergebene Wert genommen und um 1 erhöht (die Sektoren | + | Die logische Sektornummer in CP/M reicht von 0 bis max. 65535, die physikalischen Sektornummern auf Disketten-Laufwerken beginnen in der Regel mit 1. |
+ | |||
+ | :!: im CP/A wird daher einfach der übergebene Wert genommen und um 1 erhöht (die phys. Sektoren | ||
zählen in CP/A bzw. auf Diskette ab 1). Nutzt man eine allgemeine SECTRAN- | zählen in CP/A bzw. auf Diskette ab 1). Nutzt man eine allgemeine SECTRAN- | ||
- | Routine für alle Laufwerke, muss dies bei den phys. Laufwerkstreibern f. Read und Write beachtet werden. | + | Routine für alle Laufwerke, muss dies bei den phys. Laufwerkstreibern f. Read und Write beachtet werden, insbesondere bei nachladbaren Treibern wie z.B. für eine RAM-Disk. |
< | < | ||
Zeile 298: | Zeile 314: | ||
Laufwerk beziehen. | Laufwerk beziehen. | ||
- | In einem aufwendigen BIOS kann bei SELDSK eine Analyse der Diskette erfolgen, um | + | :!: In einem aufwendigen BIOS kann bei SELDSK eine Analyse der Diskette erfolgen, um |
das konkrete **Diskettenformat automatisch zu ermitteln**. Im CP/A-BIOS gibt es eine Liste von Formaten, die hier getestet werden (z.B. 624k, 780k, 800k). Als Resultat dieser | das konkrete **Diskettenformat automatisch zu ermitteln**. Im CP/A-BIOS gibt es eine Liste von Formaten, die hier getestet werden (z.B. 624k, 780k, 800k). Als Resultat dieser | ||
Analyse wird ein passender DPB ausgewählt (oder dynamisch zusammengestellt) | Analyse wird ein passender DPB ausgewählt (oder dynamisch zusammengestellt) | ||
Zeile 431: | Zeile 447: | ||
Man spricht von physischen Laufwerkstreibern für Read und Write, wenn diese den physischen Transfer eines (physischen) Sektors von/zum Laufwerk übernehmen. Die logischen Laufwerkstreiber übernehmen das Blocking/ | Man spricht von physischen Laufwerkstreibern für Read und Write, wenn diese den physischen Transfer eines (physischen) Sektors von/zum Laufwerk übernehmen. Die logischen Laufwerkstreiber übernehmen das Blocking/ | ||
- | Ganz einfache Routinen: | + | Zur Unterstützung des Blocking/ |
+ | * 0 = normales Schreiben eines Sektors | ||
+ | * 1 = Schreiben eines Directory-Sektors | ||
+ | * 2 = Schreiben des ersten Sektors eines neuen Blocks | ||
+ | |||
+ | Von Digital Research gibt es außerdem die Datei deblock.asm, | ||
+ | |||
+ | |||
+ | Ganz einfache Routinen | ||
< | < | ||
; | ; | ||
Zeile 484: | Zeile 508: | ||
Ein DPB umfasst 15 Bytes in folgender Aufteilung: | Ein DPB umfasst 15 Bytes in folgender Aufteilung: | ||
+ | |||
< | < | ||
+----------------------------------------------------------+ | +----------------------------------------------------------+ | ||
Zeile 526: | Zeile 551: | ||
* ... | * ... | ||
| | ||
- | CP/A nutzt die erste Variante. | + | :!: CP/A nutzt die erste Variante. |
- | Unabhängig von der physischen Sektorlänge gibt es im CP/M noch die **Blockgröße**. | + | Unabhängig von der physischen Sektorlänge gibt es im CP/M noch die **Blockgröße** |
Das BDOS teilt jede Diskette in Blöcke (engl. Blocks) auf, um damit den | Das BDOS teilt jede Diskette in Blöcke (engl. Blocks) auf, um damit den | ||
Verwaltungs- und Speicheraufwand für die Belegungstabelle zu verkleinern. | Verwaltungs- und Speicheraufwand für die Belegungstabelle zu verkleinern. | ||
Zeile 568: | Zeile 593: | ||
**BSH** := log2 (block size / 128)\\ | **BSH** := log2 (block size / 128)\\ | ||
**BLM** := (block size / 128) - 1\\ | **BLM** := (block size / 128) - 1\\ | ||
- | **EXM** := (block size / 1024) - 1 bei 8 bit-Blocknummern ( DSM/block size < = 255) bzw.\\ | + | **EXM** := (block size / 1024) - 1 bei 8 bit-Blocknummern ( DSM <= 255) bzw.\\ |
- | **EXM** := (block size / 2048) - 1 bei 16 bit-Blocknummern ( DSM/block size > 255)\\ | + | **EXM** := (block size / 2048) - 1 bei 16 bit-Blocknummern ( DSM > 255)\\ |
- | ^ block size ^ BSH | + | ^ block size ^ |
- | ^ 1 KByte | + | ^ :!: 512 Byte | 2 | 3 | 0 | - | |
- | ^ 2 KByte | + | ^ 1 KByte |
- | ^ 4 KByte | + | ^ 2 KByte |
- | ^ 8 KByte | + | ^ 4 KByte |
- | ^ 16 KByte | 7 | 127 | 15 | 7 | | + | ^ 8 KByte |
+ | ^ 16 KByte | 7 | 127 | 15 | 7 | | ||
+ | |||
+ | :!: 512 Byte funktionieren in CP/A und CP/M 2.2, sind aber nicht dokumentiert. Für eine kleine RAM-Disk reicht es. Die cpmtools kommen damit nicht klar! | ||
Die Anzahl der Directory-Einträge ist frei wählbar. Es werden immer ganze Blöcke vergeben, | Die Anzahl der Directory-Einträge ist frei wählbar. Es werden immer ganze Blöcke vergeben, | ||
Zeile 609: | Zeile 637: | ||
Damit wird nicht auf Diskettenwechsel geprüft. | Damit wird nicht auf Diskettenwechsel geprüft. | ||
- | Im DPH (s.o.) wird für den Prüfsummenvektor Speicherplatz definiert (CHKxx). | + | Im DPH (s.o.) wird für den Prüfsummenvektor Speicherplatz definiert (**CHK**xx). |
Dieser muss CKS Byte groß sein: | Dieser muss CKS Byte groß sein: | ||
CHK00: | CHK00: | ||
- | Der Allocation Vektor (ALV) bildet die Belegungstabelle (besser: | + | Der Allocation Vektor (**ALV**) bildet die Belegungstabelle (besser: |
Belegungsvektor) der Diskette. Für jeden Block der Diskette ist im ALV ein Bit | Belegungsvektor) der Diskette. Für jeden Block der Diskette ist im ALV ein Bit | ||
vorhanden, das entsprechend auf 0 (Block frei) oder 1 (Block belegt) gesetzt | vorhanden, das entsprechend auf 0 (Block frei) oder 1 (Block belegt) gesetzt | ||
wird. Die Zuordnung der Blöcke zu den Bits geschieht in absteigender | wird. Die Zuordnung der Blöcke zu den Bits geschieht in absteigender | ||
Bitnummernfolge (höchstes Bit eines Bytes zuerst) und aufsteigender Bytefolge | Bitnummernfolge (höchstes Bit eines Bytes zuerst) und aufsteigender Bytefolge | ||
- | (erstes Byte des ALV zuerst). Für ALLxx muss man deshalb (DSM+1)/8 Byte bereitstellen: | + | (erstes Byte des ALV zuerst). Für ALLxx muss man deshalb (DSM+7)/8 Byte bereitstellen |
- | ALL00: | + | ALL00: |
Achtung: Bei automatischer Formaterkennung müssen die Speicherplätze CHKxx und | Achtung: Bei automatischer Formaterkennung müssen die Speicherplätze CHKxx und | ||
Zeile 649: | Zeile 677: | ||
DW 0 ;OFS track offset | DW 0 ;OFS track offset | ||
+ | ALL00: | ||
CHK00: | CHK00: | ||
- | ALL00: | ||
</ | </ | ||
- | die Berechnung des DPB und der Größe der Speicherbereiche kann durch ein Makro erfolgen. | + | die Berechnung des DPB und der Größe der Speicherbereiche kann durch die Makro-Bibliothek diskdef.lib |
+ | |||
+ | -> http:// | ||
< | < | ||
Zeile 663: | Zeile 693: | ||
</ | </ | ||
- | Dieses Beispiel erzeugt genau obige Daten für Beispiel 1. | + | Dieses Beispiel erzeugt |
- | + | ||
- | Tipp: Die originale diskdef.lib funktioniert nur mit dem MAC/ | + | |
+ | :!: Die originale diskdef.lib funktioniert nur mit dem MAC/ |