Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende ÜberarbeitungLetzte ÜberarbeitungBeide Seiten der Revision | ||
cpm:write_a_bios:teil_2 [2012/03/16 09:25] – [Variante 1] volkerp | cpm: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: | ||
+ | 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! | ||
+ | |||
+ | < | ||
+ | ; | ||
+ | ; Uebersetzung Sektornummer in CP/A | ||
+ | ; | ||
+ | sectran: | ||
+ | ld l, c | ||
+ | inc hl ; | ||
+ | ret | ||
+ | </ | ||
===== Beispiel 2 ===== | ===== Beispiel 2 ===== | ||
Zeile 49: | Zeile 63: | ||
1 Track = 256 Byte (Fenstergröße)\\ | 1 Track = 256 Byte (Fenstergröße)\\ | ||
- | d.h. 2 Records/ | + | d.h. 2 Records/ |
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: | ||
< | < | ||
;DISKDEF 0, | ;DISKDEF 0, | ||
- | dpb00: | + | dpb00: |
- | db 4 ; | + | db 4 ;BSF block shift factor |
- | db 15 ; | + | db 15 ;BLM block mask |
- | db 0 ;extnt mask | + | db 0 ;EXM null mask |
- | dw 1011 ; | + | dw 1011 ;DSM disk size-1 |
- | dw 127 ; | + | dw 127 ;DRM directory max |
- | db C0h ;alloc0 | + | db C0h ;AL0 alloc 0 |
- | db 0 ;alloc1 | + | db 0 ;Al1 alloc 1 |
- | dw 0 ; | + | dw 0 ;CKS check size |
- | dw 22 ; | + | dw 22 ;OFS track offset |
; | ; | ||
- | alv00: | + | alv00: |
- | csv00: | + | csv00: |
</ | </ | ||
- | 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/ |
< | < | ||
Zeile 113: | Zeile 127: | ||
1 Track = 2048 Byte\\ | 1 Track = 2048 Byte\\ | ||
- | d.h. 16 Records/ | + | d.h. 16 Records/ |
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 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! |
< | < | ||
- | ;DISKDEF 1, | + | ;DISKDEF 1, |
- | dpb01: | + | dpb01: |
- | db 3 ; | + | db 3 ;BSF block shift factor |
- | db 7 ; | + | 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 ; | + | dw 63 ;DRM directory max |
- | db C0H ;alloc0 | + | db C0H ;AL0 alloc 0 |
- | db 0 ;alloc1 | + | db 0 ;Al1 alloc 1 |
- | dw 0 ; | + | dw 0 ;CKS check size |
- | dw 3 ; | + | dw 3 ;OFS track offset |
- | alv01: ds 0020h | + | ; |
- | csv01: | + | alv01: ds 0010h ; |
+ | csv01: | ||
</ | </ | ||
Zeile 166: | Zeile 181: | ||
</ | </ | ||
+ | ===== Beispiel 3 ===== | ||
+ | |||
+ | Ein Floppy-Laufwerk: | ||
+ | |||
+ | log. Sektoren pro Spur 1..40\\ | ||
+ | Blockgröße BLS = 2048\\ | ||
+ | Diskgröße = 800K/BLS = 400\\ | ||
+ | 192 Directory-Einträge\\ | ||
+ | keine Systemspuren | ||
+ | |||
+ | < | ||
+ | ;DISKDEF 0, | ||
+ | dpba: | ||
+ | db 4 ;BSF block shift factor | ||
+ | db 15 ; | ||
+ | db 0 ;EXM null mask | ||
+ | dw 399 ; | ||
+ | dw 191 ; | ||
+ | db 0E0H ; | ||
+ | db 0 ;Al1 alloc 1 | ||
+ | dw 48 ; | ||
+ | dw 0 ;OFS track offset | ||
+ | alva: | ||
+ | csva: | ||
+ | |||
+ | </ | ||
+ | |||
+ | CP/M zählt die logischen Recordnummern pro Spur von 0..39. SECTRAN übersetzt diese Recordnummern in 1..40 (CP/ | ||
+ | |||
+ | 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/ | ||
+ | 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: | ||
+ | < | ||
+ | A>stat dsk: | ||
+ | A: Drive Characteristics | ||
+ | 6400: 128 Byte Record Capacity | ||
+ | 800: Kilobyte Drive Capacity | ||
+ | 192: 32 Byte Directory Entries | ||
+ | 192: Checked | ||
+ | 128: Records/ Extent | ||
+ | 16: Records/ Block | ||
+ | 40: Sectors/ Track | ||
+ | 0: Reserved Tracks | ||
+ | </ | ||
+ | |||
+ | POWER gibt ein paar mehr Informationen aus: | ||
+ | |||
+ | < | ||
+ | POWER 3.03 on CP/M 2.22 1/2 | ||
+ | A=disk | ||
+ | disk capacity: | ||
+ | tracks: | ||
+ | sectors/ | ||
+ | sectors/ | ||
+ | dir entries: | ||
+ | sectors/ | ||
+ | kbytes/ | ||
+ | </ | ||
+ | Bislang wurde noch nicht darauf eingegangen, |