]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/blob - cbios/cpm3slr.lib
Mark SDIO-drives as permanently mounted.
[z180-stamp-cpm3.git] / cbios / cpm3slr.lib
1 ; Macro Definitions for CP/M3 BIOS Data Structures.
2
3 ; dtbl <dph0,dph1,...> - drive table
4
5 ; dph translate$table, - disk parameter header
6 ; disk$parameter$block,
7 ; checksum$size, (optional)
8 ; alloc$size (optional)
9
10 ; skew sectors, - skew table
11 ; skew$factor,
12 ; first$sector$number
13
14 ; dpb physical$sector$size, - disk parameter block
15 ; physical$sectors$per$track,
16 ; number$tracks,
17 ; block$size,
18 ; number$dir$entries,
19 ; track$offset,
20 ; checksum$vec$size (optional)
21
22
23 ; Drive Table. Contains 16 one word entries.
24
25 dtbl macro ?list
26 local ?n
27 ?n defl 0
28 irp ?drv,<?list>
29 ?n defl ?n+1
30 dw ?drv
31 endm
32
33 if ?n > 16
34 .' Too many drives. Max 16 allowed'
35 exitm
36 endif
37
38 if ?n < 16
39 rept (16-?n)
40 dw 0
41 endm
42 endif
43 endm
44
45 dph macro ?trans,?dpb,?csize,?asize
46 local ?csv,?alv
47 dw ?trans ; translate table address
48 db 0,0,0,0,0,0,0,0,0 ; BDOS Scratch area
49 db 0 ; media flag
50 dw ?dpb ; disk parameter block
51 if not nul ?csize
52 if ?csize = 0
53 dw 0 ; permanently mounted, no checksum vector
54 else
55 dw ?csv ; checksum vector
56 endif
57 else
58 dw 0FFFEh ; checksum vector alloc'd by GENCPM
59 endif
60 if not nul ?asize
61 dw ?alv ; allocation vector
62 else
63 dw 0FFFEh ; alloc vector allocated by GENCPM
64 endif
65 dw 0fffeh,0fffeh,0fffeh ; dirbcb, dtabcb, hash alloc'd
66 ; by GENCPM
67 db 0 ; hash bank
68
69 if not nul ?csize
70 if ?csize <> 0
71 ?csv ds ?csize ; checksum vector
72 endif
73 endif
74 if not nul ?asize
75 ?alv ds ?asize ; allocation vector
76 endif
77
78 endm
79
80 dpb macro ?psize,?pspt,?trks,?bls,?ndirs,?off,?ncks
81 local ?spt,?bsh,?blm,?exm,?dsm,?drm,?al0,?al1,?cks,?psh,?psm
82 local ?n
83 ;; physical sector mask and physical sector shift
84 ?psh defl 0
85 ?n defl ?psize/128
86 ?psm defl ?n-1
87 rept 8
88 ?n defl ?n/2
89 if ?n = 0
90 exitm
91 endif
92 ?psh defl ?psh + 1
93 endm
94 ?spt defl ?pspt*(?psize/128)
95
96 ?bsh defl 3
97 ?n defl ?bls/1024
98 rept 8
99 ?n defl ?n/2
100 if ?n = 0
101 exitm
102 endif
103 ?bsh defl ?bsh + 1
104 endm
105 ?blm defl ?bls/128-1
106 ?size defl (?trks-?off)*?spt
107 ?dsm defl ?size/(?bls/128)-1
108
109 ?exm defl ?bls/1024
110 if ?dsm > 255
111 if ?bls = 1024
112 .'Error, can''t have this size disk with 1k block size'
113 exitm
114 endif
115 ?exm defl ?exm/2
116 endif
117 ?exm defl ?exm-1
118 ?all defl 0
119 ?n defl (?ndirs*32+?bls-1)/?bls
120 rept ?n
121 ?all defl (?all shr 1) or 8000h
122 endm
123 ?al0 defl high ?all
124 ?al1 defl low ?all
125 ?drm defl ?ndirs-1
126 if not nul ?ncks
127 ?cks defl ?ncks
128 else
129 ?cks defl ?ndirs/4
130 endif
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
140 ; and mask
141 endm
142
143 ;
144 gcd macro ?m,?n
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
151 rept 65535
152 ?gcdx defl ?gcdm/?gcdn
153 ?gcdr defl ?gcdm - ?gcdx*?gcdn
154 if ?gcdr = 0
155 exitm
156 endif
157 ?gcdm defl ?gcdn
158 ?gcdn defl ?gcdr
159 endm
160 endm
161
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
166 gcd %?secs,?skf
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
173 db ?nxtsec+?fsc
174 ?nxtsec defl ?nxtsec+?skf
175 if ?nxtsec >= ?secs
176 ?nxtsec defl ?nxtsec-?secs
177 endif
178 ?nelts defl ?nelts-1
179 if ?nelts = 0
180 ?nxtbas defl ?nxtbas+1
181 ?nxtsec defl ?nxtbas
182 ?nelts defl ?neltst
183 endif
184 endm
185 endm