NEW AUTO 3,1 */-------------------------------------- *\-------------------------------------- D2MotorControl >PULLB MotorOn >PULLB DrvSlt jsr CheckDiskII bcs .9 lda MotorOn asl lda #IO.D2.DrvOff adc Slotn0 tax lda $C000,x clc .9 rts */-------------------------------------- *\-------------------------------------- D2Recalibrate >PULLB DrvSlt jsr CheckDiskII bcs .9 * ldx Slotn0 ldy Slotn0 lda #168 .1 dec dec pha and #6 ora Slotn0 phy plx tay lda IO.D2.Ph0On,y lda #IO.D2.SeekTimeR jsr D2.Wait100usecA lda IO.D2.Ph0Off,x lda #IO.D2.SeekTimeR jsr D2.Wait100usecA pla bne .1 jsr D2.Wait25600usec * ldy Slotn0 lda IO.D2.Ph0Off,y jsr D2.Wait25600usec clc .9 rts */-------------------------------------- *\-------------------------------------- D2MoveHead >PULLB MoveTo >PULLB MoveFrom >PULLB DrvSlt jsr CheckDiskII bcs .9 php sei jsr D2MoveHead.SEI plp clc .9 rts D2MoveHead.SEI ldx Slotn0 ldy Slotn0 .1 lda MoveFrom cmp MoveTo beq .8 sta IO.D2.Ph0Off,y sta IO.D2.Ph0Off,x bcs .2 * Current < Target, must move in inc .HS B0 BCS * Current > Target, must move out .2 dec sta MoveFrom pha and #6 ora Slotn0 tax pla bcs .3 * Current < Target, must move in inc .HS B0 BCS * Current > Target, must move out .3 dec and #6 ora Slotn0 bcc .4 * move out : invert 2 phases phx tax pla .4 tay sta IO.D2.Ph0On,x sta IO.D2.Ph0On,y lda #IO.D2.SeekTimeF jsr D2.Wait100usecA bra .1 .8 jsr D2.Wait25600usec sta IO.D2.Ph0Off,y sta IO.D2.Ph0Off,x rts *-------------------------------------- D2.Wait25600usec lda #0 D2.Wait100usecA phx .1 ldx #20 (2) .2 dex (2) bne .2 (3) dec (2) bne .1 (3) plx rts (6) */-------------------------------------- * # D2TrkRead16s * Write a track (16 sectors) * PUSHB = DSSS0000 * PUSHB = TrackNum * 4 : 0->136+ * PUSHW = Ptr to 16*256 buffer * ## RETURN VALUE * CC : success, A = VolNum * CS : A = Error *\-------------------------------------- D2TrkRead16s >PULLW ZPPtr1 >PULLB TrkNum >PULLB DrvSlt jsr CheckDiskII bcs .9 lda VolNum clc .9 rts */-------------------------------------- * # D2TrkWrite16s * Write a track (16 sectors) * PUSHB = DSSS0000 * PUSHB = TrackNum * 4 : 0->136+ * PUSHW = Ptr to 16*256 buffer * ## RETURN VALUE * CC : success * CS : A = Error *\-------------------------------------- D2TrkWrite16s >PULLW ZPPtr1 >PULLB TrkNum >PULLB VolNum >PULLB DrvSlt jsr CheckDiskII bcs .9 >LDYAI TRACK16.LEN+256+1 >SYSCALL2 GetMem bcs .9 >STYA ZPPtr2 stx hTrkBuf stz SectNum ldy #0 put 256 FF sync bytes for slooooow drives jsr PutSyncBytePtr2 ldy #TRACK16.GAP1 jsr PutSyncBytePtr2 .1 jsr PutAddrHeadPtr2 jsr HeaderCheckSum ldy #3 .2 lda Checksum,y jsr PutByte44Ptr2 dey bpl .2 jsr PutTailPtr2 ldy #TRACK16.GAP2 jsr PutSyncBytePtr2 jsr PutDataHeadPtr2 jsr PutData jsr PutTailPtr2 ldy #TRACK16.GAP3 jsr PutSyncBytePtr2 inc ZPPtr1+1 inc SectNum lda SectNum cmp #16 bne .1 lda #0 sta (ZPPtr2) jsr D2WriteTrackPtr2 php pha lda hTrkBuf >SYSCALL2 FreeMem pla plp .9 rts */-------------------------------------- *\-------------------------------------- D2TrkReadNIB */-------------------------------------- * # D2TrkWriteNIB * Write a track (NIBBLE) * **In:** * PUSHB = DSSS0000 * PUSHW = Ptr to NIBBLE buffer (0 ended) * ## RETURN VALUE * CC : success * CS : A = Error * A=0, currently starting/seeking... *\-------------------------------------- D2TrkWriteNIB >PULLW ZPPtr1 >PULLB DrvSlt jsr CheckDiskII was it a DISK II ? bcs .9 .9 rts *-------------------------------------- * A=DSSS0000 *-------------------------------------- CheckDiskII pha and #$70 only 0SSS sta Slotn0 lsr lsr lsr lsr ora #$C0 make Cn sta ZPPtr3+1 stz ZPPtr3 ldx #3 4 bytes to check .1 ldy DiskII.OFS,x .2 lda (ZPPtr3),y cmp DiskII.SIG,x bne .9 dex bpl .1 pla all bytes match, Disk II asl lda #0 adc #IO.D2.DrvSel1 adc Slotn0 tax lda $C000,x ldx Slotn0 lda IO.D2.ReadMode,x lda IO.D2.RData,x lda IO.D2.Ph0Off,x lda IO.D2.Ph1Off,x lda IO.D2.Ph2Off,x lda IO.D2.Ph3Off,x * clc rts .9 pla lda #MLI.E.NODEV sec rts *-------------------------------------- * A=DSSS0000 *-------------------------------------- DrvSpinCheck ldy #0 lda IO.D2.RData,x .1 pha pla cmp IO.D2.RData,x bne .8 spinning dey bne .1 clc CC:not spinning rts .8 sec rts *-------------------------------------- PutSyncBytePtr2 lda #$7f .1 jsr PutBytePtr2 dey bne .1 rts *-------------------------------------- PutAddrHeadPtr2 ldy #2 .1 lda ADDR.Head,y jsr PutBytePtr2 dey bpl .1 rts *-------------------------------------- PutDataHeadPtr2 ldy #2 .1 lda DATA.Head,y jsr PutBytePtr2 dey bpl .1 rts *-------------------------------------- PutTailPtr2 ldy #2 .1 lda TAIL,y jsr PutBytePtr2 dey bpl .1 rts *-------------------------------------- HeaderCheckSum lda VolNum eor TrkNum eor SectNum sta Checksum rts *-------------------------------------- PutData stz Checksum lda ZPPtr1 ldy ZPPtr1+1 clc adc #86 bcc .1 iny clc .1 sta ZPPtr3 sty ZPPtr3+1 adc #86 bcc .2 iny .2 sta ZPPtr4 sty ZPPtr4+1 ldy #85 .3 lda (ZPPtr1),y and #3 tax lda D2.XX000000,x pha lda (ZPPtr3),y and #3 tax pla ora D2.00XX0000,x pha lda (ZPPtr4),y and #3 tax pla ora D2.0000XX00,x tax eor Checksum sta Checksum lda FC2Nib,x jsr PutBytePtr2 dey bpl .3 ldy #0 .4 lda (ZPPtr1),y and #$FC tax eor Checksum sta Checksum lda FC2Nib,x jsr PutBytePtr2 iny bne .4 ldx Checksum lda FC2Nib,x jsr PutBytePtr2 rts *-------------------------------------- PutByte44Ptr2 pha ror jsr .1 pla .1 ora #$AA *-------------------------------------- PutBytePtr2 sta (ZPPtr2) inc ZPPtr2 bne .8 inc ZPPtr2+1 .8 rts *-------------------------------------- D2WriteTrackPtr2 lda hTrkBuf >SYSCALL2 GetMemPtr >STYA ZPPtr1 php sei ldy #TrkWriter.Size .1 lda TrkWriter-1,y sta $1ff,y dey bne .1 ldx Slotn0 jsr $200 bcs .9 plp clc rts .9 plp sec rts *-------------------------------------- MAN SAVE usr/src/lib/libblkdev.s.d2 LOAD usr/src/lib/libblkdev.s ASM