A2osX/LIB/LIBBLKDEV.S.D2.txt

659 lines
10 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
*/--------------------------------------
*\--------------------------------------
D2.MotorControl >PULLB D2.MotorOn
>PULLB D2.DrvSlt
jsr D2.CheckDiskII
bcs .9
lda D2.MotorOn
asl
lda #IO.D2.DrvOff
adc D2.Slotn0
tax
lda $C000,x
clc
.9 rts
*/--------------------------------------
*\--------------------------------------
D2.Recalibrate >PULLB D2.DrvSlt
jsr D2.CheckDiskII
bcs .9
ldy D2.Slotn0
lda IO.D2.Ph0On,y
lda #IO.D2.SeekTimeR
jsr D2.Wait100usecA
lda #160 40 x 4 Qtracks
php
sei
.1 dec
dec
pha
phy
plx
jsr D2.SeekPhOnY
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
lda IO.D2.Ph0Off,y
plp
* clc
jmp D2.Wait25600usec
.9 rts
*/--------------------------------------
*\--------------------------------------
D2.HeadSelect >PULLB D2.HeadNum
>PULLB D2.DrvSlt
jsr D2.CheckDiskII
bcs .9
lda D2.HeadNum A = 0/1
asl A = 0/2
ora D2.Slotn0
tax x=n0/n2
lda IO.D2.Ph0On,x
lda IO.D2.Ph0On+4,x
lda #1
jsr D2.Wait100usecA
lda IO.D2.Ph0Off,x
lda IO.D2.Ph0Off+4,x
.9 rts
*/--------------------------------------
*\--------------------------------------
D2.MoveHead >PULLB D2.TargetQTrack
>PULLB D2.CurrentQTrack
>PULLB D2.DrvSlt
jsr D2.CheckDiskII
bcs .99
php
sei
lda D2.CurrentQTrack
bit #1 A = Current QT
beq .2 we are on 0/4 or 2/4 track
pha
cmp D2.TargetQTrack we are on 1/4 or 3/4 track
bcc .1 if CC, C < T, must move in
inc move out: X = Ph(N+1)
.1 jsr D2.SeekPhOnY move in : X = Ph(N)
tya
tax
pla
bcs .2 if CS, C > T, must move out
inc move in : Y = Ph(N+1)
.2 jsr D2.SeekPhOnY move out: Y = Ph(N)
bra .9 Ph ON to go to 0/4 or 2/4, no wait
*--------------------------------------
.3 bcs .4 if CS, C > T, must move out
inc CC: C < T, ON next PH
.HS B0 BCS
.4 dec CS: C > T, ON prev PH
sta D2.CurrentQTrack
bit #1
bne .5
lda IO.D2.Ph0Off,x we must go to 0/4 or 2/4 : Off Prev Ph
bra .8 go wait....
.5 phy we must go on 1/4 or 3/4
plx Y already ON, -> X for Ph0Off,x
bcs .6 if CS, C > T, must move out
inc CC: C < T, ON next PH
.6 jsr D2.SeekPhOnY now X and Y on
.8 lda #IO.D2.SeekTimeF
jsr D2.Wait100usecA ...wait...
.9 lda D2.CurrentQTrack
cmp D2.TargetQTrack
bne .3
* lsr CS if X,Y on
jsr D2.Wait25600usec
ldy D2.Slotn0
lda IO.D2.Ph0Off,y
lda IO.D2.Ph0Off+2,y
lda IO.D2.Ph0Off+4,y
lda IO.D2.Ph0Off+6,y
* lda IO.D2.Ph0Off,y
* bcc .10
* lda IO.D2.Ph0Off,x
* clc
* lda IO.D2.Ph0Off,y
*.10 jsr D2.Wait25600usec
plp
clc
.99 rts
*--------------------------------------
D2.SeekPhOnY and #6
ora D2.Slotn0
tay
lda IO.D2.Ph0On,y
rts
*/--------------------------------------
* # D2TrkFmt16s
* Write a track (16 sectors)
* PUSHB DSSS0000
* PUSHB VolNum
* PUSHB HeadNum (0,1)
* PUSHB TrackNum
* ## RETURN VALUE
* CC : success
* CS : A = Error
*\--------------------------------------
D2.TrkFmt16s >PULLB D2.TrkNum
>PULLB D2.VolNum
>PULLB D2.DrvSlt
jsr D2.CheckDiskII
bcs .99
php
sei
lda D2.VolNum
sta X.TRKFMT.VolNum
lda D2.TrkNum
sta X.TRKFMT.TrkNum
ldy #D2.TrkFormat.Size
.1 lda D2.TrkFormat-1,y
sta $1ff,y
dey
bne .1
ldx D2.Slotn0
lda IO.D2.ReadProt,x
lda IO.D2.ReadMode,x
bmi .9 Write protected
jsr $200
plp
clc
rts
.9 lda #MLI.E.WRTPROT
plp
sec
.99 rts
*/--------------------------------------
* # D2TrkRead16s
* Write a track (16 sectors)
* PUSHB DSSS0000
* PUSHB TrackNum
* PUSHW Ptr to 16*256 buffer
* ## RETURN VALUE
* CC : success, A = VolNum
* CS : A = Error
*\--------------------------------------
D2.TrkRead16s >PULLW ZPPtr1
>PULLB D2.TrkNum
>PULLB D2.DrvSlt
jsr D2.CheckDiskII
bcs .9
lda D2.VolNum
clc
.9
D2.TrkRead16s.RTS
rts
*/--------------------------------------
* # D2TrkWrite16s
* Write a track (16 sectors)
* PUSHB DSSS0000
* PUSHB VolNum
* PUSHB TrackNum
* PUSHW = Ptr to 16*256 buffer
* ## RETURN VALUE
* CC : success
* CS : A = Error
*\--------------------------------------
D2.TrkWrite16s >PULLW ZPPtr1
>PULLB D2.TrkNum
>PULLB D2.VolNum
>PULLB D2.DrvSlt
jsr D2.CheckDiskII
bcs D2.TrkRead16s.RTS
>LDYAI TRACK16.LEN+256+1
>SYSCALL2 GetMem
bcs D2.TrkRead16s.RTS
>STYA ZPPtr2
stx D2.hTrkBuf
stz D2.SectNum
ldy #0 put 256 FF sync bytes for slooooow drives
jsr D2.PutSyncBytePtr2
ldy #TRACK16.GAP1
jsr D2.PutSyncBytePtr2
.1 jsr D2.PutAddrHeadPtr2
jsr D2.HeaderCheckSum
ldy #3
.2 lda D2.Checksum,y
jsr D2.PutByte44Ptr2
dey
bpl .2
jsr D2.PutTailPtr2
ldy #TRACK16.GAP2
jsr D2.PutSyncBytePtr2
jsr D2.PutDataHeadPtr2
lda ZPPtr1+1
bne .7
ldy #$57
ldx #2
lda #$96
.3 sta (ZPPtr2)
inc ZPPtr2
bne .4
inc ZPPtr2+1
.4 dey
bne .3
dex
bne .3
bra .8
.7 jsr D2.PutData
inc ZPPtr1+1
.8 jsr D2.PutTailPtr2
ldy #TRACK16.GAP3
jsr D2.PutSyncBytePtr2
inc D2.SectNum
lda D2.SectNum
cmp #16
bne .1
lda #0
sta (ZPPtr2)
jsr D2.HeadSelect
jsr D2.WriteTrackPtr2
php
pha
lda D2.hTrkBuf
>SYSCALL2 FreeMem
pla
plp
rts
*/--------------------------------------
*\--------------------------------------
D2.TrkReadNIB
*/--------------------------------------
* # D2TrkWriteNIB
* Write a track (NIBBLE)
* ## ASM
* PUSHB = DSSS0000
* PUSHW = Ptr to NIBBLE buffer (0 ended)
* ## RETURN VALUE
* CC : success
* CS : A = Error
* A=0, currently starting/seeking...
*\--------------------------------------
D2.TrkWriteNIB >PULLW ZPPtr1
>PULLB D2.DrvSlt
jsr D2.CheckDiskII was it a DISK II ?
bcs .99
.99 rts
*--------------------------------------
* A=DSSS0000
*--------------------------------------
D2.CheckDiskII pha
and #$70 only 0SSS
sta D2.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 D2.Slotn0
tax
lda $C000,x
ldx D2.Slotn0
lda IO.D2.ReadMode,x
lda IO.D2.RData,x
clc
rts
.9 pla
lda #MLI.E.NODEV
sec
rts
*--------------------------------------
* A=DSSS0000
*--------------------------------------
D2.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
*--------------------------------------
D2.Wait25600usec
lda #0
D2.Wait100usecA phx
.1 ldx #19 (2)
.2 dex (2)
bne .2 (3)
dec (2)
bne .1 (3)
plx
rts (6)
*--------------------------------------
D2.PutSyncBytePtr2
lda #$7f
.1 sta (ZPPtr2)
inc ZPPtr2
bne .2
inc ZPPtr2+1
.2 dey
bne .1
rts
*--------------------------------------
D2.PutAddrHeadPtr2
ldy #2
.1 lda ADDR.Head,y
jsr D2.PutBytePtr2
dey
bpl .1
rts
*--------------------------------------
D2.PutDataHeadPtr2
ldy #2
.1 lda DATA.Head,y
jsr D2.PutBytePtr2
dey
bpl .1
rts
*--------------------------------------
D2.PutTailPtr2 ldy #2
.1 lda TAIL,y
jsr D2.PutBytePtr2
dey
bpl .1
rts
*--------------------------------------
D2.HeaderCheckSum
lda D2.VolNum
eor D2.TrkNum
eor D2.SectNum
sta D2.Checksum
rts
*--------------------------------------
D2.PutData stz D2.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 D2.Checksum
sta D2.Checksum
lda FC2Nib,x
* jsr D2.PutBytePtr2
sta (ZPPtr2)
inc ZPPtr2
bne .31
inc ZPPtr2+1
.31 dey
bpl .3
ldy #0
.4 lda (ZPPtr1),y
and #$FC
tax
eor D2.Checksum
sta D2.Checksum
lda FC2Nib,x
* jsr D2.PutBytePtr2
sta (ZPPtr2)
inc ZPPtr2
bne .41
inc ZPPtr2+1
.41 iny
bne .4
ldx D2.Checksum
lda FC2Nib,x
bra D2.PutBytePtr2
*--------------------------------------
D2.PutByte44Ptr2
pha
ror
jsr .1
pla
.1 ora #$AA
*--------------------------------------
D2.PutBytePtr2 sta (ZPPtr2)
inc ZPPtr2
bne .8
inc ZPPtr2+1
.8 rts
*--------------------------------------
D2.WriteTrackPtr2
lda D2.hTrkBuf
>SYSCALL2 GetMemPtr
>STYA ZPPtr1
php
sei
ldy #D2.TrkWriter.Size
.1 lda D2.TrkWriter-1,y
sta $1ff,y
dey
bne .1
ldx D2.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