NEW
  AUTO 3,1
				.LIST OFF	
*/--------------------------------------
*\--------------------------------------
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
				
				lda IO.D2.DrvOn,x
				
				ldy #168
			
.1				lda IO.D2.Ph0Off,x

				dey
				dey

				tya

				and #6
				ora Slotn0
				tax
				lda IO.D2.Ph0On,x
				
				lda #IO.D2.SeekTime
				jsr D2.Wait100usecA
				
				tya
				bne .1
				
				jsr D2.Wait25600usec
				
				ldx Slotn0
				lda IO.D2.Ph0Off,x

				clc
.9				rts
*/--------------------------------------
*\--------------------------------------
D2MoveHead		>PULLB MoveTo
				>PULLB MoveFrom
				>PULLB DrvSlt
				jsr CheckDiskII
				bcs .9

				jsr D2MoveHead.1

				clc
.9				rts

D2MoveHead.1	ldx Slotn0
				ldy Slotn0
				
.1				lda	MoveFrom
				cmp MoveTo
				beq	.7

				bit IO.D2.Ph0Off,x
				ldx IO.D2.Ph0Off,y

				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
				tay
				
				lda IO.D2.Ph0On,x
				lda IO.D2.Ph0On,y
				
				lda #IO.D2.SeekTime
				jsr D2.Wait100usecA
				bra .1
				
.7				jsr D2.Wait25600usec

				lda IO.D2.Ph0Off,x
				lda IO.D2.Ph0Off,y
				rts
*--------------------------------------
D2.Wait25600usec
				lda #0

D2.Wait100usecA
				phx						(3)
				
.1				ldx #18					(2)

.2  			dex						(2)
				bne .2					(3)

				ldx Slotn0				(3)
				bit IO.D2.DrvOn,x		(4) Slow down ACC boards

				sec						(2)
				sbc #1					(2)
				bne .1					(3)
				
				plx						(4)
				
				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
				
*				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
				sei

				ldy #TrkWriter.Size
				
.1				lda TrkWriter-1,y
				sta $1ff,y
				dey
				bne .1
				
				lda hTrkBuf
				>SYSCALL2 GetMemPtr
				>STYA ZPPtr1
				ldx Slotn0

				jsr $200
				
				cli
				rts
*--------------------------------------
MAN
SAVE usr/src/lib/libblkdev.s.d2
LOAD usr/src/lib/libblkdev.s
ASM
