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:teil_1 [2018/02/01 06:48] – [Der Disk Parameter Block] volkerpcpm:write_a_bios:teil_1 [2021/09/24 05:44] (aktuell) – [Der Disk Parameter Block] volkerp
Zeile 278: 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.
  
 <code> <code>
Zeile 453: Zeile 455:
  
  
-Ganz einfache Routinen:+Ganz einfache Routinen (konkrete Beispiele folgen im 2. Teil):
 <code> <code>
 ; ;
Zeile 551: Zeile 553:
 :!: 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** (engl. block size, **BLS**).
 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 594: Zeile 596:
 **EXM** := (block size / 2048) - 1 bei 16 bit-Blocknummern ( DSM > 255)\\ **EXM** := (block size / 2048) - 1 bei 16 bit-Blocknummern ( DSM > 255)\\
  
-^ block size  BSH  BLM  ^ EXM (8)  EXM (16)  +^ block size    ^  BSH ^  BLM  EXM (8)  EXM (16) ^ 
-^ :!: 512 Byte    |    2 |    3 |        0 |         - | +^ :!: 512 Byte  |    2 |    3 |        0 |         - | 
-^ 1 KByte     |    3 |    7 |        0 |         - | +^ 1 KByte       |    3 |    7 |        0 |         - | 
-^ 2 KByte     |    4 |   15 |        1 |         0 | +^ 2 KByte       |    4 |   15 |        1 |         0 | 
-^ 4 KByte     |    5 |   31 |        3 |         1 | +^ 4 KByte       |    5 |   31 |        3 |         1 | 
-^ 8 KByte     |    6 |   63 |        7 |         3 | +^ 8 KByte       |    6 |   63 |        7 |         3 | 
-^ 16 KByte    |    7 |  127 |       15 |         7 |+^ 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! :!: 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!
Zeile 614: Zeile 616:
 sollte gewahrt bleiben. Es ist wenig sinnvoll, mehr Directory-Einträge als Blöcke zu haben. sollte gewahrt bleiben. Es ist wenig sinnvoll, mehr Directory-Einträge als Blöcke zu haben.
 DSM/(durchschnittliche Dateigröße) kann ein Anhaltspunkt sein. DSM/(durchschnittliche Dateigröße) kann ein Anhaltspunkt sein.
 +
 +Es sollte außerdem
 +
 +für 8-Bit-Blocknummern: DRM * 16 >= DSM\\
 +für 16-Bit-Blocknummern: DRM * 8 >= DSM
 + 
 +sein, sonst bekommt man die Diskette gar nicht voll.
  
 Im Beispiel ergibt sich für drei 2K-Blöcke 3 * 2048/32 = maximal mögliche 192 Einträge,  Im Beispiel ergibt sich für drei 2K-Blöcke 3 * 2048/32 = maximal mögliche 192 Einträge, 
 das Maximum sollte man auch nutzen und DRM auf 191 setzen. das Maximum sollte man auch nutzen und DRM auf 191 setzen.
  
