annotate 3rdparty/drivers/burke/hdmath.src @ 1015:08fcfa9b150a

The gfx module is now in a seperate file
author roug
date Tue, 04 Mar 2003 20:07:34 +0000
parents c10820aa211b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
91
boisy
parents:
diff changeset
1 * COPYRIGHT BURKE & BURKE 1990
boisy
parents:
diff changeset
2 * ALL RIGHTS RESERVED
boisy
parents:
diff changeset
3 *
boisy
parents:
diff changeset
4 * COCO XT LSN / DRIVE -> TASK FILE CONVERSION
boisy
parents:
diff changeset
5 *
boisy
parents:
diff changeset
6 * Version 2.0
boisy
parents:
diff changeset
7 *
boisy
parents:
diff changeset
8 * Date Who Description
boisy
parents:
diff changeset
9 * -------- --- --------------------------
boisy
parents:
diff changeset
10 * 01-08-88 CJB Coded from version 1.0
boisy
parents:
diff changeset
11 * Added GOBPtr routine and support for 2
boisy
parents:
diff changeset
12 * drives with different characteristics.
boisy
parents:
diff changeset
13 * Changed ST-225 support to work with any
boisy
parents:
diff changeset
14 * drive having 32 SPT and 4 heads (e.g.
boisy
parents:
diff changeset
15 * ST-238 w/ RLL & W9 in).
boisy
parents:
diff changeset
16 * 01/28/88 CJB Changed LSN bounds check in XSETUP --
boisy
parents:
diff changeset
17 * compare to park LSN!
boisy
parents:
diff changeset
18 * 02/06/88 CJB Fixed bug that caused loss of LSN MSbyte
boisy
parents:
diff changeset
19 * when supporting 2 drives.
boisy
parents:
diff changeset
20 * Eliminated need for DIVA and DIVY parameters
boisy
parents:
diff changeset
21 * 05/18/88 Added CNV99 to check for seek errors
boisy
parents:
diff changeset
22 * 12/12/88 cjb Fixed bug in 1-drive XSETUP for park track
boisy
parents:
diff changeset
23 * 05/18/90 cjb Added support for drives in multiple slots
boisy
parents:
diff changeset
24 *
boisy
parents:
diff changeset
25
boisy
parents:
diff changeset
26 *
boisy
parents:
diff changeset
27 * Get ready to read or write a sector
boisy
parents:
diff changeset
28 *
boisy
parents:
diff changeset
29 SETUP lbsr SELDRV
boisy
parents:
diff changeset
30 bcs SETXIT
boisy
parents:
diff changeset
31
boisy
parents:
diff changeset
32 bsr XSETUP
boisy
parents:
diff changeset
33
boisy
parents:
diff changeset
34 SETXIT rts
boisy
parents:
diff changeset
35
boisy
parents:
diff changeset
36 ifeq trsflg ;If not optimized for 4 heads, 32 SPT
boisy
parents:
diff changeset
37
boisy
parents:
diff changeset
38 *
boisy
parents:
diff changeset
39 * General setup for read or write.
boisy
parents:
diff changeset
40 * Drive is already selected.
boisy
parents:
diff changeset
41 *
boisy
parents:
diff changeset
42 XSETUP pshs y,x,b
boisy
parents:
diff changeset
43
boisy
parents:
diff changeset
44 ifne (Drives-1)
boisy
parents:
diff changeset
45 ldb PD.DRV,Y
boisy
parents:
diff changeset
46 lbsr GOBPTR ;Point Y to park LSN area
boisy
parents:
diff changeset
47
boisy
parents:
diff changeset
48 ldb ,S ;Recover MSByte of LSN
boisy
parents:
diff changeset
49 cmpb (PRKLSN-OBSTART+0),Y
boisy
parents:
diff changeset
50 lbhi BADSEC
boisy
parents:
diff changeset
51 bcs XSET2 ;Branch if OK
boisy
parents:
diff changeset
52
boisy
parents:
diff changeset
53 cmpx (PRKLSN-OBSTART+1),Y
boisy
parents:
diff changeset
54 lbhi BADSEC
boisy
parents:
diff changeset
55
boisy
parents:
diff changeset
56 * LSN is OK. Still in B:X
boisy
parents:
diff changeset
57
boisy
parents:
diff changeset
58 XSET2 ldy 3,S ;Recover PD pointer
boisy
parents:
diff changeset
59
boisy
parents:
diff changeset
60 else
boisy
parents:
diff changeset
61 cmpb PRKLSN+0,U
boisy
parents:
diff changeset
62 lbhi BADSEC
boisy
parents:
diff changeset
63 bcs XSET2
boisy
parents:
diff changeset
64
boisy
parents:
diff changeset
65 cmpx PRKLSN+1,U
boisy
parents:
diff changeset
66 lbhi BADSEC
boisy
parents:
diff changeset
67
boisy
parents:
diff changeset
68 * LSN is OK. Still in B:X
boisy
parents:
diff changeset
69
boisy
parents:
diff changeset
70 XSET2 equ *
boisy
parents:
diff changeset
71
boisy
parents:
diff changeset
72 endc
boisy
parents:
diff changeset
73
boisy
parents:
diff changeset
74 *
boisy
parents:
diff changeset
75 * Convert LSN to cylinder, sector, head #'s
boisy
parents:
diff changeset
76 * Save head.sector in TEMP
boisy
parents:
diff changeset
77 *
boisy
parents:
diff changeset
78 CNVLSN equ *
boisy
parents:
diff changeset
79
boisy
parents:
diff changeset
80 bsr LSNDIV ;track -> X, Head -> A, sector ->B
boisy
parents:
diff changeset
81 std temp,u ;save head & sector for later
boisy
parents:
diff changeset
82
boisy
parents:
diff changeset
83 clrb ; (clear carry for ROR)
boisy
parents:
diff changeset
84 tfr x,d ;Cylinder number
boisy
parents:
diff changeset
85 RORA
boisy
parents:
diff changeset
86 RORA ;get cylinder MSB's to top of byte
boisy
parents:
diff changeset
87 RORA
boisy
parents:
diff changeset
88 std hicyl,u
boisy
parents:
diff changeset
89
boisy
parents:
diff changeset
90 ldb temp+1,U ;Process sector #
boisy
parents:
diff changeset
91 andb #%00111111 ; (0-31 normal, 0-47 RLL)
boisy
parents:
diff changeset
92 stb secnum,u ;Save logical sector number
boisy
parents:
diff changeset
93 lsrb ; / 2 to get physical sector #
boisy
parents:
diff changeset
94 orb hicyl,U ; OR in the physical sector number
boisy
parents:
diff changeset
95 stb hicyl,U
boisy
parents:
diff changeset
96
boisy
parents:
diff changeset
97 lda sdhreg,U ;save drive #; OR in head
boisy
parents:
diff changeset
98 anda #%00100000
boisy
parents:
diff changeset
99 ora temp+0,U
boisy
parents:
diff changeset
100 sta sdhreg,U
boisy
parents:
diff changeset
101
boisy
parents:
diff changeset
102 lda #1 ;read only 1 sector
boisy
parents:
diff changeset
103 sta seccnt,U
boisy
parents:
diff changeset
104
boisy
parents:
diff changeset
105 tst drvsem,u ;is drive ready?
boisy
parents:
diff changeset
106 beq CNVOK
boisy
parents:
diff changeset
107
boisy
parents:
diff changeset
108 *
boisy
parents:
diff changeset
109 * Drive is not ready.
boisy
parents:
diff changeset
110 *
boisy
parents:
diff changeset
111 CNV7 clr drvsem,U
boisy
parents:
diff changeset
112
boisy
parents:
diff changeset
113 ifne (Drives-1) ;If multiple drives,
boisy
parents:
diff changeset
114 * ldy actdrv,u
boisy
parents:
diff changeset
115 * lda V.TRAK,y
boisy
parents:
diff changeset
116 ldy 3,s ;Restore PD pointer
boisy
parents:
diff changeset
117 * cmpa #$FF
boisy
parents:
diff changeset
118 * bne CNVOK ;Implicit seek if current track known
boisy
parents:
diff changeset
119 lbsr Seek ;Explicit seek
boisy
parents:
diff changeset
120 else
boisy
parents:
diff changeset
121 lda DRVTBL+V.TRAK,U
boisy
parents:
diff changeset
122 cmpa #$FF
boisy
parents:
diff changeset
123 bne CNVOK ;Implicit seek if current track known
boisy
parents:
diff changeset
124 lbsr SEEKT0 ;Else seek to track 0
boisy
parents:
diff changeset
125 endc
boisy
parents:
diff changeset
126 bcs CNV99 ; report error if any encountered
boisy
parents:
diff changeset
127
boisy
parents:
diff changeset
128 * Generic exit w/o error from conversion
boisy
parents:
diff changeset
129
boisy
parents:
diff changeset
130 CNVOK clrb
boisy
parents:
diff changeset
131
boisy
parents:
diff changeset
132 CNV9 bcc CNVXIT
boisy
parents:
diff changeset
133
boisy
parents:
diff changeset
134 CNV99 stb ,s ;Set error code
boisy
parents:
diff changeset
135
boisy
parents:
diff changeset
136 CNVXIT puls b,x,y,PC
boisy
parents:
diff changeset
137
boisy
parents:
diff changeset
138 * Return bad sector error
boisy
parents:
diff changeset
139
boisy
parents:
diff changeset
140 BADSEC puls b
boisy
parents:
diff changeset
141 comb
boisy
parents:
diff changeset
142 ldb #E$Sect
boisy
parents:
diff changeset
143 puls x,y,PC
boisy
parents:
diff changeset
144
boisy
parents:
diff changeset
145 page
boisy
parents:
diff changeset
146 *
boisy
parents:
diff changeset
147 * Convert LSN in B:X to track # in X
boisy
parents:
diff changeset
148 * and head.sector (remainder) in D. Enter with
boisy
parents:
diff changeset
149 * Reg-U -> static storage and Reg-Y -> path descriptor.
boisy
parents:
diff changeset
150 *
boisy
parents:
diff changeset
151 * Routine assumes that MSB of LSN is 0, and that
boisy
parents:
diff changeset
152 * MSB of H*S is 0.
boisy
parents:
diff changeset
153 *
boisy
parents:
diff changeset
154 * Start by dividing LSN by SPT*heads. The quotient
boisy
parents:
diff changeset
155 * is the track number. Then divide the remainder by
boisy
parents:
diff changeset
156 * SPT; the quotient is the head, and the remainder
boisy
parents:
diff changeset
157 * is the sector.
boisy
parents:
diff changeset
158 *
boisy
parents:
diff changeset
159 LSNDIV pshs Y,X,B ;Save Y, stack LSN for division
boisy
parents:
diff changeset
160
boisy
parents:
diff changeset
161 * Calculate SPT * heads
boisy
parents:
diff changeset
162
boisy
parents:
diff changeset
163 lda PD.SID,Y ;Get sides
boisy
parents:
diff changeset
164 ldb (PD.SCT+1),Y ;Get reg-B = SPT
boisy
parents:
diff changeset
165 mul
boisy
parents:
diff changeset
166
boisy
parents:
diff changeset
167 pshs D
boisy
parents:
diff changeset
168 clr ,-S ;Now stack = heads*spt
boisy
parents:
diff changeset
169
boisy
parents:
diff changeset
170 * Calculate track # to X
boisy
parents:
diff changeset
171
boisy
parents:
diff changeset
172 bsr div24 ;divide, X=quotient, D=remainder
boisy
parents:
diff changeset
173 leas 6,S ; discard temps
boisy
parents:
diff changeset
174
boisy
parents:
diff changeset
175 pshs X ;Save track to return
boisy
parents:
diff changeset
176
boisy
parents:
diff changeset
177 * Now divide heads*SPT by SPT -- quickly
boisy
parents:
diff changeset
178
boisy
parents:
diff changeset
179 clr ,-s
boisy
parents:
diff changeset
180 com ,s
boisy
parents:
diff changeset
181
boisy
parents:
diff changeset
182 LDV000 inc ,s
boisy
parents:
diff changeset
183 subb (PD.SCT+1),Y
boisy
parents:
diff changeset
184 sbca #0
boisy
parents:
diff changeset
185 bhs LDV000
boisy
parents:
diff changeset
186
boisy
parents:
diff changeset
187 addb (PD.SCT+1),Y ;Get sector # to B
boisy
parents:
diff changeset
188
boisy
parents:
diff changeset
189 puls A,X,Y,PC ;Get head to A, sector to B, track X
boisy
parents:
diff changeset
190
boisy
parents:
diff changeset
191 *
boisy
parents:
diff changeset
192 * Divide 24 bit 'M' by 24 bit 'N'. Return 16 bit quotient
boisy
parents:
diff changeset
193 * in Reg-X, 16 bit remainder in Reg-D. Destroys M, N; leaves
boisy
parents:
diff changeset
194 * carcasses on stack. Preserves U, Y.
boisy
parents:
diff changeset
195 *
boisy
parents:
diff changeset
196 * Entry:
boisy
parents:
diff changeset
197 * M.l
boisy
parents:
diff changeset
198 * M.m
boisy
parents:
diff changeset
199 * M.h
boisy
parents:
diff changeset
200 * N.l
boisy
parents:
diff changeset
201 * N.m
boisy
parents:
diff changeset
202 * N.h
boisy
parents:
diff changeset
203 * P.l
boisy
parents:
diff changeset
204 * SP->P.h
boisy
parents:
diff changeset
205 *
boisy
parents:
diff changeset
206
boisy
parents:
diff changeset
207 div24 pshs Y
boisy
parents:
diff changeset
208
boisy
parents:
diff changeset
209 * Push special division guys
boisy
parents:
diff changeset
210
boisy
parents:
diff changeset
211 ldd #1
boisy
parents:
diff changeset
212 pshs D
boisy
parents:
diff changeset
213 pshs A ;24 bit "1" flag
boisy
parents:
diff changeset
214
boisy
parents:
diff changeset
215 clrb
boisy
parents:
diff changeset
216 pshs D
boisy
parents:
diff changeset
217 pshs A ;24 bits of 0's (result)
boisy
parents:
diff changeset
218
boisy
parents:
diff changeset
219 * Lotsa good stuff on stack. Find biggest multiple of heads*spt
boisy
parents:
diff changeset
220 * smaller than or = LSN
boisy
parents:
diff changeset
221
boisy
parents:
diff changeset
222 LDV001 ldd (8+2+3+0),S
boisy
parents:
diff changeset
223 cmpd (8+2+0+0),S
boisy
parents:
diff changeset
224 bne LDV002 ;carry set w/ which is more
boisy
parents:
diff changeset
225
boisy
parents:
diff changeset
226 lda (8+2+3+2),S
boisy
parents:
diff changeset
227 cmpa (8+2+0+2),S
boisy
parents:
diff changeset
228
boisy
parents:
diff changeset
229 * Now CC set for LSN-HS
boisy
parents:
diff changeset
230 LDV002 bcs LDV005 ;branch if HS > LSN
boisy
parents:
diff changeset
231
boisy
parents:
diff changeset
232 * Get to multiply HS etc by 2
boisy
parents:
diff changeset
233
boisy
parents:
diff changeset
234 asl (3+2),S ;bit flag * 2
boisy
parents:
diff changeset
235 rol (3+1),S
boisy
parents:
diff changeset
236 rol (3+0),S
boisy
parents:
diff changeset
237
boisy
parents:
diff changeset
238 asl (8+2+0+2),S ;HS * 2
boisy
parents:
diff changeset
239 rol (8+2+0+1),S
boisy
parents:
diff changeset
240 rol (8+2+0+0),S
boisy
parents:
diff changeset
241
boisy
parents:
diff changeset
242 bra LDV001
boisy
parents:
diff changeset
243
boisy
parents:
diff changeset
244 * Now HS is bigger than LSN. Start dividing.
boisy
parents:
diff changeset
245
boisy
parents:
diff changeset
246 LDV005 lsr (8+2+0+0),S ;HS / 2
boisy
parents:
diff changeset
247 ror (8+2+0+1),S
boisy
parents:
diff changeset
248 ror (8+2+0+2),S
boisy
parents:
diff changeset
249
boisy
parents:
diff changeset
250 lsr (3+0),S ;bit flag / 2
boisy
parents:
diff changeset
251 ror (3+1),S
boisy
parents:
diff changeset
252 ror (3+2),S
boisy
parents:
diff changeset
253 bcs LDV008 ; (branch if ready for remainder)
boisy
parents:
diff changeset
254
boisy
parents:
diff changeset
255 ldd (8+2+3+1),S ;LSN - HS.scaled
boisy
parents:
diff changeset
256 subd (8+2+0+1),S
boisy
parents:
diff changeset
257 std (8+2+3+1),S
boisy
parents:
diff changeset
258 lda (8+2+3+0),S
boisy
parents:
diff changeset
259 sbca (8+2+0+0),S
boisy
parents:
diff changeset
260 sta (8+2+3+0),S
boisy
parents:
diff changeset
261
boisy
parents:
diff changeset
262 bcc LDV007
boisy
parents:
diff changeset
263
boisy
parents:
diff changeset
264 * No good. Restore LSN
boisy
parents:
diff changeset
265
boisy
parents:
diff changeset
266 leay (8+2+3),S
boisy
parents:
diff changeset
267 leax (8+2+0),S
boisy
parents:
diff changeset
268 bsr addxtoy ;LSN + HS.scaled
boisy
parents:
diff changeset
269 bra LDV005
boisy
parents:
diff changeset
270
boisy
parents:
diff changeset
271 * Good. Add bit to result
boisy
parents:
diff changeset
272
boisy
parents:
diff changeset
273 LDV007 leay 0,S ;Quotient + bit
boisy
parents:
diff changeset
274 leax 3,S
boisy
parents:
diff changeset
275 bsr addxtoy
boisy
parents:
diff changeset
276 bra LDV005
boisy
parents:
diff changeset
277
boisy
parents:
diff changeset
278 * Now we've checked for all multiples of HS.
boisy
parents:
diff changeset
279 * Quotient is at 0-2,S; remainder is where dividend was.
boisy
parents:
diff changeset
280 * Quotient and remainder are known to be < 65536
boisy
parents:
diff changeset
281
boisy
parents:
diff changeset
282 LDV008 ldx (0+1),S ;get 16 bit quotient
boisy
parents:
diff changeset
283 leas 6,S ;Deallocate quotient & temps
boisy
parents:
diff changeset
284 ldd (4+3+1),S ;get 16 bit remainder
boisy
parents:
diff changeset
285
boisy
parents:
diff changeset
286 puls Y,PC
boisy
parents:
diff changeset
287
boisy
parents:
diff changeset
288 *
boisy
parents:
diff changeset
289 * Add 24 bits @X to 24 bits @Y
boisy
parents:
diff changeset
290 *
boisy
parents:
diff changeset
291 addxtoy ldd 1,Y
boisy
parents:
diff changeset
292 addd 1,X
boisy
parents:
diff changeset
293 std 1,Y
boisy
parents:
diff changeset
294 lda 0,Y
boisy
parents:
diff changeset
295 adca 0,X
boisy
parents:
diff changeset
296 sta 0,Y
boisy
parents:
diff changeset
297 rts
boisy
parents:
diff changeset
298
boisy
parents:
diff changeset
299 else
boisy
parents:
diff changeset
300
boisy
parents:
diff changeset
301 *
boisy
parents:
diff changeset
302 * General setup for read or write.
boisy
parents:
diff changeset
303 * Drive is already selected.
boisy
parents:
diff changeset
304 *
boisy
parents:
diff changeset
305 * Optimized for drives such as ST-225, with
boisy
parents:
diff changeset
306 * 32 double-sectors / track. This version
boisy
parents:
diff changeset
307 * works only with 4 heads.
boisy
parents:
diff changeset
308 *
boisy
parents:
diff changeset
309 * Reg-Y points to path descriptor.
boisy
parents:
diff changeset
310 * Drive # already set up in SDHREG,U
boisy
parents:
diff changeset
311 *
boisy
parents:
diff changeset
312 XSETUP pshs y,x,b
boisy
parents:
diff changeset
313
boisy
parents:
diff changeset
314 ifne (Drives-1)
boisy
parents:
diff changeset
315 ldy actdrv,u ;Verify legal LSN (fetch drive table pointer)
boisy
parents:
diff changeset
316
boisy
parents:
diff changeset
317 cmpb DD.TOT,y
boisy
parents:
diff changeset
318 lbhi BADSEC
boisy
parents:
diff changeset
319 bcs XSET2 ;Branch if OK
boisy
parents:
diff changeset
320
boisy
parents:
diff changeset
321 cmpx DD.TOT+1,y
boisy
parents:
diff changeset
322 lbcc BADSEC
boisy
parents:
diff changeset
323
boisy
parents:
diff changeset
324 * LSN is OK. Still in B:X
boisy
parents:
diff changeset
325
boisy
parents:
diff changeset
326 XSET2 ldy 3,S ;Recover PD pointer
boisy
parents:
diff changeset
327
boisy
parents:
diff changeset
328 else
boisy
parents:
diff changeset
329 cmpb DRVTBL+DD.TOT,U
boisy
parents:
diff changeset
330 lbhi BADSEC
boisy
parents:
diff changeset
331 bcs XSET2
boisy
parents:
diff changeset
332
boisy
parents:
diff changeset
333 cmpx DRVTBL+DD.TOT+1,U
boisy
parents:
diff changeset
334 lbcc BADSEC
boisy
parents:
diff changeset
335
boisy
parents:
diff changeset
336 * LSN is OK. Still in B:X
boisy
parents:
diff changeset
337
boisy
parents:
diff changeset
338 XSET2 equ *
boisy
parents:
diff changeset
339
boisy
parents:
diff changeset
340 endc
boisy
parents:
diff changeset
341
boisy
parents:
diff changeset
342 *
boisy
parents:
diff changeset
343 * These drives have 4 heads, 32 sectors / track.
boisy
parents:
diff changeset
344 * The LSN is known to be in range.
boisy
parents:
diff changeset
345 *
boisy
parents:
diff changeset
346
boisy
parents:
diff changeset
347 pshs x,b ;Calculate track = LSN / (32*4); format for controller
boisy
parents:
diff changeset
348 ldd ,s
boisy
parents:
diff changeset
349 addd ,s ;double MS word of LSN; /128 is like *2 / 256.
boisy
parents:
diff changeset
350 tst 2,s ; (there's never a carry from ADDD)
boisy
parents:
diff changeset
351 bpl XSET3
boisy
parents:
diff changeset
352
boisy
parents:
diff changeset
353 incb ;add in MSB of LS byte if needed -- never a carry
boisy
parents:
diff changeset
354
boisy
parents:
diff changeset
355 * NOTE -- carry must be clear here.
boisy
parents:
diff changeset
356
boisy
parents:
diff changeset
357 XSET3 rora ;Controller likes 2 MS bits of cylinder in MS bits of A
boisy
parents:
diff changeset
358 rora
boisy
parents:
diff changeset
359 rora
boisy
parents:
diff changeset
360 std hicyl,U ; (don't need to format Reg-B)
boisy
parents:
diff changeset
361
boisy
parents:
diff changeset
362 ldb 2,s ;Calculate logical sector and physical sector
boisy
parents:
diff changeset
363 andb #%00011111 ; (0-31 ALWAYS -- W9 in for RLL)
boisy
parents:
diff changeset
364 stb secnum,u
boisy
parents:
diff changeset
365 lsrb ; (physical sector is 1/2 logical -- 0-15)
boisy
parents:
diff changeset
366 orb hicyl,u
boisy
parents:
diff changeset
367 stb hicyl,u ;format correctly
boisy
parents:
diff changeset
368
boisy
parents:
diff changeset
369 ldb 2,s ;Calculate head number = LSN / 32
boisy
parents:
diff changeset
370 lda #8
boisy
parents:
diff changeset
371 mul ; now head number is in Reg-A
boisy
parents:
diff changeset
372 anda #%00000011
boisy
parents:
diff changeset
373 pshs a
boisy
parents:
diff changeset
374 lda sdhreg,u
boisy
parents:
diff changeset
375 anda #%00100000 ; (save only the drive # from SELDRV)
boisy
parents:
diff changeset
376 ora ,s+
boisy
parents:
diff changeset
377 sta sdhreg,u ; format for controller and save
boisy
parents:
diff changeset
378
boisy
parents:
diff changeset
379 lda #1 ;Set up sector count
boisy
parents:
diff changeset
380 sta seccnt,u
boisy
parents:
diff changeset
381
boisy
parents:
diff changeset
382 leas 3,s ;Discard stack stuff
boisy
parents:
diff changeset
383
boisy
parents:
diff changeset
384 * Done with task file.
boisy
parents:
diff changeset
385 tst drvsem,u ;Is drive ready?
boisy
parents:
diff changeset
386 beq CNVOK
boisy
parents:
diff changeset
387
boisy
parents:
diff changeset
388 * Drive not ready; perform seek
boisy
parents:
diff changeset
389 CNV7 clr drvsem,u
boisy
parents:
diff changeset
390
boisy
parents:
diff changeset
391 ifne (Drives-1) ;If multiple drives,
boisy
parents:
diff changeset
392 * ldy actdrv,u
boisy
parents:
diff changeset
393 * lda V.TRAK,y
boisy
parents:
diff changeset
394 ldy 3,s ;Restore PD pointer
boisy
parents:
diff changeset
395 * cmpa #$FF
boisy
parents:
diff changeset
396 * bne CNVOK ;Implicit seek if current track known
boisy
parents:
diff changeset
397 lbsr Seek ;Explicit seek
boisy
parents:
diff changeset
398 else
boisy
parents:
diff changeset
399 lda DRVTBL+V.TRAK,U
boisy
parents:
diff changeset
400 cmpa #$FF
boisy
parents:
diff changeset
401 bne CNVOK ;Implicit seek if current track known
boisy
parents:
diff changeset
402 lbsr SEEKT0 ;Else seek to track 0
boisy
parents:
diff changeset
403 endc
boisy
parents:
diff changeset
404 bcs CNV99
boisy
parents:
diff changeset
405
boisy
parents:
diff changeset
406 * Generic conversion exit with no error
boisy
parents:
diff changeset
407 CNVOK clrb
boisy
parents:
diff changeset
408
boisy
parents:
diff changeset
409 CNV9 bcc CNVXIT
boisy
parents:
diff changeset
410
boisy
parents:
diff changeset
411 CNV99 stb ,s
boisy
parents:
diff changeset
412
boisy
parents:
diff changeset
413 CNVXIT puls b,x,y,PC
boisy
parents:
diff changeset
414
boisy
parents:
diff changeset
415 * Return bad sector error
boisy
parents:
diff changeset
416 BADSEC puls b
boisy
parents:
diff changeset
417 comb
boisy
parents:
diff changeset
418 ldb #E$Sect
boisy
parents:
diff changeset
419 puls x,y,PC
boisy
parents:
diff changeset
420
boisy
parents:
diff changeset
421 endc
boisy
parents:
diff changeset
422
boisy
parents:
diff changeset
423 *
boisy
parents:
diff changeset
424 * Perform drive selection calculations
boisy
parents:
diff changeset
425 *
boisy
parents:
diff changeset
426 SELDRV equ *
boisy
parents:
diff changeset
427
boisy
parents:
diff changeset
428 ifne (Drives-1) ;If multiple drives supported,
boisy
parents:
diff changeset
429
boisy
parents:
diff changeset
430 lda PD.DRV,Y
boisy
parents:
diff changeset
431 cmpa #Drives ;Is drive # OK?
boisy
parents:
diff changeset
432 bcs SD0
boisy
parents:
diff changeset
433
boisy
parents:
diff changeset
434 * Illegal drive error
boisy
parents:
diff changeset
435 comb
boisy
parents:
diff changeset
436 ldb #E$Unit
boisy
parents:
diff changeset
437
boisy
parents:
diff changeset
438 SD.XIT rts
boisy
parents:
diff changeset
439
boisy
parents:
diff changeset
440 * Drive # in A is OK. Set semaphore based on
boisy
parents:
diff changeset
441 * current and prev. drive;
boisy
parents:
diff changeset
442
boisy
parents:
diff changeset
443 SD0 clr drvsem,U ;Assume same drive.
boisy
parents:
diff changeset
444 cmpa prvdrv,U ;Same as previous?
boisy
parents:
diff changeset
445 beq SD1 ; (if so, we're already set up)
boisy
parents:
diff changeset
446
boisy
parents:
diff changeset
447 * Set flag to indicate new drive, and wait for drive ready
boisy
parents:
diff changeset
448
boisy
parents:
diff changeset
449 sta prvdrv,U
boisy
parents:
diff changeset
450 dec drvsem,U
boisy
parents:
diff changeset
451 lbsr WaiDrv ;Wait -- preserve D,X,Y,U
boisy
parents:
diff changeset
452 bcs SD.XIT ; (abort if drive not ready)
boisy
parents:
diff changeset
453 ifne cchflg ;If cache supported,
boisy
parents:
diff changeset
454 clr BfrFlg,U ;Mark cache data invalid
boisy
parents:
diff changeset
455 endc
boisy
parents:
diff changeset
456
boisy
parents:
diff changeset
457 * Convert drive # to controller's format
boisy
parents:
diff changeset
458
boisy
parents:
diff changeset
459 SD1 anda #$01 ;2 drives / controller, but allow slots
boisy
parents:
diff changeset
460 asla
boisy
parents:
diff changeset
461 asla
boisy
parents:
diff changeset
462 asla
boisy
parents:
diff changeset
463 asla
boisy
parents:
diff changeset
464 asla
boisy
parents:
diff changeset
465 pshs a
boisy
parents:
diff changeset
466 lda sdhreg,U ;get old value
boisy
parents:
diff changeset
467 anda #%00001111 ; (save head #)
boisy
parents:
diff changeset
468 ora ,s+
boisy
parents:
diff changeset
469 sta sdhreg,U
boisy
parents:
diff changeset
470
boisy
parents:
diff changeset
471 pshs x
boisy
parents:
diff changeset
472 ldx PD.DTB,Y ;get pointer to drive table
boisy
parents:
diff changeset
473 stx ACTDRV,U
boisy
parents:
diff changeset
474 puls x
boisy
parents:
diff changeset
475
boisy
parents:
diff changeset
476 else
boisy
parents:
diff changeset
477
boisy
parents:
diff changeset
478 lda sdhreg,U ;get old value
boisy
parents:
diff changeset
479 anda #%00001111 ; save head #, force drive # to 0
boisy
parents:
diff changeset
480 sta sdhreg,U
boisy
parents:
diff changeset
481
boisy
parents:
diff changeset
482 endc
boisy
parents:
diff changeset
483
boisy
parents:
diff changeset
484 * Carry clear unless error
boisy
parents:
diff changeset
485 SDXIT rts
boisy
parents:
diff changeset
486
boisy
parents:
diff changeset
487 ifne (Drives-1) ;For 2 drive systems,
boisy
parents:
diff changeset
488
boisy
parents:
diff changeset
489 page
boisy
parents:
diff changeset
490 *
boisy
parents:
diff changeset
491 * Calculate pointer to drive PCCYL, DIVA, DIVY, and PRKTRK
boisy
parents:
diff changeset
492 * parameters, based on drive # in Reg-B. Return ptr in Y.
boisy
parents:
diff changeset
493 *
boisy
parents:
diff changeset
494 * Assumes U->static storage
boisy
parents:
diff changeset
495 *
boisy
parents:
diff changeset
496 GOBPtr pshs D
boisy
parents:
diff changeset
497 lda #OBSIZE ;(size of option packet for each drive)
boisy
parents:
diff changeset
498 mul
boisy
parents:
diff changeset
499 leay OBSTART,U
boisy
parents:
diff changeset
500 leay D,Y ;Point to options for correct drive
boisy
parents:
diff changeset
501 puls D,PC
boisy
parents:
diff changeset
502
boisy
parents:
diff changeset
503 endc
boisy
parents:
diff changeset
504
boisy
parents:
diff changeset
505 *
boisy
parents:
diff changeset
506 * end of hdmath.src
boisy
parents:
diff changeset
507 *
boisy
parents:
diff changeset
508