# HG changeset patch # User boisy # Date 1062635288 0 # Node ID f284e1a88235a05315fb764dd0222926cb441c58 # Parent 0a04945a7c6036f39f6ba7729c9aff3469f0d36e Added check for controller, changed $FF4X to DPort+$0X diff -r 0a04945a7c60 -r f284e1a88235 level2/modules/cc3disk.asm --- a/level2/modules/cc3disk.asm Wed Sep 03 16:03:23 2003 +0000 +++ b/level2/modules/cc3disk.asm Thu Sep 04 00:28:08 2003 +0000 @@ -11,16 +11,18 @@ * $Id$ * -* Ed. Comments Who YY/MM/DD +* Edt/Rev YYYY/MM/DD Modified by +* Comment * ------------------------------------------------------------------ -* 11 Special opts for TC9 to slow controller reads 93/05/12 -* and writes -* TFM's between sector buffers & in drive table -* init/copies -* Changed software timing loop (drive spin-up) to -* F$Sleep for 32 ticks -* Shrunk (slowed slightly) error returns -* Added blobstop code +* 11 1993/05/12 ??? +* Special opts for TC9 to slow controller reads and writes TFM's +* between sector buffers & in drive table init/copies. +* Changed software timing loop (drive spin-up) to F$Sleep for 32 ticks +* Shrunk (slowed slightly) error returns +* Added blobstop code +* +* 11r1 2003/09/03 Boisy G. Pitre +* Added code to sense if HW is present or not and return error if not. nam CC3Disk ttl WD1773 Disk Controller Driver @@ -35,7 +37,7 @@ tylg set Drivr+Objct atrv set ReEnt+rev -rev set $00 +rev set $01 edition set 11 mod eom,name,tylg,atrv,start,size @@ -71,7 +73,20 @@ * Entry: Y=Ptr to device descriptor * U=Ptr to device mem -INIT clr DPort+$0B get byte at FDC Data register + coma complement it to modify it + sta >DPort+$0B write it + clrb +Init2 decb delay a bit... + bmi Init2 + suba >DPort+$0B read it back + lbne NoHW if not zero, we didn't read what we wrote +** + clr $FF40 shut off drive motors - clr DPort+$00 shut off drive motors + clr $FF48 Check status register +*L0180 bita >DPort+$08 Check status register * bne L0197 Eat it & start reading sector * leay -1,y Bump timeout timer down * bne L0180 Keep trying until it reaches 0 or sector read * lda >u00A9,u Get current drive settings * ora #%00001000 Turn drive motor on -* sta >$FF40 Send to controller +* sta >DPort+$00 Send to controller * puls y,cc Restore regs * lbra L03E0 Exit with Read Error *** Blobstop fixes - stb >$FF40 send command to FDC + stb >DPort+$00 send command to FDC nop allow HALT to take effect nop bra L0197 and a bit more time * Read loop - exited with NMI * Entry: X=ptr to sector buffer * B=Control register settings -L0197 lda >$FF4B Get byte from controller +L0197 lda >DPort+$0B Get byte from controller sta ,x+ Store into sector buffer -* stb >$FF40 Drive info +* stb >DPort+$00 Drive info nop -- blobstop fix bra L0197 Keep reading until sector done L01A1 orcc #IntMasks Shut off IRQ & FIRQ - stb >$FF48 Send command + stb >DPort+$08 Send command * ldy #$FFFF ldb #%00101000 Double density & motor on orb >u00A9,u Merge with current drive settings - stb >$FF40 Send to control register + stb >DPort+$00 Send to control register ldb #%10101000 Enable halt, double density & motor on orb >u00A9,u Merge that with current drive settings lbra L0406 Time delay to wait for command to settle @@ -371,13 +386,13 @@ *L0224 pshs y,cc Preserve path dsc. ptr & CC L0224 lbsr L01A1 Send command to controller (including delay) *** Commented out for blobstop fixes -*L0229 bita >$FF48 Controller done yet? +*L0229 bita >DPort+$08 Controller done yet? * bne L0240 Yes, go write sector out * leay -$01,y No, bump wait counter * bne L0229 Still more tries, continue * lda >u00A9,u Get current drive control register settings * ora #%00001000 Drive motor on (but drive select off) -* sta >$FF40 Send to controller +* sta >DPort+$00 Send to controller * puls y,cc Restore regs * lbra L03AF Check for errors from status register @@ -386,18 +401,18 @@ beq L0230 if not format, don't do anything sta >$FFA1 otherwise map the block in -L0230 stb >$FF40 send command to FDC +L0230 stb >DPort+$00 send command to FDC bra L0240 wait a bit for HALT to enable * Write sector routine (Entry: B= drive/side select) (NMI will break out) L0240 nop --- wait a bit more lda ,x+ Get byte from write buffer - sta >$FF4B Save to FDC's data register + sta >DPort+$0B Save to FDC's data register * EAT 2 CYCLES: TC9 ONLY (TRY 1 CYCLE AND SEE HOW IT WORKS) IFEQ TC9-1 nop nop ENDC -* stb >$FF40 Set up to read next byte +* stb >DPort+$00 Set up to read next byte bra L0240 Go read it * NMI routine @@ -407,7 +422,7 @@ lda 3,x get block number 1 sta >$FFA1 map it back into memory andcc #^IntMasks turn IRQ's on again - ldb >$FF48 Get status register + ldb >DPort+$08 Get status register bitb #%00000100 Did we lose data in the transfer? * lbne L03E0 Yes, exit with Read Error lbeq L03B2 Otherwise, check for drive errors @@ -465,7 +480,7 @@ bita #%00000010 ??? (Base 0/1 for sector #?) bne L02CC Skip ahead incb Bump sector # up by 1 -L02CC stb >$FF4A Save into Sector register +L02CC stb >DPort+$0A Save into Sector register ldx >u00A7,u Get last drive table accessed ldb $FF49 Save current track # onto controller +L02E9 stb >DPort+$09 Save current track # onto controller * From here to the line before L0307 is for write precomp, but is not used. * Unless write precomp is needed, all of this is useless @@ -502,14 +517,14 @@ ldb ,s Get track # cmpb $FF4B Save track # to data register +L0314 sta >DPort+$0B Save track # to data register ldb $FF49 Save to controller + sta >DPort+$09 Save to controller clrb No error & return rts @@ -567,7 +582,7 @@ chkdrv lda $FF48 Get status register from FDC +L03AF ldb >DPort+$08 Get status register from FDC L03B2 bitb #%11111000 Any of the error bits set? beq L03CA No, exit without error aslb Drive not ready? @@ -624,7 +639,7 @@ rts L03E4 bsr L0404 Send command to controller & waste some time -L03E6 ldb >$FF48 Check FDC status register +L03E6 ldb >DPort+$08 Check FDC status register bitb #$01 Is controller still busy? beq L0403 No, exit ldd >L0028,pc Get initial count value for drive motor speed @@ -634,8 +649,8 @@ * Send command to FDC L03F7 lda #%00001000 Mask in Drive motor on bit ora >u00A9,u Merge in drive/side selects - sta >$FF40 Turn the drive motor on & select drive - stb >$FF48 Save command & return + sta >DPort+$00 Turn the drive motor on & select drive + stb >DPort+$08 Save command & return L0403 rts L0404 bsr L03F7 Go send command to controller @@ -759,7 +774,7 @@ std >u00B1,u Save it lda >u00A9,u ?Get drive? ora #%00001000 Turn drive motor on for that drive - sta >$FF40 Send drive motor on command to FDC + sta >DPort+$00 Send drive motor on command to FDC lda $FF40 +L0509 sta >DPort+$00 IFNE H6309 aim #$FE,>u00B5,u * fcb $62,$FE,%11001001