ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/Frodo4/Src/IEC.h
(Generate patch)

Comparing Frodo4/Src/IEC.h (file contents):
Revision 1.1 by cebix, 2003-07-01T17:09:43Z vs.
Revision 1.7 by cebix, 2004-01-14T17:26:29Z

# Line 1 | Line 1
1   /*
2   *  IEC.h - IEC bus routines, 1541 emulation (DOS level)
3   *
4 < *  Frodo (C) 1994-1997,2002 Christian Bauer
4 > *  Frodo (C) 1994-1997,2002-2004 Christian Bauer
5   *
6   *  This program is free software; you can redistribute it and/or modify
7   *  it under the terms of the GNU General Public License as published by
# Line 22 | Line 22
22   #define _IEC_H
23  
24  
25 + /*
26 + *  Definitions
27 + */
28 +
29   // Maximum length of file names
30   const int NAMEBUF_LENGTH = 256;
31  
28
32   // C64 status codes
33   enum {
34          ST_OK = 0,                              // No error
# Line 35 | Line 38 | enum {
38          ST_NOTPRESENT = 0x80    // Device not present
39   };
40  
38
41   // 1541 error codes
42   enum {
43          ERR_OK,                         // 00 OK
44 <        ERR_WRITEERROR,         // 25 WRITE ERROR
44 >        ERR_SCRATCHED,          // 01 FILES SCRATCHED
45 >        ERR_UNIMPLEMENTED,      // 03 UNIMPLEMENTED
46 >        ERR_READ20,                     // 20 READ ERROR (block header not found)
47 >        ERR_READ21,                     // 21 READ ERROR (no sync character)
48 >        ERR_READ22,                     // 22 READ ERROR (data block not present)
49 >        ERR_READ23,                     // 23 READ ERROR (checksum error in data block)
50 >        ERR_READ24,                     // 24 READ ERROR (byte decoding error)
51 >        ERR_WRITE25,            // 25 WRITE ERROR (write-verify error)
52          ERR_WRITEPROTECT,       // 26 WRITE PROTECT ON
53 <        ERR_SYNTAX30,           // 30 SYNTAX ERROR (unknown command)
53 >        ERR_READ27,                     // 27 READ ERROR (checksum error in header)
54 >        ERR_WRITE28,            // 28 WRITE ERROR (long data block)
55 >        ERR_DISKID,                     // 29 DISK ID MISMATCH
56 >        ERR_SYNTAX30,           // 30 SYNTAX ERROR (general syntax)
57 >        ERR_SYNTAX31,           // 31 SYNTAX ERROR (invalid command)
58 >        ERR_SYNTAX32,           // 32 SYNTAX ERROR (command too long)
59          ERR_SYNTAX33,           // 33 SYNTAX ERROR (wildcards on writing)
60 +        ERR_SYNTAX34,           // 34 SYNTAX ERROR (missing file name)
61          ERR_WRITEFILEOPEN,      // 60 WRITE FILE OPEN
62          ERR_FILENOTOPEN,        // 61 FILE NOT OPEN
63          ERR_FILENOTFOUND,       // 62 FILE NOT FOUND
64 <        ERR_ILLEGALTS,          // 67 ILLEGAL TRACK OR SECTOR
64 >        ERR_FILEEXISTS,         // 63 FILE EXISTS
65 >        ERR_FILETYPE,           // 64 FILE TYPE MISMATCH
66 >        ERR_NOBLOCK,            // 65 NO BLOCK
67 >        ERR_ILLEGALTS,          // 66 ILLEGAL TRACK OR SECTOR
68          ERR_NOCHANNEL,          // 70 NO CHANNEL
69 +        ERR_DIRERROR,           // 71 DIR ERROR
70 +        ERR_DISKFULL,           // 72 DISK FULL
71          ERR_STARTUP,            // 73 Power-up message
72          ERR_NOTREADY            // 74 DRIVE NOT READY
73   };
74  
75 + // Mountable file types
76 + enum {
77 +        FILE_IMAGE,                     // Disk image, handled by ImageDrive
78 +        FILE_ARCH                       // Archive file, handled by ArchDrive
79 + };
80  
81 < // IEC command codes
81 > // 1541 file types
82   enum {
83 <        CMD_DATA = 0x60,        // Data transfer
84 <        CMD_CLOSE = 0xe0,       // Close channel
85 <        CMD_OPEN = 0xf0         // Open channel
83 >        FTYPE_DEL,                      // Deleted
84 >        FTYPE_SEQ,                      // Sequential
85 >        FTYPE_PRG,                      // Program
86 >        FTYPE_USR,                      // User
87 >        FTYPE_REL,                      // Relative
88 >        FTYPE_UNKNOWN
89   };
90  
91 + static const char ftype_char[9] = "DSPUL   ";
92  
93 < // IEC ATN codes
93 > // 1541 file access modes
94   enum {
95 <        ATN_LISTEN = 0x20,
96 <        ATN_UNLISTEN = 0x30,
97 <        ATN_TALK = 0x40,
98 <        ATN_UNTALK = 0x50
95 >        FMODE_READ,                     // Read
96 >        FMODE_WRITE,            // Write
97 >        FMODE_APPEND,           // Append
98 >        FMODE_M                         // Read open file
99   };
100  
72
101   // Drive LED states
102   enum {
103          DRVLED_OFF,             // Inactive, LED off
# Line 77 | Line 105 | enum {
105          DRVLED_ERROR    // Error, blink LED
106   };
107  
108 + // Information about file in disk image/archive file
109 + struct c64_dir_entry {
110 +        c64_dir_entry(const uint8 *n, int t, bool o, bool p, size_t s, off_t ofs = 0, uint8 sal = 0, uint8 sah = 0)
111 +                : type(t), is_open(o), is_protected(p), size(s), offset(ofs), sa_lo(sal), sa_hi(sah)
112 +        {
113 +                strncpy((char *)name, (const char *)n, 17);
114 +                name[16] = 0;
115 +        }
116 +
117 +        // Basic information
118 +        uint8 name[17];         // File name (C64 charset, null-terminated)
119 +        int type;                       // File type (see defines above)
120 +        bool is_open;           // Flag: file open
121 +        bool is_protected;      // Flag: file protected
122 +        size_t size;            // File size (may be approximated)
123 +
124 +        // Special information
125 +        off_t offset;           // Offset of file in archive file
126 +        uint8 sa_lo, sa_hi;     // C64 start address
127 + };
128  
129   class Drive;
130   class C64Display;
# Line 95 | Line 143 | public:
143          uint8 Out(uint8 byte, bool eoi);
144          uint8 OutATN(uint8 byte);
145          uint8 OutSec(uint8 byte);
146 <        uint8 In(uint8 *byte);
146 >        uint8 In(uint8 &byte);
147          void SetATN(void);
148          void RelATN(void);
149          void Turnaround(void);
150          void Release(void);
151  
152   private:
153 +        Drive *create_drive(const char *path);
154 +
155          uint8 listen(int device);
156          uint8 talk(int device);
157          uint8 unlisten(void);
# Line 110 | Line 160 | private:
160          uint8 sec_talk(void);
161          uint8 open_out(uint8 byte, bool eoi);
162          uint8 data_out(uint8 byte, bool eoi);
163 <        uint8 data_in(uint8 *byte);
163 >        uint8 data_in(uint8 &byte);
164  
165          C64Display *the_display;        // Pointer to display object (for drive LEDs)
166  
167 <        char name_buf[NAMEBUF_LENGTH];  // Buffer for file names and command strings
168 <        char *name_ptr;                 // Pointer for reception of file name
167 >        uint8 name_buf[NAMEBUF_LENGTH]; // Buffer for file names and command strings
168 >        uint8 *name_ptr;                // Pointer for reception of file name
169          int name_len;                   // Received length of file name
170  
171          Drive *drive[4];                // 4 drives (8..11)
# Line 131 | Line 181 | private:
181          uint8 sec_addr;                 // Received secondary address ($0x)
182   };
183  
134
184   // Abstract superclass for individual drives
185   class Drive {
186   public:
187          Drive(IEC *iec);
188          virtual ~Drive() {}
189  
190 <        virtual uint8 Open(int channel, char *filename)=0;
190 >        virtual uint8 Open(int channel, const uint8 *name, int name_len)=0;
191          virtual uint8 Close(int channel)=0;
192 <        virtual uint8 Read(int channel, uint8 *byte)=0;
192 >        virtual uint8 Read(int channel, uint8 &byte)=0;
193          virtual uint8 Write(int channel, uint8 byte, bool eoi)=0;
194          virtual void Reset(void)=0;
195  
# Line 148 | Line 197 | public:
197          bool Ready;                     // Drive is ready for operation
198  
199   protected:
200 <        void set_error(int error);
200 >        void set_error(int error, int track = 0, int sector = 0);
201 >
202 >        void parse_file_name(const uint8 *src, int src_len, uint8 *dest, int &dest_len, int &mode, int &type, int &rec_len, bool convert_charset = false);
203  
204 <        char *error_ptr;        // Pointer within error message
205 <        int error_len;          // Remaining length of error message
204 >        void execute_cmd(const uint8 *cmd, int cmd_len);
205 >        virtual void block_read_cmd(int channel, int track, int sector, bool user_cmd = false);
206 >        virtual void block_write_cmd(int channel, int track, int sector, bool user_cmd = false);
207 >        virtual void block_execute_cmd(int channel, int track, int sector);
208 >        virtual void block_allocate_cmd(int track, int sector);
209 >        virtual void block_free_cmd(int track, int sector);
210 >        virtual void buffer_pointer_cmd(int channel, int pos);
211 >        virtual void mem_read_cmd(uint16 adr, uint8 len);
212 >        virtual void mem_write_cmd(uint16 adr, uint8 len, uint8 *p);
213 >        virtual void mem_execute_cmd(uint16 adr);
214 >        virtual void copy_cmd(const uint8 *new_file, int new_file_len, const uint8 *old_files, int old_files_len);
215 >        virtual void rename_cmd(const uint8 *new_file, int new_file_len, const uint8 *old_file, int old_file_len);
216 >        virtual void scratch_cmd(const uint8 *files, int files_len);
217 >        virtual void position_cmd(const uint8 *cmd, int cmd_len);
218 >        virtual void initialize_cmd(void);
219 >        virtual void new_cmd(const uint8 *name, int name_len, const uint8 *comma);
220 >        virtual void validate_cmd(void);
221 >        void unsupp_cmd(void);
222 >
223 >        char error_buf[256];    // Buffer with current error message
224 >        char *error_ptr;                // Pointer within error message
225 >        int error_len;                  // Remaining length of error message
226 >        int current_error;              // Number of current error
227 >
228 >        uint8 cmd_buf[64];              // Buffer for incoming command strings
229 >        int cmd_len;                    // Length of received command
230  
231   private:
232 <        IEC *the_iec;           // Pointer to IEC object
232 >        IEC *the_iec;                   // Pointer to IEC object
233   };
234  
235 +
236 + /*
237 + *  Functions
238 + */
239 +
240 + // Convert ASCII character to PETSCII character
241 + extern uint8 ascii2petscii(char c);
242 +
243 + // Convert ASCII string to PETSCII string
244 + extern void ascii2petscii(uint8 *dest, const char *src, int max);
245 +
246 + // Convert PETSCII character to ASCII character
247 + extern char petscii2ascii(uint8 c);
248 +
249 + // Convert PETSCII string to ASCII string
250 + extern void petscii2ascii(char *dest, const uint8 *src, int max);
251 +
252 + // Check whether file is a mountable disk image or archive file, return type
253 + extern bool IsMountableFile(const char *path, int &type);
254 +
255 + // Read directory of mountable disk image or archive file into c64_dir_entry vector
256 + extern bool ReadDirectory(const char *path, int type, vector<c64_dir_entry> &vec);
257 +
258   #endif

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines