;	opt	d+

	;/* Hardware-include-file      */
	;/* (p) 1990 by Peter Thierolf */

custom	= $dff000

bltddat	= $000
dmaconr	= $002
vposr	= $004
vhposr	= $006
dskdatr	= $008
joy0dat	= $00a
joy1dat	= $00c
clxdat	= $00e
adkconr	= $010
pot0dat	= $012
pot1dat	= $014
potgor	= $016
serdatr	= $018
dskbytr	= $01a
intenar	= $01c
intreqr	= $01e
dskpth	= $020
dskptl	= $022
dsklen	= $024
dskdat	= $026
refptr	= $028
vposw	= $02a
vhposw	= $02c
copcon	= $02e
serdat	= $030
serper	= $032
potgo	= $034
joytest	= $036
strequ	= $038
strvbl	= $03a
strhor	= $03c
strlong	= $03e
bltcon0	= $040
bltcon1	= $042
bltafwm	= $044
bltalwm	= $046
bltcpth	= $048
bltcptl	= $04a
bltbpth	= $04c
bltbptl	= $04e
bltapth	= $050
bltaptl	= $052
bltdpth	= $054
bltdptl	= $056
bltsize	= $058

bltcmod	= $060
bltbmod	= $062
bltamod	= $064
bltdmod	= $066
 
bltcdat	= $070
bltbdat	= $072
bltadat	= $074

dsksync	= $07e
cop1lch	= $080
cop1lcl	= $082
cop2lch	= $084
cop2lcl	= $086
copjmp1	= $088
copjmp2	= $08a
copins	= $08c
diwstrt	= $08e
diwstop	= $090
ddfstrt	= $092
ddfstop	= $094
dmacon	= $096
clxcon	= $098
intena	= $09a
intreq	= $09c
adkcon	= $09e

audlch	= $000
audlcl	= $002
audlen	= $004
audper	= $006
audvol	= $008
auddat	= $00a

aud0	= $0a0
aud1	= $0b0
aud2	= $0c0
aud3	= $0e0

bpl1pth	= $0e0
bpl1ptl	= $0e2
bpl2pth	= $0e4
bpl2ptl	= $0e6
bpl3pth	= $0e8
bpl3ptl	= $0ea
bpl4pth	= $0ec
bpl4ptl	= $0ee
bpl5pth	= $0f0
bpl5ptl	= $0f2
bpl6pth	= $0f4
bpl6ptl	= $0f6

bplcon0	= $100
bplcon1	= $102
bplcon2	= $104

bpl1mod	= $108
bpl2mod	= $10a

bpl1dat	= $110
bpl2dat	= $112
bpl3dat	= $114
bpl4dat	= $116
bpl5dat	= $118
bpl6dat	= $11a

spr0pth	= $120
spr0ptl	= $122
spr1pth	= $124
spr1ptl	= $126
spr2pth	= $128
spr2ptl	= $12a
spr3pth	= $12c
spr3ptl	= $12e
spr4pth	= $130
spr4ptl	= $132
spr5pth	= $134
spr5ptl	= $136
spr6pth	= $138
spr6ptl	= $13a
spr7pth	= $13c
spr7ptl	= $13e

sprpos	= $000
sprctl	= $002
sprdata	= $004
sprdatb	= $006

spr0	= $140
spr1	= $148
spr2	= $150
spr3	= $158
spr4	= $160
spr5	= $168
spr6	= $170
spr7	= $178

color	= $180

	;/* Cia's */

ciaa	= $bfe001
ciab	= $bfd000

pra	= $000
prb	= $100
ddra	= $200
ddrb	= $300
talo	= $400
tahi	= $500
tblo	= $600
tbhi	= $700
todlo	= $800
todmid	= $900
todhi	= $a00
sdr	= $c00
icr	= $d00
cra	= $e00
crb	= $f00

	INCLUDE	work:Sources/Includes/ExecOffsets.i
	INCLUDE	work:Sources/Includes/DosOffsets.i

mili3	= 2128	;+1000	;Langsamer steppen wegen 32Mhz
mili50	= 35468	;+2699

inbits	= ciaa+pra
outbits	= ciab+prb

bufferstart	= $7a000

font	= $3f000
	;Parameter fr die Disketten-erkennung

syncwert	= $4489
code1		= $2aa5	;Apidya disk #1
code2		= $4aa9	;Apidya disk #2

Verify	= 1

Dos	= 0

