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
cpm:write_a_bios:teil_2 [2018/02/01 06:57] – [Variante 2] volkerpcpm:write_a_bios:teil_2 [2021/09/28 08:23] (aktuell) volkerp
Zeile 32: Zeile 32:
   - Zugriff auf "Window"+A7..A0   - Zugriff auf "Window"+A7..A0
  
-Für die Nutzung im CP/M soll außerdem eine Kopie von CCP+BDOS (5 KByte) auf der RAM-Disk gehalten werden, sinnvollerweise in Systemspuren.+Für die Nutzung im CP/M soll außerdem eine Kopie von CCP+BDOS (5 KByte) auf der 
 +RAM-Disk gehalten werden, sinnvollerweise in Systemspuren.
  
-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: Die Ansteuerung als Übersicht:
  
 <code> <code>
-                :-----  Vollständige 18 bit RAM-Adresse (RAF 256K)  ------: +                    :-----  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 : +                    :17 16   15 14 13 12 11 10  9  8:  7  6  5  4  3  2  1  0 : 
-                :                               :                         : +                    :                               :                         : 
-  +--+--+--+-+--+--+--+ +--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+ +  +--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+ 
-  |        Bank       | |       Hi-Adr.         | |       Window          | +  |           Bank        | |       Hi-Adr.         | |       Window          
-  +--+--+--+-+--+--+--+ +--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+ +  |B0 B1 b0 b1 x  x  x  x 
-                                            : :  :                    : +  +--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+ 
-                : 9  8:   7  6  5  4  3  2  1  0: : 0:                    : +                          : :                       : :  :                    : 
-Variante 1      :------------TRACK--------------: :--:-------RECORD-------: +Variante 1 
-                                                 SECTOR +  : 9  8                      7  6  5  4  3  2  1  0: : 0:                    : 
 +  :------------------------------TRACK--------------: :--:-------RECORD-------: 
 +                                                 SECTOR ^
  
 +Variante 2
 +  : 6  5                      4  3  2  1  0: 3  2  1    0:                    :
 +  :------------------------------TRACK---- :-SECTOR------:-------RECORD-------:
  
-                :     :                    :         :                    : 
-                : 7  6:    4  3  2  1  0 : 3 2  1 0:                    : 
-Variante 2      :------------TRACK---------:-SECTOR--:-------RECORD-------: 
 </code> </code>
  
 ==== Variante 1 ==== ==== Variante 1 ====
  
-Die Fenstergröße von 256 Byte bietet es an, die Spurgröße als 256 Byte zu wählen. Hi-Byte und Lo-Byte der Tracknummer sind dann direkt "Bank" und "HiAdr". Das macht die Ansteuerung besonders einfach.+Die Fenstergröße von 256 Byte bietet es an, die Spurgröße als 256 Byte zu 
 +wählen. Hi-Byte und Lo-Byte der Tracknummer sind dann direkt "Bank" und "HiAdr". 
 +Das macht die Ansteuerung besonders einfach.
  
 also: also:
  
 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 = 1011\\+insg. 1024 tracks -> DSM = 1024-22 = 1012\\
 wir wählen die kleinstmögliche Blockgröße 2k (1k gehen nicht wg. EXM, da DSM > 255)\\ 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 88: Zeile 94:
 </code> </code>
  
-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.+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 110: Zeile 120:
  LD HL,(TRACK)  LD HL,(TRACK)
  OUT (LDAH), L ; hi-adr.  OUT (LDAH), L ; hi-adr.
- OUT (LDBB), H ; Bank+ ld a,h 
 + rrca 
 + rrca 
 + OUT (LDBB), A ; Bank
  LD HL, WINDOW ; das ist eine xx00h-Adr.  LD HL, WINDOW ; das ist eine xx00h-Adr.
  LD a, (SECTOR) ; 1 oder 2 (in CP/A wg. SECTRAN)  LD a, (SECTOR) ; 1 oder 2 (in CP/A wg. SECTRAN)
Zeile 119: Zeile 132:
  LD BC,128  LD BC,128
  RET  RET
 +
 +
 </code> </code>
  
 ==== Variante 2 ==== ==== Variante 2 ====
  
-Um eine kleinere Blockgröße nutzen zu können, muss die Anzahl der Spuren ≤ 256 werden. +(System EPOS, EPOSRF2.MAC) 
-Da geht z.B. mit einer Spurgröße von 2 KByte.+ 
 +Um eine kleinere Blockgröße nutzen zu können, muss die Anzahl der Spuren <= 256 werden. 
 +Da geht z.B. mit einer Blockgröße von 1 KByte. Als phys. Spurgröße wählen wir 2 KByte.
  
 1 Track = 2048 Byte\\  1 Track = 2048 Byte\\ 
