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
Letzte ÜberarbeitungBeide Seiten der Revision
cpm:write_a_bios:teil_2 [2012/03/09 06:34] volkerpcpm:write_a_bios:teil_2 [2018/10/05 06:49] – [Variante 2] volkerp
Zeile 2: Zeile 2:
  
 weiter geht es mit dem **DPB** weiter geht es mit dem **DPB**
 +
 +das folgende Beispiel stammt aus einer [[cpm:cpa|]]-Implementation.
 +Bei CP/A erfolgt die Sektorzählung ab 1, deshalb steht in sectran ein inc hl. 
 +Die Zählung ab 1 muss bei den direkten Zugriffen beachtet werden!
 +
 +<code>
 +;-----------------------------------------------------------------------------
 +; Uebersetzung Sektornummer in CP/A
 +;-----------------------------------------------------------------------------
 +sectran: ld h, b
 + ld l, c
 + inc hl ;Sektoren zaehlen in CP/A ab 1
 + ret
 +</code>
  
 ===== Beispiel 2 ===== ===== Beispiel 2 =====
Zeile 49: Zeile 63:
  
 1 Track = 256 Byte (Fenstergröße)\\ 1 Track = 256 Byte (Fenstergröße)\\
-d.h. 2 Records/track\\+d.h. 2 Records/track 1..2\\
 wir brauchen damit 1600h/256 = 22 Tracks f. Systemspur\\ wir brauchen damit 1600h/256 = 22 Tracks f. Systemspur\\
-insg. 1024 tracks -> DSM = 1023-22\\ +insg. 1024 tracks -> DSM = 1024-22 = 1012\\ 
-wir wählen die kleinstmögliche Blockgröße 2k (1k gehen nicht wg. EXM, da wir mehr als 256 Spuren haben)\\+wir wählen die kleinstmögliche Blockgröße 2k (1k gehen nicht wg. EXM, da DSM > 255)\\
 und z.B. 128 Dir-Einträge (d.h. 2 Dir-Blöcke)\\ und z.B. 128 Dir-Einträge (d.h. 2 Dir-Blöcke)\\
  
Zeile 59: Zeile 73:
 <code> <code>
  ;DISKDEF 0,1,2,,2048,1012,128,0,22  ;DISKDEF 0,1,2,,2048,1012,128,0,22
-dpb00: dw 2 ;sec per track +dpb00: dw 2 ;SPT sectors per track 
- db 4 ;block shift + db 4 ;BSF block shift factor 
- db 15 ;block mask + db 15 ;BLM block mask 
- db 0 ;extnt mask + db 0 ;EXM null mask 
- dw 1011 ;disk size-1 + dw 1011 ;DSM disk size-1 
- dw 127 ;directory max + dw 127 ;DRM directory max 
- db C0h ;alloc0 + db C0h ;AL0 alloc 0 
- db 0 ;alloc1 + db 0 ;Al1 alloc 1 
- dw 0 ;check size + dw 0 ;CKS check size 
- dw 22 ;offset+ dw 22 ;OFS track offset
 ; ;
-alv00: ds 007Fh +alv00: ds 007Fh   ;allocation vector 
-csv00: ds 0000+csv00: ds 0000         ;check vector
 </code> </code>
  
-Die BIOS-Routinen zum Blocklesen und -schreiben verweisen auf folgende Routinen:+Die BIOS-Routinen zum Blocklesen und -schreiben verweisen auf folgende Routinen. Wegen der Spurgröße von 256 Byte = 2 Records muss ein Blocking/Deblocking erfolgen. Glücklicherweise ist das bei einer RAM-Disk nicht weiter schwierig umzusetzen, da innerhalb des Zugriffsfensters nur der angesprochene Bereich von 128 Byte gelesen bzw. verändert wird.
  
 <code> <code>
Zeile 101: Zeile 115:
  CP 2  CP 2
  jr nz, ADRE0a  jr nz, ADRE0a
- LD H,80h+ LD L,80h
 ADREa: LD DE,(DMAAD) ADREa: LD DE,(DMAAD)
  LD BC,128  LD BC,128
Zeile 113: Zeile 127:
  
 1 Track = 2048 Byte\\  1 Track = 2048 Byte\\ 
-d.h. 16 Records/Track\\+d.h. 16 Records/Track 1..16\\
 wir brauchen damit 1600h/2048 = 3 Tracks f. Systemspur\\ wir brauchen damit 1600h/2048 = 3 Tracks f. Systemspur\\
-insg. 256 Tracks-> DSM = 255-3\\+insg. 128 Tracks-> DSM = 128-3\\
 kleinste Blockgröße 1k\\ kleinste Blockgröße 1k\\
 und z.B. 64 Dir-Einträge (d.h. 2 Dir-Blöcke) und z.B. 64 Dir-Einträge (d.h. 2 Dir-Blöcke)
  
