]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/blame - cbios/cpm3.lib
stack
[z180-stamp-cpm3.git] / cbios / cpm3.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 set 0\r
28 irp ?drv,<?list>\r
29?n set ?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
52 dw ?csv ; checksum vector\r
53 else\r
54 dw 0FFFEh ; checksum vector allocated by\r
55 endif ; GENCPM\r
56 if not nul ?asize\r
57 dw ?alv ; allocation vector\r
58 else\r
59 dw 0FFFEh ; alloc vector allocated by GENCPM\r
60 endif\r
61 dw 0fffeh,0fffeh,0fffeh ; dirbcb, dtabcb, hash alloc'd\r
62 ; by GENCPM\r
63 db 0 ; hash bank\r
64\r
65 if not nul ?csize\r
66?csv ds ?csize ; checksum vector\r
67 endif\r
68 if not nul ?asize\r
69?alv ds ?asize ; allocation vector\r
70 endif\r
71\r
72 endm\r
73\r
74dpb macro ?psize,?pspt,?trks,?bls,?ndirs,?off,?ncks\r
75 local ?spt,?bsh,?blm,?exm,?dsm,?drm,?al0,?al1,?cks,?psh,?psm\r
76 local ?n\r
77;; physical sector mask and physical sector shift\r
78 ?psh set 0\r
79 ?n set ?psize/128\r
80 ?psm set ?n-1\r
81 rept 8\r
82 ?n set ?n/2\r
83 if ?n = 0 \r
84 exitm\r
85 endif\r
86 ?psh set ?psh + 1\r
87 endm\r
88 ?spt set ?pspt*(?psize/128)\r
89\r
90 ?bsh set 3\r
91 ?n set ?bls/1024\r
92 rept 8\r
93 ?n set ?n/2\r
94 if ?n = 0\r
95 exitm\r
96 endif\r
97 ?bsh set ?bsh + 1\r
98 endm\r
99 ?blm set ?bls/128-1\r
100 ?size set (?trks-?off)*?spt\r
101 ?dsm set ?size/(?bls/128)-1\r
102\r
103 ?exm set ?bls/1024\r
104 if ?dsm > 255\r
105 if ?bls = 1024\r
106.'Error, can''t have this size disk with 1k block size'\r
107 exitm\r
108 endif\r
109 ?exm set ?exm/2\r
110 endif\r
111 ?exm set ?exm-1\r
112 ?all set 0\r
113 ?n set (?ndirs*32+?bls-1)/?bls\r
114 rept ?n\r
115 ?all set (?all shr 1) or 8000h\r
116 endm\r
117 ?al0 set high ?all\r
118 ?al1 set low ?all\r
119 ?drm set ?ndirs-1\r
120 if not nul ?ncks\r
121 ?cks set ?ncks\r
122 else\r
123 ?cks set ?ndirs/4\r
124 endif\r
125 dw ?spt ; 128 byte records per track\r
126 db ?bsh,?blm ; block shift and mask\r
127 db ?exm ; extent mask\r
128 dw ?dsm ; maximum block number\r
129 dw ?drm ; maximum directory entry number\r
130 db ?al0,?al1 ; alloc vector for directory\r
131 dw ?cks ; checksum size\r
132 dw ?off ; offset for system tracks\r
133 db ?psh,?psm ; physical sector size shift\r
134 ; and mask\r
135 endm\r
136\r
137;\r
138gcd macro ?m,?n\r
139 ;; greatest common divisor of m,n\r
140 ;; produces value gcdn as result\r
141 ;; (used in sector translate table generation)\r
142 ?gcdm set ?m ;;variable for m\r
143 ?gcdn set ?n ;;variable for n\r
144 ?gcdr set 0 ;;variable for r\r
145 rept 65535\r
146 ?gcdx set ?gcdm/?gcdn\r
147 ?gcdr set ?gcdm - ?gcdx*?gcdn\r
148 if ?gcdr = 0\r
149 exitm\r
150 endif\r
151 ?gcdm set ?gcdn\r
152 ?gcdn set ?gcdr\r
153 endm\r
154 endm\r
155\r
156skew macro ?secs,?skf,?fsc\r
157;; generate the translate table\r
158 ?nxtsec set 0 ;;next sector to fill\r
159 ?nxtbas set 0 ;;moves by one on overflow\r
160 gcd %?secs,?skf\r
161 ;; ?gcdn = gcd(?secs,skew)\r
162 ?neltst set ?secs/?gcdn\r
163 ;; neltst is number of elements to generate\r
164 ;; before we overlap previous elements\r
165 ?nelts set ?neltst ;;counter\r
166 rept ?secs ;;once for each sector\r
167 db ?nxtsec+?fsc\r
168 ?nxtsec set ?nxtsec+?skf\r
169 if ?nxtsec >= ?secs\r
170 ?nxtsec set ?nxtsec-?secs\r
171 endif\r
172 ?nelts set ?nelts-1\r
173 if ?nelts = 0\r
174 ?nxtbas set ?nxtbas+1\r
175 ?nxtsec set ?nxtbas\r
176 ?nelts set ?neltst\r
177 endif\r
178 endm\r
179 endm\r
180\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a