/*
 *  IEC.h - IEC-Bus-Routinen, 1541-Emulation
 *
 *  Copyright (C) 1994-1996 by Christian Bauer
 */

#ifndef IEC_H
#define IEC_H

#include <exec/types.h>


// C64-Status-Codes
#define ST_OK			0		// Alles klar
#define ST_READ_TIMEOUT	0x02	// Timeout beim Lesen
#define ST_TIMEOUT		0x03	// Timeout
#define ST_EOF			0x40	// End of file

// 1541-Fehlercodes
enum {
  ERR_OK,				// 00 OK
  ERR_WRITEERROR,		// 25 WRITE ERROR
  ERR_WRITEPROTECT,		// 26 WRITE PROTECT ON
  ERR_SYNTAX30,			// 30 SYNTAX ERROR (Unbekannter Befehl)
  ERR_SYNTAX33,			// 33 SYNTAX ERROR (Wildcards beim Schreiben)
  ERR_WRITEFILEOPEN,	// 60 WRITE FILE OPEN
  ERR_FILENOTOPEN,		// 61 FILE NOT OPEN
  ERR_FILENOTFOUND,		// 62 FILE NOT FOUND
  ERR_ILLEGALTS,		// 67 ILLEGAL TRACK OR SECTOR
  ERR_NOCHANNEL,		// 70 NO CHANNEL
  ERR_STARTUP,			// 73 Einschaltmeldung
};

// Maximale Länge eines Dateinamens
#define NAMEBUF_LENGTH	256

// Struktur der BAM
typedef struct {
  UBYTE	dir_track;		// Spur...
  UBYTE	dir_sector;		// ...und Sektor des ersten Directory-Blocks
  BYTE	fmt_type;		// Format-Typ
  BYTE	pad0;
  UBYTE	bitmap[4*35];	// Belegung der Sektoren
  UBYTE	disk_name[18];	// Name des Diskette
  UBYTE	id[2];			// ID der Diskette
  BYTE	pad1;
  UBYTE	fmt_char[2];	// Formatzeichen
  BYTE	pad2[4];
  BYTE	pad3[85];
} BAM;

// Struktur eines Verzeichniseintrags
typedef struct {
  UBYTE	type;			// Dateityp
  UBYTE	track;			// Spur...
  UBYTE	sector;			// ...und Sektor des ersten Datenblocks
  UBYTE	name[16];		// Dateiname
  UBYTE	side_track;		// Spur...
  UBYTE	side_sector;	// ...und Sektor des ersten Side-Sektors
  UBYTE	rec_len;		// Recordlänge
  BYTE	pad0[4];
  UBYTE	ovr_track;		// Spur...
  UBYTE	ovr_sector;		// ...und Sektor beim Überschreiben
  UBYTE	num_blocks_l;	// Anzahl Blocks, LSB
  UBYTE	num_blocks_h;	// Anzahl Blocks, MSB
  BYTE	pad1[2];
} DirEntry;

// Struktur eines Verzeichnisblocks
typedef struct {
  UBYTE		next_track;
  UBYTE		next_sector;
  DirEntry	entry[8];
} Directory;

// Datenstruktur für ein Laufwerk
typedef struct {
  char		type;				// Laufwerks-Typ
  char		read_char;			// Byte-Puffer zum Lesen aus Dateien
  char		name_length;		// Bisher empfangene Länge des Dateinamens
  char		error_length;		// Restliche Länge der Fehlermeldung
  char		*name_ptr;			// Zeiger in Dateinamen, für Open/IECOut
  char		*error_ptr;			// Zeiger in Fehlermeldung
  BPTR		lock;				// Lock des Verzeichnisses des Laufwerks
								// bzw. Handle der .d64-Datei

  void		(*init_proc)();		// Initialisieren
  void		(*exit_proc)();		// Beenden
  int		(*open_proc)();		// Kanal öffnen
  int		(*close_proc)();	// Kanal schließen
  int		(*read_proc)();		// Byte lesen
  int		(*write_proc)();	// Byte schreiben

  char		cmd_buffer[44];		// Eingabepuffer für Kommandos
  int		cmd_length;			// Länge des bisher empfangenen Kommandos

  BPTR		handle[16];			// FS: FileHandles für alle 16 Kanäle

  char		chan_mode[16];		// D64: Kanalmodus
  char		chan_buf_num[16];	// D64: Nummer des Puffers des Kanals (für Direktzugriffskanäle)
  char		*chan_buf[16];		// D64: Zeiger auf Puffer des Kanals
  char		*buf_ptr[16];		// D64: Aktuelle Position im Puffer
  int		buf_len[16];		// D64: Restliche Anzahl Bytes im Puffer

  char		*ram;				// D64: 2KB RAM für das Laufwerk
  char		buf_free[4];		// D64: Puffer 0..3 frei?

  int		image_header;		// D64: Länge des Headers der Image-Datei (.d64: 0, .x64: 64)

  BAM		*BAM;				// D64: Zeiger auf Puffer für BAM (Puffer 4, $700)
  Directory	dir;				// D64: Temporärer Puffer für Directory-Blocks
} DriveData;

// Prefs: '/' in Dateinamen konvertieren?
extern WORD MapSlash;


// Exportierte Funktionen
extern void SetError(DriveData *drive, int error);

#endif
