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