Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
cpm:write_a_bios:teil_2 [2018/10/05 06:49] – [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:
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 1..16\\ +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. 128 Tracks-> DSM = 128-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 
Zeile 137: Zeile 156:
  
 <code> <code>
-      ;DISKDEF 1,1,16,,1024,125,64,0,+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 
- db 0 ;EXM null mask + dw 253 ;dsm 
- dw 124 ;DSM disk size-1 + dw 63 ;dpm 
- dw 63 ;DRM directory max + db 0c0h ;al0 
- db C0H ;AL0 alloc 0 + db 00 ;al1 
- db 0 ;Al1 alloc 1 + dw 0 ;cks 
- dw 0 ;CKS check size + dw 1 ;off 
- dw 3 ;OFS track offset+ db 80h ;dev 
 + ds 12,0
 ; ;
-alv01: ds 0010h             ;allocation vector +allm: ds 33 ;alloc-map
-csv01: ds 0000h             ;check vector +
-</code> +
- +
-Read und Write sind wie oben implementiert, die Adressierung ist jetzt umfangreicher: +
- +
-<code> +
-ADRE: OUT (RAMEN),+
- OUT (READEN), A+
 ; ;
- ;Adr. Fenster = (track*16+sector)/2 +rfrwoper: ;physisches schreiben 
- LD HL,(TRACK+ ld hl,(sektrk) ;und lesen 
- ADD HL,HL + add hl,hl 
- ADD HL,HL + add hl,hl 
- ADD HL,HL + add hl,hl ; trk << 3 
- ADD HL,HL HL = Track * 10h (SPT) + ld a,(seksec) 
- LD DE,(SECTOR+ and 1fh 
- DEC DE wgCP/A + srl a sec >> 1  
- ADD HL,DE ; HL := HL + Sector + push af 
- XOR A A = 0, Cy = 0  + add a,l 
- RR H  + di 
- RR L ; HL := HL/2 da Sektoren/Fenster + out (ioa+5),
- RR A L Bit0 nach A Bit7 ( A 0 oder 80h) + out (ioa+7),a 
- OUT (LDAH)L ; hi-adr. + out (ioa),a ;Hi-Adrim ramfl 
- OUT (LDBB), H Bank + ld a,03h  
- LD HHi(WINDOW) + and h ;Bit0+1 
- LD L,A + rrca 
- LD DE,(DMA) + rrca :->Bit6+7 
- LD BC,128 + out (ioa+2),a ;bank 
- RET+
 + pop af ;cy=off im fenster 
 + ld hl,wind 
 + jr nc,rf01 
 + ld hl,wind+128 
 +rf01: ld de,(dmaad) 
 + ld a,
 + or a ;rd/wr 
 + jr z,rf02 
 + ex de,hl 
 +rf02: ld bc,128 
 + ldir 
 +
 + xor a 
 + out (ioa+4),
 + ei 
 + ret
 </code> </code>
  
Zeile 208: Zeile 236:
 </code> </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 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. CP/M ermittelt anhand DSM, ob 16Bit- oder 8-Bit-Blocknummern genutzt werden: DSM > 255 -> 16Bit-Blocknummern.
Zeile 216: Zeile 246:
  
 Der DPB wird vom CP/M wie folgt angezeigt: Der DPB wird vom CP/M wie folgt angezeigt:
 +
 <code> <code>
 A>stat dsk: A>stat dsk:
Zeile 243: Zeile 274:
 </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.+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