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/08 15:49] – Page name changed from cpm:write_a_bios:dbp to cpm:write_a_bios:teil_2 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 =====
  
 Wir wollen ein RAM-Floppy ansteuern.  Wir wollen ein RAM-Floppy ansteuern. 
-Die RAM-Floppy (NANOS) hat folgende Eigenschaften:+Die [[:z1013:module:raf#nanos|RAM-Floppy (NANOS)]] hat folgende Eigenschaften:
  
   * 256 K Gesamtkapazität   * 256 K Gesamtkapazität
Zeile 21: Zeile 35:
  
 Eine RAM-Floppy hat keine physischen Spuren, deshalb kann man die Aufteilung in virtuelle Spuren und Sektoren nach eigenen Ideen vornehmen. Eine RAM-Floppy hat keine physischen Spuren, deshalb kann man die Aufteilung in virtuelle Spuren und Sektoren nach eigenen Ideen vornehmen.
 +
 +Die Ansteuerung als Übersicht:
 +
 +<code>
 +                :-----  Vollständige 18 bit RAM-Adresse (RAF 256K)  ------:
 +                :17 16   15 14 13 12 11 10  9  8:  7  6  5  4  3  2  1  0 :
 +                :                               :                         :
 +  +--+--+--+-+--+--+--+ +--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+
 +  |        Bank       | |       Hi-Adr.         | |       Window          |
 +  +--+--+--+-+--+--+--+ +--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+
 +                :     :                         : :  :                    :
 +                : 9  8:    6  5  4  3  2  1  0: : 0:                    :
 +Variante 1      :------------TRACK--------------: :--:-------RECORD-------:
 +                                                 SECTOR 
 +
 +
 +                :     :                    :         :                    :
 +                : 7  6:    4  3  2  1  0 : 3 2  1 0:                    :
 +Variante 2      :------------TRACK---------:-SECTOR--:-------RECORD-------:
 +</code>
  
 ==== Variante 1 ==== ==== Variante 1 ====
Zeile 29: 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 39: 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 81: 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 93: 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 136: 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 146: Zeile 181:
 </code> </code>
  
-Die Ansteuerung als Übersicht:+===== Beispiel 3 ===== 
 + 
 +Ein Floppy-Laufwerk800K, 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> <code>
-                :-----  Vollständige 18 bit RAM-Adresse (RAF 256K)  ------: + ;DISKDEF 0,1,40,,2048,400,192,192,0  
-                :17 16   15 14 13 12 11 10  9  8:  7  6  5  4  3  2   : +dpba: dw 40 ;SPT sectors per track 
-                :                               :                         + db 4 ;BSF block shift factor 
-  +--+--+--+-+--+--+--+ +--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+ + db 15 ;BLM block mask 
-         Bank       | |       Hi-Adr.         | |       Window          | + db 0 ;EXM null mask 
-  +--+--+--+-+--+--+--+ +--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+ + dw 399 ;DSM disk size-1 
-                :                               : :  :                    : + dw 191 ;DRM directory max 
-                : 9  8    7  6  5  4  3  2   0: :  :                    : + db 0E0H ;AL0 alloc 0 
-Variante 1      :------------TRACK--------------: :--:-------RECORD-------: + db 0 ;Al1 alloc 1 
-                                                 SECTOR + 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. 
-                 6    5      0 : 3 2  0                   + 
-Variante 2      :------------TRACK---------:-SECTOR--:-------RECORD-------:+CP/M ermittelt anhand DSM, ob 16Bit- oder 8-Bit-Blocknummern genutzt werdenDSM > 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: 
 +    ADrive Characteristics 
 + 6400128 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    0   48 dir 
 +dir entries     192    6K 
 +sectors/group:     16    2K 18FH groups 
 +kbytes/extent    16K
 </code> </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