View Single Post
Old 21 December 2012, 09:28   #5
Don_Adan
Registered User
 
Join Date: Jan 2008
Location: Warsaw/Poland
Age: 55
Posts: 2,006
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
Don_Adan is offline  
 
Page generated in 0.04984 seconds with 11 queries