mirror of
https://github.com/Oibaf66/frodo-wii.git
synced 2024-11-29 15:04:23 +01:00
109 lines
3.1 KiB
C++
109 lines
3.1 KiB
C++
/*
|
|
* 1541d64.h - 1541 emulation in .d64 file
|
|
*
|
|
* Frodo (C) 1994-1997,2002 Christian Bauer
|
|
*/
|
|
|
|
#ifndef _1541D64_H
|
|
#define _1541D64_H
|
|
|
|
#include "IEC.h"
|
|
|
|
|
|
// BAM structure
|
|
typedef struct {
|
|
uint8 dir_track; // Track...
|
|
uint8 dir_sector; // ...and sector of first directory block
|
|
int8 fmt_type; // Format type
|
|
int8 pad0;
|
|
uint8 bitmap[4*35]; // Sector allocation
|
|
uint8 disk_name[18]; // Disk name
|
|
uint8 id[2]; // Disk ID
|
|
int8 pad1;
|
|
uint8 fmt_char[2]; // Format characters
|
|
int8 pad2[4];
|
|
int8 pad3[85];
|
|
} BAM;
|
|
|
|
// Directory entry structure
|
|
typedef struct {
|
|
uint8 type; // File type
|
|
uint8 track; // Track...
|
|
uint8 sector; // ...and sector of first data block
|
|
uint8 name[16]; // File name
|
|
uint8 side_track; // Track...
|
|
uint8 side_sector; // ...and sector of first side sector
|
|
uint8 rec_len; // Record length
|
|
int8 pad0[4];
|
|
uint8 ovr_track; // Track...
|
|
uint8 ovr_sector; // ...and sector on overwrite
|
|
uint8 num_blocks_l; // Number of blocks, LSB
|
|
uint8 num_blocks_h; // Number of blocks, MSB
|
|
int8 pad1[2];
|
|
} DirEntry;
|
|
|
|
// Directory block structure
|
|
typedef struct {
|
|
uint8 padding[2]; // Keep DirEntry word-aligned
|
|
uint8 next_track;
|
|
uint8 next_sector;
|
|
DirEntry entry[8];
|
|
} Directory;
|
|
|
|
|
|
class D64Drive : public Drive {
|
|
public:
|
|
D64Drive(IEC *iec, char *filepath);
|
|
virtual ~D64Drive();
|
|
virtual uint8 Open(int channel, char *filename);
|
|
virtual uint8 Close(int channel);
|
|
virtual uint8 Read(int channel, uint8 *byte);
|
|
virtual uint8 Write(int channel, uint8 byte, bool eoi);
|
|
virtual void Reset(void);
|
|
|
|
private:
|
|
void open_close_d64_file(char *d64name);
|
|
uint8 open_file(int channel, char *filename);
|
|
void convert_filename(char *srcname, char *destname, int *filemode, int *filetype);
|
|
bool find_file(char *filename, int *track, int *sector);
|
|
uint8 open_file_ts(int channel, int track, int sector);
|
|
uint8 open_directory(char *pattern);
|
|
uint8 open_direct(int channel, char *filename);
|
|
void close_all_channels();
|
|
void execute_command(char *command);
|
|
void block_read_cmd(char *command);
|
|
void buffer_ptr_cmd(char *command);
|
|
bool parse_bcmd(char *cmd, int *arg1, int *arg2, int *arg3, int *arg4);
|
|
void chd64_cmd(char *d64name);
|
|
int alloc_buffer(int want);
|
|
void free_buffer(int buf);
|
|
bool read_sector(int track, int sector, uint8 *buffer);
|
|
int offset_from_ts(int track, int sector);
|
|
uint8 conv_from_64(uint8 c, bool map_slash);
|
|
|
|
char orig_d64_name[256]; // Original path of .d64 file
|
|
|
|
FILE *the_file; // File pointer for .d64 file
|
|
|
|
uint8 *ram; // 2KB 1541 RAM
|
|
BAM *bam; // Pointer to BAM
|
|
Directory dir; // Buffer for directory blocks
|
|
|
|
int chan_mode[16]; // Channel mode
|
|
int chan_buf_num[16]; // Buffer number of channel (for direct access channels)
|
|
uint8 *chan_buf[16]; // Pointer to buffer
|
|
uint8 *buf_ptr[16]; // Pointer in buffer
|
|
int buf_len[16]; // Remaining bytes in buffer
|
|
|
|
bool buf_free[4]; // Buffer 0..3 free?
|
|
|
|
char cmd_buffer[44]; // Buffer for incoming command strings
|
|
int cmd_len; // Length of received command
|
|
|
|
int image_header; // Length of .d64 file header
|
|
|
|
uint8 error_info[683]; // Sector error information (1 byte/sector)
|
|
};
|
|
|
|
#endif
|