diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/devices/bus/a2bus/a2diskiing.cpp | 3 | ||||
-rw-r--r-- | src/devices/machine/applefdintf.cpp | 3 | ||||
-rw-r--r-- | src/lib/formats/all.cpp | 3 | ||||
-rw-r--r-- | src/lib/formats/ap2_dsk.cpp | 142 | ||||
-rw-r--r-- | src/lib/formats/ap2_dsk.h | 28 | ||||
-rw-r--r-- | src/mame/drivers/apple3.cpp | 3 |
6 files changed, 76 insertions, 106 deletions
diff --git a/src/devices/bus/a2bus/a2diskiing.cpp b/src/devices/bus/a2bus/a2diskiing.cpp index 1ff619bd6e0..10fbec3e016 100644 --- a/src/devices/bus/a2bus/a2diskiing.cpp +++ b/src/devices/bus/a2bus/a2diskiing.cpp @@ -50,7 +50,8 @@ ROM_END void diskiing_device::floppy_formats(format_registration &fr) { - fr.add(FLOPPY_A216S_FORMAT); + fr.add(FLOPPY_A216S_DOS_FORMAT); + fr.add(FLOPPY_A216S_PRODOS_FORMAT); fr.add(FLOPPY_RWTS18_FORMAT); fr.add(FLOPPY_EDD_FORMAT); fr.add(FLOPPY_WOZ_FORMAT); diff --git a/src/devices/machine/applefdintf.cpp b/src/devices/machine/applefdintf.cpp index e20364b4983..25006d7e2b8 100644 --- a/src/devices/machine/applefdintf.cpp +++ b/src/devices/machine/applefdintf.cpp @@ -17,7 +17,8 @@ void applefdintf_device::formats_525_13(format_registration &fr) void applefdintf_device::formats_525(format_registration &fr) { - fr.add(FLOPPY_A216S_FORMAT); + fr.add(FLOPPY_A216S_DOS_FORMAT); + fr.add(FLOPPY_A216S_PRODOS_FORMAT); fr.add(FLOPPY_RWTS18_FORMAT); fr.add(FLOPPY_EDD_FORMAT); fr.add(FLOPPY_WOZ_FORMAT); diff --git a/src/lib/formats/all.cpp b/src/lib/formats/all.cpp index aa3d9ab8d70..a084c87afea 100644 --- a/src/lib/formats/all.cpp +++ b/src/lib/formats/all.cpp @@ -726,7 +726,8 @@ void mame_formats_full_list(mame_formats_enumerator &en) en.add(fs::PRODOS); #endif #ifdef HAS_FORMATS_AP2_DSK - en.add(FLOPPY_A216S_FORMAT); // ap2_dsk.h + en.add(FLOPPY_A216S_DOS_FORMAT); // ap2_dsk.h + en.add(FLOPPY_A216S_PRODOS_FORMAT); // ap2_dsk.h en.add(FLOPPY_RWTS18_FORMAT); // ap2_dsk.h en.add(FLOPPY_EDD_FORMAT); // ap2_dsk.h en.add(FLOPPY_WOZ_FORMAT); // ap2_dsk.h diff --git a/src/lib/formats/ap2_dsk.cpp b/src/lib/formats/ap2_dsk.cpp index 8adc13d69d3..38ee0b9e1a3 100644 --- a/src/lib/formats/ap2_dsk.cpp +++ b/src/lib/formats/ap2_dsk.cpp @@ -537,46 +537,69 @@ static const uint8_t prodos_skewing[] = }; -a2_16sect_format::a2_16sect_format() : floppy_image_format_t(), m_prodos_order(false) +a2_16sect_format::a2_16sect_format(bool prodos_order) : floppy_image_format_t(), m_prodos_order(prodos_order) { } -const char *a2_16sect_format::name() const +a2_16sect_dos_format::a2_16sect_dos_format() : a2_16sect_format(false) { - return "a2_16sect"; } -const char *a2_16sect_format::description() const +const char *a2_16sect_dos_format::name() const { - return "Apple II 16-sector dsk image"; + return "a2_16sect_dos"; } -const char *a2_16sect_format::extensions() const +const char *a2_16sect_dos_format::description() const { - return "dsk,do,po"; + return "Apple II 16-sector dsk image (DOS sector order)"; +} + +const char *a2_16sect_dos_format::extensions() const +{ + return "dsk,do"; +} + +a2_16sect_prodos_format::a2_16sect_prodos_format() : a2_16sect_format(true) +{ +} + +const char *a2_16sect_prodos_format::name() const +{ + return "a2_16sect_prodos"; +} + +const char *a2_16sect_prodos_format::description() const +{ + return "Apple II 16-sector dsk image (ProDos sector order)"; +} + +const char *a2_16sect_prodos_format::extensions() const +{ + return "dsk,po"; } bool a2_16sect_format::supports_save() const { - return true; + return true; } int a2_16sect_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) { - uint64_t size; - if (io.length(size)) - return 0; + uint64_t size; + if (io.length(size)) + return 0; - //uint32_t expected_size = 35 * 16 * 256; - uint32_t expected_size = APPLE2_TRACK_COUNT * 16 * 256; + //uint32_t expected_size = 35 * 16 * 256; + uint32_t expected_size = APPLE2_TRACK_COUNT * 16 * 256; - // check standard size plus some oddball sizes in our softlist - if ((size == expected_size) || (size == 35 * 16 * 256) || (size == 143403) || (size == 143363) || (size == 143358)) - { - return 50; - } + // check standard size plus some oddball sizes in our softlist + if ((size == expected_size) || (size == 35 * 16 * 256) || (size == 143403) || (size == 143363) || (size == 143358)) + { + return 50; + } - return 0; + return 0; } bool a2_16sect_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) @@ -587,83 +610,16 @@ bool a2_16sect_format::load(util::random_read &io, uint32_t form_factor, const s image->set_form_variant(floppy_image::FF_525, floppy_image::SSSD); - m_prodos_order = false; - m_tracks = (size == (40 * 16 * 256)) ? 40 : 35; + int tracks = (size == (40 * 16 * 256)) ? 40 : 35; int fpos = 0; - for(int track=0; track < m_tracks; track++) { + for(int track=0; track < tracks; track++) { std::vector<uint32_t> track_data; uint8_t sector_data[256*16]; - static const unsigned char pascal_block1[4] = { 0x08, 0xa5, 0x0f, 0x29 }; - static const unsigned char pascal2_block1[4] = { 0xff, 0xa2, 0x00, 0x8e }; - static const unsigned char dos33_block1[4] = { 0xa2, 0x02, 0x8e, 0x52 }; - static const unsigned char sos_block1[4] = { 0xc9, 0x20, 0xf0, 0x3e }; - static const unsigned char a3a2emul_block1[6] = { 0x8d, 0xd0, 0x03, 0x4c, 0xc7, 0xa4 }; - static const unsigned char cpm22_block1[8] = { 0xa2, 0x55, 0xa9, 0x00, 0x9d, 0x00, 0x0d, 0xca }; - static const unsigned char subnod_block1[8] = { 0x63, 0xaa, 0xf0, 0x76, 0x8d, 0x63, 0xaa, 0x8e }; size_t actual; io.read_at(fpos, sector_data, 256*16, actual); - if (track == 0 && fpos == 0) - { - // check ProDOS boot block - if (!memcmp("PRODOS", §or_data[0x103], 6)) - { - m_prodos_order = true; - } // check for alternate version ProDOS boot block - if (!memcmp("PRODOS", §or_data[0x121], 6)) - { - m_prodos_order = true; - } // check for ProDOS order SOS disk - else if (!memcmp(sos_block1, §or_data[0x100], 4)) - { - m_prodos_order = true; - } // check for Apple III A2 emulator disk in ProDOS order - else if (!memcmp(a3a2emul_block1, §or_data[0x100], 6)) - { - m_prodos_order = true; - } // check for PCPI Applicard software in ProDOS order - else if (!memcmp("COPYRIGHT (C) 1979, DIGITAL RESEARCH", §or_data[0x118], 36)) - { - m_prodos_order = true; - } // check Apple II Pascal - else if (!memcmp("SYSTEM.APPLE", §or_data[0xd7], 12)) - { - // Pascal discs can still be DOS order. - // Check for the second half of the boot code at 0x100 - // (which means ProDOS order) - if (!memcmp(pascal_block1, §or_data[0x100], 4)) - { - m_prodos_order = true; - } - } // check for DOS 3.3 disks in ProDOS order - else if (!memcmp(dos33_block1, §or_data[0x100], 4)) - { - m_prodos_order = true; - } // check for a later version of the Pascal boot block - else if (!memcmp(pascal2_block1, §or_data[0x100], 4)) - { - m_prodos_order = true; - } // check for CP/M disks in ProDOS order - else if (!memcmp(cpm22_block1, §or_data[0x100], 8)) - { - m_prodos_order = true; - } // check for subnodule disk - else if (!memcmp(subnod_block1, §or_data[0x100], 8)) - { - m_prodos_order = true; - } // check for ProDOS 2.5's new boot block - else if (!memcmp("PRODOS", §or_data[0x3a], 6)) - { - m_prodos_order = true; - } - else if (!memcmp("PRODOS", §or_data[0x40], 6)) - { - m_prodos_order = true; - } - } - fpos += 256*16; for(int i=0; i<49; i++) raw_w(track_data, 10, 0x3fc); @@ -772,20 +728,17 @@ bool a2_16sect_format::save(util::random_read_write &io, const std::vector<uint3 // data postamble is good #define DATAPOST 16 for (auto & elem : visualgrid) { - for (int j = 0; j < m_tracks; j++) { + for (int j = 0; j < APPLE2_TRACK_COUNT; j++) { elem[j] = 0; } } image->get_actual_geometry(g_tracks, g_heads); - if(!m_tracks) - m_tracks = g_tracks; - int head = 0; int pos_data = 0; - for(int track=0; track < m_tracks; track++) { + for(int track=0; track < g_tracks; track++) { uint8_t sectdata[(256)*16]; memset(sectdata, 0, sizeof(sectdata)); int nsect = 16; @@ -976,7 +929,8 @@ bool a2_16sect_format::save(util::random_read_write &io, const std::vector<uint3 return true; } -const floppy_format_type FLOPPY_A216S_FORMAT = &floppy_image_format_creator<a2_16sect_format>; +const floppy_format_type FLOPPY_A216S_DOS_FORMAT = &floppy_image_format_creator<a2_16sect_dos_format>; +const floppy_format_type FLOPPY_A216S_PRODOS_FORMAT = &floppy_image_format_creator<a2_16sect_prodos_format>; /* RWTS18 format * Developed by Roland Gustafsson (http://www.acts.org/roland/index.html) for Br0derbund Software around 1986 diff --git a/src/lib/formats/ap2_dsk.h b/src/lib/formats/ap2_dsk.h index 373cdb361e3..1afd6cbecb4 100644 --- a/src/lib/formats/ap2_dsk.h +++ b/src/lib/formats/ap2_dsk.h @@ -40,29 +40,41 @@ LEGACY_FLOPPY_OPTIONS_EXTERN(apple2); class a2_16sect_format : public floppy_image_format_t { public: - a2_16sect_format(); + a2_16sect_format(bool prodos_order); virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) override; virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override; virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) override; - virtual const char *name() const override; - virtual const char *description() const override; - virtual const char *extensions() const override; virtual bool supports_save() const override; private: - static const desc_e mac_gcr[]; + const bool m_prodos_order; uint8_t gb(const std::vector<bool> &buf, int &pos, int &wrap); void update_chk(const uint8_t *data, int size, uint32_t &chk); +}; - bool m_prodos_order; +class a2_16sect_dos_format : public a2_16sect_format +{ +public: + a2_16sect_dos_format(); + virtual const char *name() const override; + virtual const char *description() const override; + virtual const char *extensions() const override; +}; - int m_tracks = 0; +class a2_16sect_prodos_format : public a2_16sect_format +{ +public: + a2_16sect_prodos_format(); + virtual const char *name() const override; + virtual const char *description() const override; + virtual const char *extensions() const override; }; -extern const floppy_format_type FLOPPY_A216S_FORMAT; +extern const floppy_format_type FLOPPY_A216S_DOS_FORMAT; +extern const floppy_format_type FLOPPY_A216S_PRODOS_FORMAT; class a2_rwts18_format : public floppy_image_format_t { diff --git a/src/mame/drivers/apple3.cpp b/src/mame/drivers/apple3.cpp index 0617201eaea..76ed457b11f 100644 --- a/src/mame/drivers/apple3.cpp +++ b/src/mame/drivers/apple3.cpp @@ -41,7 +41,8 @@ static void a3_floppies(device_slot_interface &device) void apple3_state::floppy_formats(format_registration &fr) { - fr.add(FLOPPY_A216S_FORMAT); + fr.add(FLOPPY_A216S_DOS_FORMAT); + fr.add(FLOPPY_A216S_PRODOS_FORMAT); fr.add(FLOPPY_RWTS18_FORMAT); fr.add(FLOPPY_EDD_FORMAT); fr.add(FLOPPY_WOZ_FORMAT); |