/*
 * $Header: DH0:src/omti/dist/src/include/omtistruct.h,v 1.1 92/11/25 02:11:17 Barnard Exp $
 *
 */

/*
 * Structure defines
 *
 */

#include	<exec/types.h>
#include	<exec/devices.h>
#include	<exec/interrupts.h>

/* Struktur fuer Laufwerkscharakteristiken */

struct	divechar
{

/* Plattenunabhaengige Eintraege */

	UBYTE		dc_resstat; 	/*	00:	Initialisiere Controller	*/
								/*		beim naechsten Befehl		*/
								/*	01:	Init-String ist geschickt	*/
								/*	02:	Setze Controller mit Daten	*/
								/*	ff:	Controller ist initialisiert und up */
	UBYTE		dc_lun;			/*	Select-Byte fuer Controller */
	UWORD		dc_flags;		/*	Flags fuer Device */
	ULONG		dc_maxoff;		/*	Anzahl der Bytes (!) auf der Platte */
	ULONG		dc_parkpos;		/*	Byte(!), auf das geparkt wird */
	APTR		dc_vector;		/*	Vektor fuer Motor on/off */

/* Plattenabhaengige Eintraege, organisiert wie Parameter-Block */

/* Aufbau des OMIT-Init-Drive Blocks */

	UWORD		dc_hicyl;		/* hoechster, anfahrbarer Cyl. */
	UBYTE		dc_heads;		/* Anzahl Koepfe auf Platte */
	UBYTE		dc_dummy0;		/* Dummy-Offset */
	UWORD		dc_wrcur;		/* Write-Current-Reduce-Cylinder */
	UWORD		dc_wrpre;		/* Write-Precomp-Cylinder */

	UWORD		dc_step;		/* OMTI-codierte Steprate */
	UWORD		dc_wrcyl;		/* Hoechster schreib-/lesbarer Cyl */
	UWORD		dc_parkcyl;		/* Parkcylinder */
	UWORD		dc_reserved;	/* Reserviert ($1e/1f) */

/* Eintraege, die als Init-Parameter dienen */

	UBYTE		dc_wrprot;		/* Write-Protect-Byte */
	UBYTE		dc_autopark;	/* Autopark-Byte */
	UBYTE		dc_init_2;		/* Init-Felder auf Para-Block */
	UBYTE		dc_init_3;
	UBYTE		dc_init_4;
	UBYTE		dc_init_5;
	UBYTE		dc_init_6;
	UBYTE		dc_init_7;
	UBYTE		dc_init_8;
	UBYTE		dc_init_9;
	UBYTE		dc_init_a;
	UBYTE		dc_init_b;
	UBYTE		dc_init_c;
	UBYTE		dc_init_d;
	UBYTE		dc_init_e;
	UBYTE		dc_init_f;
};

#define	DCB_MOTOR	0
#define	DCF_MOTOR	(1 << DCB_MOTOR)

#define OD_NAME		"omti.device"


/* Struktur fuer Device */

struct	OmtiDevice{
	struct	Device		od_device;				/* Device-Struktur am Anfang */
	APTR				od_segment;				/* Pointer auf Codesegment */
	struct				od_divechar[2];			/* Drive-Characteristics Drive 0 */
												/* Drive-Characteristics Drive 1 */

	APTR				od_CurIoB;				/* Current IORequest */
	APTR				od_data;				/* Zeiger auf den zu uebertragenden Datenblock */
	ULONG				od_blocks;				/* Anzahl der zu uebertragenden Blocks im Current Request */
	UWORD				od_qcnt;				/* Anzahl der Requests in der Warteschlange */

	struct List			od_qlist;				/* List fuer Requests */
	struct Interrupt	od_int;					/* Struktur fuer den Interrupt-Driver */

	UBYTE		od_error;						/* Fehlerflag: 00: Alles ok */
												/*             FF: Ankommende Bytes sind Sense-Bytes */
	UBYTE		od_pad;							/* Dummy-Padbyte */

/* Hier beginnt der nichtoeffentliche Teil des Devices */
/* Zugriff auf diese Felder ist nicht erlaubt!!! */

	UBYTE		od_COM0;						/* Felder fuer OMTI-Kommmandos */
	UBYTE		od_COM1;						/* Data 1 */
	UBYTE		od_COM2;						/* Data 2 */
	UBYTE		od_COM3;						/* Data 3 */
	UBYTE		od_COM4;						/* Data 4 */
	UBYTE		od_COM5;						/* Data 5 */

	UBYTE		od_init0;						/* in diesen Feldern wird der InitDrive-Request */
	UBYTE		od_init1;						/* fuer die richtigen Drive-Parameter aufgebaut */
	UBYTE		od_init2;
	UBYTE		od_init3;
	UBYTE		od_init4;
	UBYTE		od_init5;
	UBYTE		od_init6;
	UBYTE		od_init7;
	UBYTE		od_init8;
	UBYTE		od_init9;
	UBYTE		od_inita;
	UBYTE		od_initb;
	UBYTE		od_initc;
	UBYTE		od_initd;
	UBYTE		od_inite;
	UBYTE		od_initf;
};

/* Dieses Bit wird gesetzt, wenn das Device einen Request queued */

#define	IOFB_QUEUED	6
#define	IOFF_QUEUED	(1 << IOFB_QUEUED)