-d.h. 16 Records/Track\\ +d.h. 16 Records/Track 0..15 (CPA 1..16)\\ 
-wir brauchen damit 1600h/2048 = 3 Tracks f. Systemspur\\ +wir brauchen 1600h/2048 = 3 Tracks f. Systemspur OFF, Epos 1 Systemspur\\ 
-insg. 256 Tracks-> DSM = 255-3\\ +wie wählen kleinste Blockgröße BLS 1k, 8 bit-Blocknummern ( DSM < 256)\\ 
-kleinste Blockgröße 1k\\+insg. 256 Tracks-> DSM = (256-3*2)/1-1 = 249, (epos 253)\\
 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)
 +
 +DSM = (DISKSIZE-OFF*SPURSIZE)/BLS-1
  
 Diese Aufteilung ist aufgrund 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 +dpbm: dw 16 ;spt 
-dpb01: dw 16 ;SPT sectors per track + db 3 ;bsh 
- db 3 ;BSF block shift factor + db 7 ;blm 
- db 7 ;BLM block mask+ db 0 ;exm 
 + dw 253 ;dsm 
 + dw 63 ;dpm 
 + db 0c0h ;al0 
 + db 00 ;al1 
 + dw 0 ;cks 
 + dw 1 ;off 
 + db 80h ;dev 
 + ds 12,
 +
 +allm: ds 33 ;alloc-map  
 +
 +rfrwoper: ;physisches schreiben 
 + ld hl,(sektrk) ;und lesen 
 + add hl,hl 
 + add hl,hl 
 + add hl,hl ; trk << 3 
 + ld a,(seksec) 
 + and 1fh 
 + srl a ; sec >>  
 + push af 
 + add a,
 + di 
 + out (ioa+5),
 + out (ioa+7),
 + out (ioa),a ;Hi-Adr. im ramfl 
 + ld a,03h  
 + and h ;Bit0+1 
 + rrca 
 + rrca :->Bit6+7 
 + out (ioa+2),a ;bank 
 +
 + pop af ;cy=off im fenster 
 + ld hl,wind 
 + jr nc,rf01 
 + ld hl,wind+128 
 +rf01: ld de,(dmaad) 
 + ld a,b 
 + or a ;rd/wr 
 + jr z,rf02 
 + ex de,hl 
 +rf02: ld bc,128 
 + ldir 
 +
 + xor a 
 + out (ioa+4),
 + ei 
 + ret 
 +</code> 
 + 
 +===== Beispiel ===== 
 + 
 +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,0  
 +dpba: dw 40 ;SPT sectors per track 
 + db 4 ;BSF block shift factor 
 + db 15 ;BLM block mask
  db 0 ;EXM null mask  db 0 ;EXM null mask
- dw 251 ;DSM disk size-1 + dw 399 ;DSM disk size-1 
- dw 63 ;DRM directory max + dw 191 ;DRM directory max 
- db C0H ;AL0 alloc 0+ db 0E0H ;AL0 alloc 0
  db 0 ;Al1 alloc 1  db 0 ;Al1 alloc 1
- dw 0 ;CKS check size + dw 48 ;CKS check size 
- dw 3 ;OFS track offset + dw 0 ;OFS track offset 
-+alva: ds 0032h    
-alv01: ds 0020h             ;allocation vector +csva: ds 0030h    
-csv01: ds 0000h             ;check vector+
 </code> </code>
  
-Read und Write sind wie oben implementiertdie Adressierung ist jetzt umfangreicher:+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 DSMob 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> <code>
-ADRE: OUT (RAMEN), +A>stat dsk: 
- OUT (READEN), +    A: Drive Characteristics 
-; + 6400: 128 Byte Record Capacity 
- ;Adr. Fenster = (track*16+sector)/2 +  800: Kilobyte Drive  Capacity 
- LD HL,(TRACK) +  192: 32  Byte Directory Entries 
- ADD HL,HL +  192: Checked  Directory Entries 
- ADD HL,HL +  128: Records/ Extent 
- ADD HL,HL +   16: Records/ Block 
- ADD HL,HL ; HL = Track * 10h (SPT) +   40: Sectors/ Track 
- LD DE,(SECTOR) +    0: Reserved Tracks 
- DEC DE ; wg. CP/A +</code> 
- ADD HL,DE ; HL := HL + Sector + 
- XOR A ; A = 0, Cy = 0  +POWER gibt ein paar mehr Informationen aus
- RR H  + 
- RR L ; HL := HL/2 ( da 2 Sektoren/Fenster ) +<code> 
- RR A ; L Bit0 nach A Bit7 ( A = 0 oder 80h) +        POWER 3.03 on CP/2.22 1/2 
- OUT (LDAH), L ; hi-adr. +A=disk 
- OUT (LDBB), H ; Bank +disk capacity:    800K 
- LD H, Hi(WINDOW) +tracks:           160    0 system 
- LD L,A +sectors/track:     40   40 last 
- LD DE,(DMA) +sectors/system:       48 dir 
- LD BC,128 +dir entries:      192    6K 
- RET+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.1517468245.txt.gz
  • Zuletzt geändert: 2018/02/01 06:57
  • von volkerp