;------------------------------------------------
;Lesen eines Sektors Über Trackdisk-Device
;
;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
	LABEL	global_size

 XREF _AbsExecBase
 XREF _CreatePort
 XREF _DeletePort
 XREF _CreateStdIO
 XREF _DeleteStdIO
;------------------------------------------------
;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


	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.s	1$		;kein Port erstellt
	move.l	d0,a0		;Zeiger auf Port
	jsr	_CreateStdIO
	move.l	d0,MyIORequest(a5)
	beq.s	2$		;keine IORequest-Struktur
	move.l	#SektorSize,d0
	move.l	#MEMF_PUBLIC!MEMF_CHIP,d1
	CALLSYS	AllocMem
	move.l	d0,SektorPuffer(a5)
	beq.s	3$
	bsr	OeffneDevice
	tst.l	d0
	bne.s	4$

	bsr	MotorAn
	move.w	#Sektor,d0
	move.l	SektorPuffer(a5),a0
	bsr	LeseSektor
	bsr	MotorAus

	bsr	SchliesseDevice
4$:	move.l	#SektorSize,d0
	move.l	SektorPuffer(a5),a1
	CALLSYS	FreeMem
3$:	move.l	MyIORequest(a5),a0
	jsr	_DeleteStdIO
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
;>= A0 = Zeiger auf Puffer

LeseSektor:
	move.l	MyIORequest(a5),a1
	move.w	#CMD_READ,IO_COMMAND(a1)
	move.l	#SektorSize,IO_LENGTH(a1)
	move.l	a0,IO_DATA(a1)
	mulu	#512,d0
	move.l	d0,IO_OFFSET(a1)
	CALLSYS	DoIO
	rts
;------------------------------------------------
	
DeviceName:	dc.b	'trackdisk.device',0

	END
