/* * IEC.h - IEC-Bus-Routinen, 1541-Emulation * * Copyright (C) 1994-1996 by Christian Bauer */ #ifndef IEC_H #define IEC_H #include // 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