trklen	= $1a00

	IFEQ	Dos
	ORG	$70000-8

	dc.l	$70000
	dc.l	$0
	ENDC

	dc.b	"D","O","S",0
	dc.l	0
	dc.l	$370

begin:
	lea	custom,a5
	move.w	#$7fff,dmacon(a5)
	move.w	#$7fff,intena(a5)
	move.w	#$000,$180(a5)

	lea	$7e400,a1
	lea	(a1),sp
	lea	start(pc),a0
	move.w	#(copy_len+3)/4-1,d7
.copy:
	move.l	(a0)+,(a1)+
	dbf	d7,.copy
	jmp	$7e400

start:
	ORG	$7e400
start2:
	bsr	setup

;	move.b	disk_num,d0
;	lea	drive_disks(pc),a0
;	moveq	#3,d1
;.loop:
;	cmp.b	(a0,d1.w),d0
;	beq	.found
;	dbf	d1,.loop
;	bra	forever


	moveq	#0,d1

.found:
	move.w	d1,unit_num
.gotit:
	bsr	reselect

	moveq	#0,d0			;Spur 0
	bsr	stepto
	move.w	unit_num(pc),d1
	lea	side(pc),a0
	sf	(a0,d1.w)		;Seite 0
	bsr	selside
	bsr	reselect
	bsr	motoron

	;Erwartet einen eingeschalteten Motor, einen angefahrenen Track
	;sowie eine in 'side' eingetragene Diskettenseite.
	;Im 'startpointer' wird die Load-adresse bergeben,
	;in 'diskIOlen' wird die Load-lnge bergeben.

	move.w	#$1002,intena(a5)
	move.w	#$8210,dmacon(a5)
	move.b	#3,trycount
.nexttrack:
	bsr	selside
	clr.b	errorcount
.tryloop:
	move.w	#$7700,adkcon(a5)
	move.w	#0,dsklen(a5)
	move.w	#syncwert,dsksync(a5)
	move.w	#$b500,adkcon(a5)
	move.l	trkbuffer(pc),dskpth(a5)
	move.w	#$9a20,dsklen(a5)	;$1a20 Bytes laden
	move.w	#$9a20,dsklen(a5)

	move.l	#$f0000,d0
.waitdma:
	subq.l	#1,d0
	beq	.checkerror
	btst	#1,intreqr+1(a5)
	beq	.waitdma

	move.w	#$1002,intreq(a5)
	move.w	#$4000,dsklen(a5)

	move.l	startpointer(pc),a3

	move.l	trkbuffer(pc),a1
	lea	-2(a1),a1
.sync:
	addq.l	#2,a1
	cmp.w	#syncwert,(a1)
	beq	.sync
	move.w	diskcode(pc),d0
	cmp.w	(a1),d0		;Wenn kein Synchelp, dann neu laden.
	bne	.checkerror

	addq.l	#6,a1		;Synchelp und Tracknr berspringen.

	move.w	#(trklen/4)-1,d7
	moveq	#0,d3
.loop:
	move.l	(a1)+,d0
	and.l	#$55555555,d0
	asl.l	#1,d0
	move.l	(a1)+,d1
	and.l	#$55555555,d1
	or.l	d1,d0
	add.l	d0,d3
	move.l	d0,(a3)+
	dbf	d7,.loop

	move.l	(a1)+,d0
	and.l	#$55555555,d0
	asl.l	#1,d0
	move.l	(a1)+,d1
	and.l	#$55555555,d1
	or.l	d1,d0
	cmp.l	d0,d3
	bne	.checkerror
.end:
	bsr	motoroff
	jmp	$7e800

.checkerror:
	addq.b	#1,errorcount
	cmp.b	#3,errorcount
	bne	.tryloop
	subq.b	#1,trycount
	bmi	forever
	lea	tracknr(pc),a0
	move.b	(a0,d5.w),-(sp)
	bsr	resetdrive
	bsr	reselect
	bsr	motoron
	bsr	selside
	move.b	(sp)+,d0
	bsr	stepto
	bra	.nexttrack


forever:
	bsr	motoroff
.wait:
	bra.s	.wait

stepto:
	lea	tracknr(pc),a0
	cmp.b	(a0,d5.w),d0
	beq	.done
	blt	.out
	bsr	stepin
	bra	stepto
.out:
	bsr	stepout
	bra	stepto
.done:
	rts

resetdrive:
	bsr	motoroff
	bsr	reselect
	move.b	selmask(pc),d0
	bset	#1,d0
	move.b	d0,selmask	;Step-richtung festlegen

	bsr	wait
