00001
00002
00003
00004
00005
00006
00007 #ifndef _1541D64_H
00008 #define _1541D64_H
00009
00010 #include "IEC.h"
00011
00012
00013
00014 typedef struct {
00015 uint8 dir_track;
00016 uint8 dir_sector;
00017 int8 fmt_type;
00018 int8 pad0;
00019 uint8 bitmap[4*35];
00020 uint8 disk_name[18];
00021 uint8 id[2];
00022 int8 pad1;
00023 uint8 fmt_char[2];
00024 int8 pad2[4];
00025 int8 pad3[85];
00026 } BAM;
00027
00028
00029 typedef struct {
00030 uint8 type;
00031 uint8 track;
00032 uint8 sector;
00033 uint8 name[16];
00034 uint8 side_track;
00035 uint8 side_sector;
00036 uint8 rec_len;
00037 int8 pad0[4];
00038 uint8 ovr_track;
00039 uint8 ovr_sector;
00040 uint8 num_blocks_l;
00041 uint8 num_blocks_h;
00042 int8 pad1[2];
00043 } DirEntry;
00044
00045
00046 typedef struct {
00047 uint8 padding[2];
00048 uint8 next_track;
00049 uint8 next_sector;
00050 DirEntry entry[8];
00051 } Directory;
00052
00053
00054 class D64Drive : public Drive {
00055 public:
00056 D64Drive(IEC *iec, char *filepath);
00057 virtual ~D64Drive();
00058 virtual uint8 Open(int channel, char *filename);
00059 virtual uint8 Close(int channel);
00060 virtual uint8 Read(int channel, uint8 *byte);
00061 virtual uint8 Write(int channel, uint8 byte, bool eoi);
00062 virtual void Reset(void);
00063
00064 private:
00065 void open_close_d64_file(char *d64name);
00066 uint8 open_file(int channel, char *filename);
00067 void convert_filename(char *srcname, char *destname, int *filemode, int *filetype);
00068 bool find_file(char *filename, int *track, int *sector);
00069 uint8 open_file_ts(int channel, int track, int sector);
00070 uint8 open_directory(char *pattern);
00071 uint8 open_direct(int channel, char *filename);
00072 void close_all_channels();
00073 void execute_command(char *command);
00074 void block_read_cmd(char *command);
00075 void buffer_ptr_cmd(char *command);
00076 bool parse_bcmd(char *cmd, int *arg1, int *arg2, int *arg3, int *arg4);
00077 void chd64_cmd(char *d64name);
00078 int alloc_buffer(int want);
00079 void free_buffer(int buf);
00080 bool read_sector(int track, int sector, uint8 *buffer);
00081 int offset_from_ts(int track, int sector);
00082 uint8 conv_from_64(uint8 c, bool map_slash);
00083
00084 char orig_d64_name[256];
00085
00086 FILE *the_file;
00087
00088 uint8 *ram;
00089 BAM *bam;
00090 Directory dir;
00091
00092 int chan_mode[16];
00093 int chan_buf_num[16];
00094 uint8 *chan_buf[16];
00095 uint8 *buf_ptr[16];
00096 int buf_len[16];
00097
00098 bool buf_free[4];
00099
00100 char cmd_buffer[44];
00101 int cmd_len;
00102
00103 int image_header;
00104
00105 uint8 error_info[683];
00106 };
00107
00108 #endif