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