Next version is available, I optimised a few ReadWriteData routine.
Code:
; ReadWriteData (final version - 20 XII 2012)
; input D0
; output D0
; changed D0/D1/A0/A1
; input D0 = 0/2/4
; 0 = no data
; 2 = read command
; 4 = write command
ifeq MC68000
NoData
move.l $20(A5),D0
jsr -$13E(A6) ; Wait
WaitND
move.b $1E-Modulo(A4),D0
bmi.b WaitND
moveq #0,D0 ; no error
rts
ReadWriteData
tst.w D0 ; CCR set
beq.b NoData
movem.l D2/D4/D5/D6/A5,-(SP)
move.l $20(A5),D5
move.b $6C(A2),D4 ; maximum number of blocks per track ?
move.l $60(A3),A5 ; destination/source ptr
move.b $4A(A3),D6 ; number of blocks to read/write
moveq #0,D2
subq.w #4,D0
bne.b GoR
bra.b GoW
; ReadData routine
LoopR
subq.b #1,D1
bne.b WaitForReadyR
GoR
move.l D5,D0
jsr -$13E(A6) ; Wait
move.b D4,D1
WaitForReadyR
move.b $1E-Modulo(A4),D0
bmi.b WaitForReadyR
lsr.b #1,D0
bcs.b ErrorR
lsr.b #3,D0
bcc.b WaitForReadyR
moveq #15,D0
LoopRE
move.w (A4),(A5)+ ; 68020+ copy routine
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
dbf D0,LoopRE
addq.l #8,D2 ; *8
subq.b #1,D6
bne.b LoopR
QuitR
moveq #0,D0 ; no error
QuitE
move.l A5,$60(A3)
move.l $6C(A3),A0
lsl.l #6,D2 ; *64
add.l D2,8(A0)
move.b D6,$4A(A3)
movem.l (SP)+,D2/D4/D5/D6/A5
rts
ErrorW
subq.l #8,D2
ErrorR
move.b 6-Modulo(A4),$277(A2)
bsr.b GetError
bra.b QuitE
; WriteData routine
LoopW
subq.b #1,D1
bne.b WaitForReadyW
move.l D5,D0
jsr -$13E(A6) ; Wait
GoW
move.b D4,D1
WaitForReadyW
move.b $1E-Modulo(A4),D0
bmi.b WaitForReadyW
lsr.b #1,D0
bcs.b ErrorW
lsr.b #3,D0
bcc.b WaitForReadyW
moveq #15,D0
LoopWE
move.w (A5)+,(A4) ; 68020+ copy routine
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
dbf D0,LoopWE
addq.l #8,D2 ; *8
subq.b #1,D6
bne.b LoopW
move.l D5,D0
jsr -$13E(A6) ; Wait
WaitW
move.b $1E-Modulo(A4),D0
bmi.b WaitW
bra.b QuitR
GetError
btst #6,$15(A2)
beq.b CalcError
bsr.w lbC00231C
bra.b PutError
CalcError
move.b $16-Modulo(A4),D1
lsl.w #8,D1
move.b $12-Modulo(A4),D1
mulu.w $5E(A2),D1
moveq #15,D0
and.b $1A-Modulo(A4),D0
moveq #0,D4
move.b $65(A2),D4
mulu.w D0,D4
add.l D4,D1
move.b 14-Modulo(A4),D0
subq.b #1,D0
add.l D1,D0
PutError
move.l D0,$68(A2) ; here is my fix D1 replaced with D0
moveq #2,D0 ; error
rts
else
NoData
move.l $20(A5),D0
jsr -$13E(A6) ; Wait
WaitND
move.b $1E-Modulo(A4),D0
bmi.b WaitND
moveq #0,D0 ; no error
rts
LoopROB
subq.b #1,D3
bne.b WaitForReadyRO
GoRO
move.l D5,D0
jsr -$13E(A6) ; Wait
move.b D4,D3
WaitForReadyRO
move.b $1E-Modulo(A4),D0
bmi.b WaitForReadyRO
lsr.b #1,D0
bcs.w ErrorR
btst #2,D0
beq.b WaitForReadyRO
moveq #$7E,D0 ; odd address copy routine
LoopRO move.w (A4),D1
swap D1
move.w (A4),D1 ; 1/2/3/4
rol.l #8,D1 ; 2/3/4/1
move.b D1,(A5)+
move.l D1,(A5)
addq.l #3,A5
dbf D0,LoopRO
move.w (A4),D1 ; necessary due last byte is overwritten
swap D1
move.w (A4),D1 ; 1/2/3/4
rol.l #8,D1 ; 2/3/4/1
move.b D1,(A5)+
move.b 3(A5),D1 ; backup original byte value
move.l D1,(A5)
addq.l #3,A5
addq.l #8,D2 ; *8
subq.b #1,D6
bne.b LoopROB
bra.b QuitR
OddCopy
subq.w #4,D0
bne.b GoRO
bra.w GoWO
ReadWriteData
tst.w D0 ; CCR set
beq.b NoData
movem.l D2/D3/D4/D5/D6/A5,-(SP)
move.l $20(A5),D5
move.b $6C(A2),D4 ; maximum number of Blocks per Track ?
move.l $60(A3),A5 ; destination/source ptr
move.b $4A(A3),D6 ; number of blocks to read/write
moveq #0,D2
move.l A5,D1
lsr.b #1,D1
bcs.b OddCopy
subq.w #4,D0
bne.b GoR
bra.b GoW
; ReadData routine
LoopR
subq.b #1,D3
bne.b WaitForReadyR
GoR
move.l D5,D0
jsr -$13E(A6) ; Wait
move.b D4,D3
WaitForReadyR
move.b $1E-Modulo(A4),D0
bmi.b WaitForReadyR
lsr.b #1,D0
bcs.b ErrorR
btst #2,D0
beq.b WaitForReadyR
moveq #15,D0
LoopRE
move.w (A4),(A5)+ ; even address copy routine
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
move.w (A4),(A5)+
dbf D0,LoopRE
addq.l #8,D2 ; *8
subq.b #1,D6
bne.b LoopR
QuitR
moveq #0,D0 ; no error
QuitE
move.l A5,$60(A3)
move.l $6C(A3),A0
lsl.l #6,D2 ; *64
add.l D2,8(A0)
move.b D6,$4A(A3)
movem.l (SP)+,D2/D3/D4/D5/D6/A5
rts
ErrorW
subq.l #8,D2
ErrorR
move.b 6-Modulo(A4),$277(A2)
bsr.b GetError
bra.b QuitE
; WriteData routine
LoopW
subq.b #1,D3
bne.b WaitForReadyW
move.l D5,D0
jsr -$13E(A6) ; Wait
GoW
move.b D4,D3
WaitForReadyW
move.b $1E-Modulo(A4),D0
bmi.b WaitForReadyW
lsr.b #1,D0
bcs.b ErrorW
btst #2,D0
beq.b WaitForReadyW
moveq #15,D0
LoopWE
move.w (A5)+,(A4) ; from even address
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
move.w (A5)+,(A4)
dbf D0,LoopWE
addq.l #8,D2 ; *8
subq.b #1,D6
bne.b LoopW
BackW
move.l D5,D0
jsr -$13E(A6) ; Wait
WaitW
move.b $1E-Modulo(A4),D0
bmi.b WaitW
bra.b QuitR
GetError
btst #6,$15(A2)
beq.b CalcError
bsr.w lbC00231C
bra.b PutError
CalcError
move.b $16-Modulo(A4),D1
lsl.w #8,D1
move.b $12-Modulo(A4),D1
mulu.w $5E(A2),D1
moveq #15,D0
and.b $1A-Modulo(A4),D0
moveq #0,D3
move.b $65(A2),D3
mulu.w D0,D3
add.l D3,D1
move.b 14-Modulo(A4),D0
subq.b #1,D0
add.l D1,D0
PutError
move.l D0,$68(A2) ; here is my fix D1 replaced with D0
moveq #2,D0 ; error
rts
LoopWOB
subq.b #1,D3
bne.b WaitForReadyWO
move.l D5,D0
jsr -$13E(A6) ; Wait
GoWO
move.b D4,D3
WaitForReadyWO
move.b $1E-Modulo(A4),D0
bmi.b WaitForReadyWO
lsr.b #1,D0
bcs.w ErrorW
btst #2,D0
beq.b WaitForReadyWO
moveq #$7F,D0 ; from odd address
LoopWO
move.l 1(A5),D1 ; 2/3/4/x
move.b (A5),D1 ; 2/3/4/1
rol.l #8,D1 ; 3/4/1/2
move.w D1,(A4)
swap D1
move.w D1,(A4)
addq.l #4,A5
dbf D0,LoopWO
addq.l #8,D2 ; *8
subq.b #1,D6
bne.b LoopWOB
bra.w BackW
endc