Mercurial > hg > Members > kono > nitros9-code
annotate level1/modules/rb1773.asm @ 3143:c860ff48e09c
Add coco3fpga banner to init.asm
author | Bill Pierce <merlinious999@gmail.com> |
---|---|
date | Sat, 04 Feb 2017 18:33:07 +0100 |
parents | 4446149f7ea9 |
children |
rev | line source |
---|---|
1746 | 1 ******************************************************************** |
2 * rb1773 - Western Digital 1773 Disk Controller Driver | |
3 * | |
4 * $Id$ | |
5 * | |
6 * This driver has been tested with the following controllers: | |
7 * - Tandy FD-502 "shortie" disk controller | |
8 * - Disto Super Controller I | |
9 * - Disto Super Controller II | |
10 * | |
11 * This driver can also be assembled to support the no-halt feature of | |
12 * the Disto Super Controller II. | |
13 * | |
14 * | |
15 * A lot of references to **.CYL or <u00B6 using 16 bit registers can be | |
16 * changed to 8 bit registers with a +1 offset, since track #'s >255 are | |
17 * ignored | |
18 * | |
19 * NOTE: 512 bytes is reserved as a physical sector buffer. Any reads/ | |
20 * writes are done from this buffer to the controller. Copies of the 256 | |
21 * byte chunk needed are done by a block memory move | |
22 * | |
23 * | |
24 ********** DISTO SUPER CONTROLLER II NOTES ********** | |
25 * | |
26 * SCII 0=standard controller 1=Disto Super Controller II | |
27 * SCIIALT 0=Normal I/O register 1=Alternative registers; See below | |
28 * | |
29 * Disto Super Controller II Registers: | |
30 * | |
31 * $FF74 RW.Dat --- R/W Buffer data #1 | |
32 * $FF75 mirror of $FF74 | |
33 * $FF76 RW.Ctrl --- Write D0 = 0 FDC Write Op #2 | |
34 * = 1 FDC Read Op #2 | |
35 * D1 = 0 Normal Mode | |
36 * = 1 Buffered I/O Mode | |
37 * D2 = 0 Normal NMI | |
38 * = 1 Masked NMI | |
39 * D3 = 0 No FIRQ (Masked) | |
40 * = 1 Enabled FIRQ | |
41 * Read D7 = FDC INT Status (Inverted) | |
42 * $FF77 mirror of $FF76 | |
43 * #1: any write to $FF76-$FF77 clears Buffer counter | |
44 * #2: in buffered mode only | |
45 * | |
46 * Alternate port is at $FF58-$FF5B in case of hardware conflicts. | |
47 * | |
48 * Edt/Rev YYYY/MM/DD Modified by | |
49 * Comment | |
50 * ------------------------------------------------------------------ | |
51 * 11 1993/05/12 ??? | |
52 * Special opts for TC9 to slow controller reads and writes TFM's | |
53 * between sector buffers & in drive table init/copies. | |
54 * Changed software timing loop (drive spin-up) to F$Sleep for 32 ticks | |
55 * Shrunk (slowed slightly) error returns | |
56 * Added blobstop code | |
57 * | |
58 * 11r1 2003/09/03 Boisy G. Pitre | |
59 * Added code to sense if HW is present or not and return error if not. | |
60 * | |
61 * 1r0 2004/05/20 Boisy G. Pitre | |
62 * Restarted edition due to name change; backported to Level 1 | |
63 * | |
64 * 2004/06/01 Robert Gault | |
65 * Added code to obtain an SCII driver, at least for the Sleep mode. It | |
66 * would be quite difficult and probably not worth the effort to permit | |
67 * selection of both Sleep and IRQ SCII drivers. However, both normal | |
68 * and Alt SCII I/O registers are supported. | |
69 * | |
70 * Cleaned up some errors in the last version of rb1773. | |
71 * | |
72 * 2004/07/11 Robert Gault | |
73 * Corrected the error handling code for read & write to separate SCII errors | |
74 * from OS-9 errors. Changed drive test from compare #4 to compare #N.Drives to | |
75 * permit up to 6 drives using alternate table. | |
76 * | |
77 * 2005/01/27 Robert Gault | |
78 * Separated the sector write and format write loops so that the CPU clock | |
79 * can be slowed down during formats. This "corrects" problems some hardware | |
80 * have with the current NitrOS-9 during formats. | |
1785 | 81 * |
82 * 1r1 2005/04/07 Boisy G. Pitre | |
83 * We now save the contents of D.NMI (Level 2) or D.XNMI (Level 1) before | |
84 * overwriting them, and then restore the original values at term time. | |
2226
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
85 * |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
86 * 2009/03/19 Robert Gault |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
87 * Removed slow down hack from format and write sector but left code just in case. |
2940
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
88 * |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
89 * 2013/12/16 Robert Gault and Gene Heskett |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
90 * Added two new flags, flagWP flagFMT, to prevent disk damage by Writes where |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
91 * the drive head width does not match the disk track density. |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
92 * flagWP <>0 write protects; flagFMT <>0 overrules flagWP so that a Format can |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
93 * write to a disk. |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
94 * A descriptor that does not match your drive can still cause Writes to disks that |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
95 * could possibly cause disk corruption. This cannot be prevented. |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
96 * |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
97 * When LSN0 is read using a 3.5" drive, most of the checks of density, sides, etc. |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
98 * are bypassed as not needed. |
1746 | 99 |
100 nam rb1773 | |
101 ttl Western Digital 1773 Disk Controller Driver | |
102 | |
103 * These lines needed if assembling with on a Color computer. | |
104 *SCII set 1 * 0=not present 1=present | |
105 *SCIIALT set 1 * 0=normal address 1=alternate | |
106 SCIIHACK set 0 * 0=stock model 1=512 byte buffer | |
107 *H6309 set 1 | |
108 *LEVEL set 2 | |
109 * These lines needed if not using latest os9def files. | |
110 *TkPerSec set 60 | |
111 *DPort set $FF40 | |
112 | |
113 * This should be changed for NitrOS9 project to "use defsfile" | |
114 IFP1 | |
115 use defsfile | |
116 ENDC | |
117 | |
118 tylg set Drivr+Objct | |
119 atrv set ReEnt+rev | |
1785 | 120 rev set $01 |
1746 | 121 edition set 1 |
122 | |
123 * Configuration Settings | |
124 N.Drives equ 4 number of drives to support | |
125 TC9 equ 0 Set to 1 for TC9 special slowdowns | |
126 PRECOMP equ 0 Set to 1 to turn on write precompensation | |
127 | |
128 * Disto Super Controller defs | |
129 IFEQ SCIIALT | |
130 RW.Dat equ $FF74 | |
131 RW.Ctrl equ $FF76 | |
132 ELSE | |
133 RW.Dat equ $FF58 | |
134 RW.Ctrl equ $FF5A | |
135 ENDC | |
136 | |
137 | |
138 * WD-17X3 Definitions | |
139 CtrlReg equ $00 Control register for Tandy controllers; not part of WD | |
140 WD_Cmd equ $08 | |
141 WD_Stat equ WD_Cmd | |
142 WD_Trak equ $09 | |
143 WD_Sect equ $0A | |
144 WD_Data equ $0B | |
145 | |
146 * WD-17X3 Commands | |
147 S$Read equ $80 Read sector | |
148 S$Format equ $A0 Format track | |
149 S$FrcInt equ $D0 Force interrupt | |
150 | |
151 * Control Register Definitions | |
152 C_HALT equ %10000000 Halt line to CPU is active when set | |
153 C_SIDSEL equ %01000000 Side select (0 = front side, 1 = back side) | |
154 C_DBLDNS equ %00100000 Density (0 = single, 1 = double) | |
155 C_WPRCMP equ %00010000 Write precompensation (0 = off, 1 = on) | |
156 C_MOTOR equ %00001000 Drive motor (0 = off, 1 = on) | |
157 C_DRV2 equ %00000100 Drive 2 selected when set | |
158 C_DRV1 equ %00000010 Drive 1 selected when set | |
159 C_DRV0 equ %00000001 Drive 0 selected when set | |
160 | |
161 mod eom,name,tylg,atrv,start,size | |
162 | |
163 u0000 rmb DRVBEG+(DRVMEM*N.Drives) | |
164 lastdrv rmb 2 Last drive table accessed (ptr) | |
165 ctlimg rmb 1 Bit mask for control reg (drive #, side,etc) | |
166 u00AA rmb 1 drive change flag | |
167 sectbuf rmb 2 Ptr to 512 byte sector buffer | |
168 currside rmb 1 head flag; 0=front 1 = back | |
169 u00AE rmb 1 LSB of LSN | |
170 IFGT Level-1 | |
171 FBlock rmb 2 block number for format | |
172 FTask rmb 1 task number for format | |
1785 | 173 NMISave rmb 2 |
174 ELSE | |
1807
321957ee26e8
Changed NMISave to be rmb 3 for Level 1 -- Thanks Phill for pointing out the error.
boisy
parents:
1793
diff
changeset
|
175 NMISave rmb 3 |
1746 | 176 ENDC |
177 VIRQPak rmb 2 Vi.Cnt word for VIRQ | |
178 u00B3 rmb 2 Vi.Rst word for VIRQ | |
179 u00B5 rmb 1 Vi.Stat byte for VIRQ (drive motor timeout) | |
180 loglsn rmb 2 OS9's logical sector # | |
181 * Removed next line and added two new ones. RG | |
182 * PCDOS does not ask driver for any info. | |
183 * physlsn rmb 2 PCDOS (512 byte sector) # | |
184 flag512 rmb 1 PCDOS (512 byte sector) 0=no, 1=yes | |
185 flagform rmb 1 SCII format flag | |
2940
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
186 flagWP rmb 1 write protection <>0 |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
187 flagFMT rmb 1 format flag |
1746 | 188 size equ . |
189 | |
190 fcb DIR.+SHARE.+PEXEC.+PWRIT.+PREAD.+EXEC.+UPDAT. | |
191 | |
192 name fcs /rb1773/ | |
193 fcb edition | |
194 | |
195 VIRQCnt fdb TkPerSec*4 Initial count for VIRQ (4 seconds) | |
196 | |
197 IRQPkt fcb $00 Normal bits (flip byte) | |
198 fcb $01 Bit 1 is interrupt request flag (Mask byte) | |
199 fcb 10 Priority byte | |
200 | |
201 * Init | |
202 * | |
203 * Entry: | |
204 * Y = address of device descriptor | |
205 * U = address of device memory area | |
206 * | |
207 * Exit: | |
208 * CC = carry set on error | |
209 * B = error code | |
210 * | |
211 * New code added 09/03/2003 by Boisy G. Pitre | |
212 * Write a pattern to $FF4B and read it back to verify that the hardware | |
213 * does exist. | |
214 Init equ * | |
215 * Two new lines for SCII. RG | |
216 IFNE SCII | |
217 clr RW.Ctrl clear SCII control register | |
218 clr flagform,u clear SCII format flag | |
219 ENDC | |
2940
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
220 clr flagWP,u |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
221 clr flagFMT,u |
1746 | 222 ldx V.PORT,u get Base port address |
223 lda WD_Data,x get byte at FDC Data register | |
224 coma complement it to modify it | |
225 sta WD_Data,x write it | |
226 clrb | |
227 Init2 decb delay a bit... | |
228 bmi Init2 | |
229 suba WD_Data,x read it back | |
230 lbne NoHW if not zero, we didn't read what we wrote | |
231 ** | |
232 IFEQ Level-1 | |
233 clr >D.DskTmr flag drive motor as not running | |
234 ELSE | |
235 clr <D.MotOn flag drive motor as not running | |
236 ENDC | |
237 leax WD_Stat,x point to Status/Command register | |
238 lda #S$FrcInt "Force Interrupt" command | |
239 sta ,x send to FDC | |
240 lbsr FDCDelay time delay for ~ 108 cycles | |
241 lda ,x eat status register | |
242 ldd #$FF*256+N.Drives 'invalid' value & # of drives | |
243 leax DRVBEG,u point to start of drive tables | |
244 l1 sta ,x DD.TOT MSB to bogus value | |
245 sta <V.TRAK,x init current track # to bogus value | |
246 leax <DRVMEM,x point to next drive table | |
247 decb done all drives yet? | |
248 bne l1 no, init them all | |
1785 | 249 *** Fix on 04/06/2005: we now save the contents of D.NMI (Level 2) |
250 *** or D.XNMI (Level 1) before overwriting them. | |
1746 | 251 IFGT Level-1 |
1785 | 252 ldx >D.NMI |
253 stx NMISave,u | |
254 leax >NMISvc,pc point to NMI service routine | |
255 stx >D.NMI install as system NMI | |
1746 | 256 ELSE |
1785 | 257 ldx >D.XNMI |
258 stx NMISave,u | |
259 lda >D.XNMI+2 | |
260 sta NMISave+2,u | |
261 leax >NMISvc,pc point to NMI service routine | |
1746 | 262 stx >D.XNMI+1 NMI jump vector operand |
263 lda #$7E JMP code | |
264 sta >D.XNMI NMI jump vector opcode | |
265 ENDC | |
266 pshs y save device dsc. ptr | |
267 leay >u00B5,u point to Vi.Stat in VIRQ packet | |
268 tfr y,d make it the status register ptr for IRQ | |
269 leay >IRQSvc,pc point to IRQ service routine | |
270 leax >IRQPkt,pc point to IRQ packet | |
271 os9 F$IRQ install IRQ | |
272 puls y Get back device dsc. ptr | |
273 bcs Return If we can't install IRQ, exit | |
274 ldd #512 Request 512 byte sector buffer | |
275 pshs u Preserve device mem ptr | |
276 os9 F$SRqMem Request sector buffer | |
277 tfr u,x Move ptr to sector buffer to x | |
278 puls u Restore device mem ptr | |
279 bcs Return If error, exit with it | |
280 stx >sectbuf,u Save ptr to sector buffer | |
281 | |
282 * GetStat | |
283 * | |
284 * Entry: | |
285 * A = function code | |
286 * Y = address of path descriptor | |
287 * U = address of device memory area | |
288 * | |
289 * Exit: | |
290 * CC = carry set on error | |
291 * B = error code | |
292 * | |
293 GetStat clrb no GetStt calls - return, no error, ignore | |
294 Return rts | |
295 | |
296 * Term | |
297 * | |
298 * Entry: | |
299 * U = address of device memory area | |
300 * | |
301 * Exit: | |
302 * CC = carry set on error | |
303 * B = error code | |
304 * | |
305 Term leay >VIRQPak,u Point to VIRQ packet | |
306 IFNE H6309 | |
307 tfr 0,x "remove" | |
308 ELSE | |
309 ldx #$0000 | |
310 ENDC | |
311 os9 F$VIRQ Remove VIRQ | |
312 IFNE H6309 | |
313 tfr 0,x "remove" | |
314 ELSE | |
315 ldx #$0000 | |
316 ENDC | |
317 leay >IRQSvc,pc point to IRQ service routine | |
318 os9 F$IRQ Remove IRQ | |
1785 | 319 *** Fix: we now restore original D.NMI (Level 2) or D.XNMI (Level 1) |
320 *** before overwriting them. | |
321 IFGT Level-1 | |
322 ldx NMISave,u | |
323 stx >D.NMI | |
324 ELSE | |
325 ldx NMISave,u | |
326 stx >D.XNMI | |
327 lda NMISave+2,u | |
328 sta >D.XNMI+2 | |
329 ENDC | |
330 *** | |
1746 | 331 pshs u Save device mem ptr |
332 ldu >sectbuf,u Get pointer to sector buffer | |
333 ldd #512 Return sector buffer memory | |
334 os9 F$SRtMem | |
335 puls u Restore device mem ptr | |
336 clr >DPort+CtrlReg shut off drive motors | |
337 IFEQ Level-1 | |
338 clr >D.DskTmr Clear out drive motor timeout flag | |
339 ELSE | |
340 clr <D.MotOn Clear out drive motor timeout flag | |
341 ENDC | |
342 ex rts return | |
343 | |
344 * Check if 512 byte sector conversion needed | |
345 * Entry: B:X=LSN | |
346 * U=Static mem ptr | |
347 * Y=Path dsc. ptr | |
348 * Exit: X=New LSN (same as original for 256 byte sectors, 1/2 of original | |
349 * for 512 byte sectors | |
350 * regD changed | |
351 Chk512 equ * | |
352 clr flag512,u set to 256 byte sector | |
353 stx >loglsn,u save OS9 LSN | |
354 lda <PD.TYP,y get device type from path dsc. | |
355 anda #%00000100 mask out all but 512 byte sector flag | |
356 bne Log2Phys 512 byte sectors, go process | |
357 rts RG | |
358 | |
359 * 512 byte sector processing goes here | |
360 * regB should be saved and not just cleared at end because there is | |
361 * a subsequent tst for the msb of lsn. The test is pointless if B | |
362 * is changed. | |
363 Log2Phys pshs b save MSB of LSN; new RG | |
364 * Minor inefficiencies here that I have changed, RG | |
365 tfr x,d | |
366 IFNE H6309 | |
367 lsrd | |
368 ELSE | |
369 lsra | |
370 rorb | |
371 ENDC | |
372 tfr d,x move new LSN back to regX | |
373 * New line for stock SCII controller with 256 max no-halt. | |
374 inc flag512,u set to 512 byte sector | |
375 puls b,pc regB will be tested later for >0 | |
376 | |
377 start lbra Init | |
378 bra Read | |
379 nop | |
380 lbra Write | |
381 bra GetStat | |
382 nop | |
383 lbra SetStat | |
384 bra Term | |
385 nop | |
386 | |
387 * Read | |
388 * | |
389 * Entry: | |
390 * B = MSB of LSN | |
391 * X = LSB of LSN | |
392 * Y = address of path descriptor | |
393 * U = address of device memory area | |
394 * | |
395 * Exit: | |
396 * CC = carry set on error | |
397 * B = error code | |
398 * | |
399 Read bsr Chk512 go check for 512 byte sector/adjust if needed | |
400 lda #%10010001 error flags (see Disto SCII source) | |
401 pshs x preserve sector # | |
402 lbsr ReadWithRetry go read the sector | |
403 puls x restore sector # | |
404 bcs ex if error, exit | |
405 pshs y,x save path dsc ptr & LSN | |
406 leax ,x LSN0?, ie. tstx | |
407 bne L012D no, go calculate normally | |
408 puls y,x yes, restore path dsc ptr & LSN | |
409 lda <PD.TYP,y get type from path dsc. | |
410 bita #TYP.NSF standard OS-9 format? | |
411 beq L00F0 yes, skip ahead | |
412 lbsr MakeDTEntry else make a drive table entry | |
413 pshs y,x save path dsc ptr | |
414 bra L012D | |
415 | |
416 * LSN0, standard OS-9 format - copy part of LSN0 into drive table | |
417 L00F0 ldx >sectbuf,u Get ptr to sector buffer | |
418 pshs y,x Preserve path dsc. ptr & sector buffer ptr | |
419 ldy >lastdrv,u Get last drive table accessed ptr | |
420 IFNE H6309 | |
421 ldw #DD.SIZ # bytes to copy from new LSN0 to drive table | |
422 tfm x+,y+ Copy them | |
423 ELSE | |
424 ldb #DD.SIZ | |
425 L00F0Lp lda ,x+ | |
426 sta ,y+ | |
427 decb | |
428 bne L00F0Lp | |
429 ENDC | |
430 ldy >lastdrv,u Get drive table ptr back | |
431 lda <DD.FMT,y Get format for disk in drive | |
432 ldy 2,s restore path descriptor pointer | |
2940
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
433 * !!!!!!! Most of these tests are pointless with a 3.5" drive RG |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
434 ldb <PD.TYP,y Get path's type settings RG |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
435 bitb #1 test for 3.5" drive |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
436 bne L0128 skip rest of tests if 3.5" drive |
1746 | 437 ldb <PD.DNS,y Get path's density settings |
438 bita #FMT.DNS Disk in drive double density? | |
439 beq L0115 No, all drives can read single, skip ahead | |
440 bitb #DNS.MFM Can our path dsc. handle double density? | |
441 beq erbtyp No, illegal | |
2939
011a5f26e9da
rb1773: Fix comments about 135 TPI versus 48 or 96
Robert Gault <robert.gault@att.net>
parents:
2938
diff
changeset
|
442 L0115 bita #FMT.TDNS Is new disk 96tpi? |
011a5f26e9da
rb1773: Fix comments about 135 TPI versus 48 or 96
Robert Gault <robert.gault@att.net>
parents:
2938
diff
changeset
|
443 beq L011D No, all drives handle 48/135 tpi, so skip ahead |
2940
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
444 sta flagWP,u set write protection |
2939
011a5f26e9da
rb1773: Fix comments about 135 TPI versus 48 or 96
Robert Gault <robert.gault@att.net>
parents:
2938
diff
changeset
|
445 bitb #DNS.DTD Can path dsc. handle 96 tpi? |
011a5f26e9da
rb1773: Fix comments about 135 TPI versus 48 or 96
Robert Gault <robert.gault@att.net>
parents:
2938
diff
changeset
|
446 beq erbtyp No, illegal format |
2940
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
447 clr flagWP,u clear write protection since disk and descriptor match |
1746 | 448 L011D bita #FMT.SIDE Is new disk double sided? |
449 beq L0128 No, all drives handle single sided, we're done | |
450 lda <PD.SID,y Get # sides path dsc. can handle | |
451 suba #2 sides higher or equal to 2? | |
452 blo erbtyp Yes, exit with illegal type error | |
453 L0128 clrb No error | |
454 * LSN's other than 0 come straight here | |
455 L012D ldy 2,s Get path dsc. ptr back?? | |
456 ldx PD.BUF,y Get path dsc. buffer ptr | |
457 * lda <PD.TYP,y Get path dsc. disk type, RG | |
458 ldy >sectbuf,u Get ptr to sector buffer | |
459 IFNE H6309 | |
460 ldw #256 OS9 sector size (even if physical was 512) | |
461 ENDC | |
462 * anda #%00000100 Mask out all but 512 byte sector flag, RG | |
463 * Next replaces the two lines removed, RG | |
464 tst flag512,u Is it a 512 byte sector? | |
465 beq L014B If normal sector, just copy it | |
466 ldd >loglsn,u Get OS9's LSN (twice of the 'real' 512 sector) | |
467 andb #$01 Mask out all but odd/even sector indicator | |
468 beq L014B Even, use 1st half of 512 byte sector | |
469 IFNE H6309 | |
470 addr w,y Odd, bump sector buffer ptr to 2nd half | |
471 ELSE | |
472 leay 256,y | |
473 ENDC | |
474 L014B equ * | |
475 IFNE H6309 | |
476 tfm y+,x+ Copy from physical sector buffer to PD buffer | |
477 puls pc,y,x restore path dsc & sector buffer ptrs & return | |
478 ELSE | |
479 pshs d | |
480 clrb | |
481 L014BLp lda ,y+ | |
482 sta ,x+ | |
483 decb | |
484 bne L014BLp | |
485 puls pc,y,x,d restore path dsc & sector buffer ptrs & return | |
486 ENDC | |
487 | |
488 erbtyp comb | |
489 ldb #E$BTyp Error - wrong type error | |
490 puls pc,y,x | |
491 | |
492 ********************** | |
493 * Read error - retry handler | |
494 Retry | |
495 bcc ReadWithRetry Normal retry, try reading again | |
496 pshs x,d Preserve regs | |
497 lbsr sktrk0 Seek to track 0 (attempt to recalibrate) | |
498 puls x,d Restore regs & try reading again | |
499 | |
500 | |
501 * Read With Retry: Do read with retries | |
502 * | |
503 * ENTER reg B,X=working lsn on disk | |
504 * Y=path descriptor | |
505 * U=driver data | |
506 * A=retry sequence mix of read & seek track 0 | |
507 * EXIT X,Y,U preserved; D,CC changed | |
508 * B=error if any | |
509 * CC=error flag | |
510 ReadWithRetry | |
511 pshs x,d Preserve regs | |
512 bsr ReadSector Go read sector | |
513 puls x,d Restore regs (A=retry flags) | |
514 lbcc L01D7 No error, return | |
515 lsra Shift retry flags | |
516 bne Retry Still more retries allowed, go do them | |
517 * otherwise, final try before we give up | |
518 ReadSector | |
519 lbsr L02AC Do double-step/precomp etc. if needed, seek | |
520 lbcs L01D7 Error somewhere, exit with it | |
521 L0176 ldx >sectbuf,u Get physical sector buffer ptr | |
522 ldb #S$Read Read sector command | |
523 IFNE SCII | |
524 * If SCII not hacked for 512 byte no-halt, must use halt for 512b sectors RG | |
525 IFEQ SCIIHACK | |
526 clra SCII normal mode, normal NMI | |
527 tst flag512,u SCII must use halt mode for 512 byte sectors | |
528 bne L0176B | |
529 ENDC | |
530 lda #7 SCII read, buffered mode, masked NMI | |
531 bsr L01A1B send commands and wait | |
532 * New lines needed because the SCII has error other than OS-9 errors. RG | |
533 bcs ngood | |
534 * This now becomes a subroutine call. RG | |
535 * lbcs L03AF get the errors | |
536 lbsr L03AF get the errors | |
537 bcc good | |
538 ngood rts | |
539 | |
540 good pshs y | |
541 IFNE H6309 | |
542 ldw #256 set counter | |
543 ldy #RW.DAT source of data | |
544 IFNE SCIIHACK | |
545 tst flag512,u | |
546 beq sc2rlp | |
547 ldw #512 bump up counter to 512 byte sector | |
548 ENDC | |
549 * Don't use tfm if no halt important else need orcc #$50 for tfm | |
550 * If an interrupt occurs during a tfm transfer, the SCII counter | |
551 * will update but the tfm will repeat a byte and lose track. | |
552 * If orcc #$50 used, then key presses may be lost even with no-halt | |
553 * mode. | |
554 sc2rlp lda ,y read byte from SCII | |
555 sta ,x+ transfer byte to system buffer | |
556 decw update counter | |
557 bne sc2rlp | |
558 ELSE | |
559 ldy #256 | |
560 IFNE SCIIHACK | |
561 tst flag512,u | |
562 beq sc2rlp | |
563 ldy #512 | |
564 ENDC | |
565 sc2rlp lda >RW.DAT | |
566 sta ,x+ | |
567 leay -1,y | |
568 bne sc2rlp | |
569 ENDC | |
570 clrb no errors | |
571 puls y,pc | |
572 ENDC | |
573 | |
574 L0176B bsr L01A1 Send to controller & time delay to let it settle | |
575 *** Next few lines are commented out for blobstop patches | |
576 *L0180 bita >DPort+WD_Stat check status register | |
577 * bne L0197 eat it & start reading sector | |
578 * leay -1,y bump timeout timer down | |
579 * bne L0180 keep trying until it reaches 0 or sector read | |
580 * lda >ctlimg,u get current drive settings | |
581 * ora #C_MOTOR turn drive motor on | |
582 * sta >DPort+CtrlReg send to controller | |
583 * puls y,cc restore regs | |
584 * lbra L03E0 exit with Read Error | |
585 *** Blobstop fixes | |
586 stb >DPort+CtrlReg send B to control register | |
587 nop allow HALT to take effect | |
588 nop | |
589 bra L0197 and a bit more time | |
590 * Read loop - exited with NMI | |
591 * Entry: X=ptr to sector buffer | |
592 * B=Control register settings | |
593 L0197 lda >DPort+WD_Data get byte from controller | |
594 sta ,x+ store into sector buffer | |
595 * stb >DPort+CtrlReg drive info | |
596 nop -- blobstop fix | |
597 bra L0197 Keep reading until sector done | |
598 | |
599 L01A1 orcc #IntMasks Shut off IRQ & FIRQ | |
600 * No-halt mode must enter here, skipping IRQ shutoff. | |
601 L01A1B stb >DPort+WD_Cmd Send command | |
602 IFNE SCII | |
603 sta >RW.Ctrl tell SCII what to do | |
604 ENDC | |
605 L01A1C ldb #C_DBLDNS+C_MOTOR Double density & motor on | |
606 orb >ctlimg,u Merge with current drive settings | |
607 stb >DPort+CtrlReg Send to control register | |
608 IFNE SCII | |
609 tst flagform,u Format uses halt mode | |
610 bne s512 | |
611 IFEQ SCIIHACK | |
612 tst flag512,u SCII uses halt with 512 byte sectors | |
613 beq s256 | |
614 ELSE | |
615 bra s256 | |
616 ENDC | |
617 ENDC | |
618 s512 ldb #C_HALT+C_DBLDNS+C_MOTOR Enable halt, double density & motor on | |
619 orb >ctlimg,u Merge that with current drive settings | |
620 lbra FDCDelay Time delay to wait for command to settle | |
621 IFNE SCII | |
622 s256 ldb #4 normal mode, NMI masked | |
623 lda #255 time out slices | |
624 pshs a,x | |
625 SC2tmr1 ldx #1 | |
626 lbsr Delay sleep or timer | |
627 dec ,s count | |
628 beq tmout | |
629 tst >RW.Ctrl check status | |
630 bmi SC2tmr1 loop on not ready | |
631 stb RW.Ctrl clear SCII but don't generate NMI | |
632 clrb | |
633 puls a,x,pc | |
634 tmout stb RW.Ctrl clear SCII buffer counter | |
635 lda #$D0 force interrupt | |
636 sta DPort+WD_Cmd | |
637 comb set carry | |
638 puls a,x,pc | |
639 ENDC | |
640 | |
641 * Delay for some number of ticks (1 tick = 1/60 second). | |
642 * For a hard delay, we need to delay for 14833 cycles at .89MHz or | |
643 * 29666 cycles at 1.78MHz | |
644 * Entry: X = number of ticks to delay | |
645 Delay | |
646 pshs d [5+] [4+] | |
647 IFGT Level-1 | |
648 ldd <D.Proc [6] [5] process pointer | |
649 cmpd <D.SysPrc [is it the system? | |
650 beq hardloop [3] [3] | |
651 os9 F$Sleep if not system then sleep | |
652 puls d,pc [5+] [4+] | |
653 ENDC | |
654 hardloop tfr x,d we want X in A,B | |
655 l1@ equ * | |
656 IFEQ Level-1 | |
2941
4446149f7ea9
rb1773: Support 6309 on level 1 as well
Robert Gault <robert.gault@att.net>
parents:
2940
diff
changeset
|
657 IFNE H6309 |
4446149f7ea9
rb1773: Support 6309 on level 1 as well
Robert Gault <robert.gault@att.net>
parents:
2940
diff
changeset
|
658 ldx #1854/2 |
4446149f7ea9
rb1773: Support 6309 on level 1 as well
Robert Gault <robert.gault@att.net>
parents:
2940
diff
changeset
|
659 ELSE |
4446149f7ea9
rb1773: Support 6309 on level 1 as well
Robert Gault <robert.gault@att.net>
parents:
2940
diff
changeset
|
660 ldx #1482/2 [3] [3] |
4446149f7ea9
rb1773: Support 6309 on level 1 as well
Robert Gault <robert.gault@att.net>
parents:
2940
diff
changeset
|
661 ENDC |
1746 | 662 ELSE |
2941
4446149f7ea9
rb1773: Support 6309 on level 1 as well
Robert Gault <robert.gault@att.net>
parents:
2940
diff
changeset
|
663 IFNE H6309 |
4446149f7ea9
rb1773: Support 6309 on level 1 as well
Robert Gault <robert.gault@att.net>
parents:
2940
diff
changeset
|
664 ldx #1854 [3] [3] |
4446149f7ea9
rb1773: Support 6309 on level 1 as well
Robert Gault <robert.gault@att.net>
parents:
2940
diff
changeset
|
665 ELSE |
4446149f7ea9
rb1773: Support 6309 on level 1 as well
Robert Gault <robert.gault@att.net>
parents:
2940
diff
changeset
|
666 ldx #1482 [3] [3] |
4446149f7ea9
rb1773: Support 6309 on level 1 as well
Robert Gault <robert.gault@att.net>
parents:
2940
diff
changeset
|
667 ENDC |
1746 | 668 ENDC |
669 l2@ nop [2] [1] | |
670 nop [2] [1] | |
671 nop [2] [1] | |
672 leax -1,x [4+] [4+] | |
673 bne l2@ [3] [3] | |
674 subd #$0001 [4] [3] | |
675 bne l1@ [3] [3] | |
676 puls d,pc [5+] [4+] | |
677 | |
678 * Write | |
679 * Entry: | |
680 * B = MSB of LSN | |
681 * X = LSB of LSN | |
682 * Y = address of path descriptor | |
683 * U = address of device memory area | |
684 * | |
685 * Exit: | |
686 * CC = carry set on error | |
687 * B = error code | |
688 * | |
2940
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
689 Write tst flagFMT,u |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
690 bne w3 if a format write normally and clear flags |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
691 tst flagWP,u |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
692 beq w2 continue if not a mismatch |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
693 ldb #E$BTyp |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
694 lbra L03E0 report bad type if forced WP |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
695 w3 clr flagFMT,u |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
696 clr flagWP,u |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
697 w2 lbsr Chk512 go adjust LSN for 512 byte sector if needed |
1746 | 698 * Next line was lda #%1001001 which was an error RG |
699 lda #%10010001 retry flags for I/O errors (see Disto SCII source) | |
700 L01C4 pshs x,d preserve LSN, retries | |
701 bsr L01E8 go write the sector | |
702 puls x,d restore LSN, retries | |
703 bcs L01D8 error writing, go to write retry handler | |
704 tst <PD.VFY,y no error, do we want physical verify? | |
705 bne L01D6 no, exit without error | |
706 lbsr verify go re-read & verify 64 out of 256 bytes | |
707 bcs L01D8 error on verify, go to write retry handler | |
708 L01D6 clrb no error & return | |
709 L01D7 rts | |
710 | |
711 * Write error retry handler | |
712 L01D8 lsra Shift retry flags | |
713 lbeq L03AF Too many retries, exit with error | |
714 bcc L01C4 Normal retry, attemp to re-write sector | |
715 pshs x,d Preserve flags & sector # | |
716 lbsr sktrk0 Seek to track 0 (attempt to recalibrate) | |
717 puls x,d Restore flags & sector # | |
718 bra L01C4 Try re-writing now | |
719 | |
720 * 512 byte sector write here | |
721 L01E8 lbsr L02AC Go do double-step/write precomp if needed | |
722 bcs L01D7 Error, exit with it | |
723 pshs y,d Preserve path dsc. ptr & LSN | |
724 * Since I have modified chk512 the next two lines are replaced. RG | |
725 * lda <PD.TYP,y Get device type | |
726 * anda #%00000100 512 byte sector? | |
727 tst flag512,u go if 256 byte sectors | |
728 beq L020D Not 512 then skip ahead | |
729 lbsr L0176 Go read the sector in | |
730 ldd >loglsn,u Get OS9 LSN | |
731 andb #$01 Even or odd? | |
732 beq L020D Even, skip ahead | |
733 ldx >sectbuf,u Get physical sector buffer ptr | |
734 leax >$0100,x Point to 2nd half | |
735 bra L0211 Copy caller's buffer to 2nd half of sector | |
736 | |
737 L020D ldx >sectbuf,u Get physical sector buffer ptr | |
738 | |
739 L0211 ldy PD.BUF,y Get path dsc. buffer ptr | |
740 IFNE H6309 | |
741 ldw #256 Copy write buffer to sector buffer | |
742 tfm y+,x+ | |
743 ELSE | |
744 clrb | |
745 L0211Lp lda ,y+ | |
746 sta ,x+ | |
747 decb | |
748 bne L0211Lp | |
749 ENDC | |
750 puls y,d Get path dsc. ptr & LSN back | |
751 ldx >sectbuf,u Get physical sector buffer ptr again | |
752 * See read routine for explanation of SCII code. RG | |
753 IFNE SCII | |
754 IFEQ SCIIHACK | |
755 clra SCII write, normal mode & NMI | |
756 tst flag512,u | |
757 bne wr512 | |
758 ENDC | |
759 lda #4 SCII normal mode, masked NMI | |
760 sta RW.Ctrl tell SCII | |
761 pshs y | |
762 ldy #RW.Dat Send data to SCII RAM buffer | |
763 IFNE H6309 | |
764 ldw #256 | |
765 tst flag512,u | |
766 beq wrbuf | |
767 ldw #512 | |
768 wrbuf lda ,x+ | |
769 sta ,y | |
770 decw | |
771 bne wrbuf | |
772 ELSE | |
773 ldy #256 | |
774 tst flag512,u | |
775 beq wrbuf | |
776 ldy #512 | |
777 wrbuf lda ,x+ | |
778 sta >RW.DAT | |
779 leay -1,y | |
780 bne wrbuf | |
781 ENDC | |
782 puls y | |
783 ldb #$A0 Write sector command | |
784 lda #6 SCII masked NMI, buffered mode, write | |
785 * See Read section for explanation of error changes below. RG | |
786 * lbra L01A1B send command to controller | |
787 lbsr L01A1B send command to controller | |
788 bcs wngood SCII error, then go | |
789 lbra L03AF check for OS-9 errors | |
790 wngood rts | |
791 ENDC | |
792 wr512 ldb #S$Format | |
793 | |
794 * Format track comes here with B=$F0 (write track) | |
795 * as does write sector with B=$A0 | |
796 *WrTrk pshs y,cc Preserve path dsc. ptr & CC | |
797 WrTrk lbsr L01A1 Send command to controller (including delay) | |
798 *** Commented out for blobstop fixes | |
799 *L0229 bita >DPort+WD_Stat Controller done yet? | |
800 * bne L0240 Yes, go write sector out | |
801 * leay -$01,y No, bump wait counter | |
802 * bne L0229 Still more tries, continue | |
803 * lda >ctlimg,u Get current drive control register settings | |
804 * ora #C_MOTOR Drive motor on (but drive select off) | |
805 * sta >DPort+CtrlReg Send to controller | |
806 * puls y,cc Restore regs | |
807 * lbra L03AF Check for errors from status register | |
808 | |
809 *** added blobstop | |
810 IFGT Level-1 | |
811 lda FBlock+1,u get the block number for format | |
812 beq L0230 if not format, don't do anything | |
813 sta >$FFA1 otherwise map the block in | |
814 * added delay for for MMU line settling. RG 2005/1/23 | |
815 nop | |
816 nop | |
817 ENDC | |
818 L0230 stb >DPort+CtrlReg send data to control register | |
819 * These lines converted to separate sector writes from format. RG | |
2226
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
820 * Removed slow down but left code just in case. RG |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
821 nop |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
822 nop |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
823 * cmpb #$F0 if format, then |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
824 * beq L0240b go to special loop |
1746 | 825 bra L0240 wait a bit for HALT to enable |
826 | |
827 * Write sector routine (Entry: B= drive/side select) (NMI will break out) | |
2226
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
828 * Was part of timing change mentioned above. Removed RG |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
829 L0240 nop --- wait a bit more |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
830 lda ,x+ Get byte from write buffer |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
831 *L0240 lda ,x+ Get byte from write buffer |
1746 | 832 sta >DPort+WD_Data Save to FDC's data register |
833 * EAT 2 CYCLES: TC9 ONLY (TRY 1 CYCLE AND SEE HOW IT WORKS) | |
834 IFEQ TC9-1 | |
835 nop | |
836 nop | |
2226
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
837 * ELSE |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
838 * See above. RG Now removed. |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
839 * nop |
1746 | 840 ENDC |
2226
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
841 * No blob change. |
1746 | 842 * stb >DPort+CtrlReg Set up to read next byte |
843 bra L0240 Go read it | |
2226
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
844 * Special loop for format slows CPU clock. RG Now removed. |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
845 *L0240b |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
846 * IFGT Level-1 |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
847 * sta >$FFD8 |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
848 * ENDC |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
849 *L0240c lda ,x+ |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
850 * sta >DPort+WD_Data |
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
851 * bra L0240c |
1746 | 852 * NMI routine |
853 NMISvc leas R$Size,s Eat register stack | |
2226
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
854 * Added to compensate above change in format loop. RG Now removed. |
1790 | 855 IFGT Level-1 |
2226
3af8e9655158
The clock slow down routine for rb1773 write track has been deactivated. The code is still present in case it needs to be reinstated. RG
robertgault
parents:
2194
diff
changeset
|
856 * sta >$FFD9 |
1746 | 857 ldx <D.SysDAT get pointer to system DAT image |
858 lda 3,x get block number 1 | |
859 sta >$FFA1 map it back into memory | |
860 ENDC | |
861 andcc #^IntMasks turn IRQ's on again | |
862 ldb >DPort+WD_Stat Get status register | |
863 IFNE SCII | |
864 clr RW.Ctrl Clear SCII command register | |
865 ENDC | |
866 bitb #%00000100 Did we lose data in the transfer? | |
867 lbeq L03B2 Otherwise, check for drive errors | |
868 comb -- blobstop error code | |
869 ldb #E$DevBsy -- device busy | |
870 rts -- and exit | |
871 | |
872 verify pshs x,d | |
873 * Removed unneeded code. Data never sent to PD.BUF anyway so there is | |
874 * no need to redirect the PD.BUF pointer. RG | |
875 * ldx PD.BUF,y Get write buffer ptr | |
876 * pshs x Preserve it | |
877 * ldx >sectbuf,u Get sector buffer ptr | |
878 * stx PD.BUF,y Save as write buffer ptr | |
879 * ldx 4,s | |
880 lbsr ReadSector Go read sector we just wrote | |
881 * puls x Get original write buffer ptr | |
882 * stx PD.BUF,y Restore path dsc. version | |
883 bcs L02A3 If error reading, exit with it | |
884 ldx PD.BUF,y Get system buffer ptr | |
885 pshs u,y Preserve device mem, path dsc. ptrs | |
886 * See change in chk512 routine. RG | |
887 * ldb <PD.TYP,y Get type from path dsc. | |
888 ldy >sectbuf,u Get sector buffer ptr | |
889 * andb #%00000100 512 byte sector? | |
890 tst flag512,u 512 byte sector? | |
891 beq L028D No, skip ahead | |
892 ldd >loglsn,u Get OS9's sector # | |
893 andb #$01 Odd/even sector? | |
894 beq L028D Even; compare first half | |
895 leay >$0100,y Odd, compare second half | |
896 L028D tfr x,u Move PD.BUF ptr to U (since cmpx is faster) | |
897 clra check all 256 bytes | |
898 L028F ldx ,u++ Get 2 bytes from original write buffer | |
899 cmpx ,y++ Same as corresponding bytes in re-read sector? | |
900 bne vfybad No, error & return | |
901 inca | |
902 bpl L028F No, continue | |
903 bra L02A1 carry is clear by virtue of last cmpx | |
904 vfybad comb set carry | |
905 L02A1 puls u,y | |
906 L02A3 puls pc,x,d | |
907 | |
908 L02A5 pshs a Save Caller's track # | |
909 ldb <V.TRAK,x Get track # drive is currently on | |
910 bra L02E9 Go save it to controller & continue | |
911 | |
912 L02AC lbsr L0376 Go set up controller for drive, spin motor up | |
913 bsr L032B Get track/sector # (A=Trk, B=Sector) | |
914 pshs a Save track # | |
915 lda >currside,u Get side 1/2 flag | |
916 beq L02C4 Side 1, skip ahead | |
917 lda >ctlimg,u Get control register settings | |
918 ora #C_SIDSEL Set side 2 (drive 3) select | |
919 sta >ctlimg,u Save it back | |
920 L02C4 lda <PD.TYP,y Get drive type settings | |
921 bita #%00000010 ??? (Base 0/1 for sector #?) | |
922 bne L02CC Skip ahead | |
923 incb Bump sector # up by 1 | |
2940
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
924 *!!!!!!!!!!!!!!!!!!!!!critical section on double-stepping |
1746 | 925 L02CC stb >DPort+WD_Sect Save into Sector register |
926 ldx >lastdrv,u Get last drive table accessed | |
927 ldb <V.TRAK,x Get current track # on device | |
2940
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
928 lda <PD.TYP,y Get drive type |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
929 bita #1 3.5" drive |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
930 beq L02CCb go if not 3.5" RG |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
931 lda ,s recover track # |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
932 clr flagWP,u |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
933 bra L02E9 |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
934 L02CCb lda <DD.FMT,x Get drive format specs; actually disk format specs RG |
2939
011a5f26e9da
rb1773: Fix comments about 135 TPI versus 48 or 96
Robert Gault <robert.gault@att.net>
parents:
2938
diff
changeset
|
935 lsra Shift track & bit densities to match PD; bit0 is MF or MFM |
011a5f26e9da
rb1773: Fix comments about 135 TPI versus 48 or 96
Robert Gault <robert.gault@att.net>
parents:
2938
diff
changeset
|
936 eora <PD.DNS,y Check for differences with path densities; bit0 is MF MFM, bit1 is 96tpi |
011a5f26e9da
rb1773: Fix comments about 135 TPI versus 48 or 96
Robert Gault <robert.gault@att.net>
parents:
2938
diff
changeset
|
937 anda #%00000010 Keep only 96 tpi |
1746 | 938 pshs a Save differences |
939 lda 1,s Get track # back | |
940 tst ,s+ Are tpi's different? | |
941 beq L02E9 No, continue normally | |
942 lsla Yes, multiply track # by 2 ('double-step') | |
943 lslb Multiply current track # by 2 ('double-step') | |
2940
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
944 clr flagWP,u |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
945 inc flagWP,u if double-step then prevent future writes |
1746 | 946 L02E9 stb >DPort+WD_Trak Save current track # onto controller |
947 | |
948 * From here to the line before L0307 is for write precomp, but is not used. | |
949 * Unless write precomp is needed, all of this is useless | |
950 * I think most (if not all) drives do NOT need precomp | |
951 IFEQ PRECOMP-1 | |
952 ldb #21 Pre-comp track # | |
953 pshs b Save it | |
954 ldb <PD.DNS,y Get current density settings | |
955 andb #%00000010 Just want to check track density | |
956 beq L02F9 48 tpi, skip ahead | |
957 lsl ,s Multiply pre-comp value by 2 ('double-step') | |
958 L02F9 cmpa ,s+ Is track # high enough to warrant precomp? | |
959 bls L0307 No, continue normally | |
960 ldb >ctlimg,u | |
2938
c91cd2a9b22a
rb1773: Fix typo in write precompensation code
Robert Gault <robert.gault@att.net>
parents:
2226
diff
changeset
|
961 orb #C_WPRCMP Turn on Write precomp |
1746 | 962 stb >ctlimg,u |
963 ENDC | |
964 | |
965 L0307 tst >u00AA,u ??? Get flag (same drive flag?) | |
966 bne L0314 no, skip ahead | |
967 ldb ,s get track # | |
968 cmpb <V.TRAK,x same as current track on this drive? | |
969 beq L0321 yes, skip ahead | |
970 L0314 sta >DPort+WD_Data save track # to data register | |
971 ldb <PD.STP,y get stepping rate | |
972 andb #%00000011 just keep usable settings (6-30 ms) | |
973 eorb #%00011011 set proper bits for controller | |
974 lbsr L03E4 send command to controller & time delay | |
975 L0321 puls a get track # back | |
976 sta <V.TRAK,x save as current track # | |
977 sta >DPort+WD_Trak save to controller | |
978 clrb no error & return | |
979 rts | |
980 | |
981 * Entry: B:X LSN | |
982 * Exit: A=Track # | |
983 * B=Sector # | |
984 * <currside=00 = Head 1 , $FF = Head 2 | |
985 L032B tstb Sector # > 65535? | |
986 bne L033F Yes, illegal for floppy | |
987 tfr x,d Move sector # to D | |
988 leax ,x LSN 0? ie. "tstx" | |
989 beq L0371 Yes, exit this routine | |
990 ldx >lastdrv,u Get previous drive table ptr | |
991 cmpd DD.TOT+1,x Within range of drive spec? | |
992 blo L0343 Yes, go calculate track/sector #'s | |
993 L033F comb Exit with Bad sector # error | |
994 ldb #E$Sect | |
995 rts | |
996 | |
997 * Calculate track/sector #'s? | |
998 * These two sections could be combined into one with a final | |
999 * test of DD.FMT. Then currside can be set and regA can be lsra | |
1000 * as needed. RG | |
1001 L0343 stb >u00AE,u Save LSB of LSN | |
1002 clr ,-s Clear track # on stack | |
1003 ldb <DD.FMT,x Get drive format | |
1004 lsrb Shift out # sides into carry | |
1005 ldb >u00AE,u Get LSB of LSN again | |
1006 bcc L0367 Single sided drive, skip ahead | |
1007 bra L035D Double sided drive, skip ahead | |
1008 * Double sided drive handling here | |
1009 L0355 com >currside,u Odd/even sector track flag | |
1010 bne L035D Odd, so don't bump track # up | |
1011 inc ,s Bump up track # | |
1012 | |
1013 * Changed this to more effient code. RG | |
1014 *L035D subb DD.TKS,x Subtract # sectors/track | |
1015 * sbca #$00 | |
1016 L035D subd DD.SPT,x | |
1017 bcc L0355 Still more sectors left, continue | |
1018 bra L036D Wrapped, skip ahead | |
1019 * Single sided drive handling here | |
1020 L0365 inc ,s Bump track # up | |
1021 | |
1022 * See above. RG | |
1023 *L0367 subb DD.TKS,x Subtract # sectors/track | |
1024 * sbca #$00 | |
1025 L0367 subd DD.SPT,x | |
1026 bcc L0365 Still more, go bump the track up | |
1027 * Next possible because upper limit is 256 sectors/track. RG | |
1028 L036D addb DD.TKS,x Bump sector # back up from negative value | |
1029 puls a Get the track # | |
1030 L0371 rts A=track #, B=Sector #, <currside=Odd | |
1031 | |
1032 * Drive control register bit mask table | |
1033 * May want an option here for double sided SDDD disks ex. RG | |
1034 * fcb $1 drive0 | |
1035 * fcb $2 drive1 | |
1036 * fcb $41 drive2 | |
1037 * fcb $42 drive3 | |
1038 * fcb $4 drive4 | |
1039 * fcb $44 drive5 | |
1040 | |
1041 L0372 fcb $01 Drive 0 | |
1042 fcb $02 Drive 1 | |
1043 fcb $04 Drive 2 | |
1044 fcb $40 Drive 3 / Side select | |
1045 | |
1046 * Changes regD; X,Y,U preserved | |
1047 L0376 clr >u00AA,u clear drive change flag | |
1048 chkdrv lda <PD.DRV,y Get drive # requested | |
1049 * It is possible to have more than 4 drive # so the change below. RG | |
1050 * cmpa #4 Drive 0-3? | |
1051 cmpa #N.Drives Drive 0-6 if alternate table used? | |
1052 blo L0385 Yes, continue normally | |
1053 NoHW comb Illegal drive # error | |
1054 ldb #E$Unit | |
1055 rts | |
1056 | |
1057 * Entry: A=drive #, X=LSN (Physical, not OS9 logical if PCDOS disk) | |
1058 L0385 pshs x,d Save sector #, drive # & B??? | |
1059 leax >L0372,pc Point to drive bit mask table | |
1060 ldb a,x Get bit mask for drive # we want | |
1061 stb >ctlimg,u Save mask | |
1062 leax DRVBEG,u Point to beginning of drive tables | |
1063 ldb #DRVMEM Get size of each drive table | |
1064 mul Calculate offset to drive table we want | |
1065 leax d,x Point to it | |
1066 cmpx >lastdrv,u Same as Last drive table accessed? | |
1067 beq L03A6 Yes, skip ahead | |
1068 stx >lastdrv,u Save new drive table ptr | |
1069 com >u00AA,u Set drive change flag | |
1070 L03A6 clr >currside,u Set side (head) flag to side 1 | |
1071 lbsr L04B3 Go set up VIRQ to wait for drive motor | |
1072 puls pc,x,d Restore sector #,drive #,B & return | |
1073 | |
1074 L03AF ldb >DPort+WD_Stat Get status register from FDC | |
1075 * This line needed when returning to Disk Basic but probably | |
1076 * not needed for OS-9. RG | |
1077 IFNE SCII | |
1078 clr RW.Ctrl return SCII to halt mode | |
1079 ENDC | |
1080 L03B2 bitb #%11111000 any of the error bits set? | |
1081 beq L03CA No, exit without error | |
1082 aslb Drive not ready? | |
1083 bcs L03CC Yes, use that error code | |
1084 aslb Write protect error? | |
1085 bcs L03D0 Yes, use that error code | |
1086 aslb Write fault error? | |
1087 bcs L03D4 Yes, use that error code | |
1088 aslb Sector not found? | |
1089 bcs L03D8 Yes, use Seek error code | |
1090 aslb CRC error? | |
1091 bcs L03DC Yes, use that error code | |
1092 L03CA clrb No error & return | |
1093 rts | |
1094 | |
1095 L03CC ldb #E$NotRdy not ready | |
1096 fcb $8C skip 2 bytes | |
1097 | |
1098 L03D0 ldb #E$WP write protect | |
1099 fcb $8C skip 2 bytes | |
1100 | |
1101 L03D4 ldb #E$Write write error | |
1102 fcb $8C | |
1103 | |
1104 L03D8 ldb #E$Seek seek error | |
1105 fcb $8C | |
1106 | |
1107 L03DC ldb #E$CRC CRC error | |
1108 * fcb $8C | |
1109 | |
1110 *L03E0 ldb #E$Read Read error | |
2940
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
1111 L03E0 orcc #Carry set carry |
1746 | 1112 rts |
1113 | |
1114 L03E4 bsr L0404 Send command to controller & waste some time | |
1115 L03E6 ldb >DPort+WD_Stat Check FDC status register | |
1116 bitb #$01 Is controller still busy? | |
1117 beq L0403 No, exit | |
1118 ldd >VIRQCnt,pc Get initial count value for drive motor speed | |
1119 std >VIRQPak,u Save it | |
1120 * Again, I'm trying to match Kevin Darling code. It may not be needed. RG | |
1121 pshs x | |
1122 ldx #1 Sleep remainder of slice | |
1123 lbsr Delay | |
1124 puls x | |
1125 bra L03E6 Wait for controller to finish previous command | |
1126 | |
1127 * Send command to FDC | |
1128 L03F7 lda #C_MOTOR | |
1129 * lda #%00001000 Mask in Drive motor on bit | |
1130 ora >ctlimg,u Merge in drive/side selects | |
1131 sta >DPort+CtrlReg Turn the drive motor on & select drive | |
1132 stb >DPort+WD_Cmd Save command & return | |
1133 L0403 rts | |
1134 | |
1135 L0404 bsr L03F7 Go send command to controller | |
1136 | |
1137 * This loop has been changed from nested LBSRs to timing loop. | |
1138 * People with crystal upgrades should modify the loop counter | |
1139 * to get a 58+ us delay time. MINIMUM 58us. | |
1140 FDCDelay | |
1141 pshs a 14 cycles, plus 3*loop counter | |
1142 IFEQ Level-1 | |
1143 lda #18 (only do about a 100 cycle delay for now) | |
1144 ELSE | |
1145 lda #29 (only do about a 100 cycle delay for now) | |
1146 ENDC | |
1147 L0409 deca for total ~63 us delay (123 cycles max.) | |
1148 bne L0409 | |
1149 puls a,pc restore register and exit | |
1150 | |
1151 * SetStat | |
1152 * | |
1153 * Entry: | |
1154 * A = function code | |
1155 * Y = address of path descriptor | |
1156 * U = address of device memory area | |
1157 * | |
1158 * Exit: | |
1159 * CC = carry set on error | |
1160 * B = error code | |
1161 * | |
1162 SetStat ldx PD.RGS,y Get caller's register stack ptr | |
1163 ldb R$B,x Get function code | |
1164 cmpb #SS.WTrk Write track? | |
1165 beq SSWTrk Yes, go do it | |
1166 cmpb #SS.Reset Restore head to track 0? | |
1167 lbeq sktrk0 Yes, go do it --- beq | |
1168 comb set carry for error | |
1169 ldb #E$UnkSvc return illegal service request error | |
1170 rts | |
1171 | |
2940
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
1172 SSWTrk stb flagFMT,u permit unconditional write on format |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
1173 clr flagWP,u don't protect on a format |
824019cd8744
rb1773: Make 48 TPI floppy disks readonly in 96 TPI drives
Robert Gault <robert.gault@att.net>
parents:
2939
diff
changeset
|
1174 pshs u,y preserve register stack & descriptor |
1746 | 1175 |
1176 * Level 2 Code | |
1177 IFGT Level-1 | |
1178 | |
1179 *--- new code | |
1180 ldb #1 1 block to allocate | |
1181 os9 F$AllRAM allocate some RAM | |
1182 lbcs L0489 error out if at all | |
1183 leax >FBlock,u point to 'my' DAT image | |
1184 std ,x save a copy of the block | |
1185 os9 F$ResTsk reserve a task number for the copy | |
1186 bcs FError error out | |
1187 stb 2,x save temporary task number in FTask,u | |
1188 lslb 2 bytes per entry | |
1189 ldu <D.TskIPt get task image table pointer | |
1190 stx b,u save pointer to the task's DAT image | |
1191 lsrb get the right number again | |
1192 IFNE H6309 | |
1193 tfr 0,u destination is address 0 | |
1194 ELSE | |
1195 ldu #$0000 | |
1196 ENDC | |
1197 *--- end new code | |
1198 | |
1199 ldx 2,s get pointer to descriptor | |
1200 * stu >FBlock,x | |
1201 ldx <D.Proc Get current process ptr | |
1202 lda P$Task,x Get task # for current process | |
1203 * ldb <D.SysTsk Get system task # | |
1204 ldy ,s | |
1205 ldx PD.RGS,y Get register stack ptr | |
1206 ldx R$X,x Get ptr to caller's track buffer | |
1207 ldy #$1A00 Size of track buffer | |
1208 os9 F$Move Copy from caller to temporary task | |
1209 bcs L0479 Error copying, exit | |
1210 puls u,y | |
1211 pshs u,y | |
1212 | |
1213 ENDC | |
1214 * End of Level 2 Code | |
1215 | |
1216 lbsr L0376 Go check drive #/wait for it to spin up | |
1217 ldx PD.RGS,y Get caller's register stack ptr | |
1218 ldb R$Y+1,x Get caller's side/density | |
1219 bitb #$01 Check side | |
1220 beq L0465 Side 1, skip ahead | |
1221 * I think this next line is not needed. RG | |
1222 com >currside,u * Why? This is normally used with | |
1223 * calculate track. RG | |
1224 ldb >ctlimg,u Get current control register settings | |
1225 * orb #%01000000 Mask in side 2 | |
1226 orb #C_SIDSEL Mask in side 2 | |
1227 stb >ctlimg,u Save updated control register | |
1228 L0465 lda R$U+1,x Get caller's track # | |
1229 ldx >lastdrv,u Get current drive table ptr | |
1230 lbsr L02A5 | |
1231 bcs L0489 | |
1232 ldb #$F0 Write track command | |
1233 *--- | |
1234 IFEQ Level-1 | |
1235 ldx PD.RGS,y | |
1236 ldx R$X,x | |
1237 ELSE | |
1238 ldx #$2000 start writing from block 1 | |
1239 ENDC | |
1240 | |
1241 IFNE SCII | |
1242 lda #1 normal unbuffered write | |
1243 * Next line prevents WrTrk from switching to SCII buffered mode. RG | |
1244 sta flagform,u | |
1245 ENDC | |
1246 lbsr WrTrk Go write the track | |
1247 IFNE SCII | |
1248 clr flagform,u permit no-halt mode RG | |
1249 ENDC | |
1250 | |
1251 IFGT Level-1 | |
1252 L0479 ldu 2,s | |
1253 pshs b,cc Preserve error | |
1254 ldb >FTask,u point to task | |
1255 os9 F$RelTsk release the task | |
1256 fcb $8C skip 2 bytes | |
1257 | |
1258 * format comes here when block allocation passes, but task allocation | |
1259 * gives error. So er de-allocate the block. | |
1260 FError | |
1261 pshs b,cc save error code, cc | |
1262 ldx >FBlock,u point to block | |
1263 ldb #1 1 block to return | |
1264 os9 F$DelRAM de-allocate image RAM blocks | |
1265 clr FBlock+1,u ensure that the block # in FBlock is zero. | |
1266 puls b,cc Restore error | |
1267 ENDC | |
1268 | |
1269 L0489 puls pc,u,y Restore regs & return | |
1270 | |
1271 * seek the head to track 0 | |
1272 sktrk0 lbsr chkdrv | |
1273 ldx >lastdrv,u | |
2194 | 1274 clr <V.TRAK,x |
1746 | 1275 lda #1 was 5 but that causes head banging |
1276 L0497 ldb <PD.STP,y | |
1277 andb #%00000011 Just keep usable settings (6-30 ms) | |
1278 eorb #%01001011 Set proper bits for controller | |
1279 pshs a | |
1280 lbsr L03E4 | |
1281 puls a | |
1282 deca | |
1283 bne L0497 | |
1284 ldb <PD.STP,y | |
1285 andb #%00000011 Just keep usable settings (6-30 ms) | |
1286 eorb #%00001011 Set proper bits for controller | |
1287 lbra L03E4 | |
1288 | |
1289 L04B3 pshs y,x,d Preserve regs | |
1290 ldd >VIRQCnt,pc Get VIRQ initial count value | |
1291 std >VIRQPak,u Save it | |
1292 lda >ctlimg,u ?Get drive? | |
1293 ora #C_MOTOR Turn drive motor on for that drive | |
1294 * ora #%00001000 Turn drive motor on for that drive | |
1295 sta >DPort+CtrlReg Send drive motor on command to FDC | |
1296 IFEQ Level-1 | |
1297 lda >D.DskTmr Get VIRQ flag | |
1298 ELSE | |
1299 lda <D.MotOn Get VIRQ flag | |
1300 ENDC | |
1301 bmi L04DE Not installed yet, try installing it | |
1302 bne L04E0 Drive already up to speed, exit without error | |
1303 | |
1304 * Drive motor speed timing loop (could be F$Sleep call now) (was over .5 sec) | |
1305 * 32 was not sufficient for one of my drives. RG | |
1306 ldx #50 wait for 32 ticks; increased it RG | |
1307 lbsr Delay | |
1308 | |
1309 L04DE bsr InsVIRQ Install VIRQ to wait for drive motors | |
1310 L04E0 clrb No error & return | |
1311 puls pc,y,x,d | |
1312 | |
1313 InsVIRQ lda #$01 Flag drive motor is up to speed | |
1314 IFEQ Level-1 | |
1315 sta >D.DskTmr | |
1316 ELSE | |
1317 sta <D.MotOn | |
1318 ENDC | |
1319 ldx #$0001 Install VIRQ entry | |
1320 leay >VIRQPak,u Point to packet | |
1321 clr Vi.Stat,y Reset Status byte | |
1322 ldd >VIRQCnt,pc Get initial VIRQ count value | |
1323 os9 F$VIRQ Install VIRQ | |
1324 bcc VIRQOut No error, exit | |
1325 lda #$80 Flag that VIRQ wasn't installed | |
1326 IFEQ Level-1 | |
1327 sta >D.DskTmr | |
1328 ELSE | |
1329 sta <D.MotOn | |
1330 ENDC | |
1331 VIRQOut clra | |
1332 rts | |
1333 | |
1334 * IRQ service routine for VIRQ (drive motor time) | |
1335 * Entry: U=Ptr to VIRQ memory area | |
1336 IRQSvc pshs a | |
1337 lda <D.DMAReq | |
1338 beq L0509 | |
1339 bsr InsVIRQ | |
1340 bra IRQOut | |
1341 L0509 sta >DPort+CtrlReg | |
1342 * I changed this to a clear. Don't see the point of an AND. RG | |
1343 * IFNE H6309 | |
1344 * aim #$FE,>u00B5,u | |
1345 * ELSE | |
1346 * lda u00B5,u | |
1347 * anda #$FE | |
1348 * sta u00B5,u | |
1349 * ENDC | |
1350 * fdb u00B5 --- so changes in data size won't affect anything | |
1351 clr u00B5,u | |
1352 IFEQ Level-1 | |
1353 clr >D.DskTmr | |
1354 ELSE | |
1355 clr <D.MotOn | |
1356 ENDC | |
1357 IRQOut puls pc,a | |
1358 | |
1359 * Non-OS9 formatted floppies need a drive table entry constructed | |
1360 * by hand since there is no RBF LSN0. | |
1361 * | |
1362 * Entry: X=LSN | |
1363 * Y=Path dsc. ptr | |
1364 * U=Device mem ptr | |
1365 MakeDTEntry | |
1366 pshs x Preserve Logical sector # | |
1367 ldx >lastdrv,u Get last drive table accessed ptr | |
1368 clra | |
1369 pshs x,a Save ptr & NUL byte | |
1370 IFNE H6309 | |
1371 ldw #20 Clear 20 bytes | |
1372 tfm s,x+ | |
1373 ELSE | |
1374 ldb #20 | |
1375 L051ALp clr ,x+ | |
1376 decb | |
1377 bne L051ALp | |
1378 ENDC | |
1379 puls x,a Eat NUL & get back drive table ptr | |
1380 ldb <PD.CYL+1,y Get # cylinders on drive (ignores high byte) | |
1381 lda <PD.SID,y Get # sides | |
1382 mul Calculate # tracks on drive (1 per head) | |
1383 IFNE H6309 | |
1384 decd Adjust to ignore track 0 | |
1385 ELSE | |
1386 subd #$0001 | |
1387 ENDC | |
1388 lda <PD.SCT+1,y Get # sectors/track | |
1389 sta DD.TKS,x Save in drive table | |
1390 sta <DD.SPT+1,x Save in other copy in drive table | |
1391 mul Calculate # sectors on drive (minus track 0) | |
1392 pshs x Preserve drive table ptr | |
1393 tfr d,x Move # sectors on drive to X | |
1394 lda <PD.T0S+1,y Get # sectors on track 0 | |
1395 leax a,x Add that many sectors to total | |
1396 lda <PD.TYP,y Get device type settings | |
1397 anda #%00000100 Mask out all but 512 byte sector flag | |
1398 beq L0550 Not 512 byte sector, skip ahead | |
1399 IFNE H6309 | |
1400 addr x,x Multiply by 2 (convert to 256 byte OS9 sectors) | |
1401 ELSE | |
1402 tfr x,d | |
1403 leax d,x | |
1404 ENDC | |
1405 L0550 tfr x,d Move # sectors to D | |
1406 puls x Get back drive table ptr | |
1407 std DD.TOT+1,x Save # sectors allowed on drive | |
1408 lda #UPDAT.+EXEC. Owner's read/write/exec attributes | |
1409 sta DD.ATT,x Set attributes for disk | |
2939
011a5f26e9da
rb1773: Fix comments about 135 TPI versus 48 or 96
Robert Gault <robert.gault@att.net>
parents:
2938
diff
changeset
|
1410 lda <PD.DNS,y Get density settings this should be bit1 96tpi bit0 MF MFM normally is 1 |
1746 | 1411 lsla Shift for DD.FMT |
1412 pshs a Preserve it a sec | |
1413 lda <PD.SID,y Get # sides | |
1414 deca Adjust to base 0 | |
1415 ora ,s+ Merge with density settings | |
2939
011a5f26e9da
rb1773: Fix comments about 135 TPI versus 48 or 96
Robert Gault <robert.gault@att.net>
parents:
2938
diff
changeset
|
1416 sta <DD.FMT,x Save in device table; normally becomes %11 or 3 |
1746 | 1417 clrb No error? |
1418 puls pc,x Restore original LSN & return | |
1419 | |
1420 emod | |
1421 eom equ * | |
1422 end | |
1423 |