A2osX/LIB/LIBBLKDEV.S.D2.txt

462 lines
7.3 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
.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
stz MoveTo
lda #252
sta MoveFrom
jsr D2MoveHead.1
* lda #0
* jsr D2.PhaseOn
* lda #0 wait 25.6 ms
* jsr D2.Wait100usecA
* lda #0
* jsr D2.PhaseOff
lda #0 wait 25.6 ms
jsr D2.Wait100usecA
clc
.9 rts
*/--------------------------------------
*\--------------------------------------
D2MoveHead >PULLB MoveTo
>PULLB MoveFrom
>PULLB DrvSlt
jsr CheckDiskII
bcs .9
jsr D2MoveHead.1
clc
.9 rts
D2MoveHead.1 ldy #0
.1 lda MoveTo
sec
sbc MoveFrom
beq .8
bcc .3
* Current < Target, must move in
cmp #2
bcc .5 one QT remaining
lda MoveFrom 2 or more
and #$FE from QT1 or QT3
inc
inc
bra .4
* Current > Target, must move out
.3 cmp #$FF
beq .5 one QT remaining
lda MoveFrom
bit #1 from QT1 or QT3
bne .30
dec
.30 dec
.4 sta MoveFrom
jsr D2.PhaseOn
lda #164
jsr D2.Wait100usecA
bra .1
.5 lda MoveTo
and #6
ora Slotn0
tax
inc
inc
and #$F7
tay
lda IO.D2.Ph0On,x
lda IO.D2.Ph0On,y
phx
* lda #164
* jsr D2.Wait100usecA
lda #0 wait 25.6 ms
jsr D2.Wait100usecA
plx
lda IO.D2.Ph0Off,x
lda IO.D2.Ph0Off,y
rts
.8 tya
beq D2.PhaseOn.RTS
lda #0 wait 25.6 ms
jsr D2.Wait100usecA
lda IO.D2.Ph0Off,y
rts
*--------------------------------------
D2.PhaseOn and #6
ora Slotn0
tax
pha
tya
beq .1
lda IO.D2.Ph0Off,y
.1 lda IO.D2.Ph0On,x
ply
D2.PhaseOn.RTS rts
*--------------------------------------
D2.Wait100usecA sec (2)
.1 ldx #19 (2)
.2 dex (2)
bne .2 (3)
ldx Slotn0 (3)
bit IO.D2.RData,x (4) Slow down ACC boards
sbc #1
bne .1
rts
*/--------------------------------------
*\--------------------------------------
D2TrkRead16s
*/--------------------------------------
* # D2TrkWrite16s
* Write a track (16 sectors)
* **In:**
* PUSHB = DSSS0000
* PUSHB = TrackNum * 4 : 0->136+
* PUSHW = Ptr to 16*256 buffer
* ## RETURN VALUE
* CC : success
* CS : A = Error
* A=0, currently starting/seeking...
*\--------------------------------------
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
eor Checksum
sta Checksum
tax
lda FC2Nib,x
jsr PutBytePtr2
dey
bpl .3
ldy #0
.4 lda (ZPPtr1),y
and #$FC
eor Checksum
sta Checksum
tax
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