// .DSK - This is a byte for byte copy of a physical disk // // https://github.com/simonowen/samdisk/tree/main // Apple - https://gswv.apple2.org.za/a2zine/faqs/Csa2FLUTILS.html#006 // Apple - http://fileformats.archiveteam.org/wiki/DSK_(Apple_II) // Coleco Adam - https://retrocomputing.stackexchange.com/questions/15833/what-floppy-disk-format-and-layout-and-what-disk-image-format-are-used-for-the-c #ifndef MEATLOAF_MEDIA_DSK #define MEATLOAF_MEDIA_DSK #include "meat_io.h" #include "d64.h" /******************************************************** * Streams ********************************************************/ class DSKIStream : public D64IStream { // override everything that requires overriding here public: DSKIStream(std::shared_ptr is) : D64IStream(is) { // DSK Partition Info std::vector b = { { 40, // track 1, // sector 0x10, // offset 1, // start_track 40, // end_track 6 // byte_count } }; Partition p = { 35, // track 0, // sector 0x04, // header_offset 40, // directory_track 3, // directory_sector 0x00, // directory_offset b // block_allocation_map }; partitions.clear(); partitions.push_back(p); sectorsPerTrack = { 16 }; dos_rom = ""; dos_name = ""; has_subdirs = false; error_info = true; uint32_t size = containerStream->size(); switch (size + media_header_size) { // Apple // 35 Tracks, 16 sector/track, 256 bytes/sector case 146660: break; // Coco // 35 Tracks, 16 sector/track, 256 bytes/sector case 161280: break; // Apple // 40 Tracks, 16 sector/track, 256 bytes/sector // Coleco Adam // 40 Tracks, 8 sectors per track, 512 bytes per sectors case 163840: break; // Coco OS9 case 184320: break; } }; virtual uint8_t speedZone( uint8_t track) override { return 0; }; protected: private: friend class DSKFile; }; /******************************************************** * File implementations ********************************************************/ class DSKFile: public D64File { public: DSKFile(std::string path, bool is_dir = true) : D64File(path, is_dir) {}; MStream* getDecodedStream(std::shared_ptr containerIstream) override; }; /******************************************************** * FS ********************************************************/ class DSKFileSystem: public MFileSystem { public: MFile* getFile(std::string path) override { return new DSKFile(path); } bool handles(std::string fileName) override { return byExtension( { ".dsk", ".do", ".po", ".hdv" }, fileName ); } DSKFileSystem(): MFileSystem("dsk") {}; }; #endif /* MEATLOAF_MEDIA_DSK */