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/08 15:49] – Page name changed from cpm:write_a_bios:dbp to cpm:write_a_bios:teil_2 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 ===== | ||
Wir wollen ein RAM-Floppy ansteuern. | Wir wollen ein RAM-Floppy ansteuern. | ||
- | Die RAM-Floppy (NANOS) hat folgende Eigenschaften: | + | Die [[: |
* 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: | ||
+ | |||
+ | < | ||
+ | : | ||
+ | :17 16 15 14 13 12 11 10 9 8: 7 6 5 4 3 2 1 0 : | ||
+ | : : | ||
+ | +--+--+--+-+--+--+--+ +--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+ | ||
+ | | Bank | | | ||
+ | +--+--+--+-+--+--+--+ +--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+ | ||
+ | : : | ||
+ | : 9 8: | ||
+ | Variante 1 : | ||
+ | | ||
+ | |||
+ | |||
+ | : : | ||
+ | : 7 6: | ||
+ | Variante 2 : | ||
+ | </ | ||
==== Variante 1 ==== | ==== Variante 1 ==== | ||
Zeile 29: | 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 39: | 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 81: | Zeile 115: | ||
CP 2 | CP 2 | ||
jr nz, ADRE0a | jr nz, ADRE0a | ||
- | LD H,80h | + | LD L,80h |
ADREa: | ADREa: | ||
LD BC,128 | LD BC,128 | ||
Zeile 93: | 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 136: | Zeile 171: | ||
RR H | RR H | ||
RR L ; HL := HL/2 ( da 2 Sektoren/ | RR L ; HL := HL/2 ( da 2 Sektoren/ | ||
- | RR A ; L Lo-Bit in A Hi-Bit | + | RR A ; L Bit0 nach A Bit7 ( A = 0 oder 80h) |
OUT (LDAH), | OUT (LDAH), | ||
OUT (LDBB), | OUT (LDBB), | ||
Zeile 146: | Zeile 181: | ||
</ | </ | ||
- | Die Ansteuerung als Übersicht: | + | ===== Beispiel 3 ===== |
+ | |||
+ | Ein Floppy-Laufwerk: 800K, 2 Seiten, 1K phys. Sektorgröße, | ||
+ | |||
+ | log. Sektoren pro Spur 1..40\\ | ||
+ | Blockgröße BLS = 2048\\ | ||
+ | Diskgröße = 800K/BLS = 400\\ | ||
+ | 192 Directory-Einträge\\ | ||
+ | keine Systemspuren | ||
< | < | ||
- | : | + | ;DISKDEF 0,1, |
- | :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 |
- | | + | db 0 ;EXM null mask |
- | +--+--+--+-+--+--+--+ +--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+ | + | dw 399 ; |
- | : | + | dw 191 ; |
- | : 9 8 7 6 5 4 3 2 | + | db 0E0H ; |
- | Variante 1 | + | db 0 ;Al1 alloc 1 |
- | | + | dw 48 ; |
+ | dw 0 ;OFS track offset | ||
+ | alva: ds 0032h | ||
+ | csva: ds 0030h | ||
+ | </ | ||
- | | + | CP/M zählt die logischen Recordnummern pro Spur von 0..39. SECTRAN übersetzt diese Recordnummern in 1..40 (CP/ |
- | : 7 6 5 4 3 2 1 0 : 3 2 1 0: : | + | |
- | Variante 2 | + | 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 | ||
+ | | ||
+ | </ | ||
+ | |||
+ | POWER gibt ein paar mehr Informationen aus: | ||
+ | |||
+ | < | ||
+ | POWER 3.03 on CP/M 2.22 1/2 | ||
+ | A=disk | ||
+ | disk capacity: | ||
+ | tracks: 160 0 system | ||
+ | sectors/ | ||
+ | sectors/ | ||
+ | dir entries: | ||
+ | sectors/ | ||
+ | kbytes/ | ||
</ | </ | ||
+ | Bislang wurde noch nicht darauf eingegangen, |