-Diese Aufteilung ist wg. der kleineren Blockgröße günstiger, wenn viele kleine Dateien auf  +Diese Aufteilung ist aufgrund der kleineren Blockgröße günstiger, wenn viele kleine Dateien auf  
-der RAM-Disk gehalten werden sollen. Auch wird weniger Platz für den Allocation Vektor ALVxx benötigt. Aber die Umrechnung logischer Track-Sektor -> Adr. f. RAM-Disk ist aufwendiger!+der RAM-Disk gehalten werden sollen. Auch wird weniger Platz für den Allocation Vektor ALVxx benötigt. Aber die Umrechnung logischer Track und Sektor -> Adr. f. RAM-Disk ist aufwendiger!
  
 <code> <code>
-      ;DISKDEF 1,1,16,,1024,252,64,0,3 +      ;DISKDEF 1,1,16,,1024,125,64,0,3 
-dpb01: dw 16 ;sec per track +dpb01: dw 16 ;SPT sectors per track 
- db 3 ;block shift + db 3 ;BSF block shift factor 
- db 7 ;block mask + db 7 ;BLM block mask 
- db 0 ;extnt mask + db 0 ;EXM null mask 
- dw 251 ;disk size-1 + dw 124 ;DSM disk size-1 
- dw 63 ;directory max + dw 63 ;DRM directory max 
- db C0H ;alloc0 + db C0H ;AL0 alloc 0 
- db 0 ;alloc1 + db 0 ;Al1 alloc 1 
- dw 0 ;check size + dw 0 ;CKS check size 
- dw 3 ;offset + dw 3 ;OFS track offset 
-alv01: ds 0020h +; 
-csv01: ds 0000h+alv01: ds 0010h             ;allocation vector 
 +csv01: ds 0000h             ;check vector
 </code> </code>
  
Zeile 156: Zeile 171:
  RR H   RR H
  RR L ; HL := HL/2 ( da 2 Sektoren/Fenster )  RR L ; HL := HL/2 ( da 2 Sektoren/Fenster )
- RR A ; L Lo-Bit in Hi-Bit ( A = 0 oder 80h)+ RR A ; L Bit0 nach Bit7 ( A = 0 oder 80h)
  OUT (LDAH), L ; hi-adr.  OUT (LDAH), L ; hi-adr.
  OUT (LDBB), H ; Bank  OUT (LDBB), H ; Bank
Zeile 166: Zeile 181:
 </code> </code>
  
 +===== Beispiel 3 =====
 +
 +Ein Floppy-Laufwerk: 800K, 2 Seiten, 1K phys. Sektorgröße, 5 phys. Sektoren pro Spur und Seite
 +
 +log. Sektoren pro Spur 1..40\\
 +Blockgröße BLS = 2048\\
 +Diskgröße = 800K/BLS = 400\\
 +192 Directory-Einträge\\
 +keine Systemspuren
 +
 +<code>
 + ;DISKDEF 0,1,40,,2048,400,192,192,
 +dpba: dw 40 ;SPT sectors per track
 + db 4 ;BSF block shift factor
 + db 15 ;BLM block mask
 + db 0 ;EXM null mask
 + dw 399 ;DSM disk size-1
 + dw 191 ;DRM directory max
 + db 0E0H ;AL0 alloc 0
 + db 0 ;Al1 alloc 1
 + dw 48 ;CKS check size
 + dw 0 ;OFS track offset
 +alva: ds 0032h   
 +csva: ds 0030h   
 +
 +</code>
 +
 +CP/M zählt die logischen Recordnummern pro Spur von 0..39. SECTRAN übersetzt diese Recordnummern in 1..40 (CP/A-Umrechnung) und übergibt diese berechnete Recordnummer mit SETSEC ans BIOS.
 +
 +CP/M ermittelt anhand DSM, ob 16Bit- oder 8-Bit-Blocknummern genutzt werden: DSM > 255 -> 16Bit-Blocknummern.
 +
 +Die max. Spurnummer berechnet sich als DSM*BLS/SPT/128-OFS.
 +CP/M arbeitet aber intern nicht mit einer maximalen Spurnummer, sondern testet auf Überschreiten von DSM.
 +
 +Der DPB wird vom CP/M wie folgt angezeigt:
 +<code>
 +A>stat dsk:
 +    A: Drive Characteristics
 + 6400: 128 Byte Record Capacity
 +  800: Kilobyte Drive  Capacity
 +  192: 32  Byte Directory Entries
 +  192: Checked  Directory Entries
 +  128: Records/ Extent
 +   16: Records/ Block
 +   40: Sectors/ Track
 +    0: Reserved Tracks
 +</code>
 +
 +POWER gibt ein paar mehr Informationen aus:
 +
 +<code>
 +        POWER 3.03 on CP/M 2.22 1/2
 +A=disk
 +disk capacity:    800K
 +tracks:           160    0 system
 +sectors/track:     40   40 last
 +sectors/system:       48 dir
 +dir entries:      192    6K
 +sectors/group:     16    2K 18FH groups
 +kbytes/extent:     16K
 +</code>
  
 +Bislang wurde noch nicht darauf eingegangen, dass eine phys. Diskette 2 Seiten hat. Die Adressierung von Diskettenseite/Spur/phys.Sektor incl. Blocking/Deblocking ist Aufgabe des BIOS.
  • cpm/write_a_bios/teil_2.txt
  • Zuletzt geändert: 2021/09/28 08:23
  • von volkerp