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 ldy Slotn0 lda IO.D2.DrvOn,y nop nop lda #168 .1 sta IO.D2.Ph0Off,y dec dec pha and #6 ora Slotn0 tay sta IO.D2.Ph0On,y lda #IO.D2.SeekTimeR jsr D2.Wait100usecA pla bne .1 jsr D2.Wait25600usec ldx Slotn0 lda IO.D2.Ph0Off,x 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 .7 jsr .8 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 lda IO.D2.Ph0On,x nop nop lda IO.D2.Ph0On,y nop nop lda #IO.D2.SeekTimeF jsr D2.Wait100usecA bra .1 .7 jsr D2.Wait25600usec .8 bit IO.D2.Ph0Off,x nop nop ldx IO.D2.Ph0Off,y nop nop ldx Slotn0 bit IO.D2.RData,x rts *-------------------------------------- D2.Wait25600usec lda #0 D2.Wait100usecA phx .1 ldx Slotn0 (3) bit IO.D2.RData,x (4) ldx #18 (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+1 >SYSCALL2 GetMem bcs .9 >STYA ZPPtr2 stx hTrkBuf stz SectNum 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 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 plp rts *-------------------------------------- MAN SAVE usr/src/lib/libblkdev.s.d2 LOAD usr/src/lib/libblkdev.s ASM