A2osX/LIB/LIBBLKDEV.S.D2.txt
2020-11-27 17:37:47 +01:00

524 lines
7.7 KiB
Plaintext
Raw 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
*/--------------------------------------
*\--------------------------------------
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