.loop:
	btst	#4,inbits
	beq	.done
	bsr	dostep
	bsr	wait
	bra	.loop
.done:
	lea	tracknr(pc),a0
	move.b	#0,(a0,d5.w)
	rts

dostep:
	move.b	selmask,d7
	bclr	#0,d7
	move.b	d7,outbits
	nop
	move.b	selmask(pc),outbits
	rts

stepout:
	move.b	selmask(pc),d7
	bset	#1,d7
	move.b	d7,selmask
	bsr	wait
	lea	tracknr(pc),a0
	subq.b	#1,(a0,d5.w)
	bra	dostep

stepin:
	move.b	selmask(pc),d7
	bclr	#1,d7
	move.b	d7,selmask
	bsr	wait
	lea	tracknr(pc),a0
	addq.b	#1,(a0,d5.w)
	bra	dostep

wait:
	bset	#0,ciab+cra
.loop:
	btst	#0,ciab+icr
	beq.s	.loop

	rts

motoron:
	move.b	#%01111001,outbits
	bclr	#7,selmask
	move.b	selmask(pc),outbits

	move.b	#mili50&$ff,ciab+talo
	move.b	#mili50/$100,ciab+tahi

	moveq	#20,d0
.wait2:
	bset	#0,ciab+cra
.wait:
	btst	#0,ciab+icr
	beq.s	.waiton
	subq.w	#1,d0
	beq	.fail
	bra	.wait2
.waiton:
	btst	#5,inbits
	bne	.wait

	move.b	#mili3&$ff,ciab+talo
	move.b	#mili3/$100,ciab+tahi
	moveq	#0,d0
	rts		;Zero-flag is set.

.fail:
	move.b	#mili3&$ff,ciab+talo
	move.b	#mili3/$100,ciab+tahi
	moveq	#1,d0	;Clear	Zero-flag
	rts

motoroff:
	move.b	#%11111001,outbits
	bset	#7,selmask
	move.b	selmask(pc),outbits
	or.b	#%11111000,selmask
	move.b	selmask(pc),outbits
	rts

seldrive:
	moveq	#0,d5
	move.w	d0,unit_num
	move.w	d0,d5
	addq.w	#3,d0
	move.b	selmask(pc),d7
	or.b	#%01111001,d7
	and.b	#%11111001,d7	;Motorzustand lassen, wie er ist.
	bclr	d0,d7
	move.b	d7,selmask
	move.b	d7,outbits
	rts

reselect:
	move.w	unit_num(pc),d0
	bra	seldrive

selside:
	lea	side(pc),a0
	move.b	(a0,d5.w),d0
	tst.b	d0
	beq	.upper
	bset	#2,selmask
	bra	.wait
.upper:
	bclr	#2,selmask
.wait:
	move.b	selmask(pc),outbits
	move.b	#mili50&$ff,ciab+talo
	move.b	#mili50/$100,ciab+tahi
	bset	#0,ciab+cra
.loop:
	btst	#0,ciab+icr
	beq.s	.loop
	bset	#0,ciab+cra
.loop2:
	btst	#0,ciab+icr
	beq.s	.loop2

	move.b	#mili3&$ff,ciab+talo
	move.b	#mili3/$100,ciab+tahi
	rts

setup:
	lea	custom,a5
	move.b	ciaa+ddra,d0
	and.b	#%11000011,d0
	move.b	d0,ciaa+ddra

;	move.b	#%11111001,outbits

	move.b	#%11111111,ciab+ddrb

	move.b	ciab+cra,d0
	and.b	#%11000000,d0
	or.b	#%00001000,d0
	move.b	d0,ciab+cra
	move.b	#%01111111,ciab+icr

	move.b	#mili3&$ff,ciab+talo
	move.b	#mili3/$100,ciab+tahi

	bsr	wait
	rts

startpointer:	dc.l	$7e800
trkbuffer:	dc.l	bufferstart

drive_flags:	dc.b	0,0,0,0	;Vier Drives
drive_disks:	dc.b	0,0,0,0
drive_bits:	dc.b	0,0,0,0
side:		dc.b	0,0,0,0
tracknr:	dc.b	0,0,0,0

diskcode:	dc.w	code1	;Erkennung der Disketten Nummer.
unit_num:	dc.w	0
errorcount:	dc.b	0
trycount:	dc.b	0
selmask:	dc.b	0
copy_len	= *-start2