-^ block size  ^ Anz. Dir.Blöcke           ^^^^^^^^^^^^^^^^ +^ Anz. Dir.Blöcke                 1 ^      2 ^      3 ^      4 ^      5 ^      6 ^      7 ^      8 ^      9 ^     10 ^     11 ^     12 ^     13 ^     14 ^     15 ^     16 ^ 
-^ 1^ 2^ 3^ 4^ 5^ 6^ 7^ 8^ 9^ 10^ 11^ 12^ 13^ 14^ 15^ 16^ +^ AL0,AL1          |            80,00 |  C0,00 |  E0,00 |  F0,00 |  F8,00 |  FC,00 |  FE,00 |  FF,00 |  FF,80 |  FF,C0 |  FF,E0 |  FF,F0 |  FF,F8 |  FF,FC |  FF,FE |  FF,FF | 
-^ 1 KByte|  31|  63|  95|  127|  159|  191|  223|  255|  287|  319|  351|  383|  415|  447|  479|  511| +^ block size                        |        |        |        |        |        |        |        |        |        |        |        |        |        |        |        | 
-^ 2 KByte|  63|  127|  191|  255|  319|  383|  447|  511|  575|  639|  703|  767|  831|  895|  959|  1023| +^ 1 KByte                        31 |     63 |     95 |    127 |    159 |    191 |    223 |    255 |    287 |    319 |    351 |    383 |    415 |    447 |    479 |    511 | 
-^ 4 KByte|  127|  255|  383|  511|  639|  767|  895|  1023|  1151|  1279|  1407|  1535|  1663|  1791|  1919|  2047| +^ 2 KByte                        63 |    127 |    191 |    255 |    319 |    383 |    447 |    511 |    575 |    639 |    703 |    767 |    831 |    895 |    959 |   1023 | 
-^ 8 KByte|  255|  511|  767|  1023|  1279|  1535|  1791|  2047|  2303|  2559|  2815|  3071|  3327|  3583|  3839|  4095| +^ 4 KByte                       127 |    255 |    383 |    511 |    639 |    767 |    895 |   1023 |   1151 |   1279 |   1407 |   1535 |   1663 |   1791 |   1919 |   2047 | 
-^ 16 KByte|  511|  1023|  1535|  2047|  2559|  3071|  3583|  4095|  4607|  5119|  5631|  6143|  6655|  7167|  7679|  8191|+^ 8 KByte                       255 |    511 |    767 |   1023 |   1279 |   1535 |   1791 |   2047 |   2303 |   2559 |   2815 |   3071 |   3327 |   3583 |   3839 |   4095 | 
 +^ 16 KByte                      511 |   1023 |   1535 |   2047 |   2559 |   3071 |   3583 |   4095 |   4607 |   5119 |   5631 |   6143 |   6655 |   7167 |   7679 |   8191 |
  
 CP/M erkennt Diskettenwechsel, indem ein Prüfvektor über die Directory-Records gebildet wird. CP/M erkennt Diskettenwechsel, indem ein Prüfvektor über die Directory-Records gebildet wird.
Zeile 635: Zeile 645:
 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: DS xx ;check vector 0 = CKS Byte CHK00: DS xx ;check vector 0 = CKS Byte
  
-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 
Zeile 647: Zeile 657:
 (erstes Byte des ALV zuerst). Für ALLxx muss man deshalb (DSM+7)/8 Byte bereitstellen (DSM/8 aufgerundet): (erstes Byte des ALV zuerst). Für ALLxx muss man deshalb (DSM+7)/8 Byte bereitstellen (DSM/8 aufgerundet):
  
-**ALL00**: DS xx ;allocation vector 0 = (DSM+7)/8 Byte+ALL00: DS xx ;allocation vector 0 = (DSM+7)/8 Byte
  
 Achtung: Bei automatischer Formaterkennung müssen die Speicherplätze CHKxx und  Achtung: Bei automatischer Formaterkennung müssen die Speicherplätze CHKxx und 
Zeile 680: Zeile 690:
  
 die Berechnung des DPB und der Größe der Speicherbereiche kann durch die Makro-Bibliothek diskdef.lib erfolgen. die Berechnung des DPB und der Größe der Speicherbereiche kann durch die Makro-Bibliothek diskdef.lib erfolgen.
 +
 +-> http://www.gaby.de/cpm/manuals/archive/cpm22htm/ch6.htm#Section_6.11
  
 <code> <code>
Zeile 689: Zeile 701:
 </code> </code>
  
