/* $Id: td_support.h,v 1.12 92/09/06 16:16:23 tf Exp $ © 1990,91 by Tobias Ferber */

#include <exec/types.h>
#include <exec/memory.h>
#include <exec/io.h>
#include <exec/ports.h>
#include <exec/devices.h>
#include <exec/errors.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <devices/trackdisk.h>

extern char *ioerr[2][9];   /* Standard Device IO Errors */
extern char *tderr[2][16];  /* Driver error messages */
extern BYTE turn_motor();

#define MOTOR_ON(iotd)  turn_motor(iotd, TRUE)
#define MOTOR_OFF(iotd) turn_motor(iotd, FALSE)

extern long do_command();
extern BYTE td_read();

#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <libraries/filehandler.h>

struct DFxInfo {
  struct MsgPort *MsgPort;
  struct IOExtTD *IOExtTD;
  ULONG  TD_Flag;
  ULONG *Buffer;
  ULONG  BufferSize;
  LONG   Unit;
  ULONG  Flags;
  UBYTE *Device;
  ULONG SectorsPerBlock;
  ULONG BlocksPerTrack;
  ULONG Heads;
  ULONG LowCyl, HighCyl;
  ULONG BufMemType;
};

extern struct DFxInfo DFxInfo[4]; /* global! */

#define NOUNIT          -1L
#define DEF_MEMTYPE     (MEMF_CHIP|MEMF_CLEAR)
#define DEF_SECSPERBLK   1L
#define DEF_BLKSPERTRK  11L
#define DEF_SURFACES     2L
#define DEF_FIRSTCYL     0L
#define DEF_LASTCYL     79L

extern void init_DFxInfo();

#define FIRSTBLOCK          0
#define LASTBLOCK           1759
#define BYTES_PER_BLOCK     512
#define BLOCKS_PER_TRACK    11
#define BLOCKS_PER_CYLINDER (2*BLOCKS_PER_TRACK)
#define BYTES_PER_TRACK     (BYTES_PER_BLOCK * BLOCKS_PER_TRACK)

extern char *dfxerr[2][9];
extern int check_DFxInfo();

#define TD_OPENED  0L   /* trackdisk.device successfully opened */
#define TD_CLOSED  1L   /* trackdisk.device *not* opened */

extern char *ouerr[2][6];
extern void close_unit();

#define DRIVEPORT_PRI 0L

extern int open_unit();
extern int disk_state();
extern int disk_type();

#define read_block(u,b) td_read(DFxInfo[u].IOExtTD,      \
                                (b)*BYTES_PER_BLOCK,     \
                                TD_SECTOR,               \
                                DFxInfo[u].Buffer,       \
                                NULL)

#define read_track(u,t) td_read(DFxInfo[u].IOExtTD,      \
                                (t)*BYTES_PER_TRACK,     \
                                BYTES_PER_TRACK,         \
                                DFxInfo[u].Buffer,       \
                                NULL)

/* !!! PLEASE REFER TO td_support.c FOR DOCUMENTATION !!! */
