annotate 3rdparty/drivers/burke/xtos9.src @ 392:df43967d6a46

Minor source changes, added boot_burke
author boisy
date Sun, 25 Aug 2002 19:36:23 +0000
parents c10820aa211b
children 892188818514
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
91
boisy
parents:
diff changeset
1 *******************************************
boisy
parents:
diff changeset
2 *** ***
boisy
parents:
diff changeset
3 *** COPYRIGHT 1990 BURKE & BURKE ***
boisy
parents:
diff changeset
4 *** ALL RIGHTS RESERVED ***
boisy
parents:
diff changeset
5 *** ***
boisy
parents:
diff changeset
6 *** COPYRIGHT 1992 BURKE & BURKE ***
boisy
parents:
diff changeset
7 *** ALL RIGHTS RESERVED ***
boisy
parents:
diff changeset
8 *** ***
boisy
parents:
diff changeset
9 *******************************************
boisy
parents:
diff changeset
10
boisy
parents:
diff changeset
11 *
boisy
parents:
diff changeset
12 * CoCo XT Hard Disk Driver Version 2.0
boisy
parents:
diff changeset
13 *
boisy
parents:
diff changeset
14 * For Western Digital WD1002-WX1 (or 27X) Controller.
boisy
parents:
diff changeset
15 *
boisy
parents:
diff changeset
16 * The controller can only handle 512 bytes per sector,
boisy
parents:
diff changeset
17 * so these routines must synthesize 2 logical 256 byte
boisy
parents:
diff changeset
18 * sectors from each physical 512 byte sector. This
boisy
parents:
diff changeset
19 * increases the time it takes to read or write a sector.
boisy
parents:
diff changeset
20 *
boisy
parents:
diff changeset
21 * To counteract this, the 2nd half of each "even" sector
boisy
parents:
diff changeset
22 * is retained during a read. If the next read accesses the
boisy
parents:
diff changeset
23 * "odd" half, the sector contents is read from the "verify"
boisy
parents:
diff changeset
24 * buffer instead of the hard disk.
boisy
parents:
diff changeset
25 *
boisy
parents:
diff changeset
26 * This version can be optimized for a single ST-225 hard disk,
boisy
parents:
diff changeset
27 * via conditional assembly. Several other parameters can also
boisy
parents:
diff changeset
28 * be controlled by conditional assembly.
boisy
parents:
diff changeset
29 *
boisy
parents:
diff changeset
30 * Conditional assembly control:
boisy
parents:
diff changeset
31 *
boisy
parents:
diff changeset
32 * Drives ;Number of drives supported (1-2)
boisy
parents:
diff changeset
33 *
boisy
parents:
diff changeset
34 * irqflg ;non-zero to mask IRQ during disk access.
boisy
parents:
diff changeset
35 * fmtflg ;non-zero if hard formatting supported
boisy
parents:
diff changeset
36 * fstflg ;non-zero if fast transfers supported
boisy
parents:
diff changeset
37 * cchflg ;non-zero if read cache supported
boisy
parents:
diff changeset
38 * vrfflg ;non-zero if write verification supported
boisy
parents:
diff changeset
39 * tboflg ;non-zero if jump to 2 MHz for block moves
boisy
parents:
diff changeset
40 * errflg ;non-zero for good error messages
boisy
parents:
diff changeset
41 * icdflg ;non-zero to ignore C/D status bit
boisy
parents:
diff changeset
42 * trsflg ;non-zero if optimized for 32 SPT, 4 hd disks
boisy
parents:
diff changeset
43 * sysram ;non-zero to use system RAM for verf buffer
boisy
parents:
diff changeset
44 * sizflg ;non-zero if drives may be different sizes
boisy
parents:
diff changeset
45 *
boisy
parents:
diff changeset
46 * XLEVEL ;Special level 2 flag -- to use L1 assembler
boisy
parents:
diff changeset
47 *
boisy
parents:
diff changeset
48 * Chris Burke Schaumburg, IL 10/14/87
boisy
parents:
diff changeset
49 *
boisy
parents:
diff changeset
50 * Modification History
boisy
parents:
diff changeset
51 * --------------------
boisy
parents:
diff changeset
52 *
boisy
parents:
diff changeset
53 * Date Who Description
boisy
parents:
diff changeset
54 * -------- --- -------------------------------------
boisy
parents:
diff changeset
55 * 11/20/87 CJB Fixed bug in PARK.
boisy
parents:
diff changeset
56 * 12/23/87 CJB Corrected table size and location
boisy
parents:
diff changeset
57 * equates for L2 compatibility.
boisy
parents:
diff changeset
58 * Deleted support for Level 1, Version
boisy
parents:
diff changeset
59 * 1.X OS9.
boisy
parents:
diff changeset
60 * 12/27/87 CJB Added code to grab parameters from
boisy
parents:
diff changeset
61 * device descriptor if not obtained
boisy
parents:
diff changeset
62 * by INIT.
boisy
parents:
diff changeset
63 * 01/28/88 CJB Added support for any slot.
boisy
parents:
diff changeset
64 * 02/07/88 CJB Changed FORMAT to reset drive parameters
boisy
parents:
diff changeset
65 * Added speedy read cache algorithm.
boisy
parents:
diff changeset
66 * Eliminated DIVA, DIVY, etc.
boisy
parents:
diff changeset
67 * 02/23/88 CJB Recoded for TRSFLG
boisy
parents:
diff changeset
68 * 03/03/88 CJB Changed module names to BBhdisk etc.
boisy
parents:
diff changeset
69 * 04/17/88 cjb Modified INIT to call WaitIdl before
boisy
parents:
diff changeset
70 * shutting off controller interrupts & DMA
boisy
parents:
diff changeset
71 * Fixed bugs in INIT which confused path
boisy
parents:
diff changeset
72 * descriptor and device descriptor pointers
boisy
parents:
diff changeset
73 * 04/21/88 cjb Added code to disable I/O retries after
boisy
parents:
diff changeset
74 * formatting hard drive.
boisy
parents:
diff changeset
75 * 06/12/88 cjb Changed to call WaitId2 instead of WaitIdl
boisy
parents:
diff changeset
76 * 07/01/88 cjb Changed revision from 2 to 3
boisy
parents:
diff changeset
77 * 10/10/88 cjb Modified for format error recovery
boisy
parents:
diff changeset
78 * 05/18/90 cjb Modified copyright
boisy
parents:
diff changeset
79 * Added support for up to 4 drives
boisy
parents:
diff changeset
80 * 07/07/91 cjb Rev 2.5 (allow disabling of recalibration)
boisy
parents:
diff changeset
81 * 04/15/92 cjb Rev 2.6 (speed-ups, bug fix for DBLRDD)
boisy
parents:
diff changeset
82 *
boisy
parents:
diff changeset
83
boisy
parents:
diff changeset
84 page
boisy
parents:
diff changeset
85 *
boisy
parents:
diff changeset
86 * Equates
boisy
parents:
diff changeset
87 *
boisy
parents:
diff changeset
88
boisy
parents:
diff changeset
89 ifp1
boisy
parents:
diff changeset
90 use defsfile
boisy
parents:
diff changeset
91 use wx2.equ
boisy
parents:
diff changeset
92 endc
boisy
parents:
diff changeset
93
boisy
parents:
diff changeset
94 * Index into device descriptor (using PD.XXX)
boisy
parents:
diff changeset
95
boisy
parents:
diff changeset
96 DD.BASE equ M$DTYP-PD.OPT
boisy
parents:
diff changeset
97 DD.HDSK equ $25 ;Start of extra hard disk stuff
boisy
parents:
diff changeset
98
boisy
parents:
diff changeset
99 * Multi-PAK Addresses
boisy
parents:
diff changeset
100 MPAK equ $FF7F
boisy
parents:
diff changeset
101
boisy
parents:
diff changeset
102 *
boisy
parents:
diff changeset
103 * Bogus equates for Level 2
boisy
parents:
diff changeset
104 *
boisy
parents:
diff changeset
105
boisy
parents:
diff changeset
106 D.DMARq2 equ $008A ;Bogus Level 2 D.DMAReq
boisy
parents:
diff changeset
107 D.PROC2 equ $0050 ;Bogus Level 2 D.PROC
boisy
parents:
diff changeset
108 DRVMEM2 equ $26 ;Level 2 drive table size
boisy
parents:
diff changeset
109 DRVBEG2 equ $0F ;Level 2 start of drive tables
boisy
parents:
diff changeset
110
boisy
parents:
diff changeset
111 *
boisy
parents:
diff changeset
112 * Bogus equates for Level 1
boisy
parents:
diff changeset
113 *
boisy
parents:
diff changeset
114
boisy
parents:
diff changeset
115 D.DMARq1 equ $006A ;Bogus Level 1 D.DMAReq
boisy
parents:
diff changeset
116 D.PROC1 equ $004B ;Bogus Level 1 D.PROC
boisy
parents:
diff changeset
117 DRVMEM1 equ $18 ;Level 1 drive table size
boisy
parents:
diff changeset
118 DRVBEG1 equ $07 ;Level 1 start of drive tables
boisy
parents:
diff changeset
119
boisy
parents:
diff changeset
120 ifne XLEVEL-1
boisy
parents:
diff changeset
121 DMASEM set D.DMARq2 ;Level 2 DMA stuff (multi-pak)
boisy
parents:
diff changeset
122 DPROC set D.PROC2 ;Level 2 process control stuff
boisy
parents:
diff changeset
123 XDrvBeg set DRVBEG2
boisy
parents:
diff changeset
124 XDrvMen set DRVMEM2
boisy
parents:
diff changeset
125
boisy
parents:
diff changeset
126 else
boisy
parents:
diff changeset
127 DMASEM set D.DMARq1 ;Level 1 DMA stuff (multi-pak)
boisy
parents:
diff changeset
128 DPROC set D.PROC1 ;Level 1 process control stuff
boisy
parents:
diff changeset
129 XDrvBeg set DRVBEG1
boisy
parents:
diff changeset
130 XDrvMen set DRVMEM1
boisy
parents:
diff changeset
131 endc
boisy
parents:
diff changeset
132
boisy
parents:
diff changeset
133 page
boisy
parents:
diff changeset
134 *
boisy
parents:
diff changeset
135 * Module Header
boisy
parents:
diff changeset
136 *
boisy
parents:
diff changeset
137 verson equ 2
boisy
parents:
diff changeset
138 mod cchend,cchnam,drivr+objct,reent+verson,JmpTbl,endmem
boisy
parents:
diff changeset
139 fcb DIR.+SHARE.+PEXEC.+PREAD.+PWRIT.+EXEC.+READ.+WRITE.
boisy
parents:
diff changeset
140
boisy
parents:
diff changeset
141 * Dynamic module name generation
boisy
parents:
diff changeset
142
boisy
parents:
diff changeset
143 cchnam equ *
boisy
parents:
diff changeset
144
boisy
parents:
diff changeset
145 ifeq testing
boisy
parents:
diff changeset
146 fcc "BB" ; (normal name)
boisy
parents:
diff changeset
147 else
boisy
parents:
diff changeset
148 fcc "BK" ; (special name)
boisy
parents:
diff changeset
149 endc
boisy
parents:
diff changeset
150
boisy
parents:
diff changeset
151 ifeq (XLEVEL-1) ;If level 1,
boisy
parents:
diff changeset
152 ifne irqflg ;If Level 1, Version 1 OS9
boisy
parents:
diff changeset
153 fcc /X/
boisy
parents:
diff changeset
154 else ;If Level 1, Version 2 OS9
boisy
parents:
diff changeset
155 fcc /1/
boisy
parents:
diff changeset
156 endc
boisy
parents:
diff changeset
157 endc
boisy
parents:
diff changeset
158
boisy
parents:
diff changeset
159 ifne fmtflg ;If this driver can format hard disk,
boisy
parents:
diff changeset
160 fcc /F/
boisy
parents:
diff changeset
161 endc
boisy
parents:
diff changeset
162
boisy
parents:
diff changeset
163 ifne tboflg ;If 2MHz transfers supported,
boisy
parents:
diff changeset
164 fcc /T/
boisy
parents:
diff changeset
165 endc
boisy
parents:
diff changeset
166
boisy
parents:
diff changeset
167 ifne trsflg ;If "terse" version
boisy
parents:
diff changeset
168 fcs /hd/ ;NOTE -- set MSB of last byte
boisy
parents:
diff changeset
169 else ;If "normal" version
boisy
parents:
diff changeset
170 fcs /hdisk/ ;NOTE -- set MSB of last byte
boisy
parents:
diff changeset
171 endc
boisy
parents:
diff changeset
172
boisy
parents:
diff changeset
173 fcb $06 ;revision - 2.6
boisy
parents:
diff changeset
174
boisy
parents:
diff changeset
175 * Copyright notice
boisy
parents:
diff changeset
176
boisy
parents:
diff changeset
177 fcc /COPR. 1992 BURKE & BURKE/
boisy
parents:
diff changeset
178
boisy
parents:
diff changeset
179 page
boisy
parents:
diff changeset
180 *
boisy
parents:
diff changeset
181 * Static Storage
boisy
parents:
diff changeset
182 *
boisy
parents:
diff changeset
183
boisy
parents:
diff changeset
184 use hdvars.src
boisy
parents:
diff changeset
185
boisy
parents:
diff changeset
186 page
boisy
parents:
diff changeset
187 *
boisy
parents:
diff changeset
188 * Jump table
boisy
parents:
diff changeset
189 *
boisy
parents:
diff changeset
190 JmpTbl lbra INIT
boisy
parents:
diff changeset
191 lbra READ
boisy
parents:
diff changeset
192 lbra WRITE
boisy
parents:
diff changeset
193 lbra GETSTA
boisy
parents:
diff changeset
194 lbra SETSTA
boisy
parents:
diff changeset
195 lbra TERM
boisy
parents:
diff changeset
196
boisy
parents:
diff changeset
197 ifne sizflg ;If drives may be different sizes,
boisy
parents:
diff changeset
198 page
boisy
parents:
diff changeset
199 *
boisy
parents:
diff changeset
200 * Post-initialization for drives.
boisy
parents:
diff changeset
201 *
boisy
parents:
diff changeset
202 * If we ever call a driver routine (other than INIT)
boisy
parents:
diff changeset
203 * with PARK LSN = 0, we know this drive has not been
boisy
parents:
diff changeset
204 * initialized.
boisy
parents:
diff changeset
205 *
boisy
parents:
diff changeset
206 * Enter w/ Reg-Y = path descriptor pointer,
boisy
parents:
diff changeset
207 * Reg-U = static storage
boisy
parents:
diff changeset
208 *
boisy
parents:
diff changeset
209 * Must save A and B:X as well as Y, U.
boisy
parents:
diff changeset
210 *
boisy
parents:
diff changeset
211 * Returns carry set if error initializing drive
boisy
parents:
diff changeset
212 *
boisy
parents:
diff changeset
213 PostIni pshs Y,X,D
boisy
parents:
diff changeset
214
boisy
parents:
diff changeset
215 ldb PD.DRV,Y
boisy
parents:
diff changeset
216 lbsr GOBPtr ;Point Y to extra variables
boisy
parents:
diff changeset
217 clrb ;Force no carry (success)
boisy
parents:
diff changeset
218 ldb (PRKLSN-OBSTART+0),Y
boisy
parents:
diff changeset
219 orb (PRKLSN-OBSTART+1),Y
boisy
parents:
diff changeset
220 bne PSTI0 ; (branch if OK)
boisy
parents:
diff changeset
221
boisy
parents:
diff changeset
222 * Perform drive info and controller intialization
boisy
parents:
diff changeset
223
boisy
parents:
diff changeset
224 ldy 4,S ;Get path pointer
boisy
parents:
diff changeset
225 ldy PD.DEV,Y ; get device table pointer
boisy
parents:
diff changeset
226 ldy V$DESC,Y ; get device descriptor pointer
boisy
parents:
diff changeset
227 lbsr CtlInit ;Call routine to init. controller
boisy
parents:
diff changeset
228
boisy
parents:
diff changeset
229 * Done initiailizing this drive.
boisy
parents:
diff changeset
230
boisy
parents:
diff changeset
231 PSTI0 puls D,X,Y,PC
boisy
parents:
diff changeset
232
boisy
parents:
diff changeset
233 endc
boisy
parents:
diff changeset
234
boisy
parents:
diff changeset
235 page
boisy
parents:
diff changeset
236 *
boisy
parents:
diff changeset
237 * Initialize driver routines
boisy
parents:
diff changeset
238 *
boisy
parents:
diff changeset
239 * Reg-Y points to device descriptor
boisy
parents:
diff changeset
240 *
boisy
parents:
diff changeset
241 INIT pshs y
boisy
parents:
diff changeset
242
boisy
parents:
diff changeset
243 * This section calls routines that expect a *PATH* descriptor
boisy
parents:
diff changeset
244 * pointer in Reg-Y
boisy
parents:
diff changeset
245
boisy
parents:
diff changeset
246 leay DD.BASE,Y ;Make Y look like path descriptor to get slot
boisy
parents:
diff changeset
247
boisy
parents:
diff changeset
248 lbsr Semfor ;Wait, then select HD controller.
boisy
parents:
diff changeset
249 sta >HDRSET ;Reset controller
boisy
parents:
diff changeset
250 lbsr WaitId2 ;Sleep -- wait for controller to reset
boisy
parents:
diff changeset
251 *** Extra call to give WD1004 time to reset
boisy
parents:
diff changeset
252 lbsr WaitId2 ;Sleep -- wait for controller to reset
boisy
parents:
diff changeset
253 *** ENDK
boisy
parents:
diff changeset
254 ldy ,S ;Restore y -> device descriptor
boisy
parents:
diff changeset
255
boisy
parents:
diff changeset
256 * Set up controller for non-interrupt, non-DMA operation
boisy
parents:
diff changeset
257
boisy
parents:
diff changeset
258 clr >HDMASK ;Turn off controller interrupts and DMA
boisy
parents:
diff changeset
259
boisy
parents:
diff changeset
260 * Set # of drives we can handle
boisy
parents:
diff changeset
261
boisy
parents:
diff changeset
262 lda #Drives
boisy
parents:
diff changeset
263 sta V.NDRV,U
boisy
parents:
diff changeset
264
boisy
parents:
diff changeset
265 * Set up drive switching info
boisy
parents:
diff changeset
266
boisy
parents:
diff changeset
267 ifne (Drives-1)
boisy
parents:
diff changeset
268 ldd #$FFFF
boisy
parents:
diff changeset
269 std prvdrv,u ; (set PRVDRV unknown, DRVSEM for new drive)
boisy
parents:
diff changeset
270 std actdrv,u ;Pointer to active drive table
boisy
parents:
diff changeset
271 else
boisy
parents:
diff changeset
272 lda #$FF
boisy
parents:
diff changeset
273 sta DRVSEM,U
boisy
parents:
diff changeset
274 endc
boisy
parents:
diff changeset
275
boisy
parents:
diff changeset
276 * Enable hardware I/O retries. These will be disabled by a FORMAT
boisy
parents:
diff changeset
277 * setstat, and will be re-enabled by an INIT call or a reboot.
boisy
parents:
diff changeset
278 * The main use of this is to disable retries during disk formatting.
boisy
parents:
diff changeset
279
boisy
parents:
diff changeset
280 clr RetryEn,U ;Enable hardware retries
boisy
parents:
diff changeset
281
boisy
parents:
diff changeset
282 * Program controller w/ drive parameters.
boisy
parents:
diff changeset
283 * Y points to device descriptor.
boisy
parents:
diff changeset
284
boisy
parents:
diff changeset
285 bsr CtlInit ; (also clears BFRFLG,U and changes Y)
boisy
parents:
diff changeset
286 bcs INIT9 ; (abort if error)
boisy
parents:
diff changeset
287
boisy
parents:
diff changeset
288 * Initialize the drive tables for all drives
boisy
parents:
diff changeset
289
boisy
parents:
diff changeset
290 ldd #(-1) ;Current track is unknown
boisy
parents:
diff changeset
291 stb XDrvBeg+V.TRAK,U
boisy
parents:
diff changeset
292 std XDrvBeg+DD.TOT,U ;Set total sectors non-zero to allow LSN0
boisy
parents:
diff changeset
293 ifne (Drives-1)
boisy
parents:
diff changeset
294 stb XDrvBeg+XDrvMen*1+V.TRAK,U ; (do all drives)
boisy
parents:
diff changeset
295 std XDrvBeg+XDrvMen*1+DD.TOT,U
boisy
parents:
diff changeset
296 ifge (Drives-3)
boisy
parents:
diff changeset
297 stb XDrvBeg+XDrvMen*2+V.TRAK,U ; (do all drives)
boisy
parents:
diff changeset
298 std XDrvBeg+XDrvMen*2+DD.TOT,U
boisy
parents:
diff changeset
299 endc
boisy
parents:
diff changeset
300 ifge (Drives-4)
boisy
parents:
diff changeset
301 stb XDrvBeg+XDrvMen*3+V.TRAK,U ; (do all drives)
boisy
parents:
diff changeset
302 std XDrvBeg+XDrvMen*3+DD.TOT,U
boisy
parents:
diff changeset
303 endc
boisy
parents:
diff changeset
304 endc
boisy
parents:
diff changeset
305
boisy
parents:
diff changeset
306 * Reg-Y points to bogus path descriptor (courtesy of CtlInit).
boisy
parents:
diff changeset
307 * Wait for drive to be ready.
boisy
parents:
diff changeset
308 *
boisy
parents:
diff changeset
309 * Note that WaiDrv returns Reg-B=0 and carry clear to OK,
boisy
parents:
diff changeset
310 * else reg-B = E$NotRdy and carry set.
boisy
parents:
diff changeset
311
boisy
parents:
diff changeset
312 bsr WaiDrv ;Note: WaiDrv requires *PATH* descriptor
boisy
parents:
diff changeset
313
boisy
parents:
diff changeset
314 * Error hook
boisy
parents:
diff changeset
315 INIT9 puls Y ;restore saved Y register (DD pointer)
boisy
parents:
diff changeset
316 bra HDXIT
boisy
parents:
diff changeset
317
boisy
parents:
diff changeset
318 * Generic error-free exit
boisy
parents:
diff changeset
319 OKXIT clrb
boisy
parents:
diff changeset
320
boisy
parents:
diff changeset
321 *
boisy
parents:
diff changeset
322 * Generic exit. Restore MULTI-PAK to
boisy
parents:
diff changeset
323 * slot #4 so floppy disk works, and release semaphore
boisy
parents:
diff changeset
324 *
boisy
parents:
diff changeset
325 * Preserves CC and B
boisy
parents:
diff changeset
326 *
boisy
parents:
diff changeset
327 * RELEASE also clears the V.WAKE flag.
boisy
parents:
diff changeset
328 *
boisy
parents:
diff changeset
329 HDXIT lbsr Release
boisy
parents:
diff changeset
330 rts
boisy
parents:
diff changeset
331
boisy
parents:
diff changeset
332 *
boisy
parents:
diff changeset
333 * Wait for drive ready
boisy
parents:
diff changeset
334 * Assumes reg-Y points to real or bogus path
boisy
parents:
diff changeset
335 * descriptor (for drive # and step rate)
boisy
parents:
diff changeset
336 *
boisy
parents:
diff changeset
337 WaiDrv pshs y,x,a,b
boisy
parents:
diff changeset
338
boisy
parents:
diff changeset
339 clr ,-s ;Time out
boisy
parents:
diff changeset
340
boisy
parents:
diff changeset
341 WaiDr2 lda #WX$TST ;Test drive ready
boisy
parents:
diff changeset
342
boisy
parents:
diff changeset
343 ifne (Drives-1) ;If more than 1 drive
boisy
parents:
diff changeset
344 ldb PD.DRV,Y ;get drive #
boisy
parents:
diff changeset
345 endc
boisy
parents:
diff changeset
346
boisy
parents:
diff changeset
347 lbsr DrvCmd
boisy
parents:
diff changeset
348 bcc WaiDr3 ; (branch if drive ready)
boisy
parents:
diff changeset
349
boisy
parents:
diff changeset
350 dec ,s ;Decrement timeout
boisy
parents:
diff changeset
351 beq WaiDr4 ; (branch if timeout)
boisy
parents:
diff changeset
352
boisy
parents:
diff changeset
353 lbsr Snooze ;Give drive some time
boisy
parents:
diff changeset
354 bra WaiDr2 ; then retry.
boisy
parents:
diff changeset
355
boisy
parents:
diff changeset
356 * Timeout
boisy
parents:
diff changeset
357
boisy
parents:
diff changeset
358 WaiDr4 comb
boisy
parents:
diff changeset
359 ldb #E$NotRdy ;Drive not ready
boisy
parents:
diff changeset
360 stb 1+1,S
boisy
parents:
diff changeset
361
boisy
parents:
diff changeset
362 * Carry clear if ready, else carry set
boisy
parents:
diff changeset
363
boisy
parents:
diff changeset
364 WaiDr3 leas 1,S ;Discard counter
boisy
parents:
diff changeset
365 puls a,b,x,y,pc
boisy
parents:
diff changeset
366
boisy
parents:
diff changeset
367 *
boisy
parents:
diff changeset
368 * Get extra bytes from this drive's descriptor.
boisy
parents:
diff changeset
369 * Send them to the controller.
boisy
parents:
diff changeset
370 *
boisy
parents:
diff changeset
371 * Enter w/
boisy
parents:
diff changeset
372 * Reg-Y = Dev Desc pointer, and
boisy
parents:
diff changeset
373 * Reg-U = static storage pointer.
boisy
parents:
diff changeset
374 *
boisy
parents:
diff changeset
375 * Note that if there is a 2nd drive with different
boisy
parents:
diff changeset
376 * parameters, they must be obtained in a different
boisy
parents:
diff changeset
377 * manner.
boisy
parents:
diff changeset
378 *
boisy
parents:
diff changeset
379 * Modifies Reg-Y to make it look like a bogus *PATH*
boisy
parents:
diff changeset
380 * descriptor
boisy
parents:
diff changeset
381 *
boisy
parents:
diff changeset
382
boisy
parents:
diff changeset
383 CtlInit equ *
boisy
parents:
diff changeset
384
boisy
parents:
diff changeset
385 ifne cchflg ;If read cache,
boisy
parents:
diff changeset
386 clr BFRFLG,U ;Buffer contents invalid
boisy
parents:
diff changeset
387 endc
boisy
parents:
diff changeset
388
boisy
parents:
diff changeset
389 bsr GetXtra ;Call subroutine DDPTR in Y.
boisy
parents:
diff changeset
390
boisy
parents:
diff changeset
391 * Send drive parameters to controller. Reg-Y points to device
boisy
parents:
diff changeset
392 * descriptor, but we adjust it to look like a path descriptor.
boisy
parents:
diff changeset
393
boisy
parents:
diff changeset
394 leay DD.BASE,Y ;Make Y look like path descriptor
boisy
parents:
diff changeset
395
boisy
parents:
diff changeset
396 lda #WX$INI ;Command to send drive parameters
boisy
parents:
diff changeset
397
boisy
parents:
diff changeset
398 ifne (Drives-1) ;If more than 1 drive
boisy
parents:
diff changeset
399 ldb PD.DRV,Y ;get drive #
boisy
parents:
diff changeset
400 endc
boisy
parents:
diff changeset
401
boisy
parents:
diff changeset
402 lbsr DrvCmd ;Set up drive parameters
boisy
parents:
diff changeset
403 rts
boisy
parents:
diff changeset
404
boisy
parents:
diff changeset
405 page
boisy
parents:
diff changeset
406 *
boisy
parents:
diff changeset
407 * Copy precomp cylinder and park LSN from descriptor
boisy
parents:
diff changeset
408 * (also gives max. tracks!)
boisy
parents:
diff changeset
409 *
boisy
parents:
diff changeset
410
boisy
parents:
diff changeset
411 GetXtra ldd DD.HDSK+(PCCYL-OBSTART),Y ;get prec, MSB of park LSN
boisy
parents:
diff changeset
412 ldx DD.HDSK+(PRKLSN+1-OBSTART),Y ;get rest of park LSN
boisy
parents:
diff changeset
413 ifne (Drives-1) ; If 2 drives,
boisy
parents:
diff changeset
414 ifne sizflg ; of different sizes,
boisy
parents:
diff changeset
415 pshs Y,X,D
boisy
parents:
diff changeset
416 ldb DD.BASE+PD.DRV,Y ;get drive #
boisy
parents:
diff changeset
417 lbsr GOBPtr ;get dest. pointer to Y
boisy
parents:
diff changeset
418 puls D,X
boisy
parents:
diff changeset
419 std (PCCYL-OBSTART),Y
boisy
parents:
diff changeset
420 stx (PRKLSN+1-OBSTART),Y
boisy
parents:
diff changeset
421 puls Y,PC ;Recover DD ptr and exit
boisy
parents:
diff changeset
422 else ; of same size,
boisy
parents:
diff changeset
423 std PCCYL,U
boisy
parents:
diff changeset
424 stx (PRKLSN+1),U ;set up both tables at once
boisy
parents:
diff changeset
425 std (PCCYL+OBSIZE),U
boisy
parents:
diff changeset
426 stx (PRKLSN+1+OBSIZE),U
boisy
parents:
diff changeset
427 rts
boisy
parents:
diff changeset
428 endc
boisy
parents:
diff changeset
429 else ; If 1 drive,
boisy
parents:
diff changeset
430 std PCCYL,U
boisy
parents:
diff changeset
431 stx (PRKLSN+1),U
boisy
parents:
diff changeset
432 rts
boisy
parents:
diff changeset
433 endc
boisy
parents:
diff changeset
434
boisy
parents:
diff changeset
435 page
boisy
parents:
diff changeset
436 *
boisy
parents:
diff changeset
437 * Terminate hard disk processing
boisy
parents:
diff changeset
438 *
boisy
parents:
diff changeset
439 TERM lbsr Semfor ;Wait on semaphore, select controller
boisy
parents:
diff changeset
440 bra OKXIT ;Clear semaphore and successful exit
boisy
parents:
diff changeset
441
boisy
parents:
diff changeset
442 *
boisy
parents:
diff changeset
443 * Dummy routine for GETSTA
boisy
parents:
diff changeset
444 *
boisy
parents:
diff changeset
445 GETSTA comb ;Set carry
boisy
parents:
diff changeset
446 ldb #E$UnkSVC
boisy
parents:
diff changeset
447 rts
boisy
parents:
diff changeset
448
boisy
parents:
diff changeset
449 page
boisy
parents:
diff changeset
450 *
boisy
parents:
diff changeset
451 * Read a sector from disk
boisy
parents:
diff changeset
452 *
boisy
parents:
diff changeset
453 * LSN in B:X. If it is 1+OLDLSN,
boisy
parents:
diff changeset
454 * and the drive # is right, and the
boisy
parents:
diff changeset
455 * read cache is full, don't even bother
boisy
parents:
diff changeset
456 * doing address computations
boisy
parents:
diff changeset
457 *
boisy
parents:
diff changeset
458 * There are always an even number of sectors
boisy
parents:
diff changeset
459 * per track, so if the new LSN is the old LSN
boisy
parents:
diff changeset
460 * with MSB set, we have a winner! We always
boisy
parents:
diff changeset
461 * store the old LSN with MSB set.
boisy
parents:
diff changeset
462 *
boisy
parents:
diff changeset
463
boisy
parents:
diff changeset
464 READ equ *
boisy
parents:
diff changeset
465
boisy
parents:
diff changeset
466 ifne cchflg ;If read cache,
boisy
parents:
diff changeset
467
boisy
parents:
diff changeset
468 pshs X,B ;Save LSN
boisy
parents:
diff changeset
469 lbsr SavSlt ;Save old slot #, but don't change yet
boisy
parents:
diff changeset
470
boisy
parents:
diff changeset
471 tst BFRFLG,U ;Is buffer valid?
boisy
parents:
diff changeset
472 beq READXX ; (branch if no luck)
boisy
parents:
diff changeset
473 ifne (Drives-1)
boisy
parents:
diff changeset
474 lda PD.DRV,Y
boisy
parents:
diff changeset
475 cmpa PRVDRV,U
boisy
parents:
diff changeset
476 bne READXX ; (branch if drive different)
boisy
parents:
diff changeset
477 endc
boisy
parents:
diff changeset
478 puls B,X
boisy
parents:
diff changeset
479 cmpx OLDLSN+1,U
boisy
parents:
diff changeset
480 bne READXY
boisy
parents:
diff changeset
481 cmpb OLDLSN+0,U
boisy
parents:
diff changeset
482 bne READXY
boisy
parents:
diff changeset
483
boisy
parents:
diff changeset
484 * Use verify buffer for sector data -- no read necessary!
boisy
parents:
diff changeset
485 * The OLDLSN and PRVDRV variables are already set right.
boisy
parents:
diff changeset
486
boisy
parents:
diff changeset
487 pshs u,y,x
boisy
parents:
diff changeset
488
boisy
parents:
diff changeset
489 ldb #128
boisy
parents:
diff changeset
490 ldx PD.BUF,Y ;Get destination pointer
boisy
parents:
diff changeset
491 leay vrfbuf,U ;Get source pointer
boisy
parents:
diff changeset
492
boisy
parents:
diff changeset
493 DR0 ldu ,y++
boisy
parents:
diff changeset
494 stu ,x++
boisy
parents:
diff changeset
495 decb
boisy
parents:
diff changeset
496 bne DR0
boisy
parents:
diff changeset
497
boisy
parents:
diff changeset
498 puls x,y,u
boisy
parents:
diff changeset
499 bra OKXIT3 ;Successful exit
boisy
parents:
diff changeset
500
boisy
parents:
diff changeset
501 * Not a cache read. Restore LSN
boisy
parents:
diff changeset
502
boisy
parents:
diff changeset
503 READXX puls B,X
boisy
parents:
diff changeset
504
boisy
parents:
diff changeset
505 * Save LSN in case we can do a cache read next time.
boisy
parents:
diff changeset
506 * We always set the LSB of the saved LSN; the BFRFLG
boisy
parents:
diff changeset
507 * will be set only if the actual LSB is 0!
boisy
parents:
diff changeset
508
boisy
parents:
diff changeset
509 READXY clr BFRFLG,U ;Assume future cache read invalid
boisy
parents:
diff changeset
510 stb OLDLSN+0,U ;Save LSN for next time
boisy
parents:
diff changeset
511
boisy
parents:
diff changeset
512 pshs B
boisy
parents:
diff changeset
513 tfr X,D
boisy
parents:
diff changeset
514 bitb #%00000001 ;If LSB is 0, cache read valid next time
boisy
parents:
diff changeset
515 bne READXZ
boisy
parents:
diff changeset
516
boisy
parents:
diff changeset
517 com BFRFLG,U ; (cache read next time)
boisy
parents:
diff changeset
518
boisy
parents:
diff changeset
519 READXZ orb #%00000001 ; (always set LSB in possible match)
boisy
parents:
diff changeset
520 std OLDLSN+1,U
boisy
parents:
diff changeset
521 puls B
boisy
parents:
diff changeset
522
boisy
parents:
diff changeset
523 endc
boisy
parents:
diff changeset
524
boisy
parents:
diff changeset
525 * Perform normal read -- LSN in B:X
boisy
parents:
diff changeset
526
boisy
parents:
diff changeset
527 lbsr Semfor ;Wait, select hard disk controller slot
boisy
parents:
diff changeset
528
boisy
parents:
diff changeset
529 ifne sizflg ;If drives can be different sizes,
boisy
parents:
diff changeset
530 lbsr PostIni
boisy
parents:
diff changeset
531 bcs HDXIT3
boisy
parents:
diff changeset
532 endc
boisy
parents:
diff changeset
533
boisy
parents:
diff changeset
534 * Check for LSN0
boisy
parents:
diff changeset
535
boisy
parents:
diff changeset
536 cmpx #0 ;Check for LSN 0 -- SPECIAL
boisy
parents:
diff changeset
537 bne NotLS0
boisy
parents:
diff changeset
538 tstb
boisy
parents:
diff changeset
539 bne NotLS0
boisy
parents:
diff changeset
540
boisy
parents:
diff changeset
541 ** Wants to read LSN 0.
boisy
parents:
diff changeset
542 ** See if LSN 0 has already been read once.
boisy
parents:
diff changeset
543 **
boisy
parents:
diff changeset
544 ** We must use PD.DTB,Y instead of ACTDRV,U because
boisy
parents:
diff changeset
545 ** SELDRV has not been called yet.
boisy
parents:
diff changeset
546 **
boisy
parents:
diff changeset
547 ** Actually, we still read -- we just don't update
boisy
parents:
diff changeset
548 ** the drive table
boisy
parents:
diff changeset
549 *
boisy
parents:
diff changeset
550 * pshs X,B ;Save LSN
boisy
parents:
diff changeset
551 * ifne (Drives-1) ;If 2 drives,
boisy
parents:
diff changeset
552 * ldx PD.DTB,Y ;Point to drive table
boisy
parents:
diff changeset
553 * else
boisy
parents:
diff changeset
554 * leax DRVTBL,U ;Point to drive table
boisy
parents:
diff changeset
555 * endc
boisy
parents:
diff changeset
556 * ldd DD.TOT,x ;Get total sectors
boisy
parents:
diff changeset
557 * cmpd #-1 ; -1 is a special value set by INIT routine
boisy
parents:
diff changeset
558 * puls B,X ;Restore LSN (always $000000)
boisy
parents:
diff changeset
559 * bne NotLS0 ;If not -1, LSN 0 already read; no special stuff
boisy
parents:
diff changeset
560
boisy
parents:
diff changeset
561 * Special treatment for LSN0 -- refresh drive table when done
boisy
parents:
diff changeset
562
boisy
parents:
diff changeset
563 bsr DoRead
boisy
parents:
diff changeset
564 bcs HDXIT3
boisy
parents:
diff changeset
565
boisy
parents:
diff changeset
566 ldx PD.BUF,y ;Get buffer address
boisy
parents:
diff changeset
567 pshs Y,X ;Save old buffer and device descriptor ptrs
boisy
parents:
diff changeset
568
boisy
parents:
diff changeset
569 * Note that the SELDRV routine, called by DOREAD, sets up
boisy
parents:
diff changeset
570 * the drive table pointer in actdrv,U if there are 2 drives.
boisy
parents:
diff changeset
571
boisy
parents:
diff changeset
572 ifne (Drives-1) ;If 2 drives,
boisy
parents:
diff changeset
573 ldy actdrv,u
boisy
parents:
diff changeset
574 else
boisy
parents:
diff changeset
575 leay DRVTBL,U
boisy
parents:
diff changeset
576 endc
boisy
parents:
diff changeset
577
boisy
parents:
diff changeset
578 ldb #DD.SIZ-1
boisy
parents:
diff changeset
579
boisy
parents:
diff changeset
580 * Update drive table from buffer
boisy
parents:
diff changeset
581
boisy
parents:
diff changeset
582 RCPY1 lda b,x
boisy
parents:
diff changeset
583 sta b,y
boisy
parents:
diff changeset
584 decb
boisy
parents:
diff changeset
585 bpl RCPY1
boisy
parents:
diff changeset
586
boisy
parents:
diff changeset
587 puls y,x
boisy
parents:
diff changeset
588 bra OKXIT3
boisy
parents:
diff changeset
589
boisy
parents:
diff changeset
590 * Read (not LSN0)
boisy
parents:
diff changeset
591
boisy
parents:
diff changeset
592 NotLS0 bsr DoRead
boisy
parents:
diff changeset
593 HDXIT3 lbcs HDXIT
boisy
parents:
diff changeset
594
boisy
parents:
diff changeset
595 OKXIT3 lbra OKXIT
boisy
parents:
diff changeset
596
boisy
parents:
diff changeset
597 page
boisy
parents:
diff changeset
598 *
boisy
parents:
diff changeset
599 * Utility to read a sector
boisy
parents:
diff changeset
600 *
boisy
parents:
diff changeset
601 DoRead lbsr SETUP
boisy
parents:
diff changeset
602 bcs DORXIT
boisy
parents:
diff changeset
603
boisy
parents:
diff changeset
604 * Entry point for VERIFY
boisy
parents:
diff changeset
605 VrfRdd ldx PD.BUF,Y ;Get buffer address
boisy
parents:
diff changeset
606
boisy
parents:
diff changeset
607 * General read sector
boisy
parents:
diff changeset
608 GetSec lda #WX$RDD ;Create "READ SINGLE SECTOR" command
boisy
parents:
diff changeset
609 lbsr CMEXEC
boisy
parents:
diff changeset
610 DORXIT rts
boisy
parents:
diff changeset
611
boisy
parents:
diff changeset
612 page
boisy
parents:
diff changeset
613 *
boisy
parents:
diff changeset
614 * Write a sector to disk.
boisy
parents:
diff changeset
615 *
boisy
parents:
diff changeset
616 * This routine must pre-read the sector in order to
boisy
parents:
diff changeset
617 * pack 2 logical sectors into 1 physical sector.
boisy
parents:
diff changeset
618 * This invalidates any data that might have been pre-read
boisy
parents:
diff changeset
619 * into the verify buffer.
boisy
parents:
diff changeset
620 *
boisy
parents:
diff changeset
621 WRITE lbsr Semfor ;Wait, then select HD controller
boisy
parents:
diff changeset
622
boisy
parents:
diff changeset
623 ifne sizflg ;If drives can be different sizes,
boisy
parents:
diff changeset
624 lbsr PostIni
boisy
parents:
diff changeset
625 bcs HDXIT3
boisy
parents:
diff changeset
626 endc
boisy
parents:
diff changeset
627
boisy
parents:
diff changeset
628 * Pre-read the "other" half of the sector to the verify buffer
boisy
parents:
diff changeset
629
boisy
parents:
diff changeset
630 pshs X,B ;Save LSN
boisy
parents:
diff changeset
631 lbsr SETUP ;Set up head, track, sector #'s
boisy
parents:
diff changeset
632 bsr flphlf ;flip LSB of SECNUM
boisy
parents:
diff changeset
633
boisy
parents:
diff changeset
634 ifne cchflg ;If read cache supported
boisy
parents:
diff changeset
635 clr BFRFLG,u ;2nd half of sector should not be saved
boisy
parents:
diff changeset
636 endc
boisy
parents:
diff changeset
637
boisy
parents:
diff changeset
638 leax vrfbuf,U ;Use verify buffer
boisy
parents:
diff changeset
639 bsr GetSec ; (re-use code)
boisy
parents:
diff changeset
640
boisy
parents:
diff changeset
641 puls X,B
boisy
parents:
diff changeset
642 bcs HDXIT3 ; branch to abort if pre-read fails
boisy
parents:
diff changeset
643
boisy
parents:
diff changeset
644 bsr flphlf ;fix up sector #
boisy
parents:
diff changeset
645
boisy
parents:
diff changeset
646 * Perform the write. The "other" half of the physical sector
boisy
parents:
diff changeset
647 * has been pre-read into the verify buffer.
boisy
parents:
diff changeset
648
boisy
parents:
diff changeset
649 pshs x,b ;save LSN
boisy
parents:
diff changeset
650 bsr DoWrit
boisy
parents:
diff changeset
651 puls x,b
boisy
parents:
diff changeset
652 bcs HDXIT3
boisy
parents:
diff changeset
653
boisy
parents:
diff changeset
654 ifne vrfflg ;If verify enabled,
boisy
parents:
diff changeset
655
boisy
parents:
diff changeset
656 tst PD.VFY,Y ;Verify writes?
boisy
parents:
diff changeset
657 bne OKXIT3
boisy
parents:
diff changeset
658
boisy
parents:
diff changeset
659 * Verify the write
boisy
parents:
diff changeset
660 bsr VERIFY
boisy
parents:
diff changeset
661 bcc OKXIT3
boisy
parents:
diff changeset
662
boisy
parents:
diff changeset
663 * Verify failed; carry set
boisy
parents:
diff changeset
664 ldb #E$Write
boisy
parents:
diff changeset
665 bra HDXIT3
boisy
parents:
diff changeset
666
boisy
parents:
diff changeset
667 else
boisy
parents:
diff changeset
668
boisy
parents:
diff changeset
669 bra OKXIT3
boisy
parents:
diff changeset
670
boisy
parents:
diff changeset
671 endc
boisy
parents:
diff changeset
672
boisy
parents:
diff changeset
673 *
boisy
parents:
diff changeset
674 * Flip LSB of SECNUM. This is used to pre-read the half of the sector
boisy
parents:
diff changeset
675 * that should not be changed by a write.
boisy
parents:
diff changeset
676 *
boisy
parents:
diff changeset
677 flphlf lda secnum,u
boisy
parents:
diff changeset
678 EORA #1
boisy
parents:
diff changeset
679 sta secnum,u
boisy
parents:
diff changeset
680 rts
boisy
parents:
diff changeset
681
boisy
parents:
diff changeset
682 page
boisy
parents:
diff changeset
683 *
boisy
parents:
diff changeset
684 * Utility to write a sector
boisy
parents:
diff changeset
685 *
boisy
parents:
diff changeset
686 DoWRIT lbsr SETUP
boisy
parents:
diff changeset
687 bcs DOWXIT
boisy
parents:
diff changeset
688
boisy
parents:
diff changeset
689 ldx PD.BUF,Y ;Get buffer pointer
boisy
parents:
diff changeset
690 lda #WX$WRT ;Create "WRITE SINGLE SECTOR" command
boisy
parents:
diff changeset
691 lbsr CMEXEC
boisy
parents:
diff changeset
692
boisy
parents:
diff changeset
693 DOWXIT rts
boisy
parents:
diff changeset
694
boisy
parents:
diff changeset
695 ifne vrfflg ;If verify supported,
boisy
parents:
diff changeset
696
boisy
parents:
diff changeset
697 *
boisy
parents:
diff changeset
698 * Verify last sector written
boisy
parents:
diff changeset
699 *
boisy
parents:
diff changeset
700 * Don't copy unused part of sector to verify buffer
boisy
parents:
diff changeset
701 *
boisy
parents:
diff changeset
702 VERIFY pshs x,b,a
boisy
parents:
diff changeset
703
boisy
parents:
diff changeset
704 ldx PD.BUF,y ;Save buffer pointer
boisy
parents:
diff changeset
705 pshs x
boisy
parents:
diff changeset
706
boisy
parents:
diff changeset
707 leax vrfbuf,U
boisy
parents:
diff changeset
708 stx PD.BUF,y ;Force dummy buffer pointer
boisy
parents:
diff changeset
709 ldx 4,s ;Recover LSN
boisy
parents:
diff changeset
710
boisy
parents:
diff changeset
711 lbsr setup
boisy
parents:
diff changeset
712 bcs VF1
boisy
parents:
diff changeset
713
boisy
parents:
diff changeset
714 ifne cchflg ;If read cache supported,
boisy
parents:
diff changeset
715 clr BFRFLG,u ;Mark don't save 2nd half of sector
boisy
parents:
diff changeset
716 endc
boisy
parents:
diff changeset
717
boisy
parents:
diff changeset
718 lbsr VrfRdd ;Actual read done here
boisy
parents:
diff changeset
719
boisy
parents:
diff changeset
720 VF1 puls x
boisy
parents:
diff changeset
721 stx PD.BUF,y ;Restore buffer pointer
boisy
parents:
diff changeset
722 bcs VRFXIT
boisy
parents:
diff changeset
723
boisy
parents:
diff changeset
724 * Look only at every 8th byte to speed up the verify
boisy
parents:
diff changeset
725 lda #(256/8) ;Iteration count
boisy
parents:
diff changeset
726 pshs u,y,a
boisy
parents:
diff changeset
727
boisy
parents:
diff changeset
728 leay vrfbuf,U ;Point at sector buffer
boisy
parents:
diff changeset
729 tfr x,u
boisy
parents:
diff changeset
730
boisy
parents:
diff changeset
731 * Compare the data read back to the data written
boisy
parents:
diff changeset
732 VRF1 ldx ,u
boisy
parents:
diff changeset
733 cmpx ,y
boisy
parents:
diff changeset
734 bne VRFERR
boisy
parents:
diff changeset
735
boisy
parents:
diff changeset
736 leau 8,u ;next byte
boisy
parents:
diff changeset
737 leay 8,y
boisy
parents:
diff changeset
738 dec ,s
boisy
parents:
diff changeset
739 bne VRF1
boisy
parents:
diff changeset
740
boisy
parents:
diff changeset
741 bra VRFOK
boisy
parents:
diff changeset
742
boisy
parents:
diff changeset
743 * Error exit
boisy
parents:
diff changeset
744 VRFERR orcc #$01
boisy
parents:
diff changeset
745
boisy
parents:
diff changeset
746 * Deallocate temporaries
boisy
parents:
diff changeset
747 VRFOK puls u,y,a
boisy
parents:
diff changeset
748
boisy
parents:
diff changeset
749 * Generic verify exit
boisy
parents:
diff changeset
750 VRFXIT puls a,b,x,PC
boisy
parents:
diff changeset
751
boisy
parents:
diff changeset
752 endc
boisy
parents:
diff changeset
753
boisy
parents:
diff changeset
754 page
boisy
parents:
diff changeset
755 *
boisy
parents:
diff changeset
756 * Set Status.
boisy
parents:
diff changeset
757 *
boisy
parents:
diff changeset
758 * Reg-Y has path descriptor, and Reg-A has status code.
boisy
parents:
diff changeset
759 *
boisy
parents:
diff changeset
760 SETSTA lbsr Semfor ;Wait, then select HD controller
boisy
parents:
diff changeset
761
boisy
parents:
diff changeset
762 ifne sizflg ;If drives can be different sizes,
boisy
parents:
diff changeset
763 lbsr PostIni
boisy
parents:
diff changeset
764 lbcs HDXIT
boisy
parents:
diff changeset
765 endc
boisy
parents:
diff changeset
766
boisy
parents:
diff changeset
767 lbsr SELDRV
boisy
parents:
diff changeset
768
boisy
parents:
diff changeset
769 ldx PD.RGS,y ;Point at register stack
boisy
parents:
diff changeset
770 ldb R$B,x ;Recover service code
boisy
parents:
diff changeset
771
boisy
parents:
diff changeset
772 cmpb #SS.Reset
boisy
parents:
diff changeset
773 bne SS1
boisy
parents:
diff changeset
774
boisy
parents:
diff changeset
775 lbsr SEEKT0
boisy
parents:
diff changeset
776 bra SSXIT
boisy
parents:
diff changeset
777
boisy
parents:
diff changeset
778 SS1 equ *
boisy
parents:
diff changeset
779
boisy
parents:
diff changeset
780 ifne fmtflg ;If hard formatting supported,
boisy
parents:
diff changeset
781 cmpb #SS.WTrk
boisy
parents:
diff changeset
782 bne SS2
boisy
parents:
diff changeset
783
boisy
parents:
diff changeset
784 bsr FmtTrk
boisy
parents:
diff changeset
785 bra SSXIT
boisy
parents:
diff changeset
786 endc
boisy
parents:
diff changeset
787
boisy
parents:
diff changeset
788 SS2 cmpb #SS.SQD
boisy
parents:
diff changeset
789 bne SS9
boisy
parents:
diff changeset
790
boisy
parents:
diff changeset
791 bsr PwrDwn
boisy
parents:
diff changeset
792 bra SSXIT
boisy
parents:
diff changeset
793
boisy
parents:
diff changeset
794 * Error - unrecognized SETSTA code
boisy
parents:
diff changeset
795
boisy
parents:
diff changeset
796 SS9 comb
boisy
parents:
diff changeset
797 ldb #E$UnkSvc
boisy
parents:
diff changeset
798
boisy
parents:
diff changeset
799 * Generic exit. Return error if carry set.
boisy
parents:
diff changeset
800
boisy
parents:
diff changeset
801 SSXIT lbcs HDXIT
boisy
parents:
diff changeset
802 lbra OKXIT
boisy
parents:
diff changeset
803
boisy
parents:
diff changeset
804 page
boisy
parents:
diff changeset
805 *
boisy
parents:
diff changeset
806 * Power-down (park) disk
boisy
parents:
diff changeset
807 *
boisy
parents:
diff changeset
808 PwrDwn equ *
boisy
parents:
diff changeset
809
boisy
parents:
diff changeset
810 * Get park LSN to B:X
boisy
parents:
diff changeset
811
boisy
parents:
diff changeset
812 ifne (Drives-1) ;If 2 drives,
boisy
parents:
diff changeset
813 lbsr GtPkLSN ;Call routine to get park LSN to B:X
boisy
parents:
diff changeset
814 else
boisy
parents:
diff changeset
815 ldb PRKLSN+0,U
boisy
parents:
diff changeset
816 ldx PRKLSN+1,U
boisy
parents:
diff changeset
817 endc
boisy
parents:
diff changeset
818
boisy
parents:
diff changeset
819 * Seek to this LSN
boisy
parents:
diff changeset
820
boisy
parents:
diff changeset
821 PwrDn2 lbsr SETUP
boisy
parents:
diff changeset
822 lbsr SEEK ;Park head at last track
boisy
parents:
diff changeset
823 rts
boisy
parents:
diff changeset
824
boisy
parents:
diff changeset
825 ifne fmtflg ;If hard format supported
boisy
parents:
diff changeset
826
boisy
parents:
diff changeset
827 *
boisy
parents:
diff changeset
828 * Format a track.
boisy
parents:
diff changeset
829 *
boisy
parents:
diff changeset
830 * Now we format one track at a time.
boisy
parents:
diff changeset
831 *
boisy
parents:
diff changeset
832 * At entry Reg-X points to the register packet,
boisy
parents:
diff changeset
833 * and Reg-Y points to the path descriptor
boisy
parents:
diff changeset
834 *
boisy
parents:
diff changeset
835 FmtTrk lda #$80 ;Disable hardware retries
boisy
parents:
diff changeset
836 sta RetryEn,U
boisy
parents:
diff changeset
837
boisy
parents:
diff changeset
838 ldd R$U,x ;Get track number -- must be zero.
boisy
parents:
diff changeset
839 cmpd #0
boisy
parents:
diff changeset
840 bne FMTXIT
boisy
parents:
diff changeset
841
boisy
parents:
diff changeset
842 ldd R$Y,x ;Check side/density -- MSB must be zero
boisy
parents:
diff changeset
843 cmpa #0
boisy
parents:
diff changeset
844 beq FMT1
boisy
parents:
diff changeset
845
boisy
parents:
diff changeset
846 * Ignore repeated calls, returning success
boisy
parents:
diff changeset
847 FMTXIT clrb
boisy
parents:
diff changeset
848 rts
boisy
parents:
diff changeset
849
boisy
parents:
diff changeset
850 * Perform the format if not write protected
boisy
parents:
diff changeset
851 FMT1 pshs u,y,x
boisy
parents:
diff changeset
852
boisy
parents:
diff changeset
853 * Proceed, disk not write protected
boisy
parents:
diff changeset
854 FMT11 equ *
boisy
parents:
diff changeset
855
boisy
parents:
diff changeset
856 * Set up reduced drive characteristics (only legal tracks)
boisy
parents:
diff changeset
857
boisy
parents:
diff changeset
858 lda #WX$XIN ;Bogus command to init. special parameters
boisy
parents:
diff changeset
859 lbsr CmExec
boisy
parents:
diff changeset
860 bcs FMTERR
boisy
parents:
diff changeset
861
boisy
parents:
diff changeset
862 * Initialize sector buffer
boisy
parents:
diff changeset
863
boisy
parents:
diff changeset
864 lda #WX$WBF
boisy
parents:
diff changeset
865 lbsr CmExec
boisy
parents:
diff changeset
866 bcs FMTERR
boisy
parents:
diff changeset
867
boisy
parents:
diff changeset
868 * Begin formatting at track 0
boisy
parents:
diff changeset
869
boisy
parents:
diff changeset
870 ldd #$C0FF ;Set initial cylinder to (-1)
boisy
parents:
diff changeset
871 std ERRHCYL,u
boisy
parents:
diff changeset
872
boisy
parents:
diff changeset
873 * Set up starting track for format
boisy
parents:
diff changeset
874
boisy
parents:
diff changeset
875 FMT2 ldd ERRHCYL,u ;Use last good cylinder
boisy
parents:
diff changeset
876 anda #%11000000
boisy
parents:
diff changeset
877 incb
boisy
parents:
diff changeset
878 bne FMT3
boisy
parents:
diff changeset
879 adda #%01000000
boisy
parents:
diff changeset
880 FMT3 std hicyl,U ; (set track number, sector 0)
boisy
parents:
diff changeset
881
boisy
parents:
diff changeset
882 * clr lowcyl,u ;Clear LOWCYL
boisy
parents:
diff changeset
883 * clr hicyl,u ;Clear HICYL (and sector #)
boisy
parents:
diff changeset
884
boisy
parents:
diff changeset
885 ifne (Drives-1) ;If multiple drives,
boisy
parents:
diff changeset
886 lda PD.DRV,Y ;Set up drive #
boisy
parents:
diff changeset
887 ldb #32
boisy
parents:
diff changeset
888 mul
boisy
parents:
diff changeset
889 stb sdhreg,u ;Select correct drive, clear head number
boisy
parents:
diff changeset
890 else
boisy
parents:
diff changeset
891 clr sdhreg,u
boisy
parents:
diff changeset
892 endc
boisy
parents:
diff changeset
893
boisy
parents:
diff changeset
894 lda PD.ILV,Y ;Set interleave factor
boisy
parents:
diff changeset
895 lsra ; / 2 since physical sectors are 2X
boisy
parents:
diff changeset
896 sta seccnt,u
boisy
parents:
diff changeset
897
boisy
parents:
diff changeset
898 lda #WX$FMT ;Command to FORMAT ENTIRE DRIVE
boisy
parents:
diff changeset
899 * lda #WX$FTK ;Command to FORMAT TRACK
boisy
parents:
diff changeset
900 lbsr CmExec
boisy
parents:
diff changeset
901 bcs FMT2 ;Try next track if error
boisy
parents:
diff changeset
902
boisy
parents:
diff changeset
903 * Return error code in B, C set or no error, C clear
boisy
parents:
diff changeset
904
boisy
parents:
diff changeset
905 FMTERR pshs b,cc ;Stack error status
boisy
parents:
diff changeset
906
boisy
parents:
diff changeset
907 * Set up correct drive characteristics (park track allowed)
boisy
parents:
diff changeset
908
boisy
parents:
diff changeset
909 lda #WX$INI ;Init. original parameters
boisy
parents:
diff changeset
910 lbsr CmExec
boisy
parents:
diff changeset
911
boisy
parents:
diff changeset
912 * Get back error status
boisy
parents:
diff changeset
913
boisy
parents:
diff changeset
914 puls cc,b
boisy
parents:
diff changeset
915
boisy
parents:
diff changeset
916 * End of format routine
boisy
parents:
diff changeset
917
boisy
parents:
diff changeset
918 FMTEND puls x,y,u,PC
boisy
parents:
diff changeset
919
boisy
parents:
diff changeset
920 endc
boisy
parents:
diff changeset
921
boisy
parents:
diff changeset
922 *
boisy
parents:
diff changeset
923 * End of main line of XTOS9.SRC.
boisy
parents:
diff changeset
924 * "USE" files follow.
boisy
parents:
diff changeset
925 *
boisy
parents:
diff changeset
926
boisy
parents:
diff changeset
927 page
boisy
parents:
diff changeset
928 *
boisy
parents:
diff changeset
929 * Include routines to issue command to controller
boisy
parents:
diff changeset
930 * and return completion status.
boisy
parents:
diff changeset
931 *
boisy
parents:
diff changeset
932
boisy
parents:
diff changeset
933 use hdcmd.src
boisy
parents:
diff changeset
934
boisy
parents:
diff changeset
935 page
boisy
parents:
diff changeset
936 *
boisy
parents:
diff changeset
937 * Include routines to translate LSN & drive #
boisy
parents:
diff changeset
938 * to a controller task file.
boisy
parents:
diff changeset
939 *
boisy
parents:
diff changeset
940
boisy
parents:
diff changeset
941 use hdmath.src
boisy
parents:
diff changeset
942
boisy
parents:
diff changeset
943 page
boisy
parents:
diff changeset
944 *
boisy
parents:
diff changeset
945 * Include utility routines.
boisy
parents:
diff changeset
946 *
boisy
parents:
diff changeset
947
boisy
parents:
diff changeset
948 use hdutil3.src
boisy
parents:
diff changeset
949
boisy
parents:
diff changeset
950 emod
boisy
parents:
diff changeset
951 cchend equ *
boisy
parents:
diff changeset
952
boisy
parents:
diff changeset
953 end