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
Nächste ÜberarbeitungBeide Seiten der Revision
cpm:write_a_bios:teil_1 [2015/03/03 08:05] – [Der Disk Parameter Block] volkerpcpm: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, die vor WBOOT gesetzt werden müssen, initialisieren
 +  * 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, Low-Nibble = Laufwerk)
 +  * C = aktuelles Laufwerk. WBOOT sollte CDRIVE auslesen und sicherstellen, dass es ein echtes Laufwerk ist, und in Register C übergeben
 +  * Sprung nach CCP
 +
  
 <code> <code>
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.
  
 <code> <code>
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/Deblocking und andere Aufgaben zur Laufwerksverwaltung wie Optimierung der Zugriffe auf verschiedene Laufwerke etc. In einem einfachen BIOS z.B. für eine RAM-Disk mit 128 Byte großen Sektoren braucht man diese Unterteilung nicht. 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/Deblocking und andere Aufgaben zur Laufwerksverwaltung wie Optimierung der Zugriffe auf verschiedene Laufwerke etc. In einem einfachen BIOS z.B. für eine RAM-Disk mit 128 Byte großen Sektoren braucht man diese Unterteilung nicht.
  
-Ganz einfache Routinen:+Zur Unterstützung des Blocking/Deblocking wird der **WRITE**-Funktion im C-Register ein Wert übergeben: 
 +  * 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, die Blocking/Deblocking-Vorlagen enthält. 
 + 
 + 
 +Ganz einfache Routinen (konkrete Beispiele folgen im 2. Teil):
 <code> <code>
 ; ;
Zeile 484: Zeile 508:
  
 Ein DPB umfasst 15 Bytes in folgender Aufteilung:  Ein DPB umfasst 15 Bytes in folgender Aufteilung: 
 +
 <ditaa> <ditaa>
 +----------------------------------------------------------+ +----------------------------------------------------------+
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** (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 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  BLM  ^ EXM (8)  ^ EXM (16)  +^ block size    ^  BSH ^  BLM  EXM (8) ^  EXM (16) ^ 
-^ 1 KByte     |    3 |    7 |        0 |         - | +^ :!: 512 Byte  |    2 |    3 |        0 |         - | 
-^ 2 KByte     |    4 |   15 |        1 |         0 | +^ 1 KByte       |    3 |    7 |        0 |         - | 
-^ 4 KByte     |    5 |   31 |        3 |         1 | +^ 2 KByte       |    4 |   15 |        1 |         0 | 
-^ 8 KByte     |    6 |   63 |        7 |         3 | +^ 4 KByte       |    5 |   31 |        3 |         1 | 
-^ 16 KByte    |    7 |  127 |       15 |         7 |+^ 8 KByte       |    6 |   63 |        7 |         3 | 
 +^ 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: 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 
 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 (DSM/8 aufgerundet):
  
-ALL00: DS xx ;allocation vector 0 = (DSM+1)/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 649: Zeile 677:
  DW 0 ;OFS track offset  DW 0 ;OFS track offset
  
 +ALL00: DS 50 ;allocation vector 0
 CHK00: DS 48 ;check vector 0 CHK00: DS 48 ;check vector 0
-ALL00: DS 50 ;allocation vector 0 
 </code> </code>
  
-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 erfolgen. 
 + 
 +-> http://www.gaby.de/cpm/manuals/archive/cpm22htm/ch6.htm#Section_6.11
  
 <code> <code>
Zeile 663: Zeile 693:
 </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.
- +
-Tipp: 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. +
  
 +:!: 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 |}}.
  • cpm/write_a_bios/teil_1.txt
  • Zuletzt geändert: 2024/04/12 12:34
  • von volkerp