Mercurial > hg > Members > kono > nitros9-code
changeset 1572:43f38b44b0ae
Now in level1
author | boisy |
---|---|
date | Tue, 18 May 2004 01:27:09 +0000 |
parents | ccf4c764cde9 |
children | 55a157abdbd1 |
files | level2/modules/rb1773.asm level2/modules/rb1773desc.asm |
diffstat | 2 files changed, 0 insertions(+), 1081 deletions(-) [+] |
line wrap: on
line diff
--- a/level2/modules/rb1773.asm Tue May 18 01:26:32 2004 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1015 +0,0 @@ -******************************************************************** -* rb1773 - Western Digital 1773 Disk Controller Driver -* -* 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 -* -* NOTE: 512 bytes is reserved as a physical sector buffer. Any reads/ -* writes are done from this buffer to the controller. Copies of the 256 -* byte chunk needed are done by a block memory move - -* $Id$ -* -* Edt/Rev YYYY/MM/DD Modified by -* Comment -* ------------------------------------------------------------------ -* 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 rb1773 - ttl Western Digital 1773 Disk Controller Driver - -TC9 equ 0 Set to 1 for TC9 special slowdowns -PRECOMP equ 0 Set to 1 to turn on write precompensation - - IFP1 - use defsfile - ENDC - -tylg set Drivr+Objct -atrv set ReEnt+rev -rev set $01 -edition set 11 - -* Configuration Settings -N.Drives equ 4 number of drives to support - -* WD-17X3 Definitions -WD_Cmd equ $08 -WD_Stat equ WD_Cmd -WD_Trak equ $09 -WD_Sect equ $0A -WD_Data equ $0B - - mod eom,name,tylg,atrv,start,size - -u0000 rmb DRVBEG+(DRVMEM*N.Drives) -u00A7 rmb 2 Last drive table accessed (ptr) -u00A9 rmb 1 Bit mask for control reg (drive #, side,etc) -u00AA rmb 1 -sectbuf rmb 2 Ptr to 512 byte sector buffer -u00AD rmb 1 -u00AE rmb 1 -FBlock rmb 2 block number for format - IFGT Level-1 -FTask rmb 1 task number for format - ENDC -u00B1 rmb 2 Vi.Cnt word for VIRQ -u00B3 rmb 2 Vi.Rst word for VIRQ -u00B5 rmb 1 Vi.Stat byte for VIRQ (drive motor timeout) -u00B6 rmb 2 OS9's logical sector # -u00B8 rmb 1 PCDOS (512 byte sector) sector # -size equ . - - fcb DIR.+SHARE.+PEXEC.+PWRIT.+PREAD.+EXEC.+UPDAT. - -name equ * - IFEQ Level-1 - fcs /CCDisk/ - ELSE - fcs /rb1773/ - ENDC - fcb edition - -VIRQCnt fdb $00F0 Initial count for VIRQ (240) - -IRQPkt fcb $00 Normal bits (flip byte) - fcb $01 Bit 1 is interrupt request flag (Mask byte) - fcb 10 Priority byte - -* Init -* -* Entry: -* Y = address of device descriptor -* U = address of device memory area -* -* Exit: -* CC = carry set on error -* B = error code -* -* 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 - lda WD_Data,x get byte at FDC Data register - coma complement it to modify it - sta WD_Data,x write it - clrb -Init2 decb delay a bit... - bmi Init2 - suba WD_Data,x read it back - lbne NoHW if not zero, we didn't read what we wrote -** - IFEQ Level-1 - clr >D.DskTmr flag drive motor as not running - ELSE - clr <D.MotOn flag drive motor as not running - ENDC - leax WD_Stat,x point to Status/Command register - lda #$D0 force Interrupt command - sta ,x send to FDC - lbsr L0406 time delay for ~ 108 cycles - lda ,x eat status register - ldd #$FF*256+N.Drives 'invalid' value & # of drives - sta >u00B8,u set 512 byte sector # to bogus value - sta >u00B8+1,u - leax DRVBEG,u point to start of drive tables -L004B 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 4 drives yet? - bne L004B 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 - ENDC - pshs y save device dsc. ptr - leay >u00B5,u point to Vi.Stat in VIRQ packet - tfr y,d make it the status register ptr for IRQ - leay >IRQSvc,pc point to IRQ service routine - leax >IRQPkt,pc point to IRQ packet - os9 F$IRQ install IRQ - puls y Get back device dsc. ptr - bcs Return If we can't install IRQ, exit - ldd #512 Request 512 byte sector buffer - pshs u Preserve device mem ptr - os9 F$SRqMem Request sector buffer - tfr u,x Move ptr to sector buffer to x - puls u Restore device mem ptr - bcs Return If error, exit with it - stx >sectbuf,u Save ptr to sector buffer - -* GetStat -* -* Entry: -* A = function code -* Y = address of path descriptor -* U = address of device memory area -* -* Exit: -* CC = carry set on error -* B = error code -* -GetStat clrb no GetStt calls - return, no error, ignore -Return rts - -* Term -* -* Entry: -* U = address of device memory area -* -* Exit: -* CC = carry set on error -* B = error code -* -Term leay >u00B1,u Point to VIRQ packet - IFNE H6309 - tfr 0,x "remove" - ELSE - ldx #$0000 - ENDC - os9 F$VIRQ Remove VIRQ - IFNE H6309 - tfr 0,x "remove" - ELSE - ldx #$0000 - ENDC - os9 F$IRQ Remove IRQ - pshs u Save device mem ptr - ldu >sectbuf,u Get pointer to sector buffer - ldd #512 Return sector buffer memory - os9 F$SRtMem - puls u Restore device mem ptr - clr >DPort shut off drive motors - IFEQ Level-1 - clr >D.DskTmr Clear out drive motor timeout flag - ELSE - clr <D.MotOn Clear out drive motor timeout flag - ENDC -L00AB rts return - -* 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 -L00AC pshs x,b Save LSN - stx >u00B6,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 L00BB 512 byte sectors, go process -L00CA puls pc,x,b Restore LSN & return - -* 512 byte sector processing goes here -L00BB puls x,b Get back LSN - clrb Clear carry for rotate (also high byte of LSN) - tfr x,d Move to mathable register - IFNE H6309 - rord Divide LSN by 2 - ELSE - rora - rorb - ENDC - tfr d,x Move new LSN back to X - stx >u00B8,u Save 'physical' LSN (for controller) - clrb No error & return - rts - -start lbra Init - bra Read - nop - lbra Write - bra GetStat - nop - lbra SetStat - bra Term - nop - -* Read -* -* Entry: -* B = MSB of LSN -* X = LSB of LSN -* Y = address of path descriptor -* U = address of device memory area -* -* Exit: -* CC = carry set on error -* B = error code -* -Read bsr L00AC Go check for 512 byte sector/adjust if needed - lda #%10010001 Error flags (see Disto SCII source) - pshs x Preserve sector # - lbsr L0162 Go read the sector - puls x Restore sector # - bcs L00AB If error, exit - pshs y,x Save path dsc ptr & LSN - leax ,x LSN0? - bne L012D No, go calculate normally - puls y,x Yes, restore path dsc ptr & LSN - lda <PD.TYP,y Get type from path dsc. - bita #TYP.NSF Standard OS-9 format? - beq L00F0 Yes, skip ahead - lbsr L051A - pshs y,x save path dsc ptr - bra L012D - -* LSN0, standard OS-9 format -L00F0 ldx >sectbuf,u Get ptr to sector buffer - pshs y,x Preserve path dsc. ptr & sector buffer ptr - ldy >u00A7,u Get last drive table accessed ptr - IFNE H6309 - ldw #DD.SIZ # bytes to copy from new LSN0 to drive table - tfm x+,y+ Copy them - ELSE - ldb #DD.SIZ -L00F0Lp lda ,x+ - sta ,y+ - decb - bne L00F0Lp - ENDC - ldy >u00A7,u Get drive table ptr back - lda <DD.FMT,y Get format for disk in drive - ldy 2,s restore path descriptor pointer - ldb <PD.DNS,y Get path's density settings - bita #FMT.DNS Disk in drive double density? - beq L0115 No, all drives can read single, skip ahead - bitb #DNS.MFM Can our path dsc. handle double density? - beq erbtyp No, illegal -L0115 bita #FMT.TDNS Is new disk 96 tpi? - beq L011D No, all drives handle 48 tpi, so skip ahead - bitb #DNS.DTD Can path dsc. handle 96 tpi? - beq erbtyp No, illegal -L011D bita #FMT.SIDE Is new disk double sided? - beq L0128 No, all drives handle single sided, we're done - lda <PD.SID,y Get # sides path dsc. can handle - 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 - 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 - beq L014B If normal sector, just copy it - ldd >u00B6,u Get OS9's LSN (twice of the 'real' 512 sector) - andb #$01 Mask out all but odd/even sector indicator - beq L014B Even, use 1st half of 512 byte sector - IFNE H6309 - addr w,y Odd, bump sector buffer ptr to 2nd half - ELSE - leay 256,y - ENDC -L014B equ * - IFNE H6309 - tfm y+,x+ Copy from physical sector buffer to PD buffer - puls pc,y,x restore path dsc & sector buffer ptrs & return - ELSE - pshs d - clrb -L014BLp lda ,y+ - sta ,x+ - decb - bne L014BLp - puls pc,y,x,d restore path dsc & sector buffer ptrs & return - ENDC - -erbtyp comb - 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 - -L0162 pshs x,d Preserve regs - bsr L016F Go read sector - puls x,d Restore regs (A=retry flags) - bcc 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 -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 -*** Next few lines are commented out for blobstop patches -*L0180 bita >DPort+WD_Stat 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 >DPort send to controller -* puls y,cc restore regs -* lbra L03E0 exit with Read Error -*** Blobstop fixes - stb >DPort 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 >DPort+WD_Data get byte from controller - sta ,x+ store into sector buffer -* stb >DPort drive info - nop -- blobstop fix - bra L0197 Keep reading until sector done - -L01A1 orcc #IntMasks Shut off IRQ & FIRQ - stb >DPort+WD_Cmd Send command -* ldy #$FFFF - ldb #%00101000 Double density & motor on - orb >u00A9,u Merge with current drive settings - stb >DPort 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 -* lda #$02 -*L01BE rts - -* Write -* -* Entry: -* B = MSB of LSN -* X = LSB of LSN -* Y = address of path descriptor -* U = address of device memory area -* -* Exit: -* CC = carry set on error -* B = error code -* -Write lbsr L00AC Go adjust LSN for 512 byte sector if needed - lda #%1001001 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 - bcs L01D8 Error on verify, go to write retry handler -L01D6 clrb No error & return -L01D7 rts - -* Write error retry handler -L01D8 lsra Shift retry flags - lbeq L03AF Too many retries, exit with error - bcc L01C4 Normal retry, attemp to re-write sector - pshs x,d Preserve flags & sector # - lbsr sktrk0 Seek to track 0 (attempt to recalibrate) - puls x,d Restore flags & sector # - bra L01C4 Try re-writing now - -* 512 byte sector write here -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 - lbsr L0176 Go read the sector in - ldd >u00B6,u Get OS9 LSN - andb #$01 Even or odd? - beq L020D Even, skip ahead - ldx >sectbuf,u Get physical sector buffer ptr - leax >$0100,x Point to 2nd half - bra L0211 Copy caller's buffer to 2nd half of sector - -L020D ldx >sectbuf,u Get physical sector buffer ptr - -L0211 ldy PD.BUF,y Get path dsc. buffer ptr - IFNE H6309 - ldw #256 Copy write buffer to sector buffer - tfm y+,x+ - ELSE - clrb -L0211Lp lda ,y+ - sta ,x+ - decb - bne L0211Lp - ENDC - puls y,d Get path dsc. ptr & LSN back - ldx >sectbuf,u Get physical sector buffer ptr again - ldb #$A0 Write sector command - -* Format track comes here with B=$F0 (write track) -*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 >DPort+WD_Stat 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 >DPort Send to controller -* puls y,cc Restore regs -* lbra L03AF Check for errors from status register - - 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 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 >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 - ENDC -* stb >DPort 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 - sta >$FFA1 map it back into memory - andcc #^IntMasks turn IRQ's on again - ELSE -* puls y,cc Get path dsc. ptr & CC - ENDC - ldb >DPort+WD_Stat 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 - 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 - lbsr L016F Go read sector we just wrote - puls x Get original write buffer ptr - stx PD.BUF,y Restore path dsc. version - bcs L02A3 If error reading, exit with it - pshs u,y Preserve device mem, path dsc. ptrs - ldb <PD.TYP,y Get type from path dsc. - ldy >sectbuf,u Get sector buffer ptr - andb #%00000100 512 byte sector? - beq L028D No, skip ahead - ldd >u00B6,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 -L02A1 puls u,y -L02A3 puls pc,x,d - -L02A5 pshs a Save Caller's track # - ldb <V.TRAK,x Get track # drive is currently on - bra L02E9 Go save it to controller & continue - -L02AC lbsr L0376 Go set up controller for drive, spin motor up - bsr L032B Get track/sector # (A=Trk, B=Sector) - pshs a Save track # - lda >u00AD,u Get side 1/2 flag - beq L02C4 Side 1, skip ahead - lda >u00A9,u Get control register settings - ora #%01000000 Set side 2 (drive 3) select - sta >u00A9,u Save it back -L02C4 lda <PD.TYP,y Get drive type settings - bita #%00000010 ??? (Base 0/1 for sector #?) - bne L02CC Skip ahead - incb Bump sector # up by 1 -L02CC stb >DPort+WD_Sect Save into Sector register - ldx >u00A7,u Get last drive table accessed - ldb <V.TRAK,x Get current track # on device - 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 - pshs a Save differences - lda 1,s Get track # back - tst ,s+ Are tpi's different? - beq L02E9 No, continue normally - lsla Yes, multiply track # by 2 ('double-step') - lslb Multiply current track # by 2 ('double-step') -L02E9 stb >DPort+WD_Trak 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 -* I think most (if not all) drives do NOT need precomp - IFEQ PRECOMP-1 - ldb #21 Pre-comp track # - pshs b Save it - ldb <PD.DNS,y Get current density settings - andb #%00000010 Just want to check track density - beq L02F9 48 tpi, skip ahead - lsl ,s Multiply pre-comp value by 2 ('double-step') -L02F9 cmpa ,s+ Is track # high enough to warrant precomp? - bls L0307 No, continue normally - ldb >u00A9,u - orb #%00010000 Turn on Write precomp - stb >u00A9,u - ENDC - -L0307 ldb >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? - beq L0321 yes, skip ahead -L0314 sta >DPort+WD_Data save track # to data register - ldb <PD.STP,y get stepping rate - andb #%00000011 just keep usable settings (6-30 ms) - eorb #%00011011 set proper bits for controller - lbsr L03E4 send command to controller & time delay -L0321 puls a get track # back - sta <V.TRAK,x save as current track # - sta >DPort+WD_Trak save to controller - clrb no error & return - rts - -* Entry: B:X LSN -* Exit: A=Track # -* B=Sector # -* <u00AD=00 = Head 1 , $FF = Head 2 -L032B tstb Sector # > 65535? - bne L033F Yes, illegal for floppy - tfr x,d Move sector # to D - leax ,x LSN 0? - beq L0371 Yes, exit this routine - ldx >u00A7,u Get previous drive table ptr - cmpd DD.TOT+1,x Within range of drive spec? - blo L0343 Yes, go calculate track/sector #'s -L033F comb Exit with Bad sector # error - ldb #E$Sect - rts - -* Calculate track/sector #'s? -L0343 stb >u00AE,u Save LSB of LSN - clr ,-s Clear track # on stack - ldb <DD.FMT,x Get drive format - lsrb Shift out # sides into carry - ldb >u00AE,u Get LSB of LSN again - 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? - bne L035D Odd, so don't bump track # up - inc ,s Bump up track # - -L035D subb DD.TKS,x Subtract # sectors/track - sbca #$00 - 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 - bcc L0365 Still more, go bump the track up -L036D addb $03,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 -L0372 fcb $01 Drive 0 - fcb $02 Drive 1 - fcb $04 Drive 2 - fcb $40 Drive 3 / Side select - -L0376 clr >u00AA,u ??? - -chkdrv lda <PD.DRV,y Get drive # requested - cmpa #4 Drive 0-3? - blo L0385 Yes, continue normally -NoHW comb Illegal drive # error - ldb #E$Unit - rts - -* Entry: A=drive #, X=LSN (Physical, not OS9 logical if PCDOS disk) -L0385 pshs x,d Save sector #, drive # & B??? - leax >L0372,pc Point to drive bit mask table - ldb a,x Get bit mask for drive # we want - stb >u00A9,u Save mask - leax DRVBEG,u Point to beginning of drive tables - ldb #DRVMEM Get size of each drive table - mul Calculate offset to drive table we want - leax d,x Point to it - 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 -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? - beq L03CA No, exit without error - aslb Drive not ready? - bcs L03CC Yes, use that error code - aslb Write protect error? - bcs L03D0 Yes, use that error code - aslb Write fault error? - bcs L03D4 Yes, use that error code - aslb Sector not found? - bcs L03D8 Yes, use Seek error code - aslb CRC error? - bcs L03DC Yes, use that error code -L03CA clrb No error & return - rts - -L03CC ldb #E$NotRdy not ready - fcb $8C skip 2 bytes - -L03D0 ldb #E$WP write protect - fcb $8C skip 2 bytes - -L03D4 ldb #E$Write write error - fcb $8C - -L03D8 ldb #E$Seek seek error - fcb $8C - -L03DC ldb #E$CRC CRC error -* fcb $8C - -*L03E0 ldb #E$Read Read error - orcc #Carry set carry - rts - -L03E4 bsr L0404 Send command to controller & waste some time -L03E6 ldb >DPort+WD_Stat Check FDC status register - bitb #$01 Is controller still busy? - beq L0403 No, exit - ldd >VIRQCnt,pc Get initial count value for drive motor speed - std >u00B1,u Save it - bra L03E6 Wait for controller to finish previous command - -* Send command to FDC -L03F7 lda #%00001000 Mask in Drive motor on bit - ora >u00A9,u Merge in drive/side selects - sta >DPort Turn the drive motor on & select drive - stb >DPort+WD_Cmd Save command & return -L0403 rts - -L0404 bsr L03F7 Go send command to controller - -* This loop has been changed from nested LBSRs to timing loop. -* People with crystal upgrades should modify the loop counter -* to get a 58+ us delay time. MINIMUM 58us. -L0406 pshs a 14 cycles, plus 3*loop counter - lda #29 (only do about a 100 cycle delay for now) -L0409 deca for total ~63 us delay (123 cycles max.) - bne L0409 - puls a,pc restore register and exit - -* SetStat -* -* Entry: -* A = function code -* Y = address of path descriptor -* U = address of device memory area -* -* Exit: -* CC = carry set on error -* B = error code -* -SetStat ldx PD.RGS,y Get caller's register stack ptr - ldb R$B,x Get function code - cmpb #SS.WTrk Write track? - beq SSWTrk Yes, go do it - cmpb #SS.Reset Restore head to track 0? - lbeq sktrk0 Yes, go do it --- beq - comb set carry for error - ldb #E$UnkSvc return illegal service request error - rts - -SSWTrk pshs u,y preserve register stack & descriptor - - IFEQ Level-1 - - ldd #$1A00 Size of buffer to hold entire track image - os9 F$SRqMem Request memory from system - bcs L0489 Error requesting, exit with it - stu >FBlock,x - - ELSE - -*--- new code - ldb #1 1 block to allocate - os9 F$AllRAM allocate some RAM - bcs 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 - bcs FError error out - stb 2,x save temporary task number in FTask,u - lslb 2 bytes per entry - ldu <D.TskIPt get task image table pointer - stx b,u save pointer to the task's DAT image - lsrb get the right number again - IFNE H6309 - tfr 0,u destination is address 0 - ELSE - ldu #$0000 - ENDC -*--- end new code - - ldx 2,s get pointer to descriptor -* stu >FBlock,x - ldx <D.Proc Get current process ptr - lda P$Task,x Get task # for current process -* ldb <D.SysTsk Get system task # - ldy ,s - ldx PD.RGS,y Get register stack ptr - ldx R$X,x Get ptr to caller's track buffer - ldy #$1A00 Size of track buffer - os9 F$Move Copy from caller to temporary task - bcs L0479 Error copying, exit - - ENDC - - puls u,y - pshs u,y - lbsr L0376 Go check drive #/wait for it to spin up - ldx PD.RGS,y Get caller's register stack ptr - ldb R$Y+1,x Get caller's side/density - bitb #$01 Check side - beq L0465 Side 1, skip ahead - com >u00AD,u - ldb >u00A9,u Get current control register settings - orb #%01000000 Mask in side 2 - stb >u00A9,u Save updated control register -L0465 lda R$U+1,x Get caller's track # - ldx >u00A7,u Get current drive table ptr - lbsr L02A5 - bcs L0489 - ldb #$F0 Write track command? -*--- - IFEQ Level-1 - ldx >FBlock,u - ELSE - ldx #$2000 start writing from block 1 - ENDC - - lbsr L0224 Go write the track -L0479 ldu 2,s - pshs b,cc Preserve error - - IFEQ Level-1 - - ldu >FBlock,u Get ptr to track buffer - ldd #$1A00 Return track buffer - os9 F$SRtMem - - ELSE - - ldb >FTask,u point to task - os9 F$RelTsk release the task - fcb $8C skip 2 bytes - - ENDC - -* format comes here when block allocation passes, but task allocation -* gives error. So er de-allocate the block. -FError - IFGT Level-1 - pshs b,cc save error code, cc - ldx >FBlock,u point to block - ldb #1 1 block to return - os9 F$DelRAM de-allocate image RAM blocks - clr FBlock+1,u ensure that the block # in FBlock is zero. - puls b,cc Restore error - ENDC - -L0489 puls pc,u,y Restore regs & return - -* seek the head to track 0 -sktrk0 lbsr chkdrv - ldx >u00A7,u - clr <$15,x - lda #$05 -L0497 ldb <PD.STP,y - andb #%00000011 Just keep usable settings (6-30 ms) - eorb #%01001011 Set proper bits for controller - pshs a - lbsr L03E4 - puls a - deca - bne L0497 - ldb <PD.STP,y - andb #%00000011 Just keep usable settings (6-30 ms) - eorb #%00001011 Set proper bits for controller - lbra L03E4 - -L04B3 pshs y,x,d Preserve regs - ldd >VIRQCnt,pc Get VIRQ initial count value - std >u00B1,u Save it - lda >u00A9,u ?Get drive? - ora #%00001000 Turn drive motor on for that drive - sta >DPort Send drive motor on command to FDC - IFEQ Level-1 - lda >D.DskTmr Get VIRQ flag - ELSE - lda <D.MotOn Get VIRQ flag - ENDC - bmi L04DE Not installed yet, try installing it - 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 - -L04DE bsr InsVIRQ Install VIRQ to wait for drive motors -L04E0 clrb No error & return - puls pc,y,x,d - -InsVIRQ lda #$01 Flag drive motor is up to speed - IFEQ Level-1 - sta >D.DskTmr - ELSE - sta <D.MotOn - ENDC - ldx #$0001 Install VIRQ entry - leay >u00B1,u Point to packet - clr Vi.Stat,y Reset Status byte - ldd >VIRQCnt,pc Get initial VIRQ count value - os9 F$VIRQ Install VIRQ - bcc VIRQOut No error, exit - lda #$80 Flag that VIRQ wasn't installed - IFEQ Level-1 - sta >D.DskTmr - ELSE - sta <D.MotOn - ENDC -VIRQOut clra - rts - -* IRQ service routine for VIRQ (drive motor time) -* Entry: U=Ptr to VIRQ memory area -IRQSvc pshs a - lda <D.DMAReq - beq L0509 - bsr InsVIRQ - bra IRQOut -L0509 sta >DPort - 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 - IFEQ Level-1 - clr >D.DskTmr - ELSE - clr <D.MotOn - ENDC -IRQOut puls pc,a - -* Non-OS9 format goes here -* Entry: X=LSN -* Y=Path dsc. ptr -* U=Device mem ptr -L051A pshs x Preserve Logical sector # - ldx >u00A7,u Get last drive table accessed ptr - clra - pshs x,a Save ptr & NUL byte - IFNE H6309 - ldw #$14 Clear 20 bytes - tfm s,x+ - ELSE - ldb #$14 -L051ALp clr ,x+ - decb - bne L051ALp - ENDC - puls x,a Eat NUL & get back drive table ptr - ldb <PD.CYL+1,y Get # cylinders on drive (ignores high byte) - lda <PD.SID,y Get # sides - mul Calculate # tracks on drive (1 per head) - IFNE H6309 - decd Adjust to ignore track 0 - ELSE - subd #$0001 - ENDC - lda <PD.SCT+1,y Get # sectors/track - sta DD.TKS,x Save in drive table - sta <DD.SPT+1,x Save in other copy in drive table - mul Calculate # sectors on drive (minus track 0) - pshs x Preserve drive table ptr - tfr d,x Move # sectors on drive to X - lda <PD.T0S+1,y Get # sectors on track 0 - leax a,x Add that many sectors to total - lda <PD.TYP,y Get device type settings - anda #%00000100 Mask out all but 512 byte sector flag - beq L0550 Not 512 byte sector, skip ahead - IFNE H6309 - addr x,x Multiply by 2 (convert to 256 byte OS9 sectors) - ELSE - tfr x,d - leax d,x - ENDC -L0550 tfr x,d Move # sectors to D - puls x Get back drive table ptr - std DD.TOT+1,x Save # sectors allowed on drive - lda #UPDAT.+EXEC. Owner's read/write/exec attributes - sta DD.ATT,x Set attributes for disk - lda <PD.DNS,y Get density settings - lsla Shift for DD.FMT - pshs a Preserve it a sec - lda <PD.SID,y Get # sides - deca Adjust to base 0 - ora ,s+ Merge with density settings - sta <DD.FMT,x Save in device table - clrb No error? - puls pc,x Restore original LSN & return - - emod -eom equ * - end
--- a/level2/modules/rb1773desc.asm Tue May 18 01:26:32 2004 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -******************************************************************** -* rb1773desc - rb1773 Device Descriptor Template -* -* $Id$ -* -* Edt/Rev YYYY/MM/DD Modified by -* Comment -* ------------------------------------------------------------------ - - nam rb1773desc - ttl rb1773 Device Descriptor Template - -* Disassembled 98/08/23 17:09:41 by Disasm v1.6 (C) 1988 by RML - - ifp1 - use defsfile - endc - -tylg set Devic+Objct -atrv set ReEnt+rev -rev set $00 - -DNum set 0 -Type set TYP.CCF+TYP.5 -Density set DNS.MFM -Step set STP.6ms -Cyls set 35 -Sides set 1 -Verify set 1 -SectTrk set 18 -SectTrk0 set 18 -Interlv set 3 -SAS set 8 - - mod eom,name,tylg,atrv,mgrnam,drvnam - - fcb DIR.!SHARE.!PEXEC.!PWRIT.!PREAD.!EXEC.!UPDAT. mode byte - fcb HW.Page extended controller address - fdb $FF40 physical controller address - fcb initsize-*-1 initalization table size - fcb DT.RBF device type:0=scf,1=rbf,2=pipe,3=scf - fcb DNum drive number - fcb Step step rate - fcb Type drive device type - fcb Density media density:0=single,1=double - fdb Cyls number of cylinders (tracks) - fcb Sides number of sides - fcb Verify verify disk writes:0=on - fdb SectTrk # of sectors per track - fdb SectTrk0 # of sectors per track (track 0) - fcb Interlv sector interleave factor - fcb SAS minimum size of sector allocation -initsize equ * - - IFNE DD -name fcs /DD/ - ELSE -name fcb 'D,'0+DNum+$80 - ENDC -mgrnam fcs /RBF/ -drvnam fcs /rb1773/ - - emod -eom equ * - end -