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