;------------------------------------------------
;Lesen eines Sektors Über Trackdisk-Device mit den Erweiterten Befehlen
;
;RG
;------------------------------------------------


 include "exec/types.i"
 include "exec/memory.i"
 include "exec/io.i"
 include "devices/trackdisk.i"

 include "mymacro.i"

 STRUCTURE	global,0
	APTR	MyReplyPort
	APTR	MyIORequest
	APTR	SektorPuffer
	APTR	LabelPuffer
	LONG	WechselAnzahl
	LABEL	global_size


 XREF _AbsExecBase
 XREF _CreatePort
 XREF _DeletePort
 XREF _CreateIO
 XREF _DeleteIO
;------------------------------------------------
;Exec

 XLIB AllocMem
 XLIB FreeMem
 XLIB OpenDevice
 XLIB CloseDevice
 XLIB DoIO
;------------------------------------------------
Unit	EQU	0
Flags	EQU	0

Laufwerk	EQU	0
Sektor	EQU	880
AN	EQU	1
AUS	EQU	0

SektorSize	EQU	512
LabelSize	EQU	16


	move.l	_AbsExecBase,a6
	lea	-global_size(a7),a7
	move.l	a7,a5
	suba.l	a0,a0		;keinName (lokaler Port)
	jsr	_CreatePort
	move.l	d0,MyReplyPort(a5)
	beq	1$		;kein Port erstellt
	move.l	d0,a0		;Zeiger auf Port
	move.l	#IOTD_SIZE,d0
	jsr	_CreateIO
	move.l	d0,MyIORequest(a5)
	beq	2$		;keine IORequest-Struktur
	move.l	#SektorSize,d0
	move.l	#MEMF_PUBLIC!MEMF_CHIP,d1
	CALLSYS	AllocMem
	move.l	d0,SektorPuffer(a5)
	beq	3$
	move.l	#LabelSize,d0
	move.l	#MEMF_PUBLIC!MEMF_CHIP,d1
	CALLSYS	AllocMem
	move.l	d0,LabelPuffer(a5)
	beq	4$

	bsr	OeffneDevice
	tst.l	d0
	bne	4$

	bsr	MotorAn

	bsr	WechselAnz
	move.l	d0,WechselAnzahl(a5)
	move.w	#Sektor,d0
	move.l	SektorPuffer(a5),a0
	move.l	LabelPuffer(a5),a1
	move.l	WechselAnzahl(a5),d1
	bsr	LeseSektor

	bsr	MotorAus

	bsr	SchliesseDevice

	move.l	#LabelSize,d0
	move.l	LabelPuffer(a5),a1
	CALLSYS	FreeMem
4$:	move.l	#SektorSize,d0
	move.l	SektorPuffer(a5),a1
	CALLSYS	FreeMem
3$:	move.l	MyIORequest(a5),a0
	jsr	_DeleteIO
2$:	move.l	MyReplyPort(a5),a0
	jsr	_DeletePort
1$:	lea	global_size(a7),a7
	clr.l	d0
	rts
;------------------------------------------------
;Device für Trackdisk öffnen
;=> D0 = Null => Alles Ok

OeffneDevice:
	lea	DeviceName(pc),a0
	move.l	#Laufwerk,d0
	move.l	MyIORequest(a5),a1
	move.l	#Flags,d1
	CALLSYS	OpenDevice
	rts
;------------------------------------------------
;Device schließen

SchliesseDevice:
	move.l	MyIORequest(a5),a1
	CALLSYS	CloseDevice
	rts
;------------------------------------------------
;Motor des Laufwerks anschalten

MotorAn:
	move.l	MyIORequest(a5),a1
	move.w	#TD_MOTOR,IO_COMMAND(a1)
	move.l	#AN,IO_LENGTH(a1)
	CALLSYS	DoIO
	rts
;------------------------------------------------
;Motor des Laufwerks ausschalten

MotorAus:
	move.l	MyIORequest(a5),a1
	move.w	#TD_MOTOR,IO_COMMAND(a1)
	move.l	#AUS,IO_LENGTH(a1)
	CALLSYS	DoIO
	rts
;------------------------------------------------
;Lese einen Seltor in den angegebenen Puffer

;>= D0 = Sektornummer
;>= D1 = Anzahl der Diskettenwechsel
;>= A0 = Zeiger auf Puffer
;>= A1 = Zeiger auf Puffer für Labelblock

;=> D0 = Fehlermeldung oder Null

LeseSektor:
	move.l	a2,-(a7)
	move.l	MyIORequest(a5),a2
	move.w	#ETD_READ,IO_COMMAND(a2)
	move.l	#SektorSize,IO_LENGTH(a2)
	move.l	a0,IO_DATA(a2)
	move.l	a1,IOTD_SECLABEL(a2)
	mulu	#512,d0
	move.l	d0,IO_OFFSET(a2)
	move.l	d1,IOTD_COUNT(a2)
	move.l	a2,a1
	CALLSYS	DoIO
	move.l	(a7)+,a2
	rts
;------------------------------------------------
;Anzahl der Diskettenwechel fertstellen

;=> D0 = Anzahl der Diskwechsel

WechselAnz:
	move.l	a2,-(a7)
	move.l	MyIORequest(a5),a2
	move.w	#TD_CHANGENUM,IO_COMMAND(a2)
	move.l	a2,a1
	CALLSYS	DoIO
	move.l	IO_ACTUAL(a2),d0
	move.l	(a7)+,a2
	rts

;------------------------------------------------

DeviceName:	dc.b	'trackdisk.device',0

	END
