1 ; Macro Definitions for CP/M3 BIOS Data Structures.
3 ; dtbl <dph0,dph1,...> - drive table
5 ; dph translate$table, - disk parameter header
6 ; disk$parameter$block,
7 ; checksum$size, (optional)
8 ; alloc$size (optional)
10 ; skew sectors, - skew table
14 ; dpb physical$sector$size, - disk parameter block
15 ; physical$sectors$per$track,
20 ; checksum$vec$size (optional)
23 ; Drive Table. Contains 16 one word entries.
34 .' Too many drives. Max 16 allowed'
45 dph macro ?trans,?dpb,?csize,?asize
47 dw ?trans ; translate table address
48 db 0,0,0,0,0,0,0,0,0 ; BDOS Scratch area
50 dw ?dpb ; disk parameter block
52 dw ?csv ; checksum vector
54 dw 0FFFEh ; checksum vector allocated by
57 dw ?alv ; allocation vector
59 dw 0FFFEh ; alloc vector allocated by GENCPM
61 dw 0fffeh,0fffeh,0fffeh ; dirbcb, dtabcb, hash alloc'd
66 ?csv ds ?csize ; checksum vector
69 ?alv ds ?asize ; allocation vector
74 dpb macro ?psize,?pspt,?trks,?bls,?ndirs,?off,?ncks
75 local ?spt,?bsh,?blm,?exm,?dsm,?drm,?al0,?al1,?cks,?psh,?psm
77 ;; physical sector mask and physical sector shift
88 ?spt defl ?pspt*(?psize/128)
100 ?size defl (?trks-?off)*?spt
101 ?dsm defl ?size/(?bls/128)-1
106 .'Error, can''t have this size disk with 1k block size'
113 ?n defl (?ndirs*32+?bls-1)/?bls
115 ?all defl (?all shr 1) or 8000h
125 dw ?spt ; 128 byte records per track
126 db ?bsh,?blm ; block shift and mask
127 db ?exm ; extent mask
128 dw ?dsm ; maximum block number
129 dw ?drm ; maximum directory entry number
130 db ?al0,?al1 ; alloc vector for directory
131 dw ?cks ; checksum size
132 dw ?off ; offset for system tracks
133 db ?psh,?psm ; physical sector size shift
139 ;; greatest common divisor of m,n
140 ;; produces value gcdn as result
141 ;; (used in sector translate table generation)
142 ?gcdm defl ?m ;;variable for m
143 ?gcdn defl ?n ;;variable for n
144 ?gcdr defl 0 ;;variable for r
146 ?gcdx defl ?gcdm/?gcdn
147 ?gcdr defl ?gcdm - ?gcdx*?gcdn
156 skew macro ?secs,?skf,?fsc
157 ;; generate the translate table
158 ?nxtsec defl 0 ;;next sector to fill
159 ?nxtbas defl 0 ;;moves by one on overflow
161 ;; ?gcdn = gcd(?secs,skew)
162 ?neltst defl ?secs/?gcdn
163 ;; neltst is number of elements to generate
164 ;; before we overlap previous elements
165 ?nelts defl ?neltst ;;counter
166 rept ?secs ;;once for each sector
168 ?nxtsec defl ?nxtsec+?skf
170 ?nxtsec defl ?nxtsec-?secs
174 ?nxtbas defl ?nxtbas+1