Mercurial > hg > Members > kono > nitros9-code
annotate level1/modules/rb1773.asm @ 1581:c35df03d98db
IRQ properly deleted
author | boisy |
---|---|
date | Fri, 21 May 2004 03:18:56 +0000 |
parents | 1a19aed5dc34 |
children | dc3272e71faa |
rev | line source |
---|---|
1570 | 1 ******************************************************************** |
2 * rb1773 - Western Digital 1773 Disk Controller Driver | |
3 * | |
4 * A lot of references to **.CYL or <u00B6 using 16 bit registers can be | |
5 * changed to 8 bit registers with a +1 offset, since track #'s >255 are | |
6 * ignored | |
7 * | |
8 * NOTE: 512 bytes is reserved as a physical sector buffer. Any reads/ | |
9 * writes are done from this buffer to the controller. Copies of the 256 | |
10 * byte chunk needed are done by a block memory move | |
1581 | 11 * |
12 * Disto Super Controller II Registers: | |
13 * | |
14 * $FF74 RW.Dat --- R/W Buffer data #1 | |
15 * $FF75 mirror of $FF74 | |
16 * $FF76 RW.Ctrl --- Write D0 = 0 FDC Write Op #2 | |
17 * = 1 FDC Read Op #2 | |
18 * D1 = 0 Normal Mode | |
19 * = 1 Buffered I/O Mode | |
20 * D2 = 0 Normal NMI | |
21 * = 1 Masked NMI | |
22 * D3 = 0 No FIRQ (Masked) | |
23 * = 1 Enabled FIRQ | |
24 * Read D7 = FDC INT Status (Inverted) | |
25 * $FF77 mirror of $FF76 | |
26 * #1: any write to $FF76-$FF77 clears Buffer counter | |
27 * #2: in buffered mode only | |
28 * | |
1570 | 29 * $Id$ |
30 * | |
31 * Edt/Rev YYYY/MM/DD Modified by | |
32 * Comment | |
33 * ------------------------------------------------------------------ | |
34 * 11 1993/05/12 ??? | |
35 * Special opts for TC9 to slow controller reads and writes TFM's | |
36 * between sector buffers & in drive table init/copies. | |
37 * Changed software timing loop (drive spin-up) to F$Sleep for 32 ticks | |
38 * Shrunk (slowed slightly) error returns | |
39 * Added blobstop code | |
40 * | |
41 * 11r1 2003/09/03 Boisy G. Pitre | |
42 * Added code to sense if HW is present or not and return error if not. | |
1581 | 43 * |
44 * 1r0 2004/05/20 Boisy G. Pitre | |
45 * Restarted edition due to name change; backported to Level 1 | |
1570 | 46 |
47 nam rb1773 | |
48 ttl Western Digital 1773 Disk Controller Driver | |
49 | |
50 IFP1 | |
51 use defsfile | |
52 ENDC | |
53 | |
54 tylg set Drivr+Objct | |
55 atrv set ReEnt+rev | |
1581 | 56 rev set $00 |
57 edition set 1 | |
1570 | 58 |
59 * Configuration Settings | |
1578 | 60 N.Drives equ 4 number of drives to support |
1570 | 61 TC9 equ 0 Set to 1 for TC9 special slowdowns |
62 PRECOMP equ 0 Set to 1 to turn on write precompensation | |
63 | |
64 * WD-17X3 Definitions | |
1578 | 65 CtrlReg equ $00 Control register for Tandy controllers; not part of WD |
1570 | 66 WD_Cmd equ $08 |
67 WD_Stat equ WD_Cmd | |
68 WD_Trak equ $09 | |
69 WD_Sect equ $0A | |
70 WD_Data equ $0B | |
71 | |
1581 | 72 * WD-17X3 Commands |
73 S$FrcInt equ $D0 | |
74 | |
1578 | 75 * Control Register Definitions |
76 C_HALT equ %10000000 Halt line to CPU is active when set | |
77 C_SIDSEL equ %01000000 Side select (0 = front side, 1 = back side) | |
78 C_DBLDNS equ %00100000 Density (0 = single, 1 = double) | |
79 C_WPRCMP equ %00010000 Write precompensation (0 = off, 1 = on) | |
80 C_MOTOR equ %00001000 Drive motor (0 = off, 1 = on) | |
81 C_DRV2 equ %00000100 Drive 2 selected when set | |
82 C_DRV1 equ %00000010 Drive 1 selected when set | |
83 C_DRV0 equ %00000001 Drive 0 selected when set | |
84 | |
1570 | 85 mod eom,name,tylg,atrv,start,size |
86 | |
87 u0000 rmb DRVBEG+(DRVMEM*N.Drives) | |
88 u00A7 rmb 2 Last drive table accessed (ptr) | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
89 CtlImg rmb 1 Bit mask for control reg (drive #, side,etc) |
1570 | 90 u00AA rmb 1 |
91 sectbuf rmb 2 Ptr to 512 byte sector buffer | |
92 u00AD rmb 1 | |
93 u00AE rmb 1 | |
94 FBlock rmb 2 block number for format | |
95 IFGT Level-1 | |
96 FTask rmb 1 task number for format | |
97 ENDC | |
1581 | 98 VIRQPak rmb 2 Vi.Cnt word for VIRQ |
1570 | 99 u00B3 rmb 2 Vi.Rst word for VIRQ |
100 u00B5 rmb 1 Vi.Stat byte for VIRQ (drive motor timeout) | |
1581 | 101 loglsn rmb 2 OS9's logical sector # |
102 physlsn rmb 1 PCDOS (512 byte sector) sector # | |
1570 | 103 size equ . |
104 | |
105 fcb DIR.+SHARE.+PEXEC.+PWRIT.+PREAD.+EXEC.+UPDAT. | |
106 | |
1574 | 107 name fcs /rb1773/ |
1570 | 108 fcb edition |
109 | |
1581 | 110 VIRQCnt fdb TkPerSec*4 Initial count for VIRQ (4 seconds) |
1570 | 111 |
112 IRQPkt fcb $00 Normal bits (flip byte) | |
113 fcb $01 Bit 1 is interrupt request flag (Mask byte) | |
114 fcb 10 Priority byte | |
115 | |
116 * Init | |
117 * | |
118 * Entry: | |
119 * Y = address of device descriptor | |
120 * U = address of device memory area | |
121 * | |
122 * Exit: | |
123 * CC = carry set on error | |
124 * B = error code | |
125 * | |
126 * New code added 09/03/2003 by Boisy G. Pitre | |
127 * Write a pattern to $FF4B and read it back to verify that the hardware | |
128 * does exist. | |
129 Init ldx V.PORT,u get Base port address | |
130 lda WD_Data,x get byte at FDC Data register | |
131 coma complement it to modify it | |
132 sta WD_Data,x write it | |
133 clrb | |
134 Init2 decb delay a bit... | |
135 bmi Init2 | |
136 suba WD_Data,x read it back | |
137 lbne NoHW if not zero, we didn't read what we wrote | |
138 ** | |
139 IFEQ Level-1 | |
140 clr >D.DskTmr flag drive motor as not running | |
141 ELSE | |
142 clr <D.MotOn flag drive motor as not running | |
143 ENDC | |
144 leax WD_Stat,x point to Status/Command register | |
1581 | 145 lda #S$FrcInt "Force Interrupt" command |
1570 | 146 sta ,x send to FDC |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
147 lbsr FDCDelay time delay for ~ 108 cycles |
1570 | 148 lda ,x eat status register |
149 ldd #$FF*256+N.Drives 'invalid' value & # of drives | |
1581 | 150 sta >physlsn,u set 512 byte sector # to bogus value |
151 sta >physlsn+1,u | |
1570 | 152 leax DRVBEG,u point to start of drive tables |
1581 | 153 l@ sta ,x DD.TOT MSB to bogus value |
1570 | 154 sta <V.TRAK,x init current track # to bogus value |
155 leax <DRVMEM,x point to next drive table | |
1581 | 156 decb done all drives yet? |
157 bne l@ no, init them all | |
1570 | 158 leax >NMISvc,pc point to NMI service routine |
159 IFGT Level-1 | |
160 stx <D.NMI install as system NMI | |
161 ELSE | |
162 stx >D.XNMI+1 NMI jump vector operand | |
163 lda #$7E JMP code | |
164 sta >D.XNMI NMI jump vector opcode | |
165 ENDC | |
166 pshs y save device dsc. ptr | |
167 leay >u00B5,u point to Vi.Stat in VIRQ packet | |
168 tfr y,d make it the status register ptr for IRQ | |
169 leay >IRQSvc,pc point to IRQ service routine | |
170 leax >IRQPkt,pc point to IRQ packet | |
171 os9 F$IRQ install IRQ | |
172 puls y Get back device dsc. ptr | |
173 bcs Return If we can't install IRQ, exit | |
1581 | 174 IFNE SCII |
175 lda MPI.Slct | |
176 sta mpislot,u | |
177 ldd #RW.Ctrl | |
178 leay SC2vec,pcr | |
179 os9 F$IRQ | |
180 bcs Return | |
181 pshs cc | |
182 orcc #IntMasks | |
183 lda $FF23 | |
184 * disable FIRQ from cart. set flag on falling edge of CART | |
185 anda #$FC | |
186 sta $FF23 | |
187 lda $FF22 | |
188 lda D.IRQER | |
189 ora #1 enable CART IRQ | |
190 sta D.IRQER .. save in IRQENR shadow | |
191 sta IRQENR .. and actual register | |
192 puls cc | |
193 ENDC | |
1570 | 194 ldd #512 Request 512 byte sector buffer |
195 pshs u Preserve device mem ptr | |
196 os9 F$SRqMem Request sector buffer | |
197 tfr u,x Move ptr to sector buffer to x | |
198 puls u Restore device mem ptr | |
199 bcs Return If error, exit with it | |
200 stx >sectbuf,u Save ptr to sector buffer | |
201 | |
202 * GetStat | |
203 * | |
204 * Entry: | |
205 * A = function code | |
206 * Y = address of path descriptor | |
207 * U = address of device memory area | |
208 * | |
209 * Exit: | |
210 * CC = carry set on error | |
211 * B = error code | |
212 * | |
213 GetStat clrb no GetStt calls - return, no error, ignore | |
214 Return rts | |
215 | |
216 * Term | |
217 * | |
218 * Entry: | |
219 * U = address of device memory area | |
220 * | |
221 * Exit: | |
222 * CC = carry set on error | |
223 * B = error code | |
224 * | |
1581 | 225 Term leay >VIRQPak,u Point to VIRQ packet |
1570 | 226 IFNE H6309 |
227 tfr 0,x "remove" | |
228 ELSE | |
229 ldx #$0000 | |
230 ENDC | |
231 os9 F$VIRQ Remove VIRQ | |
232 IFNE H6309 | |
233 tfr 0,x "remove" | |
234 ELSE | |
235 ldx #$0000 | |
236 ENDC | |
1581 | 237 leay >IRQSvc,pc point to IRQ service routine |
1570 | 238 os9 F$IRQ Remove IRQ |
1581 | 239 IFNE SCII |
240 IFNE H6309 | |
241 tfr 0,x "remove" | |
242 ELSE | |
243 ldx #$0000 | |
244 ENDC | |
245 leay SC2vec,pcr | |
246 os9 F$IRQ Remove IRQ | |
247 ENDC | |
1570 | 248 pshs u Save device mem ptr |
249 ldu >sectbuf,u Get pointer to sector buffer | |
250 ldd #512 Return sector buffer memory | |
251 os9 F$SRtMem | |
252 puls u Restore device mem ptr | |
1578 | 253 clr >DPort+CtrlReg shut off drive motors |
1570 | 254 IFEQ Level-1 |
255 clr >D.DskTmr Clear out drive motor timeout flag | |
256 ELSE | |
257 clr <D.MotOn Clear out drive motor timeout flag | |
258 ENDC | |
1581 | 259 ex rts return |
1570 | 260 |
261 * Check if 512 byte sector conversion needed | |
262 * Entry: B:X=LSN | |
263 * U=Static mem ptr | |
264 * Y=Path dsc. ptr | |
265 * Exit: X=New LSN (same as original for 256 byte sectors, 1/2 of original | |
266 * for 512 byte sectors | |
1581 | 267 Chk512 pshs x,b save LSN |
268 stx >loglsn,u save OS9 LSN | |
269 lda <PD.TYP,y get device type from path dsc. | |
270 anda #%00000100 mask out all but 512 byte sector flag | |
271 bne Log2Phys 512 byte sectors, go process | |
272 L00CA puls pc,x,b restore LSN & return | |
1570 | 273 * 512 byte sector processing goes here |
1581 | 274 Log2Phys puls x,b Get back LSN |
1570 | 275 clrb Clear carry for rotate (also high byte of LSN) |
276 tfr x,d Move to mathable register | |
277 IFNE H6309 | |
278 rord Divide LSN by 2 | |
279 ELSE | |
280 rora | |
281 rorb | |
282 ENDC | |
283 tfr d,x Move new LSN back to X | |
1581 | 284 stx >physlsn,u Save 'physical' LSN (for controller) |
1570 | 285 clrb No error & return |
286 rts | |
287 | |
288 start lbra Init | |
289 bra Read | |
290 nop | |
291 lbra Write | |
292 bra GetStat | |
293 nop | |
294 lbra SetStat | |
295 bra Term | |
296 nop | |
297 | |
298 * Read | |
299 * | |
300 * Entry: | |
301 * B = MSB of LSN | |
302 * X = LSB of LSN | |
303 * Y = address of path descriptor | |
304 * U = address of device memory area | |
305 * | |
306 * Exit: | |
307 * CC = carry set on error | |
308 * B = error code | |
309 * | |
1581 | 310 Read bsr Chk512 go check for 512 byte sector/adjust if needed |
311 lda #%10010001 error flags (see Disto SCII source) | |
312 pshs x preserve sector # | |
313 lbsr L0162 go read the sector | |
314 puls x restore sector # | |
315 bcs ex if error, exit | |
316 pshs y,x save path dsc ptr & LSN | |
1570 | 317 leax ,x LSN0? |
1581 | 318 bne L012D no, go calculate normally |
319 puls y,x yes, restore path dsc ptr & LSN | |
320 lda <PD.TYP,y get type from path dsc. | |
321 bita #TYP.NSF standard OS-9 format? | |
322 beq L00F0 yes, skip ahead | |
1570 | 323 lbsr L051A |
324 pshs y,x save path dsc ptr | |
325 bra L012D | |
326 | |
327 * LSN0, standard OS-9 format | |
328 L00F0 ldx >sectbuf,u Get ptr to sector buffer | |
329 pshs y,x Preserve path dsc. ptr & sector buffer ptr | |
330 ldy >u00A7,u Get last drive table accessed ptr | |
331 IFNE H6309 | |
332 ldw #DD.SIZ # bytes to copy from new LSN0 to drive table | |
333 tfm x+,y+ Copy them | |
334 ELSE | |
335 ldb #DD.SIZ | |
336 L00F0Lp lda ,x+ | |
337 sta ,y+ | |
338 decb | |
339 bne L00F0Lp | |
340 ENDC | |
341 ldy >u00A7,u Get drive table ptr back | |
342 lda <DD.FMT,y Get format for disk in drive | |
343 ldy 2,s restore path descriptor pointer | |
344 ldb <PD.DNS,y Get path's density settings | |
345 bita #FMT.DNS Disk in drive double density? | |
346 beq L0115 No, all drives can read single, skip ahead | |
347 bitb #DNS.MFM Can our path dsc. handle double density? | |
348 beq erbtyp No, illegal | |
349 L0115 bita #FMT.TDNS Is new disk 96 tpi? | |
350 beq L011D No, all drives handle 48 tpi, so skip ahead | |
351 bitb #DNS.DTD Can path dsc. handle 96 tpi? | |
352 beq erbtyp No, illegal | |
353 L011D bita #FMT.SIDE Is new disk double sided? | |
354 beq L0128 No, all drives handle single sided, we're done | |
355 lda <PD.SID,y Get # sides path dsc. can handle | |
356 suba #2 sides higher or equal to 2? | |
357 blo erbtyp Yes, exit with illegal type error | |
358 L0128 clrb No error | |
359 * puls y,x ??? 2 USELESS LINES? | |
360 * pshs y,x | |
361 * LSN's other than 0 come straight here | |
362 L012D ldy 2,s Get path dsc. ptr back?? | |
363 ldx PD.BUF,y Get path dsc. buffer ptr | |
364 lda <PD.TYP,y Get path dsc. disk type | |
365 ldy >sectbuf,u Get ptr to sector buffer | |
366 IFNE H6309 | |
367 ldw #256 OS9 sector size (even if physical was 512) | |
368 ENDC | |
369 anda #%00000100 Mask out all but 512 byte sector flag | |
370 beq L014B If normal sector, just copy it | |
1581 | 371 ldd >loglsn,u Get OS9's LSN (twice of the 'real' 512 sector) |
1570 | 372 andb #$01 Mask out all but odd/even sector indicator |
373 beq L014B Even, use 1st half of 512 byte sector | |
374 IFNE H6309 | |
375 addr w,y Odd, bump sector buffer ptr to 2nd half | |
376 ELSE | |
377 leay 256,y | |
378 ENDC | |
379 L014B equ * | |
380 IFNE H6309 | |
381 tfm y+,x+ Copy from physical sector buffer to PD buffer | |
382 puls pc,y,x restore path dsc & sector buffer ptrs & return | |
383 ELSE | |
384 pshs d | |
385 clrb | |
386 L014BLp lda ,y+ | |
387 sta ,x+ | |
388 decb | |
389 bne L014BLp | |
390 puls pc,y,x,d restore path dsc & sector buffer ptrs & return | |
391 ENDC | |
392 | |
393 erbtyp comb | |
394 ldb #E$BTyp Error - wrong type error | |
395 puls pc,y,x | |
396 | |
397 * Read error - retry handler | |
398 L0159 bcc L0162 Normal retry, try reading again | |
399 pshs x,d Preserve regs | |
400 lbsr sktrk0 Seek to track 0 (attempt to recalibrate) | |
401 puls x,d Restore regs & try reading again | |
402 | |
403 L0162 pshs x,d Preserve regs | |
404 bsr L016F Go read sector | |
405 puls x,d Restore regs (A=retry flags) | |
406 bcc L01D7 No error, return | |
407 lsra Shift retry flags | |
408 bne L0159 Still more retries allowed, go do them | |
409 * otherwise, final try before we give up | |
410 L016F lbsr L02AC Do double-step/precomp etc. if needed, seek | |
411 bcs L01D7 Error somewhere, exit with it | |
412 L0176 ldx >sectbuf,u Get physical sector buffer ptr | |
413 * pshs y,cc Preserve timeout timer & CC | |
414 ldb #$80 Read sector command | |
415 bsr L01A1 Send to controller & time delay to let it settle | |
416 *** Next few lines are commented out for blobstop patches | |
417 *L0180 bita >DPort+WD_Stat check status register | |
418 * bne L0197 eat it & start reading sector | |
419 * leay -1,y bump timeout timer down | |
420 * bne L0180 keep trying until it reaches 0 or sector read | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
421 * lda >CtlImg,u get current drive settings |
1578 | 422 * ora #C_MOTOR turn drive motor on |
423 * sta >DPort+CtrlReg send to controller | |
1570 | 424 * puls y,cc restore regs |
425 * lbra L03E0 exit with Read Error | |
426 *** Blobstop fixes | |
1578 | 427 stb >DPort+CtrlReg send B to control register |
1570 | 428 nop allow HALT to take effect |
429 nop | |
430 bra L0197 and a bit more time | |
431 * Read loop - exited with NMI | |
432 * Entry: X=ptr to sector buffer | |
433 * B=Control register settings | |
434 L0197 lda >DPort+WD_Data get byte from controller | |
435 sta ,x+ store into sector buffer | |
1578 | 436 * stb >DPort+CtrlReg drive info |
1570 | 437 nop -- blobstop fix |
438 bra L0197 Keep reading until sector done | |
439 | |
440 L01A1 orcc #IntMasks Shut off IRQ & FIRQ | |
441 stb >DPort+WD_Cmd Send command | |
442 * ldy #$FFFF | |
1578 | 443 ldb #C_DBLDNS+C_MOTOR Double density & motor on |
444 * ldb #%00101000 Double density & motor on | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
445 orb >CtlImg,u Merge with current drive settings |
1578 | 446 stb >DPort+CtrlReg Send to control register |
447 ldb #C_HALT+C_DBLDNS+C_MOTOR Enable halt, double density & motor on | |
448 * ldb #%10101000 Enable halt, double density & motor on | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
449 orb >CtlImg,u Merge that with current drive settings |
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
450 lbra FDCDelay Time delay to wait for command to settle |
1570 | 451 * lda #$02 |
452 *L01BE rts | |
453 | |
454 * Write | |
455 * | |
456 * Entry: | |
457 * B = MSB of LSN | |
458 * X = LSB of LSN | |
459 * Y = address of path descriptor | |
460 * U = address of device memory area | |
461 * | |
462 * Exit: | |
463 * CC = carry set on error | |
464 * B = error code | |
465 * | |
1581 | 466 Write lbsr Chk512 go adjust LSN for 512 byte sector if needed |
467 lda #%1001001 retry flags for I/O errors (see Disto SCII source) | |
468 L01C4 pshs x,d preserve LSN, retries | |
469 bsr L01E8 go write the sector | |
470 puls x,d restore LSN, retries | |
471 bcs L01D8 error writing, go to write retry handler | |
472 tst <PD.VFY,y no error, do we want physical verify? | |
473 bne L01D6 no, exit without error | |
474 lbsr verify go re-read & verify 32 out of 256 bytes | |
475 bcs L01D8 error on verify, go to write retry handler | |
476 L01D6 clrb no error & return | |
1570 | 477 L01D7 rts |
478 | |
479 * Write error retry handler | |
480 L01D8 lsra Shift retry flags | |
481 lbeq L03AF Too many retries, exit with error | |
482 bcc L01C4 Normal retry, attemp to re-write sector | |
483 pshs x,d Preserve flags & sector # | |
484 lbsr sktrk0 Seek to track 0 (attempt to recalibrate) | |
485 puls x,d Restore flags & sector # | |
486 bra L01C4 Try re-writing now | |
487 | |
488 * 512 byte sector write here | |
489 L01E8 lbsr L02AC Go do double-step/write precomp if needed | |
490 bcs L01D7 Error, exit with it | |
491 pshs y,d Preserve path dsc. ptr & LSN | |
492 lda <PD.TYP,y Get device type | |
493 anda #%00000100 512 byte sector? | |
494 beq L020D No, skip ahead | |
495 lda #$91 ??? appears to be useless | |
496 lbsr L0176 Go read the sector in | |
1581 | 497 ldd >loglsn,u Get OS9 LSN |
1570 | 498 andb #$01 Even or odd? |
499 beq L020D Even, skip ahead | |
500 ldx >sectbuf,u Get physical sector buffer ptr | |
501 leax >$0100,x Point to 2nd half | |
502 bra L0211 Copy caller's buffer to 2nd half of sector | |
503 | |
504 L020D ldx >sectbuf,u Get physical sector buffer ptr | |
505 | |
506 L0211 ldy PD.BUF,y Get path dsc. buffer ptr | |
507 IFNE H6309 | |
508 ldw #256 Copy write buffer to sector buffer | |
509 tfm y+,x+ | |
510 ELSE | |
511 clrb | |
512 L0211Lp lda ,y+ | |
513 sta ,x+ | |
514 decb | |
515 bne L0211Lp | |
516 ENDC | |
517 puls y,d Get path dsc. ptr & LSN back | |
518 ldx >sectbuf,u Get physical sector buffer ptr again | |
519 ldb #$A0 Write sector command | |
520 | |
521 * Format track comes here with B=$F0 (write track) | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
522 *WrTrk pshs y,cc Preserve path dsc. ptr & CC |
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
523 WrTrk lbsr L01A1 Send command to controller (including delay) |
1570 | 524 *** Commented out for blobstop fixes |
525 *L0229 bita >DPort+WD_Stat Controller done yet? | |
526 * bne L0240 Yes, go write sector out | |
527 * leay -$01,y No, bump wait counter | |
528 * bne L0229 Still more tries, continue | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
529 * lda >CtlImg,u Get current drive control register settings |
1578 | 530 * ora #C_MOTOR Drive motor on (but drive select off) |
531 * sta >DPort+CtrlReg Send to controller | |
1570 | 532 * puls y,cc Restore regs |
533 * lbra L03AF Check for errors from status register | |
534 | |
535 IFGT Level-1 | |
536 *** added blobstop | |
537 lda FBlock+1,u get the block number for format | |
538 beq L0230 if not format, don't do anything | |
539 sta >$FFA1 otherwise map the block in | |
540 ENDC | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
541 L0230 stb >DPort+CtrlReg send data to control register |
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
542 bra L0240 wait a bit for HALT to enable |
1570 | 543 |
544 * Write sector routine (Entry: B= drive/side select) (NMI will break out) | |
545 L0240 nop --- wait a bit more | |
546 lda ,x+ Get byte from write buffer | |
547 sta >DPort+WD_Data Save to FDC's data register | |
548 * EAT 2 CYCLES: TC9 ONLY (TRY 1 CYCLE AND SEE HOW IT WORKS) | |
549 IFEQ TC9-1 | |
550 nop | |
551 nop | |
552 ENDC | |
1578 | 553 * stb >DPort+CtrlReg Set up to read next byte |
1570 | 554 bra L0240 Go read it |
555 | |
556 * NMI routine | |
557 NMISvc leas R$Size,s Eat register stack | |
558 * puls y,cc Get path dsc. ptr & CC | |
559 IFGT Level-1 | |
560 ldx <D.SysDAT get pointer to system DAT image | |
561 lda 3,x get block number 1 | |
562 sta >$FFA1 map it back into memory | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
563 ENDC |
1570 | 564 andcc #^IntMasks turn IRQ's on again |
565 ldb >DPort+WD_Stat Get status register | |
566 bitb #%00000100 Did we lose data in the transfer? | |
567 * lbne L03E0 Yes, exit with Read Error | |
568 lbeq L03B2 Otherwise, check for drive errors | |
569 comb -- blobstop error code | |
570 ldb #E$DevBsy -- device busy | |
571 rts -- and exit | |
572 | |
573 verify pshs x,d | |
574 ldx PD.BUF,y Get write buffer ptr | |
575 pshs x Preserve it | |
576 ldx >sectbuf,u Get sector buffer ptr | |
577 stx PD.BUF,y Save as write buffer ptr | |
578 ldx 4,s | |
579 lbsr L016F Go read sector we just wrote | |
580 puls x Get original write buffer ptr | |
581 stx PD.BUF,y Restore path dsc. version | |
582 bcs L02A3 If error reading, exit with it | |
583 pshs u,y Preserve device mem, path dsc. ptrs | |
584 ldb <PD.TYP,y Get type from path dsc. | |
585 ldy >sectbuf,u Get sector buffer ptr | |
586 andb #%00000100 512 byte sector? | |
587 beq L028D No, skip ahead | |
1581 | 588 ldd >loglsn,u Get OS9's sector # |
1570 | 589 andb #$01 Odd/even sector? |
590 beq L028D Even; compare first half | |
591 leay >$0100,y Odd, compare second half | |
592 L028D tfr x,u Move PD.BUF ptr to U (since cmpx is faster) | |
593 lda #32 # of 'spotty' checks to do | |
594 L028F ldx ,u Get 2 bytes from original write buffer | |
595 cmpx ,y Same as corresponding bytes in re-read sector? | |
596 bne L029F No, error & return | |
597 leau 8,u Skip next 6 bytes | |
598 leay 8,y | |
599 deca Done our 'spotty' check? | |
600 bne L028F No, continue | |
601 fcb $8C skip the next 2 bytes | |
602 | |
603 L029F orcc #Carry | |
604 L02A1 puls u,y | |
605 L02A3 puls pc,x,d | |
606 | |
607 L02A5 pshs a Save Caller's track # | |
608 ldb <V.TRAK,x Get track # drive is currently on | |
609 bra L02E9 Go save it to controller & continue | |
610 | |
611 L02AC lbsr L0376 Go set up controller for drive, spin motor up | |
612 bsr L032B Get track/sector # (A=Trk, B=Sector) | |
613 pshs a Save track # | |
614 lda >u00AD,u Get side 1/2 flag | |
615 beq L02C4 Side 1, skip ahead | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
616 lda >CtlImg,u Get control register settings |
1578 | 617 ora #C_SIDSEL Set side 2 (drive 3) select |
618 * ora #%01000000 Set side 2 (drive 3) select | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
619 sta >CtlImg,u Save it back |
1570 | 620 L02C4 lda <PD.TYP,y Get drive type settings |
621 bita #%00000010 ??? (Base 0/1 for sector #?) | |
622 bne L02CC Skip ahead | |
623 incb Bump sector # up by 1 | |
624 L02CC stb >DPort+WD_Sect Save into Sector register | |
625 ldx >u00A7,u Get last drive table accessed | |
626 ldb <V.TRAK,x Get current track # on device | |
627 lda <DD.FMT,x Get drive format specs | |
628 lsra Shift track & bit densities to match PD | |
629 eora <PD.DNS,y Check for differences with path densities | |
630 anda #%00000010 Keep only 48/96 tpi differences | |
631 pshs a Save differences | |
632 lda 1,s Get track # back | |
633 tst ,s+ Are tpi's different? | |
634 beq L02E9 No, continue normally | |
635 lsla Yes, multiply track # by 2 ('double-step') | |
636 lslb Multiply current track # by 2 ('double-step') | |
637 L02E9 stb >DPort+WD_Trak Save current track # onto controller | |
638 | |
639 * From here to the line before L0307 is for write precomp, but is not used. | |
640 * Unless write precomp is needed, all of this is useless | |
641 * I think most (if not all) drives do NOT need precomp | |
642 IFEQ PRECOMP-1 | |
643 ldb #21 Pre-comp track # | |
644 pshs b Save it | |
645 ldb <PD.DNS,y Get current density settings | |
646 andb #%00000010 Just want to check track density | |
647 beq L02F9 48 tpi, skip ahead | |
648 lsl ,s Multiply pre-comp value by 2 ('double-step') | |
649 L02F9 cmpa ,s+ Is track # high enough to warrant precomp? | |
650 bls L0307 No, continue normally | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
651 ldb >CtlImg,u |
1578 | 652 orb #C_WRPCMP Turn on Write precomp |
653 * orb #%00010000 Turn on Write precomp | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
654 stb >CtlImg,u |
1570 | 655 ENDC |
656 | |
657 L0307 ldb >u00AA,u ??? Get flag (same drive flag?) | |
658 bne L0314 no, skip ahead | |
659 ldb ,s get track # | |
660 cmpb <V.TRAK,x same as current track on this drive? | |
661 beq L0321 yes, skip ahead | |
662 L0314 sta >DPort+WD_Data save track # to data register | |
663 ldb <PD.STP,y get stepping rate | |
664 andb #%00000011 just keep usable settings (6-30 ms) | |
665 eorb #%00011011 set proper bits for controller | |
666 lbsr L03E4 send command to controller & time delay | |
667 L0321 puls a get track # back | |
668 sta <V.TRAK,x save as current track # | |
669 sta >DPort+WD_Trak save to controller | |
670 clrb no error & return | |
671 rts | |
672 | |
673 * Entry: B:X LSN | |
674 * Exit: A=Track # | |
675 * B=Sector # | |
676 * <u00AD=00 = Head 1 , $FF = Head 2 | |
677 L032B tstb Sector # > 65535? | |
678 bne L033F Yes, illegal for floppy | |
679 tfr x,d Move sector # to D | |
680 leax ,x LSN 0? | |
681 beq L0371 Yes, exit this routine | |
682 ldx >u00A7,u Get previous drive table ptr | |
683 cmpd DD.TOT+1,x Within range of drive spec? | |
684 blo L0343 Yes, go calculate track/sector #'s | |
685 L033F comb Exit with Bad sector # error | |
686 ldb #E$Sect | |
687 rts | |
688 | |
689 * Calculate track/sector #'s? | |
690 L0343 stb >u00AE,u Save LSB of LSN | |
691 clr ,-s Clear track # on stack | |
692 ldb <DD.FMT,x Get drive format | |
693 lsrb Shift out # sides into carry | |
694 ldb >u00AE,u Get LSB of LSN again | |
695 bcc L0367 Single sided drive, skip ahead | |
696 bra L035D Double sided drive, skip ahead | |
697 * Double sided drive handling here | |
698 L0355 com >u00AD,u ???? Odd/even sector track flag? | |
699 bne L035D Odd, so don't bump track # up | |
700 inc ,s Bump up track # | |
701 | |
702 L035D subb DD.TKS,x Subtract # sectors/track | |
703 sbca #$00 | |
704 bcc L0355 Still more sectors left, continue | |
705 bra L036D Wrapped, skip ahead | |
706 * Single sided drive handling here | |
707 L0365 inc ,s Bump track # up | |
708 | |
709 L0367 subb DD.TKS,x Subtract # sectors/track | |
710 sbca #$00 | |
711 bcc L0365 Still more, go bump the track up | |
712 L036D addb $03,x Bump sector # back up from negative value | |
713 puls a Get the track # | |
714 L0371 rts A=track #, B=Sector #, <u00AD=Odd | |
715 | |
716 * Drive control register bit mask table | |
717 L0372 fcb $01 Drive 0 | |
718 fcb $02 Drive 1 | |
719 fcb $04 Drive 2 | |
720 fcb $40 Drive 3 / Side select | |
721 | |
722 L0376 clr >u00AA,u ??? | |
723 | |
724 chkdrv lda <PD.DRV,y Get drive # requested | |
725 cmpa #4 Drive 0-3? | |
726 blo L0385 Yes, continue normally | |
727 NoHW comb Illegal drive # error | |
728 ldb #E$Unit | |
729 rts | |
730 | |
731 * Entry: A=drive #, X=LSN (Physical, not OS9 logical if PCDOS disk) | |
732 L0385 pshs x,d Save sector #, drive # & B??? | |
733 leax >L0372,pc Point to drive bit mask table | |
734 ldb a,x Get bit mask for drive # we want | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
735 stb >CtlImg,u Save mask |
1570 | 736 leax DRVBEG,u Point to beginning of drive tables |
737 ldb #DRVMEM Get size of each drive table | |
738 mul Calculate offset to drive table we want | |
739 leax d,x Point to it | |
740 cmpx >u00A7,u Same as Last drive table accessed? | |
741 beq L03A6 Yes, skip ahead | |
742 stx >u00A7,u Save new drive table ptr | |
743 com >u00AA,u ??? Set flag | |
744 L03A6 clr >u00AD,u Set side (head) flag to side 1 | |
745 lbsr L04B3 Go set up VIRQ to wait for drive motor | |
746 puls pc,x,d Restore sector #,drive #,B & return | |
747 | |
748 L03AF ldb >DPort+WD_Stat Get status register from FDC | |
749 L03B2 bitb #%11111000 Any of the error bits set? | |
750 beq L03CA No, exit without error | |
751 aslb Drive not ready? | |
752 bcs L03CC Yes, use that error code | |
753 aslb Write protect error? | |
754 bcs L03D0 Yes, use that error code | |
755 aslb Write fault error? | |
756 bcs L03D4 Yes, use that error code | |
757 aslb Sector not found? | |
758 bcs L03D8 Yes, use Seek error code | |
759 aslb CRC error? | |
760 bcs L03DC Yes, use that error code | |
761 L03CA clrb No error & return | |
762 rts | |
763 | |
764 L03CC ldb #E$NotRdy not ready | |
765 fcb $8C skip 2 bytes | |
766 | |
767 L03D0 ldb #E$WP write protect | |
768 fcb $8C skip 2 bytes | |
769 | |
770 L03D4 ldb #E$Write write error | |
771 fcb $8C | |
772 | |
773 L03D8 ldb #E$Seek seek error | |
774 fcb $8C | |
775 | |
776 L03DC ldb #E$CRC CRC error | |
777 * fcb $8C | |
778 | |
779 *L03E0 ldb #E$Read Read error | |
780 orcc #Carry set carry | |
781 rts | |
782 | |
783 L03E4 bsr L0404 Send command to controller & waste some time | |
784 L03E6 ldb >DPort+WD_Stat Check FDC status register | |
785 bitb #$01 Is controller still busy? | |
786 beq L0403 No, exit | |
787 ldd >VIRQCnt,pc Get initial count value for drive motor speed | |
1581 | 788 std >VIRQPak,u Save it |
1570 | 789 bra L03E6 Wait for controller to finish previous command |
790 | |
791 * Send command to FDC | |
1578 | 792 L03F7 lda #C_MOTOR |
793 * lda #%00001000 Mask in Drive motor on bit | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
794 ora >CtlImg,u Merge in drive/side selects |
1578 | 795 sta >DPort+CtrlReg Turn the drive motor on & select drive |
1570 | 796 stb >DPort+WD_Cmd Save command & return |
797 L0403 rts | |
798 | |
799 L0404 bsr L03F7 Go send command to controller | |
800 | |
801 * This loop has been changed from nested LBSRs to timing loop. | |
802 * People with crystal upgrades should modify the loop counter | |
803 * to get a 58+ us delay time. MINIMUM 58us. | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
804 FDCDelay |
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
805 pshs a 14 cycles, plus 3*loop counter |
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
806 IFEQ Level-1 |
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
807 lda #18 (only do about a 100 cycle delay for now) |
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
808 ELSE |
1570 | 809 lda #29 (only do about a 100 cycle delay for now) |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
810 ENDC |
1570 | 811 L0409 deca for total ~63 us delay (123 cycles max.) |
812 bne L0409 | |
813 puls a,pc restore register and exit | |
814 | |
815 * SetStat | |
816 * | |
817 * Entry: | |
818 * A = function code | |
819 * Y = address of path descriptor | |
820 * U = address of device memory area | |
821 * | |
822 * Exit: | |
823 * CC = carry set on error | |
824 * B = error code | |
825 * | |
826 SetStat ldx PD.RGS,y Get caller's register stack ptr | |
827 ldb R$B,x Get function code | |
828 cmpb #SS.WTrk Write track? | |
829 beq SSWTrk Yes, go do it | |
830 cmpb #SS.Reset Restore head to track 0? | |
831 lbeq sktrk0 Yes, go do it --- beq | |
832 comb set carry for error | |
833 ldb #E$UnkSvc return illegal service request error | |
834 rts | |
835 | |
836 SSWTrk pshs u,y preserve register stack & descriptor | |
837 | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
838 * Level 2 Code |
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
839 IFGT Level-1 |
1570 | 840 |
841 *--- new code | |
842 ldb #1 1 block to allocate | |
843 os9 F$AllRAM allocate some RAM | |
844 bcs L0489 error out if at all | |
845 leax >FBlock,u point to 'my' DAT image | |
846 std ,x save a copy of the block | |
847 os9 F$ResTsk reserve a task number for the copy | |
848 bcs FError error out | |
849 stb 2,x save temporary task number in FTask,u | |
850 lslb 2 bytes per entry | |
851 ldu <D.TskIPt get task image table pointer | |
852 stx b,u save pointer to the task's DAT image | |
853 lsrb get the right number again | |
854 IFNE H6309 | |
855 tfr 0,u destination is address 0 | |
856 ELSE | |
857 ldu #$0000 | |
858 ENDC | |
859 *--- end new code | |
860 | |
861 ldx 2,s get pointer to descriptor | |
862 * stu >FBlock,x | |
863 ldx <D.Proc Get current process ptr | |
864 lda P$Task,x Get task # for current process | |
865 * ldb <D.SysTsk Get system task # | |
866 ldy ,s | |
867 ldx PD.RGS,y Get register stack ptr | |
868 ldx R$X,x Get ptr to caller's track buffer | |
869 ldy #$1A00 Size of track buffer | |
870 os9 F$Move Copy from caller to temporary task | |
871 bcs L0479 Error copying, exit | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
872 puls u,y |
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
873 pshs u,y |
1570 | 874 |
875 ENDC | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
876 * End of Level 2 Code |
1570 | 877 |
878 lbsr L0376 Go check drive #/wait for it to spin up | |
879 ldx PD.RGS,y Get caller's register stack ptr | |
880 ldb R$Y+1,x Get caller's side/density | |
881 bitb #$01 Check side | |
882 beq L0465 Side 1, skip ahead | |
883 com >u00AD,u | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
884 ldb >CtlImg,u Get current control register settings |
1578 | 885 * orb #%01000000 Mask in side 2 |
886 orb #C_SIDSEL Mask in side 2 | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
887 stb >CtlImg,u Save updated control register |
1570 | 888 L0465 lda R$U+1,x Get caller's track # |
889 ldx >u00A7,u Get current drive table ptr | |
890 lbsr L02A5 | |
891 bcs L0489 | |
892 ldb #$F0 Write track command? | |
893 *--- | |
894 IFEQ Level-1 | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
895 ldx PD.RGS,y |
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
896 ldx R$X,x |
1570 | 897 ELSE |
898 ldx #$2000 start writing from block 1 | |
899 ENDC | |
900 | |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
901 lbsr WrTrk Go write the track |
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
902 |
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
903 IFGT Level-1 |
1570 | 904 L0479 ldu 2,s |
905 pshs b,cc Preserve error | |
906 ldb >FTask,u point to task | |
907 os9 F$RelTsk release the task | |
908 fcb $8C skip 2 bytes | |
909 | |
910 * format comes here when block allocation passes, but task allocation | |
911 * gives error. So er de-allocate the block. | |
912 FError | |
913 pshs b,cc save error code, cc | |
914 ldx >FBlock,u point to block | |
915 ldb #1 1 block to return | |
916 os9 F$DelRAM de-allocate image RAM blocks | |
917 clr FBlock+1,u ensure that the block # in FBlock is zero. | |
918 puls b,cc Restore error | |
919 ENDC | |
920 | |
921 L0489 puls pc,u,y Restore regs & return | |
922 | |
923 * seek the head to track 0 | |
924 sktrk0 lbsr chkdrv | |
925 ldx >u00A7,u | |
926 clr <$15,x | |
927 lda #$05 | |
928 L0497 ldb <PD.STP,y | |
929 andb #%00000011 Just keep usable settings (6-30 ms) | |
930 eorb #%01001011 Set proper bits for controller | |
931 pshs a | |
932 lbsr L03E4 | |
933 puls a | |
934 deca | |
935 bne L0497 | |
936 ldb <PD.STP,y | |
937 andb #%00000011 Just keep usable settings (6-30 ms) | |
938 eorb #%00001011 Set proper bits for controller | |
939 lbra L03E4 | |
940 | |
941 L04B3 pshs y,x,d Preserve regs | |
942 ldd >VIRQCnt,pc Get VIRQ initial count value | |
1581 | 943 std >VIRQPak,u Save it |
1579
1a19aed5dc34
rb1773 now works under L1 (formats, reads/writes fine)
boisy
parents:
1578
diff
changeset
|
944 lda >CtlImg,u ?Get drive? |
1578 | 945 ora #C_MOTOR Turn drive motor on for that drive |
946 * ora #%00001000 Turn drive motor on for that drive | |
947 sta >DPort+CtrlReg Send drive motor on command to FDC | |
1570 | 948 IFEQ Level-1 |
949 lda >D.DskTmr Get VIRQ flag | |
950 ELSE | |
951 lda <D.MotOn Get VIRQ flag | |
952 ENDC | |
953 bmi L04DE Not installed yet, try installing it | |
954 bne L04E0 Drive already up to speed, exit without error | |
955 | |
956 * Drive motor speed timing loop (could be F$Sleep call now) (was over .5 sec) | |
957 ldx #32 wait for 32 ticks | |
958 os9 F$Sleep | |
959 | |
960 L04DE bsr InsVIRQ Install VIRQ to wait for drive motors | |
961 L04E0 clrb No error & return | |
962 puls pc,y,x,d | |
963 | |
964 InsVIRQ lda #$01 Flag drive motor is up to speed | |
965 IFEQ Level-1 | |
966 sta >D.DskTmr | |
967 ELSE | |
968 sta <D.MotOn | |
969 ENDC | |
970 ldx #$0001 Install VIRQ entry | |
1581 | 971 leay >VIRQPak,u Point to packet |
1570 | 972 clr Vi.Stat,y Reset Status byte |
973 ldd >VIRQCnt,pc Get initial VIRQ count value | |
974 os9 F$VIRQ Install VIRQ | |
975 bcc VIRQOut No error, exit | |
976 lda #$80 Flag that VIRQ wasn't installed | |
977 IFEQ Level-1 | |
978 sta >D.DskTmr | |
979 ELSE | |
980 sta <D.MotOn | |
981 ENDC | |
982 VIRQOut clra | |
983 rts | |
984 | |
985 * IRQ service routine for VIRQ (drive motor time) | |
986 * Entry: U=Ptr to VIRQ memory area | |
987 IRQSvc pshs a | |
988 lda <D.DMAReq | |
989 beq L0509 | |
990 bsr InsVIRQ | |
991 bra IRQOut | |
1578 | 992 L0509 sta >DPort+CtrlReg |
1570 | 993 IFNE H6309 |
994 aim #$FE,>u00B5,u | |
995 ELSE | |
996 lda u00B5,u | |
997 anda #$FE | |
998 sta u00B5,u | |
999 ENDC | |
1000 * fdb u00B5 --- so changes in data size won't affect anything | |
1001 IFEQ Level-1 | |
1002 clr >D.DskTmr | |
1003 ELSE | |
1004 clr <D.MotOn | |
1005 ENDC | |
1006 IRQOut puls pc,a | |
1007 | |
1008 * Non-OS9 format goes here | |
1009 * Entry: X=LSN | |
1010 * Y=Path dsc. ptr | |
1011 * U=Device mem ptr | |
1012 L051A pshs x Preserve Logical sector # | |
1013 ldx >u00A7,u Get last drive table accessed ptr | |
1014 clra | |
1015 pshs x,a Save ptr & NUL byte | |
1016 IFNE H6309 | |
1017 ldw #$14 Clear 20 bytes | |
1018 tfm s,x+ | |
1019 ELSE | |
1020 ldb #$14 | |
1021 L051ALp clr ,x+ | |
1022 decb | |
1023 bne L051ALp | |
1024 ENDC | |
1025 puls x,a Eat NUL & get back drive table ptr | |
1026 ldb <PD.CYL+1,y Get # cylinders on drive (ignores high byte) | |
1027 lda <PD.SID,y Get # sides | |
1028 mul Calculate # tracks on drive (1 per head) | |
1029 IFNE H6309 | |
1030 decd Adjust to ignore track 0 | |
1031 ELSE | |
1032 subd #$0001 | |
1033 ENDC | |
1034 lda <PD.SCT+1,y Get # sectors/track | |
1035 sta DD.TKS,x Save in drive table | |
1036 sta <DD.SPT+1,x Save in other copy in drive table | |
1037 mul Calculate # sectors on drive (minus track 0) | |
1038 pshs x Preserve drive table ptr | |
1039 tfr d,x Move # sectors on drive to X | |
1040 lda <PD.T0S+1,y Get # sectors on track 0 | |
1041 leax a,x Add that many sectors to total | |
1042 lda <PD.TYP,y Get device type settings | |
1043 anda #%00000100 Mask out all but 512 byte sector flag | |
1044 beq L0550 Not 512 byte sector, skip ahead | |
1045 IFNE H6309 | |
1046 addr x,x Multiply by 2 (convert to 256 byte OS9 sectors) | |
1047 ELSE | |
1048 tfr x,d | |
1049 leax d,x | |
1050 ENDC | |
1051 L0550 tfr x,d Move # sectors to D | |
1052 puls x Get back drive table ptr | |
1053 std DD.TOT+1,x Save # sectors allowed on drive | |
1054 lda #UPDAT.+EXEC. Owner's read/write/exec attributes | |
1055 sta DD.ATT,x Set attributes for disk | |
1056 lda <PD.DNS,y Get density settings | |
1057 lsla Shift for DD.FMT | |
1058 pshs a Preserve it a sec | |
1059 lda <PD.SID,y Get # sides | |
1060 deca Adjust to base 0 | |
1061 ora ,s+ Merge with density settings | |
1062 sta <DD.FMT,x Save in device table | |
1063 clrb No error? | |
1064 puls pc,x Restore original LSN & return | |
1065 | |
1066 emod | |
1067 eom equ * | |
1068 end |