summaryrefslogtreecommitdiffstats
path: root/src/lib/formats/ap2_dsk.cpp
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2022-03-25 09:42:02 +0100
committer Olivier Galibert <galibert@pobox.com>2022-03-30 15:45:35 +0200
commit023486a37ff70f9be765495c07ff3fe0b9c47bc1 (patch)
tree0a0c39760f06d02dfc28f62df2f80546594b28cf /src/lib/formats/ap2_dsk.cpp
parent66c0222c690fb6fb0e093fad37d42a68fea66a2f (diff)
apple2: split the 16 sector format in dos/prodos types
Diffstat (limited to 'src/lib/formats/ap2_dsk.cpp')
-rw-r--r--src/lib/formats/ap2_dsk.cpp142
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", &sector_data[0x103], 6))
- {
- m_prodos_order = true;
- } // check for alternate version ProDOS boot block
- if (!memcmp("PRODOS", &sector_data[0x121], 6))
- {
- m_prodos_order = true;
- } // check for ProDOS order SOS disk
- else if (!memcmp(sos_block1, &sector_data[0x100], 4))
- {
- m_prodos_order = true;
- } // check for Apple III A2 emulator disk in ProDOS order
- else if (!memcmp(a3a2emul_block1, &sector_data[0x100], 6))
- {
- m_prodos_order = true;
- } // check for PCPI Applicard software in ProDOS order
- else if (!memcmp("COPYRIGHT (C) 1979, DIGITAL RESEARCH", &sector_data[0x118], 36))
- {
- m_prodos_order = true;
- } // check Apple II Pascal
- else if (!memcmp("SYSTEM.APPLE", &sector_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, &sector_data[0x100], 4))
- {
- m_prodos_order = true;
- }
- } // check for DOS 3.3 disks in ProDOS order
- else if (!memcmp(dos33_block1, &sector_data[0x100], 4))
- {
- m_prodos_order = true;
- } // check for a later version of the Pascal boot block
- else if (!memcmp(pascal2_block1, &sector_data[0x100], 4))
- {
- m_prodos_order = true;
- } // check for CP/M disks in ProDOS order
- else if (!memcmp(cpm22_block1, &sector_data[0x100], 8))
- {
- m_prodos_order = true;
- } // check for subnodule disk
- else if (!memcmp(subnod_block1, &sector_data[0x100], 8))
- {
- m_prodos_order = true;
- } // check for ProDOS 2.5's new boot block
- else if (!memcmp("PRODOS", &sector_data[0x3a], 6))
- {
- m_prodos_order = true;
- }
- else if (!memcmp("PRODOS", &sector_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