summaryrefslogtreecommitdiffstatshomepage
path: root/src
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
parent66c0222c690fb6fb0e093fad37d42a68fea66a2f (diff)
apple2: split the 16 sector format in dos/prodos types
Diffstat (limited to 'src')
-rw-r--r--src/devices/bus/a2bus/a2diskiing.cpp3
-rw-r--r--src/devices/machine/applefdintf.cpp3
-rw-r--r--src/lib/formats/all.cpp3
-rw-r--r--src/lib/formats/ap2_dsk.cpp142
-rw-r--r--src/lib/formats/ap2_dsk.h28
-rw-r--r--src/mame/drivers/apple3.cpp3
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", &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
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);