diff options
Diffstat (limited to 'src/lib/formats/ap2_dsk.cpp')
-rw-r--r-- | src/lib/formats/ap2_dsk.cpp | 142 |
1 files changed, 48 insertions, 94 deletions
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 |