-Dieses Beispiel erzeugt genau obige Daten für Beispiel 1.+Dieses Beispiel erzeugt beim Assemblieren mit MAC genau obige Daten für Beispiel 1.
  
 :!: Die originale diskdef.lib funktioniert nur mit dem MAC/RMAC-Assembler. Für den M80 gibt es eine angepasste Version BUGS fixed 07/07/82 JDW Software {{ :cpm:write_a_bios:diskdef_jdw.zip |}}. :!: Die originale diskdef.lib funktioniert nur mit dem MAC/RMAC-Assembler. Für den M80 gibt es eine angepasste Version BUGS fixed 07/07/82 JDW Software {{ :cpm:write_a_bios:diskdef_jdw.zip |}}.
 +
 +Der Makroaufruf **DISKDEF** hat die Form:
 +
 +        DISKDEF dn,fsc,lsc,[skf],bls,dks,dir,cks,ofs[,0]
 +
 +wobei
 +
 +    dn ist die logische Plattennummer, 0 bis n - 1.
 +    fsc ist die erste physische Sektornummer (0 oder 1).
 +    lsc ist die letzte Sektornummer.
 +    skf ist der optionale Sektor-Skew-Faktor.
 +    bls ist die Blockgröße der Datenzuordnung.
 +    dks ist die Anzahl der Blöcke auf der Platte.
 +    dir ist die Anzahl der Verzeichniseinträge.
 +    cks ist die Anzahl der geprüften Verzeichniseinträge.
 +    ofs ist der Spurversatz zur logischen Spur 00.
 +    [0] ist ein optionales 1.4-Kompatibilitätsflag.
 +
 +Der Wert dn ist die Laufwerksnummer, die mit diesem DISKDEF-Makroaufruf definiert wird. Der Parameter fsc berücksichtigt unterschiedliche Sektornummerierungssysteme und ist normalerweise 0 bis 1. Der lsc ist der letzte nummerierte Sektor auf einer Spur. Falls vorhanden, definiert der Parameter skf den Sektorversatzfaktor, der verwendet wird, um eine Sektorübersetzungstabelle gemäß dem Versatz zu erstellen.
 +
 +Wenn die Anzahl der Sektoren weniger als 256 beträgt, wird eine Einzelbyte-Tabelle erstellt, ansonsten belegt jedes Übersetzungstabellenelement zwei Bytes. Es wird keine Übersetzungstabelle erstellt, wenn der Parameter skf weggelassen wird oder gleich 0 ist.
 +
 +Der Parameter bls gibt die Anzahl der Bytes an, die jedem Datenblock zugeordnet sind und nimmt die Werte 1024, 2048, 4096, 8192 oder 16384 an. Im Allgemeinen steigt die Leistung mit größeren Datenblockgrößen, da weniger Verzeichnisreferenzen und logisch verbundene Daten vorhanden sind Datensätze sind physisch nahe auf der Festplatte. Außerdem adressiert jeder Verzeichniseintrag mehr Daten und der BIOS-residente RAM-Speicherplatz wird reduziert.
 +
 +Der Parameter dks gibt die Gesamtplattengröße in bls-Einheiten an. Das heißt, wenn bls = 2048 und dks = 1000 ist, beträgt die Gesamtplattenkapazität 2.048.000 Byte. Wenn dks größer als 255 ist, muss der Blockgrößenparameter bls größer als 1024 sein. Der Wert von dir ist die Gesamtzahl der Verzeichniseinträge, die bei Bedarf 255 überschreiten kann.
 +
 +Der Parameter cks bestimmt die Anzahl der Verzeichniselemente, die bei jedem Verzeichnisscan zu überprüfen sind, und wird intern verwendet, um während des Systembetriebs geänderte Platten zu erkennen, wenn kein Kalt- oder Warmstart dazwischen erfolgt. Wenn diese Situation erkannt wird, markiert CP/M die Platte automatisch als schreibgeschützt, damit die Daten anschließend nicht zerstört werden.
 +
 +Wie im vorherigen Abschnitt erwähnt, ist der Wert von cks = dir, wenn das Medium leicht geändert werden kann, wie es bei einem Disketten-Subsystem der Fall ist. Wenn die Platte permanent gemountet ist, ist der Wert von cks normalerweise 0, da die Wahrscheinlichkeit eines Plattenwechsels ohne Neustart gering ist.
 +
 +Der Wert ofs bestimmt die Anzahl der zu überspringenden Spuren, wenn dieses bestimmte Laufwerk angesprochen wird. Dies kann verwendet werden, um zusätzlichen Betriebssystemspeicherplatz zu reservieren oder mehrere logische Laufwerke auf einem einzelnen physischen Laufwerk mit großer Kapazität zu simulieren. Schließlich ist der Parameter [0] enthalten, wenn Dateikompatibilität mit Versionen von 1.4 erforderlich ist, die für Festplatten mit höherer Dichte modifiziert wurden. Dieser Parameter stellt sicher, dass für jeden Verzeichnisdatensatz nur 16 KB zugewiesen werden, wie dies bei früheren Versionen der Fall war. Normalerweise ist dieser Parameter nicht enthalten.
 +
  • cpm/write_a_bios/teil_1.1517467716.txt.gz
  • Zuletzt geändert: 2018/02/01 06:48
  • von volkerp