Mercurial > hg > Members > kono > nitros9-code
changeset 1619:b113a1589fa3
Robert's additions to the source for SC-II support, and a bug fix to the verify
routine.
author | boisy |
---|---|
date | Thu, 24 Jun 2004 21:18:08 +0000 |
parents | 78b98373061d |
children | c228f9fbe3b8 |
files | level1/modules/rb1773.asm |
diffstat | 1 files changed, 361 insertions(+), 152 deletions(-) [+] |
line wrap: on
line diff
--- a/level1/modules/rb1773.asm Wed Jun 23 21:14:22 2004 +0000 +++ b/level1/modules/rb1773.asm Thu Jun 24 21:18:08 2004 +0000 @@ -1,6 +1,17 @@ ******************************************************************** * rb1773 - Western Digital 1773 Disk Controller Driver * +* $Id$ +* +* This driver has been tested with the following controllers: +* - Tandy FD-502 "shortie" disk controller +* - Disto Super Controller I +* - Disto Super Controller II +* +* This driver can also be assembled to support the no-halt feature of +* the Disto Super Controller II. +* +* * A lot of references to **.CYL or <u00B6 using 16 bit registers can be * changed to 8 bit registers with a +1 offset, since track #'s >255 are * ignored @@ -9,6 +20,12 @@ * writes are done from this buffer to the controller. Copies of the 256 * byte chunk needed are done by a block memory move * +* +********** DISTO SUPER CONTROLLER II NOTES ********** +* +* SCII 0=standard controller 1=Disto Super Controller II +* SCIIALT 0=Normal I/O register 1=Alternative registers; See below +* * Disto Super Controller II Registers: * * $FF74 RW.Dat --- R/W Buffer data #1 @@ -26,7 +43,7 @@ * #1: any write to $FF76-$FF77 clears Buffer counter * #2: in buffered mode only * -* $Id$ +* Alternate port is at $FF58-$FF5B in case of hardware conflicts. * * Edt/Rev YYYY/MM/DD Modified by * Comment @@ -43,10 +60,29 @@ * * 1r0 2004/05/20 Boisy G. Pitre * Restarted edition due to name change; backported to Level 1 +* +* 2004/06/01 Robert Gault +* Added code to obtain an SCII driver, at least for the Sleep mode. It +* would be quite difficult and probably not worth the effort to permit +* selection of both Sleep and IRQ SCII drivers. However, both normal +* and Alt SCII I/O registers are supported. +* +* Cleaned up some errors in the last version of rb1773. nam rb1773 ttl Western Digital 1773 Disk Controller Driver +* These lines needed if assembling with on a Color computer. +*SCII set 1 * 0=not present 1=present +*SCIIALT set 1 * 0=normal address 1=alternate +SCIIHACK set 0 * 0=stock model 1=512 byte buffer +*H6309 set 1 +*LEVEL set 2 +* These lines needed if not using latest os9def files. +*TkPerSec set 60 +*DPort set $FF40 + +* This should be changed for NitrOS9 project to "use defsfile" IFP1 use defsfile ENDC @@ -61,8 +97,18 @@ TC9 equ 0 Set to 1 for TC9 special slowdowns PRECOMP equ 0 Set to 1 to turn on write precompensation +* Disto Super Controller defs + IFEQ SCIIALT +RW.Dat equ $FF74 +RW.Ctrl equ $FF76 + ELSE +RW.Dat equ $FF58 +RW.Ctrl equ $FF5A + ENDC + + * WD-17X3 Definitions -CtrlReg equ $00 Control register for Tandy controllers; not part of WD +CtrlReg equ $00 Control register for Tandy controllers; not part of WD WD_Cmd equ $08 WD_Stat equ WD_Cmd WD_Trak equ $09 @@ -70,27 +116,27 @@ WD_Data equ $0B * WD-17X3 Commands -S$FrcInt equ $D0 +S$FrcInt equ $D0 Force interrupt * Control Register Definitions -C_HALT equ %10000000 Halt line to CPU is active when set -C_SIDSEL equ %01000000 Side select (0 = front side, 1 = back side) -C_DBLDNS equ %00100000 Density (0 = single, 1 = double) -C_WPRCMP equ %00010000 Write precompensation (0 = off, 1 = on) -C_MOTOR equ %00001000 Drive motor (0 = off, 1 = on) -C_DRV2 equ %00000100 Drive 2 selected when set -C_DRV1 equ %00000010 Drive 1 selected when set -C_DRV0 equ %00000001 Drive 0 selected when set +C_HALT equ %10000000 Halt line to CPU is active when set +C_SIDSEL equ %01000000 Side select (0 = front side, 1 = back side) +C_DBLDNS equ %00100000 Density (0 = single, 1 = double) +C_WPRCMP equ %00010000 Write precompensation (0 = off, 1 = on) +C_MOTOR equ %00001000 Drive motor (0 = off, 1 = on) +C_DRV2 equ %00000100 Drive 2 selected when set +C_DRV1 equ %00000010 Drive 1 selected when set +C_DRV0 equ %00000001 Drive 0 selected when set mod eom,name,tylg,atrv,start,size u0000 rmb DRVBEG+(DRVMEM*N.Drives) u00A7 rmb 2 Last drive table accessed (ptr) CtlImg rmb 1 Bit mask for control reg (drive #, side,etc) -u00AA rmb 1 +u00AA rmb 1 drive change flag sectbuf rmb 2 Ptr to 512 byte sector buffer -u00AD rmb 1 -u00AE rmb 1 +u00AD rmb 1 head flag; 0=front 1 = back +u00AE rmb 1 LSB of LSN FBlock rmb 2 block number for format IFGT Level-1 FTask rmb 1 task number for format @@ -99,7 +145,11 @@ u00B3 rmb 2 Vi.Rst word for VIRQ u00B5 rmb 1 Vi.Stat byte for VIRQ (drive motor timeout) loglsn rmb 2 OS9's logical sector # -physlsn rmb 1 PCDOS (512 byte sector) sector # +* Removed next line and added two new ones. RG +* PCDOS does not ask driver for any info. +* physlsn rmb 2 PCDOS (512 byte sector) # +flag512 rmb 1 PCDOS (512 byte sector) 0=no, 1=yes +flagform rmb 1 SCII format flag size equ . fcb DIR.+SHARE.+PEXEC.+PWRIT.+PREAD.+EXEC.+UPDAT. @@ -126,7 +176,13 @@ * New code added 09/03/2003 by Boisy G. Pitre * Write a pattern to $FF4B and read it back to verify that the hardware * does exist. -Init ldx V.PORT,u get Base port address +Init equ * +* Two new lines for SCII. RG + IFNE SCII + clr RW.Ctrl clear SCII control register + clr flagform,u clear SCII format flag + ENDC + ldx V.PORT,u get Base port address lda WD_Data,x get byte at FDC Data register coma complement it to modify it sta WD_Data,x write it @@ -147,21 +203,19 @@ lbsr FDCDelay time delay for ~ 108 cycles lda ,x eat status register ldd #$FF*256+N.Drives 'invalid' value & # of drives - sta >physlsn,u set 512 byte sector # to bogus value - sta >physlsn+1,u leax DRVBEG,u point to start of drive tables -l@ sta ,x DD.TOT MSB to bogus value +l1 sta ,x DD.TOT MSB to bogus value sta <V.TRAK,x init current track # to bogus value leax <DRVMEM,x point to next drive table decb done all drives yet? - bne l@ no, init them all + bne l1 no, init them all leax >NMISvc,pc point to NMI service routine IFGT Level-1 stx <D.NMI install as system NMI ELSE - stx >D.XNMI+1 NMI jump vector operand - lda #$7E JMP code - sta >D.XNMI NMI jump vector opcode + stx >D.XNMI+1 NMI jump vector operand + lda #$7E JMP code + sta >D.XNMI NMI jump vector opcode ENDC pshs y save device dsc. ptr leay >u00B5,u point to Vi.Stat in VIRQ packet @@ -171,26 +225,6 @@ os9 F$IRQ install IRQ puls y Get back device dsc. ptr bcs Return If we can't install IRQ, exit - IFNE SCII - lda MPI.Slct - sta mpislot,u - ldd #RW.Ctrl - leay SC2vec,pcr - os9 F$IRQ - bcs Return - pshs cc - orcc #IntMasks - lda $FF23 -* disable FIRQ from cart. set flag on falling edge of CART - anda #$FC - sta $FF23 - lda $FF22 - lda D.IRQER - ora #1 enable CART IRQ - sta D.IRQER .. save in IRQENR shadow - sta IRQENR .. and actual register - puls cc - ENDC ldd #512 Request 512 byte sector buffer pshs u Preserve device mem ptr os9 F$SRqMem Request sector buffer @@ -236,15 +270,6 @@ ENDC leay >IRQSvc,pc point to IRQ service routine os9 F$IRQ Remove IRQ - IFNE SCII - IFNE H6309 - tfr 0,x "remove" - ELSE - ldx #$0000 - ENDC - leay SC2vec,pcr - os9 F$IRQ Remove IRQ - ENDC pshs u Save device mem ptr ldu >sectbuf,u Get pointer to sector buffer ldd #512 Return sector buffer memory @@ -260,30 +285,35 @@ * Check if 512 byte sector conversion needed * Entry: B:X=LSN -* U=Static mem ptr -* Y=Path dsc. ptr -* Exit: X=New LSN (same as original for 256 byte sectors, 1/2 of original -* for 512 byte sectors -Chk512 pshs x,b save LSN - stx >loglsn,u save OS9 LSN - lda <PD.TYP,y get device type from path dsc. - anda #%00000100 mask out all but 512 byte sector flag - bne Log2Phys 512 byte sectors, go process -L00CA puls pc,x,b restore LSN & return +* U=Static mem ptr +* Y=Path dsc. ptr +* Exit: X=New LSN (same as original for 256 byte sectors, 1/2 of original +* for 512 byte sectors +* regD changed +Chk512 equ * + clr flag512,u set to 256 byte sector + stx >loglsn,u save OS9 LSN + lda <PD.TYP,y get device type from path dsc. + anda #%00000100 mask out all but 512 byte sector flag + bne Log2Phys 512 byte sectors, go process + rts RG * 512 byte sector processing goes here -Log2Phys puls x,b Get back LSN - clrb Clear carry for rotate (also high byte of LSN) - tfr x,d Move to mathable register +* regB should be saved and not just cleared at end because there is +* a subsequent tst for the msb of lsn. The test is pointless if B +* is changed. +Log2Phys pshs b save MSB of LSN; new RG +* Minor inefficiencies here that I have changed, RG + tfr x,d IFNE H6309 - rord Divide LSN by 2 + lsrd ELSE - rora + lsra rorb ENDC - tfr d,x Move new LSN back to X - stx >physlsn,u Save 'physical' LSN (for controller) - clrb No error & return - rts + tfr d,x move new LSN back to regX +* New line for stock SCII controller with 256 max no-halt. + inc flag512,u set to 512 byte sector + puls b,pc regB will be tested later for >0 start lbra Init bra Read @@ -314,7 +344,7 @@ puls x restore sector # bcs ex if error, exit pshs y,x save path dsc ptr & LSN - leax ,x LSN0? + leax ,x LSN0?, ie. tstx bne L012D no, go calculate normally puls y,x yes, restore path dsc ptr & LSN lda <PD.TYP,y get type from path dsc. @@ -347,7 +377,7 @@ bitb #DNS.MFM Can our path dsc. handle double density? beq erbtyp No, illegal L0115 bita #FMT.TDNS Is new disk 96/135 tpi? - beq L011D No, so skip ahead + beq L011D No, all drives handle 48 tpi, so skip ahead bitb #DNS.DTD Can path dsc. handle 96/135 tpi? beq erbtyp No, illegal L011D bita #FMT.SIDE Is new disk double sided? @@ -356,17 +386,17 @@ suba #2 sides higher or equal to 2? blo erbtyp Yes, exit with illegal type error L0128 clrb No error -* puls y,x ??? 2 USELESS LINES? -* pshs y,x * LSN's other than 0 come straight here L012D ldy 2,s Get path dsc. ptr back?? ldx PD.BUF,y Get path dsc. buffer ptr - lda <PD.TYP,y Get path dsc. disk type +* lda <PD.TYP,y Get path dsc. disk type, RG ldy >sectbuf,u Get ptr to sector buffer IFNE H6309 ldw #256 OS9 sector size (even if physical was 512) ENDC - anda #%00000100 Mask out all but 512 byte sector flag +* anda #%00000100 Mask out all but 512 byte sector flag, RG +* Next replaces the two lines removed, RG + tst flag512,u Is it a 512 byte sector? beq L014B If normal sector, just copy it ldd >loglsn,u Get OS9's LSN (twice of the 'real' 512 sector) andb #$01 Mask out all but odd/even sector indicator @@ -394,25 +424,77 @@ ldb #E$BTyp Error - wrong type error puls pc,y,x +********************** + * Read error - retry handler L0159 bcc L0162 Normal retry, try reading again pshs x,d Preserve regs lbsr sktrk0 Seek to track 0 (attempt to recalibrate) puls x,d Restore regs & try reading again +* ENTER reg B,X=working lsn on disk +* Y=path descriptor +* U=driver data +* A=retry sequence mix of read & seek track 0 +* EXIT X,Y,U preserved; D,CC changed +* B=error if any +* CC=error flag L0162 pshs x,d Preserve regs bsr L016F Go read sector puls x,d Restore regs (A=retry flags) - bcc L01D7 No error, return + lbcc L01D7 No error, return lsra Shift retry flags bne L0159 Still more retries allowed, go do them * otherwise, final try before we give up L016F lbsr L02AC Do double-step/precomp etc. if needed, seek - bcs L01D7 Error somewhere, exit with it + lbcs L01D7 Error somewhere, exit with it L0176 ldx >sectbuf,u Get physical sector buffer ptr -* pshs y,cc Preserve timeout timer & CC ldb #$80 Read sector command - bsr L01A1 Send to controller & time delay to let it settle + IFNE SCII +* If SCII not hacked for 512 byte no-halt, must use halt for 512b sectors RG + IFEQ SCIIHACK + clra SCII normal mode, normal NMI + tst flag512,u SCII must use halt mode for 512 byte sectors + bne L0176B + ENDC + lda #7 SCII read, buffered mode, masked NMI + bsr L01A1B send commands and wait + lbcs L03AF get the errors + IFNE H6309 + pshs y + ldw #128 set counter + ldy #RW.DAT source of data + IFNE SCIIHACK + tst flag512,u + beq sc2rlp + ldw #256 bump up counter to 512 byte sector + ENDC +* Don't use tfm if no halt important else need orcc #$50 for tfm +* If an interrupt occurs during a tfm transfer, the SCII counter +* will update but the tfm will repeat a byte and lose track. +* If orcc #$50 used, then key presses may be lost even with no-halt +* mode. +sc2rlp ldd ,y read two bytes from SCII + std ,x++ transfer two bytes to system buffer + decw update counter + bne sc2rlp + ELSE + ldy #128 + IFNE SCIIHACK + tst flag512,u + beq sc2rlp + ldy #256 + ENDC +sc2rlp ldd >RW.DAT + std ,x++ + leay -1,y + bne sc2rlp + ENDC + clrb no errors + puls y,pc + ENDC + +L0176B bsr L01A1 Send to controller & time delay to let it settle *** Next few lines are commented out for blobstop patches *L0180 bita >DPort+WD_Stat check status register * bne L0197 eat it & start reading sector @@ -438,21 +520,68 @@ bra L0197 Keep reading until sector done L01A1 orcc #IntMasks Shut off IRQ & FIRQ - stb >DPort+WD_Cmd Send command -* ldy #$FFFF - ldb #C_DBLDNS+C_MOTOR Double density & motor on -* ldb #%00101000 Double density & motor on +* No-halt mode must enter here, skipping IRQ shutoff. +L01A1B stb >DPort+WD_Cmd Send command + IFNE SCII + sta >RW.Ctrl tell SCII what to do + ENDC +L01A1C ldb #C_DBLDNS+C_MOTOR Double density & motor on orb >CtlImg,u Merge with current drive settings - stb >DPort+CtrlReg Send to control register - ldb #C_HALT+C_DBLDNS+C_MOTOR Enable halt, double density & motor on -* ldb #%10101000 Enable halt, double density & motor on + stb >DPort+CtrlReg Send to control register + IFNE SCII + tst flagform,u Format uses halt mode + bne s512 + IFEQ SCIIHACK + tst flag512,u SCII uses halt with 512 byte sectors + beq s256 + ELSE + bra s256 + ENDC + ENDC +s512 ldb #C_HALT+C_DBLDNS+C_MOTOR Enable halt, double density & motor on orb >CtlImg,u Merge that with current drive settings lbra FDCDelay Time delay to wait for command to settle -* lda #$02 -*L01BE rts + IFNE SCII +s256 ldb #4 normal mode, NMI masked + lda #255 time out slices + pshs a,x +SC2tmr1 ldx #1 + lbsr SC2Slp sleep or timer + dec ,s count + beq tmout + tst >RW.Ctrl check status + bmi SC2tmr1 loop on not ready + stb RW.Ctrl clear SCII but don't generate NMI + clrb + puls a,x,pc +tmout stb RW.Ctrl clear SCII buffer counter + lda #$D0 force interrupt + sta DPort+WD_Cmd + comb set carry + puls a,x,pc + ENDC + +* The distinction between system and non-system is from some +* Kevin Darling code. I'm not sure if it is necessary. RG +SC2Slp + IFGT Level-1 + pshs d + ldd <D.Proc process pointer + cmpd <D.SysPrc is it the system? + puls d + beq syslup + ENDC + os9 F$Sleep if not system then sleep + rts +syslup ldx #$A000 +syslup2 nop + nop + nop + leax -1,x + bne syslup2 + rts * Write -* * Entry: * B = MSB of LSN * X = LSB of LSN @@ -464,14 +593,15 @@ * B = error code * Write lbsr Chk512 go adjust LSN for 512 byte sector if needed - lda #%1001001 retry flags for I/O errors (see Disto SCII source) +* Next line was lda #%1001001 which was an error RG + lda #%10010001 retry flags for I/O errors (see Disto SCII source) L01C4 pshs x,d preserve LSN, retries bsr L01E8 go write the sector puls x,d restore LSN, retries bcs L01D8 error writing, go to write retry handler tst <PD.VFY,y no error, do we want physical verify? bne L01D6 no, exit without error - lbsr verify go re-read & verify 32 out of 256 bytes + lbsr verify go re-read & verify 64 out of 256 bytes bcs L01D8 error on verify, go to write retry handler L01D6 clrb no error & return L01D7 rts @@ -489,10 +619,11 @@ L01E8 lbsr L02AC Go do double-step/write precomp if needed bcs L01D7 Error, exit with it pshs y,d Preserve path dsc. ptr & LSN - lda <PD.TYP,y Get device type - anda #%00000100 512 byte sector? - beq L020D No, skip ahead - lda #$91 ??? appears to be useless +* Since I have modified chk512 the next two lines are replaced. RG +* lda <PD.TYP,y Get device type +* anda #%00000100 512 byte sector? + tst flag512,u go if 256 byte sectors + beq L020D Not 512 then skip ahead lbsr L0176 Go read the sector in ldd >loglsn,u Get OS9 LSN andb #$01 Even or odd? @@ -516,9 +647,45 @@ ENDC puls y,d Get path dsc. ptr & LSN back ldx >sectbuf,u Get physical sector buffer ptr again +* See read routine for explanation of SCII code. RG + IFNE SCII + IFEQ SCIIHACK + clra SCII write, normal mode & NMI + tst flag512,u + bne wr512 + ENDC + lda #4 SCII normal mode, masked NMI + sta RW.Ctrl tell SCII + pshs y + ldy #RW.Dat Send data to SCII RAM buffer + IFNE H6309 + ldw #128 + tst flag512,u + beq wrbuf + ldw #256 +wrbuf ldd ,x++ + std ,y + decw + bne wrbuf + ELSE + ldy #128 + tst flag512,u + beq wrbuf + ldy #256 +wrbuf ldd ,x++ + std >RW.DAT + leay -1,y + bne wrbuf + ENDC + puls y ldb #$A0 Write sector command + lda #6 SCII masked NMI, buffered mode, write + lbra L01A1B send command to controller + ENDC +wr512 ldb #$A0 * Format track comes here with B=$F0 (write track) +* as does write sector with B=$A0 *WrTrk pshs y,cc Preserve path dsc. ptr & CC WrTrk lbsr L01A1 Send command to controller (including delay) *** Commented out for blobstop fixes @@ -532,30 +699,36 @@ * puls y,cc Restore regs * lbra L03AF Check for errors from status register +*** added blobstop IFGT Level-1 -*** added blobstop lda FBlock+1,u get the block number for format beq L0230 if not format, don't do anything sta >$FFA1 otherwise map the block in ENDC L0230 stb >DPort+CtrlReg send data to control register +* These lines added to match read routine. Should be better timing. RG + nop + nop 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 +* Part of timing change mentioned above. RG +*L0240 nop --- wait a bit more +L0240 lda ,x+ Get byte from write buffer sta >DPort+WD_Data Save to FDC's data register * EAT 2 CYCLES: TC9 ONLY (TRY 1 CYCLE AND SEE HOW IT WORKS) IFEQ TC9-1 nop nop + ELSE +* See above. RG + nop ENDC * stb >DPort+CtrlReg Set up to read next byte bra L0240 Go read it * NMI routine NMISvc leas R$Size,s Eat register stack -* puls y,cc Get path dsc. ptr & CC IFGT Level-1 ldx <D.SysDAT get pointer to system DAT image lda 3,x get block number 1 @@ -563,44 +736,48 @@ ENDC andcc #^IntMasks turn IRQ's on again ldb >DPort+WD_Stat Get status register + IFNE SCII + clr RW.Ctrl Clear SCII command register + ENDC bitb #%00000100 Did we lose data in the transfer? -* lbne L03E0 Yes, exit with Read Error lbeq L03B2 Otherwise, check for drive errors comb -- blobstop error code ldb #E$DevBsy -- device busy rts -- and exit verify pshs x,d - ldx PD.BUF,y Get write buffer ptr - pshs x Preserve it - ldx >sectbuf,u Get sector buffer ptr - stx PD.BUF,y Save as write buffer ptr - ldx 4,s +* Removed unneeded code. Data never sent to PD.BUF anyway so there is +* no need to redirect the PD.BUF pointer. RG +* ldx PD.BUF,y Get write buffer ptr +* pshs x Preserve it +* ldx >sectbuf,u Get sector buffer ptr +* stx PD.BUF,y Save as write buffer ptr +* ldx 4,s lbsr L016F Go read sector we just wrote - puls x Get original write buffer ptr - stx PD.BUF,y Restore path dsc. version +* puls x Get original write buffer ptr +* stx PD.BUF,y Restore path dsc. version bcs L02A3 If error reading, exit with it + ldx PD.BUF,y Get system buffer ptr pshs u,y Preserve device mem, path dsc. ptrs - ldb <PD.TYP,y Get type from path dsc. +* See change in chk512 routine. RG +* ldb <PD.TYP,y Get type from path dsc. ldy >sectbuf,u Get sector buffer ptr - andb #%00000100 512 byte sector? +* andb #%00000100 512 byte sector? + tst flag512,u 512 byte sector? beq L028D No, skip ahead - ldd >loglsn,u Get OS9's sector # + ldd >loglsn,u Get OS9's sector # andb #$01 Odd/even sector? beq L028D Even; compare first half leay >$0100,y Odd, compare second half L028D tfr x,u Move PD.BUF ptr to U (since cmpx is faster) - lda #32 # of 'spotty' checks to do -L028F ldx ,u Get 2 bytes from original write buffer - cmpx ,y Same as corresponding bytes in re-read sector? - bne L029F No, error & return - leau 8,u Skip next 6 bytes - leay 8,y - deca Done our 'spotty' check? - bne L028F No, continue - fcb $8C skip the next 2 bytes - -L029F orcc #Carry + clra check all 256 bytes +L028F ldx ,u++ Get 2 bytes from original write buffer + cmpx ,y++ Same as corresponding bytes in re-read sector? + bne vfybad No, error & return + inca + bpl L028F No, continue + bra L02A1 carry is clear by virtue of last cmpx +vfybad comb set carry L02A1 puls u,y L02A3 puls pc,x,d @@ -615,7 +792,6 @@ beq L02C4 Side 1, skip ahead lda >CtlImg,u Get control register settings ora #C_SIDSEL Set side 2 (drive 3) select -* ora #%01000000 Set side 2 (drive 3) select sta >CtlImg,u Save it back L02C4 lda <PD.TYP,y Get drive type settings bita #%00000010 ??? (Base 0/1 for sector #?) @@ -627,7 +803,7 @@ lda <DD.FMT,x Get drive format specs lsra Shift track & bit densities to match PD eora <PD.DNS,y Check for differences with path densities - anda #%00000010 Keep only 48/96 tpi differences + anda #%00000010 Keep only 48 vs. 96/135 tpi differences pshs a Save differences lda 1,s Get track # back tst ,s+ Are tpi's different? @@ -649,12 +825,11 @@ L02F9 cmpa ,s+ Is track # high enough to warrant precomp? bls L0307 No, continue normally ldb >CtlImg,u - orb #C_WRPCMP Turn on Write precomp -* orb #%00010000 Turn on Write precomp + orb #C.WRPCMP Turn on Write precomp stb >CtlImg,u ENDC -L0307 ldb >u00AA,u ??? Get flag (same drive flag?) +L0307 tst >u00AA,u ??? Get flag (same drive flag?) bne L0314 no, skip ahead ldb ,s get track # cmpb <V.TRAK,x same as current track on this drive? @@ -677,7 +852,7 @@ L032B tstb Sector # > 65535? bne L033F Yes, illegal for floppy tfr x,d Move sector # to D - leax ,x LSN 0? + leax ,x LSN 0? ie. "tstx" beq L0371 Yes, exit this routine ldx >u00A7,u Get previous drive table ptr cmpd DD.TOT+1,x Within range of drive spec? @@ -687,6 +862,9 @@ rts * Calculate track/sector #'s? +* These two sections could be combined into one with a final +* test of DD.FMT. Then u00AD can be set and regA can be lsra +* as needed. RG L0343 stb >u00AE,u Save LSB of LSN clr ,-s Clear track # on stack ldb <DD.FMT,x Get drive format @@ -695,32 +873,45 @@ bcc L0367 Single sided drive, skip ahead bra L035D Double sided drive, skip ahead * Double sided drive handling here -L0355 com >u00AD,u ???? Odd/even sector track flag? +L0355 com >u00AD,u Odd/even sector track flag bne L035D Odd, so don't bump track # up inc ,s Bump up track # -L035D subb DD.TKS,x Subtract # sectors/track - sbca #$00 +* Changed this to more effient code. RG +*L035D subb DD.TKS,x Subtract # sectors/track +* sbca #$00 +L035D subd DD.SPT,x bcc L0355 Still more sectors left, continue bra L036D Wrapped, skip ahead * Single sided drive handling here L0365 inc ,s Bump track # up -L0367 subb DD.TKS,x Subtract # sectors/track - sbca #$00 +* See above. RG +*L0367 subb DD.TKS,x Subtract # sectors/track +* sbca #$00 +L0367 subd DD.SPT,x bcc L0365 Still more, go bump the track up -L036D addb $03,x Bump sector # back up from negative value +* Next possible because upper limit is 256 sectors/track. RG +L036D addb DD.TKS,x Bump sector # back up from negative value puls a Get the track # L0371 rts A=track #, B=Sector #, <u00AD=Odd * Drive control register bit mask table +* May want an option here for double sided SDDD disks ex. RG +* fcb $1 drive0 +* fcb $2 drive1 +* fcb $41 drive2 +* fcb $42 drive3 +* fcb $4 drive4 +* fcb $44 drive5 + L0372 fcb $01 Drive 0 fcb $02 Drive 1 fcb $04 Drive 2 fcb $40 Drive 3 / Side select -L0376 clr >u00AA,u ??? - +* Changes regD; X,Y,U preserved +L0376 clr >u00AA,u clear drive change flag chkdrv lda <PD.DRV,y Get drive # requested cmpa #4 Drive 0-3? blo L0385 Yes, continue normally @@ -740,13 +931,13 @@ cmpx >u00A7,u Same as Last drive table accessed? beq L03A6 Yes, skip ahead stx >u00A7,u Save new drive table ptr - com >u00AA,u ??? Set flag + com >u00AA,u Set drive change flag L03A6 clr >u00AD,u Set side (head) flag to side 1 lbsr L04B3 Go set up VIRQ to wait for drive motor puls pc,x,d Restore sector #,drive #,B & return L03AF ldb >DPort+WD_Stat Get status register from FDC -L03B2 bitb #%11111000 Any of the error bits set? +L03B2 bitb #%11111000 any of the error bits set? beq L03CA No, exit without error aslb Drive not ready? bcs L03CC Yes, use that error code @@ -786,6 +977,11 @@ beq L0403 No, exit ldd >VIRQCnt,pc Get initial count value for drive motor speed std >VIRQPak,u Save it +* Again, I'm trying to match Kevin Darling code. It may not be needed. RG + pshs x + ldx #1 Sleep remainder of slice + lbsr SC2Slp + puls x bra L03E6 Wait for controller to finish previous command * Send command to FDC @@ -841,7 +1037,7 @@ *--- new code ldb #1 1 block to allocate os9 F$AllRAM allocate some RAM - bcs L0489 error out if at all + lbcs L0489 error out if at all leax >FBlock,u point to 'my' DAT image std ,x save a copy of the block os9 F$ResTsk reserve a task number for the copy @@ -880,7 +1076,9 @@ ldb R$Y+1,x Get caller's side/density bitb #$01 Check side beq L0465 Side 1, skip ahead - com >u00AD,u +* I think this next line is not needed. RG + com >u00AD,u * Why? This is normally used with +* calculate track. RG ldb >CtlImg,u Get current control register settings * orb #%01000000 Mask in side 2 orb #C_SIDSEL Mask in side 2 @@ -889,7 +1087,7 @@ ldx >u00A7,u Get current drive table ptr lbsr L02A5 bcs L0489 - ldb #$F0 Write track command? + ldb #$F0 Write track command *--- IFEQ Level-1 ldx PD.RGS,y @@ -898,7 +1096,15 @@ ldx #$2000 start writing from block 1 ENDC + IFNE SCII + lda #1 normal unbuffered write +* Next line prevents WrTrk from switching to SCII buffered mode. RG + sta flagform,u + ENDC lbsr WrTrk Go write the track + IFNE SCII + clr flagform,u permit no-halt mode RG + ENDC IFGT Level-1 L0479 ldu 2,s @@ -924,7 +1130,7 @@ sktrk0 lbsr chkdrv ldx >u00A7,u clr <$15,x - lda #$05 + lda #1 was 5 but that causes head banging L0497 ldb <PD.STP,y andb #%00000011 Just keep usable settings (6-30 ms) eorb #%01001011 Set proper bits for controller @@ -954,8 +1160,9 @@ bne L04E0 Drive already up to speed, exit without error * Drive motor speed timing loop (could be F$Sleep call now) (was over .5 sec) - ldx #32 wait for 32 ticks - os9 F$Sleep +* 32 was not sufficient for one of my drives. RG + ldx #50 wait for 32 ticks; increased it RG + lbsr SC2Slp L04DE bsr InsVIRQ Install VIRQ to wait for drive motors L04E0 clrb No error & return @@ -990,14 +1197,16 @@ bsr InsVIRQ bra IRQOut L0509 sta >DPort+CtrlReg - IFNE H6309 - aim #$FE,>u00B5,u - ELSE - lda u00B5,u - anda #$FE - sta u00B5,u - ENDC +* I changed this to a clear. Don't see the point of an AND. RG +* IFNE H6309 +* aim #$FE,>u00B5,u +* ELSE +* lda u00B5,u +* anda #$FE +* sta u00B5,u +* ENDC * fdb u00B5 --- so changes in data size won't affect anything + clr u00B5,u IFEQ Level-1 clr >D.DskTmr ELSE