	org	$28000
	load	$28000
;Konstanten
Gap_len		=	900
DMA_ReadBytes	=	[($440*11+Gap_len)/2]+2
;fuer DMA-Transfer
DiskBuf		=	$70000
BlockSize	=	512
Drive		=	0
MAX_HeadMoves	=	2
MAX_ReadTries	=	10

WaitBlit:	Macro
\@1
	btst	#6,$2(a6)
	bne.s	\@1
	ENDM
j1:
	lea	DiskDemo1(pc),a0
	move.l	a0,$80.w
	trap	#0
	jmp	$30000
DiskDemo1:
	movem.l	d0-d7/a0-a6,-(a7)
	lea	$30000,a0
	moveq	#80,d0
	moveq	#02,d1
	bsr.b	Trackloader
	movem.l	(a7)+,d0-d7/a0-a6
	rte
;Trackloader
;-----------
Trackloader:
	movem.l	d0-d7/a0-a6,-(a7)
	subq.w	#1,d1
	bmi.b	LT_LoadDone
	lea	ReadError(pc),a4
	bsr.b	LT_MoveHead
LT_LoadLoop:
	moveq	#MAX_HeadMoves,d6
	bra.s	LT_NoHead
LT_HeadRetry:
	bsr.b	LT_MoveHead
LT_NoHead:
	moveq	#MAX_ReadTries,d5
LT_ReadRetry:
	bsr.w	LT_ReadTrack
	bsr.w	BlitDecode
	;bsr.w	CPU_Decode
	move.b	(a4),d7
	beq.s	LT_MoreMore
	dbf	d5,LT_ReadRetry
	dbf	d6,LT_HeadRetry
	move.w	#$4444,d7
LT_WasError:
	move	d7,$dff180
	dbf	d7,LT_WasError
LT_MoreMore:
	lea	$1600(a0),a0
	addq.w	#1,d0
	bchg	#2,(a5)
	btst	#0,d0
	bne.s	LT_Load2
	bclr	#1,(a5)
	bclr	#0,(a5)
	nop
	bset	#0,(a5)
	bsr.b	LT_TIME
LT_Load2:
	dbf	d1,LT_LoadLoop
	bsr.b	LT_Leaver
LT_LoadDone:
	movem.l	(a7)+,d0-d7/a0-a6
	rts
ReadError:	dc.w	0

LT_MoveHead:
	lea	$bfd100,a5
	move.b	#$7f,(a5)
	nop
	bclr	#Drive+3,(a5)
	nop
LT_MH0:
	btst	#5,$f01(a5)
	bne.s	LT_MH0
LT_Move2Zero:
	btst	#4,$f01(a5)
	beq.s	LT_HeadAtZero
	bclr	#0,(a5)
	nop
	bset	#0,(a5)
	bsr.b	LT_TIME
	bra.s	LT_Move2Zero
LT_HeadAtZero:
	bset	#2,(a5)
	moveq	#0,d2
	move.b	d0,d2
	lsr.w	#1,d2
	bcc.s	LT_HeadOK
	bclr	#2,(a5)
LT_HeadOK:
	subq.w	#1,d2
	bmi.s	LT_HeadMoved
	bclr	#1,(a5)
LT_MH1:
	bclr	#0,(a5)
	nop
	bset	#0,(a5)
	bsr.b	LT_TIME
	dbf	d2,LT_MH1
LT_HeadMoved:
	rts
LT_Leaver:
	move.b	#$fd,(a5)
	bset	#Drive+3,(a5)
	bset	#0,(a5)
	rts
LT_TIME:
	moveq	#64,d7
	bsr.b	TimeWait
	rts
TimeWait:
	movem.l	d1/d2,-(a7)
TimeWait0:
	move.w	$dff006,d1
	lsr.w	#8,d1
TimeWait1:
	move.w	$dff006,d2
	lsr.w	#8,d2
	cmp.w	d1,d2
	beq.s	TimeWait1
	dbf	d7,TimeWait0
	movem.l	(a7)+,d1/d2
	rts
LT_ReadTrack:
	lea	$dff000,a6
	move.w	#$7f00,$9e(a6)
	move.w	#$8500,$9e(a6)
	move.w	#$4489,$7e(a6)
	move.w	#$8210,$96(a6)
LT_RT0:
	btst	#5,$f01(a5)
	bne.s	LT_RT0
	move.w	#$4000,$24(a6)
	move.l	#DiskBuf,$20(a6)
	move.w	#$8000+DMA_ReadBytes,d2
	move.w	d2,$24(a6)
	move.w	d2,$24(a6)
	move.w	#$2,$9c(a6)
LT_RT1:
	btst	#1,$1f(a6)
	beq.s	LT_RT1
	move.w	#$4000,$24(a6)
	move.w	#$0400,$9e(a6)
	rts
;---------------------------------------------------------------------------
BlitDecode:
	movem.l	d0-d7/a0-a6,-(a7)
	move.l	#$55555555,d4
	lea	$dff000,a6
	lea	DiskBuf,a1
	moveq	#10,d7
Blit_Dec0:
	cmp.w	#$4489,(a1)+
	bne.s	Blit_Dec0
	cmp.w	#$4489,(a1)
	bne.s	Blit_Dec1
	addq.l	#2,a1
Blit_Dec1:
	bsr.w	Blit_CheckBlock
	;bsr.w	CPU_CheckBlock
	move.b	d0,(a4)
	bne.s	Blit_Error
	movem.l	(a1),d2/d3
	and.w	d4,d2
	and.w	d4,d3
	add.w	d2,d2
	or.w	d3,d2
	lsr.w	#8,d2
	lsl.w	#8,d2
	add.w	d2,d2
	lea	(a0,d2.w),a2
	lea	56(a1),a1
	bsr.b	Blit_DoBlit
	subq.l	#1,a1
	dbf	d7,Blit_Dec0
Blit_Error:
	movem.l	(a7)+,d0-d7/a0-a6
	rts
Blit_DoBlit:
	WaitBlit
	move.w	#$8640,$96(a6)
	move.l	#$1dd80002,$40(a6)
	move.l	#$ffffffff,$44(a6)
	moveq	#0,d2
	move.l	d2,$62(a6)
	move.w	d2,$66(a6)
	move.w	d4,$70(a6)
	lea	BlockSize-1(a1),a1
	move.l	a1,$50(a6)
	lea	BlockSize(a1),a1
	move.l	a1,$4c(a6)
	lea	BlockSize-1(a2),a2
	move.l	a2,$54(a6)
	move.w	#$0808,$58(a6)
	rts
Blit_CheckBlock:
	movem.l	d2/d3/a2/a3,-(a7)
	movem.l	48(a1),d2/d3
	and.l	d4,d2
	add.l	d2,d2
	and.l	d4,d3
	or.l	d3,d2
	lea	56(a1),a2
	lea	48(a1),a3
	moveq	#0,d0
	move.l	d0,(a3)
	waitblit
	move.w	#$8640,$96(a6)
	move.l	a3,$4c(a6)
	move.l	a2,$50(a6)
	move.l	a3,$54(a6)
	move.l	#$0d3c0000,$40(a6)
	move.l	#$FFFFFFFF,$44(a6)
	move.w	#$FFFc,$62(a6)
	move.l	#$0000FFFC,$64(a6)
	move.w	#$4002,$58(a6)
	waitblit
	move.l	(a3),d0
	and.l	d4,d0
	sub.l	d2,d0
	sne	d0
	movem.l	(a7)+,d2/d3/a2/a3
	rts
