Microware OS-9 Assembler RS Version 01.00.00 04/04/97 17:05:38 Page 001 DragDisk - Dragon Disk Driver 00001 *********************************************** 00002 * 00003 NAM DragDisk 00004 * Dragon Disk Device Driver 00005 * Last edit 9/9/86 00006 * A modified version of DDisk based 00007 * on version 00.10 of Andrew Lindley's 00008 * CCDisk. 00009 * 00010 * 00011 TTL Dragon Disk Driver 00012 00013 * Includes of System Definitions 00014 IFP1 00019 ENDC 00020 00021 00022 0109 NMIVec EQU $109 00023 0004 NumDrvs EQU 4 00024 0001 DensMask EQU %00000001 00025 0002 T80Mask EQU %00000010 00026 00027 FF22 P1PDRB EQU $FF22 00028 FF23 P1PCRB EQU $FF23 00029 FF03 P0PCRB EQU $FF03 00030 FF05 ACIAStat EQU $FF05 00031 FF06 ACIACmnd EQU $FF06 00032 00033 * SelReg Masks 00034 0020 NMIEn EQU %00100000 00035 0010 WPCEn EQU %00010000 00036 0004 MotorOn EQU %00000100 00037 0008 SDensEn EQU %00001000 00038 00039 * Disk port locations 00040 FF48 SelReg EQU $FF48 00041 FF40 CmndReg EQU $FF40 00042 FF41 TrkReg EQU $FF41 00043 FF42 SecReg EQU $FF42 00044 FF43 DataReg EQU $FF43 00045 00046 * Disk Commands 00047 00D0 FrcInt EQU %11010000 00048 0088 ReadCmnd EQU %10001000 00049 0000 RestCmnd EQU %00000000 00050 0010 SeekCmnd EQU %00010000 00051 0040 StpICmnd EQU %01000000 00052 00A8 WritCmnd EQU %10101000 00053 00F0 WtTkCmnd EQU %11110000 00054 0002 Sid2Sel EQU %00000010 00055 00056 * Disk Status Bits 00057 0001 BusyMask EQU %00000001 00058 0004 LostMask EQU %00000100 00059 00F8 ErrMask EQU %11111000 00060 0008 CRCMask EQU %00001000 00061 0010 RNFMask EQU %00010000 00062 0020 RTypMask EQU %00100000 00063 0040 WPMask EQU %01000000 00064 0080 NotRMask EQU %10000000 Microware OS-9 Assembler RS Version 01.00.00 04/04/97 17:05:40 Page 002 DragDisk - Dragon Disk Driver 00065 00066 * Data Area Defs 00067 D 000F ORG DRVBEG 00068 D 000F RMB NumDrvs*DrvMem 00069 D 00A7 CDrvTab RMB 2 00070 D 00A9 DrvMask RMB 1 00071 D 00AA Settle RMB 1 00072 D 00AB PIATemp RMB 1 00073 D 00AC ACIATemp RMB 1 00074 D 00AD BufPtr RMB 2 00075 D 00AF SideSel RMB 1 00076 D 00B0 DatSiz EQU . 00077 00078 0000 87CD0376 MOD Length,Name,Type,Att,Entry,DatSiz 00079 00080 00E1 Type EQU Drivr+Objct 00081 0082 Att EQU ReEnt+2 00082 000D FF FCB $FF access modes byte 00083 000E 44446973 Name FCS /DDisk/ Module Name 00084 0013 03 FCB $03 revision byte 00085 00086 W 0014 16000F Entry LBRA Init Initialise Drive 00087 W 0017 160050 LBRA Read Read Sector 00088 001A 160107 LBRA Write Write Sector 00089 W 001D 160048 LBRA NoErr Get Status 00090 0020 1602C6 LBRA SetSta Set Status 00091 W 0023 160042 LBRA NoErr Terminate Device 00092 00093 * Initialisation Routine 00094 0026 4F Init CLRA 00095 W 0027 B7006F STA >D.DskTmr Null the motor time out count 00096 W 002A B7FF48 STA >SelReg deselect all drives and tur 00097 002D 8EFF40 LDX #CmndReg Reset the Controller 00098 0030 86D0 LDA #FrcInt 00099 0032 A784 STA ,X 00100 0034 1702AB LBSR Delay 00101 0037 A684 LDA ,X 00102 0039 86FF LDA #$FF 00103 003B C604 LDB #NumDrvs 00104 003D 304F LEAX DrvBeg,U Set up Device Memory Area so 00105 003F A784 Init1 STA DD.Tot,X First read will work 00106 0041 A78815 STA NMIVec+1 00112 0051 867E LDA #$7E 00113 W 0053 B70109 STA >NMIVec 00114 0056 CC0100 LDD #256 Get a page for verify bu 00115 0059 3440 PSHS U 00116 005B 103F28 OS9 F$SRqMem 00117 005E 1F31 TFR U,X 00118 0060 3540 PULS U 00119 0062 2505 BLO Init2 00120 0064 AFC900AD STX >BufPtr,U 00121 0068 5F NoErr CLRB 00122 0069 39 Init2 RTS 00123 00124 * Read Rtne Microware OS-9 Assembler RS Version 01.00.00 04/04/97 17:05:42 Page 003 DragDisk - Dragon Disk Driver 00125 006A 8691 Read LDA #$91 Retry Count 00126 006C 8C0000 CMPX #0 Is it LSN 0 ? 00127 006F 2623 BNE Read2 No then just do the read 00128 0071 8D21 BSR Read2 Else do the read and 00129 0073 2515 BLO Read4 copy part into the Device 00130 0075 AE28 LDX PD.Buf,Y 00131 0077 3430 PSHS Y,X 00132 0079 10AEC900A7 LDY >CDrvTab,U 00133 007E C614 LDB #DD.Siz-1 00134 0080 A685 Read1 LDA B,X 00135 0082 A7A5 STA B,Y 00136 0084 5A DECB 00137 0085 2AF9 BPL Read1 00138 0087 5F CLRB 00139 0088 35B0 PULS X,Y,PC 00140 008A 39 Read4 RTS 00141 008B 2407 Read3 BHS Read2 Retry Entry Point 00142 008D 3416 PSHS X,B,A 00143 008F 170288 LBSR Reset Reset to Track 0 00144 0092 3516 PULS A,B,X 00145 0094 3416 Read2 PSHS X,B,A Normal Entry Point 00146 0096 8D07 BSR ReadTS 00147 0098 3516 PULS A,B,X 00148 009A 24EE BHS Read4 00149 009C 44 LSRA Check for retry, 00150 009D 26EC BNE Read3 00151 009F 17011A ReadTS LBSR SeekTrk 00152 00A2 25E6 BLO Read4 00153 00A4 AE28 LDX PD.Buf,Y Target Address for data 00154 00A6 3429 PSHS Y,DP,CC 00155 00A8 C688 LDB #ReadCmnd 00156 00AA 8D18 BSR PrDskRW Prepare to read from disk 00157 00AC 9623 ReadT1 LDA ACIATemp,U 00174 00CE 84FE ANDA #$FE Disable ACIA 00175 00D0 9706 STA PIATemp,U 00184 00E4 8634 LDA #$34 Microware OS-9 Assembler RS Version 01.00.00 04/04/97 17:05:44 Page 004 DragDisk - Dragon Disk Driver 00185 00E6 9703 STA DrvMask,U 00196 0100 EAC900AF ORB >SideSel,U Set up Side 00197 0104 D740 STB DrvMask,U Deselect drive but leave motor 00202 010D 8A04 ORA #MotorOn 00203 010F 9748 STA PIATemp,U Recover previous PIA set up 00205 0115 9703 STA ACIATemp,U Recover previous ACIA set up 00210 0121 9706 STA CmndReg 00257 017B C504 BITB #LostMask Check for lost record 00258 017D 1026013E LBNE E.Read 00259 0181 16010D LBRA ErrTst Test for another type of e 00260 00261 * Verify sector just written 00262 0184 3416 Verify PSHS X,B,A Swap the data buffer and 00263 0186 AE28 LDX PD.Buf,Y buffer pointers then read b 00264 0188 3410 PSHS X data just written 00265 018A AEC900AD LDX >BufPtr,U 00266 018E AF28 STX PD.Buf,Y 00267 0190 AE64 LDX 4,S 00268 0192 17FF0A LBSR ReadTS 00269 0195 3510 PULS X 00270 0197 AF28 STX PD.Buf,Y 00271 0199 251F BLO Verify1 00272 019B 8620 LDA #$20 00273 019D 3462 PSHS U,Y,A 00274 019F 10AEC900AD LDY >BufPtr,U Compare every 4th word 00275 01A4 1F13 TFR X,U 00276 01A6 AEC4 Verify2 LDX ,U 00277 01A8 ACA4 CMPX ,Y 00278 01AA 260A BNE Verify3 00279 01AC 3348 LEAU 8,U 00280 01AE 3128 LEAY 8,Y 00281 01B0 6AE4 DEC ,S 00282 01B2 26F2 BNE Verify2 00283 01B4 2002 BRA Verify4 00284 01B6 1A01 Verify3 ORCC #Carry Error exit 00285 01B8 3562 Verify4 PULS A,Y,U 00286 01BA 3596 Verify1 PULS A,B,X,PC 00287 00288 * Set Head to Required track and sector number 00289 01BC 6FC900AA SeekTrk CLR >Settle,U default no settle 00290 01C0 1700A3 LBSR SelDrv select and start correct d 00291 01C3 5D TSTB 00292 01C4 2611 BNE E.Sect 00293 01C6 1F10 TFR X,D 00294 01C8 AEC900A7 LDX >CDrvTab,U 00295 01CC 10830000 CMPD #0 Skip calculation of tr 00296 01D0 273F BEQ SeekT1 00297 01D2 10A301 CMPD 1,X Has an illegal LSN been 00298 01D5 2504 BLO SeekT2 00299 01D7 53 E.Sect COMB 00300 01D8 C6F1 LDB #E$Sect 00301 01DA 39 RTS 00302 01DB 6FE2 SeekT2 CLR ,-S Calculate track number 00303 01DD A3A82B SUBD PD.T0S,Y subtract no. of sectors in t 00304 01E0 2405 BHS SeekT4 Microware OS-9 Assembler RS Version 01.00.00 04/04/97 17:05:49 Page 006 DragDisk - Dragon Disk Driver 00305 01E2 EBA82C ADDB PD.T0S+1,Y 00306 01E5 200A BRA SeekT3 00307 01E7 6CE4 SeekT4 INC ,S 00308 01E9 A38811 SUBD DD.Spt,X sectors per track for rest o 00309 01EC 24F9 BHS SeekT4 00310 01EE EB8812 ADDB DD.Spt+1,X 00311 01F1 3502 SeekT3 PULS A 00312 01F3 170163 LBSR SetWPC set write precompensation 00313 01F6 3404 PSHS B 00314 01F8 E68810 LDB DD.Fmt,X Is the media double sided ? 00315 01FB 54 LSRB 00316 01FC 2415 BCC SeekT9 skip if not 00317 01FE E6A827 LDB PD.Sid,Y Is the drive double sided ? 00318 0201 5A DECB 00319 0202 2606 BNE SeekT10 00320 0204 3504 PULS B No then its an error 00321 0206 53 COMB 00322 0207 C6F9 LDB #E$BTyp 00323 0209 39 RTS 00324 020A 44 SeekT10 LSRA Media & drive ar 00325 020B 2406 BCC SeekT9 00326 020D 8D48 BSR SetSide 00327 020F 2002 BRA SeekT9 00328 0211 3404 SeekT1 PSHS B 00329 0213 E6A823 SeekT9 LDB PD.Typ,Y Dragon and Coco disks 00330 0216 C520 BITB #$20 count sectors from 1 no 00331 0218 2705 BEQ SeekT8 00332 021A 3504 PULS B 00333 021C 5C INCB 00334 021D 2002 BRA SeekT11 00335 021F 3504 SeekT8 PULS B Count from 0 for othe 00336 W 0221 F7FF42 SeekT11 STB >SecReg 00337 0224 1700BB LBSR Delay 00338 W 0227 F1FF42 CMPB >SecReg 00339 022A 26F5 BNE SeekT11 00340 022C E68815 SeekTS LDB TrkReg 00342 0232 6DC900AA TST >Settle,U If settle has been flagged th 00343 0236 2605 BNE SeekT5 00344 0238 A18815 CMPA DataReg 00348 0243 C610 LDB #SeekCmnd 00349 0245 EAA822 ORB PD.Stp,Y Set Step Rate according to P 00350 0248 8D79 BSR FDCCmnd 00351 024A 3410 PSHS X 00352 024C 8E222E LDX #$222E Wait for head to settle 00353 024F 301F SeekT7 LEAX -1,X 00354 0251 26FC BNE SeekT7 00355 0253 3510 PULS X 00356 0255 5F SeekT6 CLRB 00357 0256 39 RTS 00358 * Set Side2 Mask 00359 0257 3402 SetSide PSHS A 00360 0259 2404 BCC Side1 Side 1 if even track no. 00361 025B 8602 LDA #Sid2Sel Odd track no. so side 2 00362 025D 2001 BRA Side 00363 025F 4F Side1 CLRA 00364 0260 A7C900AF Side STA >SideSel,U Microware OS-9 Assembler RS Version 01.00.00 04/04/97 17:05:51 Page 007 DragDisk - Dragon Disk Driver 00365 0264 3582 PULS A,PC 00366 00367 * Select & start the drive required 00368 0266 1700D4 SelDrv LBSR StrtMot 00369 0269 A6A821 LDA DrvMask,U 00377 027A 304F LEAX DrvBeg,U Calculate drives DD table ad 00378 027C C626 LDB #DrvMem 00379 027E 3D MUL 00380 027F 308B LEAX D,X 00381 0281 ACC900A7 CMPX >CDrvTab,U 00382 0285 2708 BEQ SelDrv2 00383 0287 AFC900A7 STX >CDrvTab,U Force seek if its a different 00384 028B 63C900AA COM >Settle,U the last request 00385 028F 3596 SelDrv2 PULS A,B,X,PC 00386 00387 * Analyse device status Rtne 00388 0291 C5F8 ErrTst BITB #ErrMask 00389 0293 2714 BEQ ErrTst1 00390 0295 C580 BITB #NotRMask 00391 0297 2612 BNE E.NotRdy 00392 0299 C540 BITB #WPMask 00393 029B 2612 BNE E.WP 00394 029D C520 BITB #RTypMask 00395 029F 2612 BNE E.Write 00396 02A1 C510 BITB #RNFMask 00397 02A3 2612 BNE E.Seek 00398 02A5 C508 BITB #CRCMask 00399 02A7 2612 BNE E.CRC 00400 02A9 5F ErrTst1 CLRB 00401 02AA 39 RTS 00402 02AB 53 E.NotRdy COMB 00403 02AC C6F6 LDB #E$NotRdy 00404 02AE 39 RTS 00405 02AF 53 E.WP COMB 00406 02B0 C6F2 LDB #E$WP 00407 02B2 39 RTS 00408 02B3 53 E.Write COMB 00409 02B4 C6F5 LDB #E$Write 00410 02B6 39 RTS 00411 02B7 53 E.Seek COMB 00412 02B8 C6F7 LDB #E$Seek 00413 02BA 39 RTS 00414 02BB 53 E.CRC COMB 00415 02BC C6F3 LDB #E$CRC 00416 02BE 39 RTS 00417 02BF 53 E.Read COMB 00418 02C0 C6F4 LDB #E$Read 00419 02C2 39 RTS 00420 00421 * Issue a command to the FDC and wait until its ready 00422 02C3 8D1B FDCCmnd BSR FDCC1 00423 W 02C5 F6FF40 FDCC2 LDB >CmndReg Poll Disk until its ready 00424 02C8 C501 BITB #BusyMask Microware OS-9 Assembler RS Version 01.00.00 04/04/97 17:05:53 Page 008 DragDisk - Dragon Disk Driver 00425 02CA 271C BEQ Delay2 00426 02CC 86F0 LDA #$F0 00427 W 02CE B7006F STA >D.DskTmr 00428 02D1 20F2 BRA FDCC2 00429 02D3 8604 FDCC3 LDA #MotorOn send command to drive 00430 02D5 AAC900A9 ORA >DrvMask,U 00431 W 02D9 B7FF48 STA >SelReg 00432 W 02DC F7FF40 STB >CmndReg 00433 02DF 39 RTS 00434 02E0 8DF1 FDCC1 BSR FDCC3 00435 W 02E2 170000 Delay LBSR Delay1 Delay routine 00436 W 02E5 170000 Delay1 LBSR Delay2 00437 02E8 39 Delay2 RTS 00438 00439 * Rtne called When a Set Status call is made 00440 02E9 AE26 SetSta LDX PD.Rgs,Y Retrieve request code from u 00441 02EB E602 LDB R$B,X 00442 02ED C103 CMPB #SS.Reset Dispatch valid codes 00443 02EF 2729 BEQ Reset 00444 02F1 C104 CMPB #SS.Wtrk 00445 02F3 2704 BEQ WTrk 00446 02F5 53 COMB Unknown code so 00447 02F6 C6D0 LDB #E$UnkSvc 00448 02F8 39 SetSt1 RTS 00449 00450 * Write Track routine 00451 02F9 17FF6A WTrk LBSR SelDrv 00452 02FC A607 LDA R$Y+1,X 00453 02FE 44 LSRA 00454 02FF 17FF55 LBSR SetSide Set Side 2 if appropriate 00455 0302 A609 LDA R$U+1,X 00456 0304 8D53 BSR SetWPC Set WPC by disk type 00457 0306 AEC900A7 LDX >CDrvTab,U 00458 030A 17FF1F LBSR SeekTS Move head to correct track 00459 030D 25E9 BLO SetSt1 00460 030F AE26 LDX PD.Rgs,Y 00461 0311 AE04 LDX R$X,X 00462 0313 C6F0 LDB #WtTkCmnd 00463 0315 3429 PSHS Y,DP,CC 00464 0317 16FE3B LBRA WtTkJmp Do the write 00465 00466 * Resets head to track 0 00467 031A 17FF49 Reset LBSR SelDrv 00468 031D AEC900A7 LDX >CDrvTab,U 00469 0321 6F8815 CLR D.DskTmr If the timer is 0 then wait f Microware OS-9 Assembler RS Version 01.00.00 04/04/97 17:05:56 Page 009 DragDisk - Dragon Disk Driver 00485 0342 260E BNE Strt1 motors to get up to spee 00486 0344 8604 LDA #MotorOn 00487 W 0346 B7FF48 STA >SelReg 00488 0349 8EA000 LDX #$A000 00489 034C 12 Strt2 NOP 00490 034D 12 NOP 00491 034E 301F LEAX -1,X 00492 0350 26FA BNE Strt2 00493 0352 86F0 Strt1 LDA #$F0 Start the motor timer, t 00494 W 0354 B7006F STA >D.DskTmr external to the disk device 00495 0357 3596 PULS A,B,X,PC 00496 00497 * Set Write Precompensation according to media type 00498 0359 3406 SetWPC PSHS A,B 00499 035B E6A824 LDB PD.DNS,Y 00500 035E C502 BITB #T80Mask Is it 96 tpi drive 00501 0360 2601 BNE SetWP1 00502 0362 48 ASLA no then double 00503 0363 8120 SetWP1 CMPA #32 WPC needed ? 00504 0365 230A BLS SetWP2 00505 0367 A6C900A9 LDA >DrvMask,U 00506 036B 8A10 ORA #WPCEn 00507 036D A7C900A9 STA >DrvMask,U 00508 0371 3586 SetWP2 PULS A,B,PC 00509 00510 0373 A1B277 EMOD 00511 0376 Length EQU * 00000 error(s) 00024 warning(s) $0376 00886 program bytes generated $00A1 00161 data bytes allocated $244C 09292 bytes used for symbols