1 2 #ifndef CPMDISK_H 3 #define CPMDISK_H 4 5 // We need the FATfs header 6 #include "ff.h" 7 8 typedef struct { 9 const char *name; // Name of the format 10 // Generic parameters 11 uint8_t sectors_per_track; 12 uint8_t tracks; 13 uint8_t sides; 14 uint16_t sector_size; 15 uint8_t gap3_length; 16 uint8_t filler_byte; 17 uint16_t directory_entries; 18 19 // CP/M Parameters 20 uint8_t boottracks; /* What track does the directory start */ 21 uint16_t extent_size; /* In bytes */ 22 uint8_t byte_size_extents; /* If set, extends in directories are single byte */ 23 uint8_t first_sector_offset; /* If set, first sector in Track-Info is 1, else 0 */ 24 uint8_t boot_tracks_sector_offset; /* Sector offset for boot tracks (0 = ignore) */ 25 uint32_t offset; /* Offset to directory (format kludge) */ 26 27 // FAT parameters 28 uint8_t number_of_fats; 29 uint16_t fat_format_flags; 30 uint16_t cluster_size; 31 32 // Image layout 33 uint8_t alternate_sides; 34 uint8_t has_skew; 35 uint16_t skew_track_start; 36 uint8_t skew_tab[32]; 37 } disc_spec; 38 39 typedef struct disc_handle_s disc_handle; 40 41 // Utility functions in cpm2.c 42 extern disc_handle *cpm_create_with_format(const char *disc_format); 43 extern void cpm_create_filename(const char *binary_name, char *cpm_filename, char force_com_extension, char include_dot); 44 extern int cpm_write_file_to_image(const char *disc_format, const char *container, const char *output_file, const char *binary_name, const char *crt_filename, const char *boot_filename); 45 extern int fat_write_file_to_image(const char *disc_format, const char *container, const char* output_file, const char* binary_name, const char* crt_filename, const char* boot_filename); 46 47 48 // Create an in memory disc image 49 extern disc_handle *disc_create(disc_spec *spec); 50 extern disc_handle *cpm_create(disc_spec *spec); 51 extern disc_handle *fat_create(disc_spec* spec); 52 53 54 extern void disc_write_boot_track(disc_handle *h, void *data, size_t len); 55 extern void disc_write_file(disc_handle *h, char filename[11], void *data, size_t len); 56 extern void disc_free(disc_handle *h); 57 58 typedef int (*disc_writer_func)(disc_handle *h, const char *flename); 59 extern disc_writer_func disc_get_writer(const char *container_name, const char **extension); 60 extern int disc_write_raw(disc_handle *h, const char *filename); 61 extern int disc_write_edsk(disc_handle *h, const char *filename); 62 extern int disc_write_d88(disc_handle *h, const char *filename); 63 extern int disc_write_anadisk(disc_handle* h, const char* filename); 64 extern int disc_write_imd(disc_handle* h, const char* filename); 65 extern void disc_print_writers(FILE *fp); 66 67 68 void disc_write_sector(disc_handle *h, int track, int sector, int head, const void *data); 69 void disc_read_sector(disc_handle *h, int track, int sector, int head, void *data); 70 void disc_read_sector_lba(disc_handle *h, int sector_nr, int count, void *data); 71 void disc_write_sector_lba(disc_handle *h, int sector_nr, int count, const void *data); 72 int disc_get_sector_size(disc_handle *h); 73 int disc_get_sector_count(disc_handle *h); 74 75 #endif 76 77