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
53 dw 0 ; permanently mounted, no checksum vector
55 dw ?csv ; checksum vector
58 dw 0FFFEh ; checksum vector alloc'd by GENCPM
61 dw ?alv ; allocation vector
63 dw 0FFFEh ; alloc vector allocated by GENCPM
65 dw 0fffeh,0fffeh,0fffeh ; dirbcb, dtabcb, hash alloc'd
71 ?csv ds ?csize ; checksum vector
75 ?alv ds ?asize ; allocation vector
80 dpb macro ?psize,?pspt,?trks,?bls,?ndirs,?off,?ncks
81 local ?spt,?bsh,?blm,?exm,?dsm,?drm,?al0,?al1,?cks,?psh,?psm
83 ;; physical sector mask and physical sector shift
94 ?spt defl ?pspt*(?psize/128)
106 ?size defl (?trks-?off)*?spt
107 ?dsm defl ?size/(?bls/128)-1
112 .'Error, can''t have this size disk with 1k block size'
119 ?n defl (?ndirs*32+?bls-1)/?bls
121 ?all defl (?all shr 1) or 8000h
131 dw ?spt ; 128 byte records per track
132 db ?bsh,?blm ; block shift and mask
133 db ?exm ; extent mask
134 dw ?dsm ; maximum block number
135 dw ?drm ; maximum directory entry number
136 db ?al0,?al1 ; alloc vector for directory
137 dw ?cks ; checksum size
138 dw ?off ; offset for system tracks
139 db ?psh,?psm ; physical sector size shift
145 ;; greatest common divisor of m,n
146 ;; produces value gcdn as result
147 ;; (used in sector translate table generation)
148 ?gcdm defl ?m ;;variable for m
149 ?gcdn defl ?n ;;variable for n
150 ?gcdr defl 0 ;;variable for r
152 ?gcdx defl ?gcdm/?gcdn
153 ?gcdr defl ?gcdm - ?gcdx*?gcdn
162 skew macro ?secs,?skf,?fsc
163 ;; generate the translate table
164 ?nxtsec defl 0 ;;next sector to fill
165 ?nxtbas defl 0 ;;moves by one on overflow
167 ;; ?gcdn = gcd(?secs,skew)
168 ?neltst defl ?secs/?gcdn
169 ;; neltst is number of elements to generate
170 ;; before we overlap previous elements
171 ?nelts defl ?neltst ;;counter
172 rept ?secs ;;once for each sector
174 ?nxtsec defl ?nxtsec+?skf
176 ?nxtsec defl ?nxtsec-?secs
180 ?nxtbas defl ?nxtbas+1