]>
Commit | Line | Data |
---|---|---|
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 | |
25 | dtbl 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 | |
45 | dph 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 | |
74 | dpb 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 | |
138 | gcd 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 | |
156 | skew 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 |