summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/lib/formats/pasti_dsk.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/lib/formats/pasti_dsk.h')
-rw-r--r--trunk/src/lib/formats/pasti_dsk.h62
1 files changed, 62 insertions, 0 deletions
diff --git a/trunk/src/lib/formats/pasti_dsk.h b/trunk/src/lib/formats/pasti_dsk.h
new file mode 100644
index 00000000000..16c56d53463
--- /dev/null
+++ b/trunk/src/lib/formats/pasti_dsk.h
@@ -0,0 +1,62 @@
+#ifndef PASTI_DSK_H_
+#define PASTI_DSK_H_
+
+#include "flopimg.h"
+
+class pasti_format : public floppy_image_format_t
+{
+public:
+ pasti_format();
+
+ virtual int identify(io_generic *io, UINT32 form_factor);
+ virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image);
+
+ virtual const char *name() const;
+ virtual const char *description() const;
+ virtual const char *extensions() const;
+ virtual bool supports_save() const;
+
+ static const desc_e xdesc[];
+
+protected:
+ struct wd_sect {
+ const UINT8 *data;
+ const UINT8 *fuzzy_mask;
+ UINT8 id[6];
+ int position;
+ double time_ratio;
+ };
+
+ struct wd_obs {
+ const UINT8 *track_data;
+ wd_sect sectors[256];
+ int track_size, sector_count;
+ };
+
+ void wd_generate_track_from_observations(int track, int head, floppy_image *image, wd_obs &obs);
+
+private:
+ struct wd_sect_info {
+ int hstart, hend;
+ int dstart, dend;
+ bool hsynced, dsynced;
+ };
+
+ void map_sectors_in_track(wd_obs &obs, wd_sect_info *sect_infos);
+ void match_mfm_data(wd_obs &obs, int tpos, const UINT8 *data, int size, UINT8 context, int &bcount, int &ccount, bool &synced);
+ void match_raw_data(wd_obs &obs, int tpos, const UINT8 *data, int size, UINT8 context, int &bcount, int &ccount);
+ UINT16 byte_to_mfm(UINT8 data, bool context);
+ UINT16 calc_crc(const UINT8 *data, int size, UINT16 crc);
+
+ void wd_generate_unsynced_gap(UINT32 *track, int &pos, const wd_obs &obs, int tstart, int tend, UINT32 cell_size);
+ void wd_generate_synced_gap(UINT32 *track, int &pos, const wd_obs &obs, int tstart, int tend, UINT32 cell_size);
+ void wd_generate_gap(UINT32 *track, int &pos, const wd_obs &obs, int tstart, int tend, bool synced, UINT32 cell_size_start, UINT32 cell_size_end);
+ void wd_generate_sector_header(UINT32 *track, int &pos, const wd_obs &obs, int sector, int tstart, UINT32 cell_size);
+ void wd_generate_sector_data(UINT32 *track, int &pos, const wd_obs &obs, int sector, int tstart, UINT32 cell_size);
+ void wd_generate_track_from_sectors_and_track(int track, int head, floppy_image *image, wd_obs &obs);
+ void wd_generate_track_from_sectors_only(int track, int head, floppy_image *image, wd_obs &obs);
+};
+
+extern const floppy_format_type FLOPPY_PASTI_FORMAT;
+
+#endif /*PASTI_DSK_H_*/