mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
renamed bbc_dsk to acorn_dsk
- split ssd/dsd formats - added opus ddos format - split adfs into oldmap and newmap formats for archimedes - logging
This commit is contained in:
parent
de7c161add
commit
9104c9d523
@ -142,6 +142,8 @@ project "formats"
|
||||
MAME_DIR .. "src/lib/formats/abcfd2_dsk.h",
|
||||
MAME_DIR .. "src/lib/formats/ace_tap.cpp",
|
||||
MAME_DIR .. "src/lib/formats/ace_tap.h",
|
||||
MAME_DIR .. "src/lib/formats/acorn_dsk.cpp",
|
||||
MAME_DIR .. "src/lib/formats/acorn_dsk.h",
|
||||
MAME_DIR .. "src/lib/formats/adam_cas.cpp",
|
||||
MAME_DIR .. "src/lib/formats/adam_cas.h",
|
||||
MAME_DIR .. "src/lib/formats/adam_dsk.cpp",
|
||||
@ -170,8 +172,6 @@ project "formats"
|
||||
MAME_DIR .. "src/lib/formats/atom_dsk.h",
|
||||
MAME_DIR .. "src/lib/formats/atom_tap.cpp",
|
||||
MAME_DIR .. "src/lib/formats/atom_tap.h",
|
||||
MAME_DIR .. "src/lib/formats/bbc_dsk.cpp",
|
||||
MAME_DIR .. "src/lib/formats/bbc_dsk.h",
|
||||
MAME_DIR .. "src/lib/formats/bw2_dsk.cpp",
|
||||
MAME_DIR .. "src/lib/formats/bw2_dsk.h",
|
||||
MAME_DIR .. "src/lib/formats/bw12_dsk.cpp",
|
||||
|
665
src/lib/formats/acorn_dsk.cpp
Normal file
665
src/lib/formats/acorn_dsk.cpp
Normal file
@ -0,0 +1,665 @@
|
||||
// license:GPL-2.0+
|
||||
// copyright-holders:Dirk Best, Nigel Barnes
|
||||
/***************************************************************************
|
||||
|
||||
Acorn - BBC Micro, Electron, Archimedes
|
||||
|
||||
Disk image formats
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "acorn_dsk.h"
|
||||
|
||||
acorn_ssd_format::acorn_ssd_format() : wd177x_format(formats)
|
||||
{
|
||||
}
|
||||
|
||||
const char *acorn_ssd_format::name() const
|
||||
{
|
||||
return "ssd";
|
||||
}
|
||||
|
||||
const char *acorn_ssd_format::description() const
|
||||
{
|
||||
return "Acorn SSD disk image";
|
||||
}
|
||||
|
||||
const char *acorn_ssd_format::extensions() const
|
||||
{
|
||||
return "ssd,bbc,img";
|
||||
}
|
||||
|
||||
int acorn_ssd_format::find_size(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
UINT8 cat[8];
|
||||
UINT32 sectors0, sectors2;
|
||||
|
||||
// read sector count from side 0 catalogue
|
||||
io_generic_read(io, cat, 0x100, 8);
|
||||
sectors0 = ((cat[6] & 3) << 8) + cat[7];
|
||||
LOG_FORMATS("ssd: sector count 0: %d %s\n", sectors0, sectors0 % 10 != 0 ? "invalid" : "");
|
||||
|
||||
UINT64 size = io_generic_size(io);
|
||||
for(int i=0; formats[i].form_factor; i++) {
|
||||
const format &f = formats[i];
|
||||
if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
|
||||
continue;
|
||||
|
||||
if ((size <= (UINT64)compute_track_size(f) * f.track_count * f.head_count) && (sectors0 <= f.track_count * f.sector_count)) {
|
||||
if (f.head_count == 2)
|
||||
{
|
||||
// read sector count from side 2 catalogue
|
||||
io_generic_read(io, cat, compute_track_size(f) * f.track_count + 0x100, 8); // sequential
|
||||
sectors2 = ((cat[6] & 3) << 8) + cat[7];
|
||||
LOG_FORMATS("ssd: sector count 2: %d %s\n", sectors2, sectors2 % 10 != 0 ? "invalid" : "");
|
||||
}
|
||||
else
|
||||
{
|
||||
sectors2 = sectors0;
|
||||
}
|
||||
|
||||
if (sectors0 % 10 == 0 && sectors2 % 10 == 0)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
LOG_FORMATS("ssd: no match\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int acorn_ssd_format::identify(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
int type = find_size(io, form_factor);
|
||||
|
||||
if(type != -1)
|
||||
return 90;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int acorn_ssd_format::get_image_offset(const format &f, int head, int track)
|
||||
{
|
||||
if (f.sector_base_id == -1)
|
||||
return (track * f.head_count + head) * compute_track_size(f);
|
||||
else
|
||||
return (f.track_count * head + track) * compute_track_size(f);
|
||||
}
|
||||
|
||||
const acorn_ssd_format::format acorn_ssd_format::formats[] =
|
||||
{
|
||||
{ // 100k 40 track single sided single density
|
||||
floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
|
||||
4000, 10, 40, 1, 256, {}, 0, {}, 40, 10, 10
|
||||
},
|
||||
{ // 200k 80 track single sided single density
|
||||
floppy_image::FF_525, floppy_image::SSQD, floppy_image::FM,
|
||||
4000, 10, 80, 1, 256, {}, 0, {}, 40, 10, 10
|
||||
},
|
||||
{ // 200k 40 track double sided single density
|
||||
floppy_image::FF_525, floppy_image::DSSD, floppy_image::FM,
|
||||
4000, 10, 40, 2, 256, {}, 0, {}, 40, 10, 10
|
||||
},
|
||||
{ // 400k 80 track double sided single density
|
||||
floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
|
||||
4000, 10, 80, 2, 256, {}, 0, {}, 40, 10, 10
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
acorn_dsd_format::acorn_dsd_format() : wd177x_format(formats)
|
||||
{
|
||||
}
|
||||
|
||||
const char *acorn_dsd_format::name() const
|
||||
{
|
||||
return "dsd";
|
||||
}
|
||||
|
||||
const char *acorn_dsd_format::description() const
|
||||
{
|
||||
return "Acorn DSD disk image";
|
||||
}
|
||||
|
||||
const char *acorn_dsd_format::extensions() const
|
||||
{
|
||||
return "dsd";
|
||||
}
|
||||
|
||||
int acorn_dsd_format::find_size(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
UINT8 cat[8];
|
||||
UINT32 sectors0, sectors2;
|
||||
|
||||
// read sector count from side 0 catalogue
|
||||
io_generic_read(io, cat, 0x100, 8);
|
||||
sectors0 = ((cat[6] & 3) << 8) + cat[7];
|
||||
LOG_FORMATS("dsd: sector count 0: %d %s\n", sectors0, sectors0 % 10 != 0 ? "invalid" : "");
|
||||
|
||||
UINT64 size = io_generic_size(io);
|
||||
for (int i = 0; formats[i].form_factor; i++) {
|
||||
const format &f = formats[i];
|
||||
if (form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
|
||||
continue;
|
||||
|
||||
if ((size <= (UINT64)compute_track_size(f) * f.track_count * f.head_count) && (sectors0 <= f.track_count * f.sector_count)) {
|
||||
// read sector count from side 2 catalogue
|
||||
io_generic_read(io, cat, 0xb00, 8); // interleaved
|
||||
sectors2 = ((cat[6] & 3) << 8) + cat[7];
|
||||
LOG_FORMATS("dsd: sector count 2: %d %s\n", sectors2, sectors2 % 10 != 0 ? "invalid" : "");
|
||||
|
||||
if (sectors0 % 10 == 0 && sectors2 % 10 == 0)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
LOG_FORMATS("dsd: no match\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int acorn_dsd_format::identify(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
int type = find_size(io, form_factor);
|
||||
|
||||
if (type != -1)
|
||||
return 90;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int acorn_dsd_format::get_image_offset(const format &f, int head, int track)
|
||||
{
|
||||
if (f.sector_base_id == -1)
|
||||
return (track * f.head_count + head) * compute_track_size(f);
|
||||
else
|
||||
return (f.track_count * head + track) * compute_track_size(f);
|
||||
}
|
||||
|
||||
const acorn_dsd_format::format acorn_dsd_format::formats[] =
|
||||
{
|
||||
{ // 400k 80 track double sided single density (interleaved)
|
||||
floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
|
||||
4000, 10, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9 }, 40, 10, 10
|
||||
},
|
||||
{ // 200k 40 track double sided single density (interleaved)
|
||||
floppy_image::FF_525, floppy_image::DSSD, floppy_image::FM,
|
||||
4000, 10, 40, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9 }, 40, 10, 10
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
opus_ddos_format::opus_ddos_format() : wd177x_format(formats)
|
||||
{
|
||||
}
|
||||
|
||||
const char *opus_ddos_format::name() const
|
||||
{
|
||||
return "ddos";
|
||||
}
|
||||
|
||||
const char *opus_ddos_format::description() const
|
||||
{
|
||||
return "Opus DDOS disk image";
|
||||
}
|
||||
|
||||
const char *opus_ddos_format::extensions() const
|
||||
{
|
||||
return "dds";
|
||||
}
|
||||
|
||||
int opus_ddos_format::find_size(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
UINT8 cat[8];
|
||||
UINT32 sectors0, sectors2;
|
||||
|
||||
// read sector count from side 0 catalogue
|
||||
io_generic_read(io, cat, 0x1000, 8);
|
||||
sectors0 = (cat[1] << 8) + cat[2];
|
||||
LOG_FORMATS("ddos: sector count 0: %d %s\n", sectors0, sectors0 % 18 != 0 ? "invalid" : "");
|
||||
|
||||
UINT64 size = io_generic_size(io);
|
||||
for (int i = 0; formats[i].form_factor; i++) {
|
||||
const format &f = formats[i];
|
||||
if (form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
|
||||
continue;
|
||||
|
||||
if ((size <= (UINT64)compute_track_size(f) * f.track_count * f.head_count) && (sectors0 <= f.track_count * f.sector_count)) {
|
||||
if (f.head_count == 2)
|
||||
{
|
||||
// read sector count from side 2 catalogue
|
||||
io_generic_read(io, cat, compute_track_size(f) * f.track_count + 0x1000, 8); // sequential
|
||||
sectors2 = (cat[1] << 8) + cat[2];
|
||||
LOG_FORMATS("ddos: sector count 2: %d %s\n", sectors2, sectors2 % 18 != 0 ? "invalid" : "");
|
||||
}
|
||||
else
|
||||
{
|
||||
sectors2 = sectors0;
|
||||
}
|
||||
|
||||
if (sectors0 % 18 == 0 && sectors2 % 18 == 0)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
LOG_FORMATS("ddos: no match\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int opus_ddos_format::identify(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
int type = find_size(io, form_factor);
|
||||
|
||||
if (type != -1)
|
||||
return 90;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int opus_ddos_format::get_image_offset(const format &f, int head, int track)
|
||||
{
|
||||
if (f.sector_base_id == -1)
|
||||
return (track * f.head_count + head) * compute_track_size(f);
|
||||
else
|
||||
return (f.track_count * head + track) * compute_track_size(f);
|
||||
}
|
||||
|
||||
const opus_ddos_format::format opus_ddos_format::formats[] =
|
||||
{
|
||||
{ // 180k 40 track single sided double density - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::SSSD, floppy_image::MFM,
|
||||
4000, 18, 40, 1, 256, {}, 0, {}, 40, 10, 10
|
||||
},
|
||||
{ // 360k 80 track single sided double density - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
|
||||
4000, 18, 80, 1, 256, {}, 0, {}, 40, 10, 10
|
||||
},
|
||||
{ // 360k 40 track double sided double density - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::DSSD, floppy_image::MFM,
|
||||
4000, 18, 40, 2, 256, {}, 0, {}, 40, 10, 10
|
||||
},
|
||||
{ // 720k 80 track double sided double density - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
|
||||
4000, 18, 80, 2, 256, {}, 0, {}, 40, 10, 10
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
acorn_adfs_old_format::acorn_adfs_old_format() : wd177x_format(formats)
|
||||
{
|
||||
}
|
||||
|
||||
const char *acorn_adfs_old_format::name() const
|
||||
{
|
||||
return "adfs_o";
|
||||
}
|
||||
|
||||
const char *acorn_adfs_old_format::description() const
|
||||
{
|
||||
return "Acorn ADFS (OldMap) disk image";
|
||||
}
|
||||
|
||||
const char *acorn_adfs_old_format::extensions() const
|
||||
{
|
||||
return "adf,ads,adm,adl";
|
||||
}
|
||||
|
||||
int acorn_adfs_old_format::find_size(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
UINT8 map[3];
|
||||
UINT32 sectors;
|
||||
UINT8 oldmap[4];
|
||||
|
||||
// read sector count from free space map
|
||||
io_generic_read(io, map, 0xfc, 3);
|
||||
sectors = map[0] + (map[1] << 8) + (map[2] << 16);
|
||||
LOG_FORMATS("adfs_o: sector count %d %s\n", sectors, sectors % 16 != 0 ? "invalid" : "");
|
||||
|
||||
// read map identifier
|
||||
io_generic_read(io, oldmap, 0x201, 4);
|
||||
LOG_FORMATS("adfs_o: map identifier %s %s\n", oldmap, memcmp(oldmap, "Hugo", 4) != 0 ? "invalid" : "");
|
||||
|
||||
UINT64 size = io_generic_size(io);
|
||||
for(int i=0; formats[i].form_factor; i++) {
|
||||
const format &f = formats[i];
|
||||
if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
|
||||
continue;
|
||||
|
||||
// valid images will have map identifier 'Hugo' and sector counts adfs-s = 0x280; adfs-m = 0x500; adfs-l = 0xa00; though many adfs-s images are incorrect
|
||||
if ((size <= (UINT64)compute_track_size(f) * f.track_count * f.head_count) && memcmp(oldmap, "Hugo", 4) == 0 && (sectors == 0x280 || sectors == 0x500 || sectors == 0xa00 || size == 819200)) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
LOG_FORMATS("adfs_o: no match\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int acorn_adfs_old_format::identify(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
int type = find_size(io, form_factor);
|
||||
|
||||
if(type != -1)
|
||||
return 100;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int acorn_adfs_old_format::get_image_offset(const format &f, int head, int track)
|
||||
{
|
||||
if (f.sector_base_id == -1)
|
||||
return (track * f.head_count + head) * compute_track_size(f);
|
||||
else
|
||||
return (f.track_count * head + track) * compute_track_size(f);
|
||||
}
|
||||
|
||||
const acorn_adfs_old_format::format acorn_adfs_old_format::formats[] =
|
||||
{
|
||||
{ // M - 320K 5 1/4 inch 80 track single sided double density
|
||||
floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
|
||||
2000, 16, 80, 1, 256, {}, 0, {}, 60, 22, 43
|
||||
},
|
||||
{ // S - 160K 5 1/4 inch 40 track single sided double density
|
||||
floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
|
||||
2000, 16, 40, 1, 256, {}, 0, {}, 60, 22, 43
|
||||
},
|
||||
{ // L - 640K 5 1/4 inch 80 track double sided double density (interleaved)
|
||||
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
|
||||
2000, 16, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, 60, 22, 43
|
||||
},
|
||||
{ // M - 320K 3 1/2 inch 80 track single sided double density
|
||||
floppy_image::FF_35, floppy_image::SSQD, floppy_image::MFM,
|
||||
2000, 16, 80, 1, 256, {}, 0, {}, 60, 22, 43
|
||||
},
|
||||
{ // S - 160K 3 1/2 inch 40 track single sided double density
|
||||
floppy_image::FF_35, floppy_image::SSDD, floppy_image::MFM,
|
||||
2000, 16, 40, 1, 256, {}, 0, {}, 60, 22, 43
|
||||
},
|
||||
{ // L - 640K 3 1/2 inch 80 track double sided double density (interleaved)
|
||||
floppy_image::FF_35, floppy_image::DSQD, floppy_image::MFM,
|
||||
2000, 16, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, 60, 22, 43
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
acorn_adfs_new_format::acorn_adfs_new_format() : wd177x_format(formats)
|
||||
{
|
||||
}
|
||||
|
||||
const char *acorn_adfs_new_format::name() const
|
||||
{
|
||||
return "adfs_n";
|
||||
}
|
||||
|
||||
const char *acorn_adfs_new_format::description() const
|
||||
{
|
||||
return "Acorn ADFS (NewMap) disk image";
|
||||
}
|
||||
|
||||
const char *acorn_adfs_new_format::extensions() const
|
||||
{
|
||||
return "adf";
|
||||
}
|
||||
|
||||
int acorn_adfs_new_format::find_size(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
UINT8 dform[4];
|
||||
UINT8 eform[4];
|
||||
|
||||
// read map identifiers for D and E formats
|
||||
io_generic_read(io, dform, 0x401, 4);
|
||||
LOG_FORMATS("adfs_n: map identifier (D format) %s %s\n", dform, memcmp(dform, "Nick", 4) != 0 ? "invalid" : "");
|
||||
io_generic_read(io, eform, 0x801, 4);
|
||||
LOG_FORMATS("adfs_n: map identifier (E format) %s %s\n", eform, memcmp(eform, "Nick", 4) != 0 ? "invalid" : "");
|
||||
|
||||
UINT64 size = io_generic_size(io);
|
||||
for (int i = 0; formats[i].form_factor; i++) {
|
||||
const format &f = formats[i];
|
||||
if (form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
|
||||
continue;
|
||||
|
||||
// valid images will have map identifier Nick
|
||||
if ((size == (UINT64)compute_track_size(f) * f.track_count * f.head_count) && (memcmp(dform, "Nick", 4) == 0 || memcmp(eform, "Nick", 4) == 0)) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
LOG_FORMATS("adfs_n: no match\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int acorn_adfs_new_format::identify(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
int type = find_size(io, form_factor);
|
||||
|
||||
if (type != -1)
|
||||
return 100;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int acorn_adfs_new_format::get_image_offset(const format &f, int head, int track)
|
||||
{
|
||||
if (f.sector_base_id == -1)
|
||||
return (track * f.head_count + head) * compute_track_size(f);
|
||||
else
|
||||
return (f.track_count * head + track) * compute_track_size(f);
|
||||
}
|
||||
|
||||
const acorn_adfs_new_format::format acorn_adfs_new_format::formats[] =
|
||||
{
|
||||
{ // D,E - 800K 3 1/2 inch 80 track double sided double density - gaps unverified
|
||||
floppy_image::FF_35, floppy_image::DSDD, floppy_image::MFM,
|
||||
2000, 5, 80, 2, 1024, {}, -1, { 0,1,2,3,4 }, 60, 22, 43
|
||||
},
|
||||
{ // F - 1600K 3 1/2 inch 80 track double sided quad density - gaps unverified
|
||||
floppy_image::FF_35, floppy_image::DSQD, floppy_image::MFM,
|
||||
2000, 10, 80, 2, 1024, {}, -1, { 0,1,2,3,4,5,6,7,8,9 }, 60, 22, 43
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
acorn_dos_format::acorn_dos_format() : wd177x_format(formats)
|
||||
{
|
||||
}
|
||||
|
||||
const char *acorn_dos_format::name() const
|
||||
{
|
||||
return "dos";
|
||||
}
|
||||
|
||||
const char *acorn_dos_format::description() const
|
||||
{
|
||||
return "Acorn DOS disk image";
|
||||
}
|
||||
|
||||
const char *acorn_dos_format::extensions() const
|
||||
{
|
||||
return "img,adl";
|
||||
}
|
||||
|
||||
int acorn_dos_format::find_size(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
UINT8 cat[3];
|
||||
UINT32 sectors;
|
||||
|
||||
UINT64 size = io_generic_size(io);
|
||||
for(int i=0; formats[i].form_factor; i++) {
|
||||
const format &f = formats[i];
|
||||
if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
|
||||
continue;
|
||||
|
||||
if (size == (UINT64)compute_track_size(f) * f.track_count * f.head_count) {
|
||||
switch (size)
|
||||
{
|
||||
case 640 * 1024: // 640K Acorn (Bootable) DOS Format
|
||||
// read sector count from free space map - Acorn DOS = 0xaa0
|
||||
io_generic_read(io, cat, 0xfc, 3);
|
||||
sectors = cat[0] + (cat[1] << 8) + (cat[2] << 16);
|
||||
if (sectors == 0xaa0) {
|
||||
// read media type ID from FAT - Acorn DOS = 0xff
|
||||
if (f.sector_base_id == -1)
|
||||
io_generic_read(io, cat, 0x2000, 1); // interleaved
|
||||
else
|
||||
io_generic_read(io, cat, 0x1000, 1); // sequential
|
||||
LOG_FORMATS("dos: 640k media type id %02X %s\n", cat[0], cat[0] != 0xff ? "invalid" : "");
|
||||
if (cat[0] == 0xff) return i;
|
||||
}
|
||||
break;
|
||||
case 800 * 1024: // 800K Acorn DOS Format
|
||||
// read media type ID from FAT - Acorn DOS = 0xfd
|
||||
io_generic_read(io, cat, 0, 1);
|
||||
LOG_FORMATS("dos: 800k media type id %02X %s\n", cat[0], cat[0] != 0xfd ? "invalid" : "");
|
||||
if (cat[0] == 0xfd) return i;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
LOG_FORMATS("dos: no match\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int acorn_dos_format::identify(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
int type = find_size(io, form_factor);
|
||||
|
||||
if(type != -1)
|
||||
return 100;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int acorn_dos_format::get_image_offset(const format &f, int head, int track)
|
||||
{
|
||||
if (f.sector_base_id == -1)
|
||||
return (track * f.head_count + head) * compute_track_size(f);
|
||||
else
|
||||
return (f.track_count * head + track) * compute_track_size(f);
|
||||
}
|
||||
|
||||
const acorn_dos_format::format acorn_dos_format::formats[] =
|
||||
{
|
||||
{ // 640K 5 1/4 inch 80 track double sided double density - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
|
||||
2000, 16, 80, 2, 256, {}, 0, {}, 60, 22, 43
|
||||
},
|
||||
{ // 640K 5 1/4 inch 80 track double sided double density (interleaved) - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
|
||||
2000, 16, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, 60, 22, 43
|
||||
},
|
||||
{ // 800K 5 1/4 inch 80 track double sided double density - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
|
||||
2000, 5, 80, 2, 1024, {}, 0, {}, 60, 22, 43
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
acorn_cpm_format::acorn_cpm_format() : wd177x_format(formats)
|
||||
{
|
||||
}
|
||||
|
||||
const char *acorn_cpm_format::name() const
|
||||
{
|
||||
return "cpm";
|
||||
}
|
||||
|
||||
const char *acorn_cpm_format::description() const
|
||||
{
|
||||
return "Acorn CP/M disk image";
|
||||
}
|
||||
|
||||
const char *acorn_cpm_format::extensions() const
|
||||
{
|
||||
return "img,ssd,dsd";
|
||||
}
|
||||
|
||||
int acorn_cpm_format::identify(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
UINT8 h[8];
|
||||
|
||||
io_generic_read(io, h, 0, 8);
|
||||
|
||||
int type = find_size(io, form_factor);
|
||||
|
||||
if(type != -1 && (memcmp(h, "Acorn CP", 8) == 0 || memcmp(h, "Slogger ", 8) == 0)) {
|
||||
return 100;
|
||||
}
|
||||
LOG_FORMATS("cpm: no match\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int acorn_cpm_format::get_image_offset(const format &f, int head, int track)
|
||||
{
|
||||
if (f.sector_base_id == -1)
|
||||
return (track * f.head_count + head) * compute_track_size(f);
|
||||
else
|
||||
return (f.track_count * head + track) * compute_track_size(f);
|
||||
}
|
||||
|
||||
const acorn_cpm_format::format acorn_cpm_format::formats[] =
|
||||
{
|
||||
{ // 400K 5 1/4 inch 80 track double sided single density - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
|
||||
4000, 5, 80, 2, 512, {}, 0, {}, 40, 10, 10
|
||||
},
|
||||
{ // 400k 5 1/4 inch 80 track double sided single density (interleaved) - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
|
||||
4000, 5, 80, 2, 512, {}, -1, { 0,1,2,3,4 }, 40, 10, 10
|
||||
},
|
||||
{ // 800K 5 1/4 inch 80 track double sided double density - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
|
||||
2000, 10, 80, 2, 512, {}, 0, {}, 60, 22, 43
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
torch_cpn_format::torch_cpn_format() : wd177x_format(formats)
|
||||
{
|
||||
}
|
||||
|
||||
const char *torch_cpn_format::name() const
|
||||
{
|
||||
return "cpn";
|
||||
}
|
||||
|
||||
const char *torch_cpn_format::description() const
|
||||
{
|
||||
return "Torch CPN disk image";
|
||||
}
|
||||
|
||||
const char *torch_cpn_format::extensions() const
|
||||
{
|
||||
return "dsd";
|
||||
}
|
||||
|
||||
int torch_cpn_format::identify(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
int type = find_size(io, form_factor);
|
||||
|
||||
if(type != -1)
|
||||
return 50;
|
||||
LOG_FORMATS("cpn: no match\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int torch_cpn_format::get_image_offset(const format &f, int head, int track)
|
||||
{
|
||||
if (f.sector_base_id == -1)
|
||||
return (track * f.head_count + head) * compute_track_size(f);
|
||||
else
|
||||
return (f.track_count * head + track) * compute_track_size(f);
|
||||
}
|
||||
|
||||
const torch_cpn_format::format torch_cpn_format::formats[] =
|
||||
{
|
||||
{ // 400k 80 track double sided single density (interleaved) - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
|
||||
4000, 10, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9 }, 40, 10, 10
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
const floppy_format_type FLOPPY_ACORN_SSD_FORMAT = &floppy_image_format_creator<acorn_ssd_format>;
|
||||
const floppy_format_type FLOPPY_ACORN_DSD_FORMAT = &floppy_image_format_creator<acorn_dsd_format>;
|
||||
const floppy_format_type FLOPPY_OPUS_DDOS_FORMAT = &floppy_image_format_creator<opus_ddos_format>;
|
||||
const floppy_format_type FLOPPY_ACORN_ADFS_OLD_FORMAT = &floppy_image_format_creator<acorn_adfs_old_format>;
|
||||
const floppy_format_type FLOPPY_ACORN_ADFS_NEW_FORMAT = &floppy_image_format_creator<acorn_adfs_new_format>;
|
||||
const floppy_format_type FLOPPY_ACORN_DOS_FORMAT = &floppy_image_format_creator<acorn_dos_format>;
|
||||
const floppy_format_type FLOPPY_ACORN_CPM_FORMAT = &floppy_image_format_creator<acorn_cpm_format>;
|
||||
const floppy_format_type FLOPPY_TORCH_CPN_FORMAT = &floppy_image_format_creator<torch_cpn_format>;
|
154
src/lib/formats/acorn_dsk.h
Normal file
154
src/lib/formats/acorn_dsk.h
Normal file
@ -0,0 +1,154 @@
|
||||
// license:GPL-2.0+
|
||||
// copyright-holders:Dirk Best, Nigel Barnes
|
||||
/***************************************************************************
|
||||
|
||||
Acorn - BBC Micro, Electron, Archimedes
|
||||
|
||||
Disk image formats
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef __ACORN_DSK_H__
|
||||
#define __ACORN_DSK_H__
|
||||
|
||||
#include "wd177x_dsk.h"
|
||||
|
||||
class acorn_ssd_format : public wd177x_format
|
||||
{
|
||||
public:
|
||||
acorn_ssd_format();
|
||||
|
||||
virtual int find_size(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int identify(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int get_image_offset(const format &f, int head, int track) override;
|
||||
virtual const char *name() const override;
|
||||
virtual const char *description() const override;
|
||||
virtual const char *extensions() const override;
|
||||
|
||||
private:
|
||||
static const format formats[];
|
||||
};
|
||||
|
||||
class acorn_dsd_format : public wd177x_format
|
||||
{
|
||||
public:
|
||||
acorn_dsd_format();
|
||||
|
||||
virtual int find_size(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int identify(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int get_image_offset(const format &f, int head, int track) override;
|
||||
virtual const char *name() const override;
|
||||
virtual const char *description() const override;
|
||||
virtual const char *extensions() const override;
|
||||
|
||||
private:
|
||||
static const format formats[];
|
||||
};
|
||||
|
||||
class opus_ddos_format : public wd177x_format
|
||||
{
|
||||
public:
|
||||
opus_ddos_format();
|
||||
|
||||
virtual int find_size(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int identify(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int get_image_offset(const format &f, int head, int track) override;
|
||||
virtual const char *name() const override;
|
||||
virtual const char *description() const override;
|
||||
virtual const char *extensions() const override;
|
||||
|
||||
private:
|
||||
static const format formats[];
|
||||
};
|
||||
|
||||
class acorn_adfs_old_format : public wd177x_format
|
||||
{
|
||||
public:
|
||||
acorn_adfs_old_format();
|
||||
|
||||
virtual int find_size(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int identify(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int get_image_offset(const format &f, int head, int track) override;
|
||||
virtual const char *name() const override;
|
||||
virtual const char *description() const override;
|
||||
virtual const char *extensions() const override;
|
||||
|
||||
private:
|
||||
static const format formats[];
|
||||
};
|
||||
|
||||
class acorn_adfs_new_format : public wd177x_format
|
||||
{
|
||||
public:
|
||||
acorn_adfs_new_format();
|
||||
|
||||
virtual int find_size(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int identify(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int get_image_offset(const format &f, int head, int track) override;
|
||||
virtual const char *name() const override;
|
||||
virtual const char *description() const override;
|
||||
virtual const char *extensions() const override;
|
||||
|
||||
private:
|
||||
static const format formats[];
|
||||
};
|
||||
|
||||
class acorn_dos_format : public wd177x_format
|
||||
{
|
||||
public:
|
||||
acorn_dos_format();
|
||||
|
||||
virtual int find_size(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int identify(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int get_image_offset(const format &f, int head, int track) override;
|
||||
virtual const char *name() const override;
|
||||
virtual const char *description() const override;
|
||||
virtual const char *extensions() const override;
|
||||
|
||||
private:
|
||||
static const format formats[];
|
||||
};
|
||||
|
||||
class acorn_cpm_format : public wd177x_format
|
||||
{
|
||||
public:
|
||||
acorn_cpm_format();
|
||||
|
||||
virtual int identify(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int get_image_offset(const format &f, int head, int track) override;
|
||||
virtual const char *name() const override;
|
||||
virtual const char *description() const override;
|
||||
virtual const char *extensions() const override;
|
||||
|
||||
private:
|
||||
static const format formats[];
|
||||
};
|
||||
|
||||
class torch_cpn_format : public wd177x_format
|
||||
{
|
||||
public:
|
||||
torch_cpn_format();
|
||||
|
||||
virtual int identify(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int get_image_offset(const format &f, int head, int track) override;
|
||||
virtual const char *name() const override;
|
||||
virtual const char *description() const override;
|
||||
virtual const char *extensions() const override;
|
||||
|
||||
private:
|
||||
static const format formats[];
|
||||
};
|
||||
|
||||
|
||||
extern const floppy_format_type FLOPPY_ACORN_SSD_FORMAT;
|
||||
extern const floppy_format_type FLOPPY_ACORN_DSD_FORMAT;
|
||||
extern const floppy_format_type FLOPPY_OPUS_DDOS_FORMAT;
|
||||
extern const floppy_format_type FLOPPY_ACORN_ADFS_OLD_FORMAT;
|
||||
extern const floppy_format_type FLOPPY_ACORN_ADFS_NEW_FORMAT;
|
||||
extern const floppy_format_type FLOPPY_ACORN_DOS_FORMAT;
|
||||
extern const floppy_format_type FLOPPY_ACORN_CPM_FORMAT;
|
||||
extern const floppy_format_type FLOPPY_TORCH_CPN_FORMAT;
|
||||
|
||||
#endif // __ACORN_DSK_H__
|
@ -1,411 +0,0 @@
|
||||
// license:GPL-2.0+
|
||||
// copyright-holders:Dirk Best, Nigel Barnes
|
||||
/***************************************************************************
|
||||
|
||||
BBC Micro
|
||||
|
||||
Disk image formats
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "bbc_dsk.h"
|
||||
|
||||
bbc_dfs_format::bbc_dfs_format() : wd177x_format(formats)
|
||||
{
|
||||
}
|
||||
|
||||
const char *bbc_dfs_format::name() const
|
||||
{
|
||||
return "dfs";
|
||||
}
|
||||
|
||||
const char *bbc_dfs_format::description() const
|
||||
{
|
||||
return "Acorn DFS disk image";
|
||||
}
|
||||
|
||||
const char *bbc_dfs_format::extensions() const
|
||||
{
|
||||
return "bbc,img,ssd,dsd";
|
||||
}
|
||||
|
||||
int bbc_dfs_format::find_size(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
UINT8 cat[8];
|
||||
UINT32 sectors0, sectors2;
|
||||
|
||||
// read sector count from side 0 catalogue
|
||||
io_generic_read(io, cat, 0x100, 8);
|
||||
sectors0 = ((cat[6] & 3) << 8) + cat[7];
|
||||
|
||||
UINT64 size = io_generic_size(io);
|
||||
for(int i=0; formats[i].form_factor; i++) {
|
||||
const format &f = formats[i];
|
||||
if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
|
||||
continue;
|
||||
|
||||
if ((size <= (UINT64)compute_track_size(f) * f.track_count * f.head_count) && (sectors0 == f.track_count * f.sector_count)) {
|
||||
if (f.head_count == 2)
|
||||
{
|
||||
// read sector count from side 2 catalogue
|
||||
if (f.sector_base_id == -1)
|
||||
io_generic_read(io, cat, 0xb00, 8); // interleaved
|
||||
else
|
||||
io_generic_read(io, cat, compute_track_size(f) * f.track_count + 0x100, 8); // sequential
|
||||
sectors2 = ((cat[6] & 3) << 8) + cat[7];
|
||||
}
|
||||
else
|
||||
{
|
||||
sectors2 = sectors0;
|
||||
}
|
||||
|
||||
if (sectors0 == sectors2)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int bbc_dfs_format::identify(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
int type = find_size(io, form_factor);
|
||||
|
||||
if(type != -1)
|
||||
return 90;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bbc_dfs_format::get_image_offset(const format &f, int head, int track)
|
||||
{
|
||||
if (f.sector_base_id == -1)
|
||||
return (track * f.head_count + head) * compute_track_size(f);
|
||||
else
|
||||
return (f.track_count * head + track) * compute_track_size(f);
|
||||
}
|
||||
|
||||
const bbc_dfs_format::format bbc_dfs_format::formats[] =
|
||||
{
|
||||
{ // 100k 40 track single sided single density
|
||||
floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
|
||||
4000, 10, 40, 1, 256, {}, 0, {}, 40, 10, 10
|
||||
},
|
||||
{ // 200k 80 track single sided single density
|
||||
floppy_image::FF_525, floppy_image::SSQD, floppy_image::FM,
|
||||
4000, 10, 80, 1, 256, {}, 0, {}, 40, 10, 10
|
||||
},
|
||||
{ // 200k 40 track double sided single density
|
||||
floppy_image::FF_525, floppy_image::DSSD, floppy_image::FM,
|
||||
4000, 10, 40, 2, 256, {}, 0, {}, 40, 10, 10
|
||||
},
|
||||
{ // 200k 40 track double sided single density (interleaved)
|
||||
floppy_image::FF_525, floppy_image::DSSD, floppy_image::FM,
|
||||
4000, 10, 40, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9 }, 40, 10, 10
|
||||
},
|
||||
{ // 400k 80 track double sided single density
|
||||
floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
|
||||
4000, 10, 80, 2, 256, {}, 0, {}, 40, 10, 10
|
||||
},
|
||||
{ // 400k 80 track double sided single density (interleaved)
|
||||
floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
|
||||
4000, 10, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9 }, 40, 10, 10
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
bbc_adfs_format::bbc_adfs_format() : wd177x_format(formats)
|
||||
{
|
||||
}
|
||||
|
||||
const char *bbc_adfs_format::name() const
|
||||
{
|
||||
return "adfs";
|
||||
}
|
||||
|
||||
const char *bbc_adfs_format::description() const
|
||||
{
|
||||
return "Acorn ADFS disk image";
|
||||
}
|
||||
|
||||
const char *bbc_adfs_format::extensions() const
|
||||
{
|
||||
return "adf,ads,adm,adl";
|
||||
}
|
||||
|
||||
int bbc_adfs_format::find_size(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
UINT8 map[3];
|
||||
UINT32 sectors;
|
||||
|
||||
// read sector count from free space map
|
||||
io_generic_read(io, map, 0xfc, 3);
|
||||
sectors = map[0] + (map[1] << 8) + (map[2] << 16);
|
||||
|
||||
UINT64 size = io_generic_size(io);
|
||||
for(int i=0; formats[i].form_factor; i++) {
|
||||
const format &f = formats[i];
|
||||
if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
|
||||
continue;
|
||||
|
||||
// valid images will have sector counts adfs-s = 0x280; adfs-m = 0x500; adfs-l = 0xa00; though many adfs-s images are incorrect
|
||||
// format d/e (size 819200) we accept on the size only
|
||||
if ((size == (UINT64)compute_track_size(f) * f.track_count * f.head_count) && (sectors == 0x280 || sectors == 0x500 || sectors == 0xa00 || size == 819200)) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int bbc_adfs_format::identify(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
int type = find_size(io, form_factor);
|
||||
|
||||
if(type != -1)
|
||||
return 100;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bbc_adfs_format::get_image_offset(const format &f, int head, int track)
|
||||
{
|
||||
if (f.sector_base_id == -1)
|
||||
return (track * f.head_count + head) * compute_track_size(f);
|
||||
else
|
||||
return (f.track_count * head + track) * compute_track_size(f);
|
||||
}
|
||||
|
||||
const bbc_adfs_format::format bbc_adfs_format::formats[] =
|
||||
{
|
||||
{ // 160K 5 1/4 inch 40 track single sided double density
|
||||
floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
|
||||
2000, 16, 40, 1, 256, {}, 0, {}, 60, 22, 43
|
||||
},
|
||||
{ // 320K 5 1/4 inch 80 track single sided double density
|
||||
floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
|
||||
2000, 16, 80, 1, 256, {}, 0, {}, 60, 22, 43
|
||||
},
|
||||
{ // 640K 5 1/4 inch 80 track double sided double density (interleaved)
|
||||
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
|
||||
2000, 16, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, 60, 22, 43
|
||||
},
|
||||
{ // 160K 3 1/2 inch 40 track single sided double density
|
||||
floppy_image::FF_35, floppy_image::SSDD, floppy_image::MFM,
|
||||
2000, 16, 40, 1, 256, {}, 0, {}, 60, 22, 43
|
||||
},
|
||||
{ // 320K 3 1/2 inch 80 track single sided double density
|
||||
floppy_image::FF_35, floppy_image::SSQD, floppy_image::MFM,
|
||||
2000, 16, 80, 1, 256, {}, 0, {}, 60, 22, 43
|
||||
},
|
||||
{ // 640K 3 1/2 inch 80 track double sided double density (interleaved)
|
||||
floppy_image::FF_35, floppy_image::DSQD, floppy_image::MFM,
|
||||
2000, 16, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, 60, 22, 43
|
||||
},
|
||||
{ // 800K 3 1/2 inch 80 track double sided double density
|
||||
floppy_image::FF_35, floppy_image::DSQD, floppy_image::MFM,
|
||||
2000, 5, 80, 2, 1024, {}, -1, { 0,1,2,3,4 }, 60, 22, 43
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
bbc_dos_format::bbc_dos_format() : wd177x_format(formats)
|
||||
{
|
||||
}
|
||||
|
||||
const char *bbc_dos_format::name() const
|
||||
{
|
||||
return "dos";
|
||||
}
|
||||
|
||||
const char *bbc_dos_format::description() const
|
||||
{
|
||||
return "Acorn DOS disk image";
|
||||
}
|
||||
|
||||
const char *bbc_dos_format::extensions() const
|
||||
{
|
||||
return "img,adl";
|
||||
}
|
||||
|
||||
int bbc_dos_format::find_size(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
UINT8 cat[3];
|
||||
UINT32 sectors;
|
||||
|
||||
UINT64 size = io_generic_size(io);
|
||||
for(int i=0; formats[i].form_factor; i++) {
|
||||
const format &f = formats[i];
|
||||
if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
|
||||
continue;
|
||||
|
||||
if (size == (UINT64)compute_track_size(f) * f.track_count * f.head_count) {
|
||||
switch (size)
|
||||
{
|
||||
case 640 * 1024: // 640K Acorn (Bootable) DOS Format
|
||||
// read sector count from free space map - Acorn DOS = 0xaa0
|
||||
io_generic_read(io, cat, 0xfc, 3);
|
||||
sectors = cat[0] + (cat[1] << 8) + (cat[2] << 16);
|
||||
if (sectors == 0xaa0) {
|
||||
// read media type ID from FAT - Acorn DOS = 0xff
|
||||
if (f.sector_base_id == -1)
|
||||
io_generic_read(io, cat, 0x2000, 1); // interleaved
|
||||
else
|
||||
io_generic_read(io, cat, 0x1000, 1); // sequential
|
||||
if (cat[0] == 0xff) return i;
|
||||
}
|
||||
break;
|
||||
case 800 * 1024: // 800K Acorn DOS Format
|
||||
// read media type ID from FAT - Acorn DOS = 0xfd
|
||||
io_generic_read(io, cat, 0, 1);
|
||||
if (cat[0] == 0xfd) return i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int bbc_dos_format::identify(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
int type = find_size(io, form_factor);
|
||||
|
||||
if(type != -1)
|
||||
return 100;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bbc_dos_format::get_image_offset(const format &f, int head, int track)
|
||||
{
|
||||
if (f.sector_base_id == -1)
|
||||
return (track * f.head_count + head) * compute_track_size(f);
|
||||
else
|
||||
return (f.track_count * head + track) * compute_track_size(f);
|
||||
}
|
||||
|
||||
const bbc_dos_format::format bbc_dos_format::formats[] =
|
||||
{
|
||||
{ // 640K 5 1/4 inch 80 track double sided double density - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
|
||||
2000, 16, 80, 2, 256, {}, 0, {}, 60, 22, 43
|
||||
},
|
||||
{ // 640K 5 1/4 inch 80 track double sided double density (interleaved) - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
|
||||
2000, 16, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, 60, 22, 43
|
||||
},
|
||||
{ // 800K 5 1/4 inch 80 track double sided double density - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
|
||||
2000, 5, 80, 2, 1024, {}, 0, {}, 60, 22, 43
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
bbc_cpm_format::bbc_cpm_format() : wd177x_format(formats)
|
||||
{
|
||||
}
|
||||
|
||||
const char *bbc_cpm_format::name() const
|
||||
{
|
||||
return "cpm";
|
||||
}
|
||||
|
||||
const char *bbc_cpm_format::description() const
|
||||
{
|
||||
return "Acorn CP/M disk image";
|
||||
}
|
||||
|
||||
const char *bbc_cpm_format::extensions() const
|
||||
{
|
||||
return "img,ssd,dsd";
|
||||
}
|
||||
|
||||
int bbc_cpm_format::identify(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
UINT8 h[8];
|
||||
|
||||
io_generic_read(io, h, 0, 8);
|
||||
|
||||
int type = find_size(io, form_factor);
|
||||
|
||||
if(type != -1 && (memcmp(h, "Acorn CP", 8) == 0 || memcmp(h, "Slogger ", 8) == 0)) {
|
||||
return 100;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bbc_cpm_format::get_image_offset(const format &f, int head, int track)
|
||||
{
|
||||
if (f.sector_base_id == -1)
|
||||
return (track * f.head_count + head) * compute_track_size(f);
|
||||
else
|
||||
return (f.track_count * head + track) * compute_track_size(f);
|
||||
}
|
||||
|
||||
const bbc_cpm_format::format bbc_cpm_format::formats[] =
|
||||
{
|
||||
{ // 400K 5 1/4 inch 80 track double sided single density - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
|
||||
4000, 5, 80, 2, 512, {}, 0, {}, 40, 10, 10
|
||||
},
|
||||
{ // 400k 5 1/4 inch 80 track double sided single density (interleaved) - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
|
||||
4000, 5, 80, 2, 512, {}, -1, { 0,1,2,3,4 }, 40, 10, 10
|
||||
},
|
||||
{ // 800K 5 1/4 inch 80 track double sided double density - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
|
||||
2000, 10, 80, 2, 512, {}, 0, {}, 60, 22, 43
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
bbc_cpn_format::bbc_cpn_format() : wd177x_format(formats)
|
||||
{
|
||||
}
|
||||
|
||||
const char *bbc_cpn_format::name() const
|
||||
{
|
||||
return "cpn";
|
||||
}
|
||||
|
||||
const char *bbc_cpn_format::description() const
|
||||
{
|
||||
return "Torch CPN disk image";
|
||||
}
|
||||
|
||||
const char *bbc_cpn_format::extensions() const
|
||||
{
|
||||
return "dsd";
|
||||
}
|
||||
|
||||
int bbc_cpn_format::identify(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
int type = find_size(io, form_factor);
|
||||
|
||||
if(type != -1)
|
||||
return 50;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bbc_cpn_format::get_image_offset(const format &f, int head, int track)
|
||||
{
|
||||
if (f.sector_base_id == -1)
|
||||
return (track * f.head_count + head) * compute_track_size(f);
|
||||
else
|
||||
return (f.track_count * head + track) * compute_track_size(f);
|
||||
}
|
||||
|
||||
const bbc_cpn_format::format bbc_cpn_format::formats[] =
|
||||
{
|
||||
{ // 400k 80 track double sided single density (interleaved) - gaps unverified
|
||||
floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
|
||||
4000, 10, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9 }, 40, 10, 10
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
const floppy_format_type FLOPPY_BBC_DFS_FORMAT = &floppy_image_format_creator<bbc_dfs_format>;
|
||||
const floppy_format_type FLOPPY_BBC_ADFS_FORMAT = &floppy_image_format_creator<bbc_adfs_format>;
|
||||
const floppy_format_type FLOPPY_BBC_DOS_FORMAT = &floppy_image_format_creator<bbc_dos_format>;
|
||||
const floppy_format_type FLOPPY_BBC_CPM_FORMAT = &floppy_image_format_creator<bbc_cpm_format>;
|
||||
const floppy_format_type FLOPPY_BBC_CPN_FORMAT = &floppy_image_format_creator<bbc_cpn_format>;
|
@ -1,103 +0,0 @@
|
||||
// license:GPL-2.0+
|
||||
// copyright-holders:Dirk Best, Nigel Barnes
|
||||
/***************************************************************************
|
||||
|
||||
BBC Micro
|
||||
|
||||
Disk image formats
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef __BBC_DSK_H__
|
||||
#define __BBC_DSK_H__
|
||||
|
||||
#include "wd177x_dsk.h"
|
||||
|
||||
class bbc_dfs_format : public wd177x_format
|
||||
{
|
||||
public:
|
||||
bbc_dfs_format();
|
||||
|
||||
virtual int find_size(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int identify(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int get_image_offset(const format &f, int head, int track) override;
|
||||
virtual const char *name() const override;
|
||||
virtual const char *description() const override;
|
||||
virtual const char *extensions() const override;
|
||||
|
||||
private:
|
||||
static const format formats[];
|
||||
};
|
||||
|
||||
class bbc_adfs_format : public wd177x_format
|
||||
{
|
||||
public:
|
||||
bbc_adfs_format();
|
||||
|
||||
virtual int find_size(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int identify(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int get_image_offset(const format &f, int head, int track) override;
|
||||
virtual const char *name() const override;
|
||||
virtual const char *description() const override;
|
||||
virtual const char *extensions() const override;
|
||||
|
||||
private:
|
||||
static const format formats[];
|
||||
};
|
||||
|
||||
class bbc_dos_format : public wd177x_format
|
||||
{
|
||||
public:
|
||||
bbc_dos_format();
|
||||
|
||||
virtual int find_size(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int identify(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int get_image_offset(const format &f, int head, int track) override;
|
||||
virtual const char *name() const override;
|
||||
virtual const char *description() const override;
|
||||
virtual const char *extensions() const override;
|
||||
|
||||
private:
|
||||
static const format formats[];
|
||||
};
|
||||
|
||||
class bbc_cpm_format : public wd177x_format
|
||||
{
|
||||
public:
|
||||
bbc_cpm_format();
|
||||
|
||||
virtual int identify(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int get_image_offset(const format &f, int head, int track) override;
|
||||
virtual const char *name() const override;
|
||||
virtual const char *description() const override;
|
||||
virtual const char *extensions() const override;
|
||||
|
||||
private:
|
||||
static const format formats[];
|
||||
};
|
||||
|
||||
class bbc_cpn_format : public wd177x_format
|
||||
{
|
||||
public:
|
||||
bbc_cpn_format();
|
||||
|
||||
virtual int identify(io_generic *io, UINT32 form_factor) override;
|
||||
virtual int get_image_offset(const format &f, int head, int track) override;
|
||||
virtual const char *name() const override;
|
||||
virtual const char *description() const override;
|
||||
virtual const char *extensions() const override;
|
||||
|
||||
private:
|
||||
static const format formats[];
|
||||
};
|
||||
|
||||
|
||||
extern const floppy_format_type FLOPPY_BBC_DFS_FORMAT;
|
||||
extern const floppy_format_type FLOPPY_BBC_ADFS_FORMAT;
|
||||
extern const floppy_format_type FLOPPY_BBC_DOS_FORMAT;
|
||||
extern const floppy_format_type FLOPPY_BBC_CPM_FORMAT;
|
||||
extern const floppy_format_type FLOPPY_BBC_CPN_FORMAT;
|
||||
|
||||
#endif // __BBC_DSK_H__
|
@ -9,7 +9,7 @@
|
||||
* Angelo Salese, August 2010
|
||||
*
|
||||
* Notes:
|
||||
* - default NVRAM is plainly wrong. Use the status/configure commands to set up properly
|
||||
* - default NVRAM is plainly wrong. Use the status/configure commands to set up properly
|
||||
* (Scroll Lock is currently mapped with Right SHIFT, use this to move to next page of status).
|
||||
* In order to load a floppy, you need at very least:
|
||||
* configure floppies 2
|
||||
@ -76,7 +76,7 @@
|
||||
//#include "machine/aakart.h"
|
||||
#include "machine/ram.h"
|
||||
#include "machine/wd_fdc.h"
|
||||
#include "formats/bbc_dsk.h"
|
||||
#include "formats/acorn_dsk.h"
|
||||
#include "softlist.h"
|
||||
|
||||
class a310_state : public archimedes_state
|
||||
@ -336,8 +336,8 @@ static INPUT_PORTS_START( a310 )
|
||||
INPUT_PORTS_END
|
||||
|
||||
FLOPPY_FORMATS_MEMBER( a310_state::floppy_formats )
|
||||
FLOPPY_BBC_DFS_FORMAT,
|
||||
FLOPPY_BBC_ADFS_FORMAT
|
||||
FLOPPY_ACORN_ADFS_NEW_FORMAT,
|
||||
FLOPPY_ACORN_ADFS_OLD_FORMAT
|
||||
FLOPPY_FORMATS_END
|
||||
|
||||
static SLOT_INTERFACE_START( a310_floppies )
|
||||
@ -345,7 +345,7 @@ static SLOT_INTERFACE_START( a310_floppies )
|
||||
SLOT_INTERFACE_END
|
||||
|
||||
WRITE_LINE_MEMBER( archimedes_state::a310_kart_tx_w )
|
||||
{
|
||||
{
|
||||
if(state)
|
||||
archimedes_request_irq_b(ARCHIMEDES_IRQB_KBD_RECV_FULL);
|
||||
else
|
||||
@ -391,7 +391,9 @@ static MACHINE_CONFIG_START( a310, a310_state )
|
||||
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE( a310_state, a310_wd177x_intrq_w))
|
||||
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(a310_state, a310_wd177x_drq_w))
|
||||
MCFG_FLOPPY_DRIVE_ADD("fdc:0", a310_floppies, "35dd", a310_state::floppy_formats)
|
||||
MCFG_FLOPPY_DRIVE_SOUND(true)
|
||||
MCFG_FLOPPY_DRIVE_ADD("fdc:1", a310_floppies, "35dd", a310_state::floppy_formats)
|
||||
MCFG_FLOPPY_DRIVE_SOUND(true)
|
||||
|
||||
MCFG_SOFTWARE_LIST_ADD("flop_list", "archimedes")
|
||||
|
||||
|
@ -53,8 +53,7 @@
|
||||
#include "bbc.lh"
|
||||
|
||||
/* Devices */
|
||||
#include "imagedev/flopdrv.h"
|
||||
#include "formats/bbc_dsk.h"
|
||||
#include "formats/acorn_dsk.h"
|
||||
#include "formats/fsd_dsk.h"
|
||||
#include "imagedev/cassette.h"
|
||||
#include "formats/uef_cas.h"
|
||||
@ -180,7 +179,7 @@ static ADDRESS_MAP_START( bbc_base, AS_PROGRAM, 8, bbc_state )
|
||||
AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write) /* fe40-fe5f 6522 VIA SYSTEM VIA */
|
||||
AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE("via6522_1", via6522_device, read, write) /* fe60-fe7f 6522 VIA USER VIA */
|
||||
/* fe80-fe9f FDC Floppy disc controller */
|
||||
AM_RANGE(0xfea0, 0xfebf) AM_READ(bbc_fe_r) /* fea0-febf 68B54 ADLC ECONET controller */
|
||||
AM_RANGE(0xfea0, 0xfebf) AM_DEVREADWRITE("mc6854", mc6854_device, read, write) /* fea0-febf 68B54 ADLC ECONET controller */
|
||||
AM_RANGE(0xfec0, 0xfedf) AM_DEVREADWRITE("upd7002", upd7002_device, read, write) /* fec0-fedf uPD7002 Analogue to digital converter */
|
||||
AM_RANGE(0xfee0, 0xfeff) AM_READ(bbc_fe_r) /* fee0-feff Tube ULA Tube system interface */
|
||||
AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("os", 0x3f00) /* ff00-ffff OS ROM (continued) */
|
||||
@ -188,13 +187,13 @@ ADDRESS_MAP_END
|
||||
|
||||
|
||||
static ADDRESS_MAP_START( bbcb_mem, AS_PROGRAM, 8, bbc_state )
|
||||
AM_RANGE(0x0000, 0x3fff) AM_READ_BANK("bank1") AM_WRITE(bbc_memorya1_w) /* 0000-3fff Regular Ram */
|
||||
AM_RANGE(0x4000, 0x7fff) AM_READ_BANK("bank3") AM_WRITE(bbc_memoryb3_w) /* 4000-7fff Regular Ram */
|
||||
AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank4") AM_WRITE(bbc_memoryb4_w) /* 8000-bfff Paged ROM */
|
||||
AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectb_w) /* R: fe30-fe3f NC Not Connected */
|
||||
/* W: fe30-fe3f 84LS161 Paged ROM selector */
|
||||
AM_RANGE(0xfe80, 0xfe83) AM_DEVICE("i8271", i8271_device, map) /* fe80-fe83 8271 FDC Floppy disc controller */
|
||||
AM_RANGE(0xfe84, 0xfe9f) AM_DEVREADWRITE("i8271", i8271_device, data_r, data_w) /* fe84-fe9f 8271 FDC Floppy disc controller */
|
||||
AM_RANGE(0x0000, 0x3fff) AM_READ_BANK("bank1") AM_WRITE(bbc_memorya1_w) /* 0000-3fff Regular Ram */
|
||||
AM_RANGE(0x4000, 0x7fff) AM_READ_BANK("bank3") AM_WRITE(bbc_memoryb3_w) /* 4000-7fff Regular Ram */
|
||||
AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank4") AM_WRITE(bbc_memoryb4_w) /* 8000-bfff Paged ROM */
|
||||
AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectb_w) /* R: fe30-fe3f NC Not Connected */
|
||||
/* W: fe30-fe3f 84LS161 Paged ROM selector */
|
||||
AM_RANGE(0xfe80, 0xfe83) AM_DEVICE("i8271", i8271_device, map) /* fe80-fe83 8271 FDC Floppy disc controller */
|
||||
AM_RANGE(0xfe84, 0xfe9f) AM_DEVREADWRITE("i8271", i8271_device, data_r, data_w) /* fe84-fe9f 8271 FDC Floppy disc controller */
|
||||
AM_IMPORT_FROM(bbc_base)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
@ -529,7 +528,7 @@ INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START(bbcb_links)
|
||||
PORT_START("STATID")
|
||||
PORT_DIPNAME(0xff, 0xfe, "Econet ID") PORT_DIPLOCATION("S11:0,1,2,3,4,5,6,7")
|
||||
PORT_DIPNAME(0xff, 0xfe, "Econet ID") PORT_DIPLOCATION("S11:1,2,3,4,5,6,7,8")
|
||||
PORT_DIPSETTING( 0x00, "0" ) PORT_DIPSETTING( 0x01, "1" ) PORT_DIPSETTING( 0x02, "2" ) PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x04, "4" )
|
||||
PORT_DIPSETTING( 0x05, "5" ) PORT_DIPSETTING( 0x06, "6" ) PORT_DIPSETTING( 0x07, "7" ) PORT_DIPSETTING( 0x08, "8" ) PORT_DIPSETTING( 0x09, "9" )
|
||||
PORT_DIPSETTING( 0x0a, "10" ) PORT_DIPSETTING( 0x0b, "11" ) PORT_DIPSETTING( 0x0c, "12" ) PORT_DIPSETTING( 0x0d, "13" ) PORT_DIPSETTING( 0x0e, "14" )
|
||||
@ -587,7 +586,7 @@ INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START(bbcbp_links)
|
||||
PORT_START("STATID")
|
||||
PORT_DIPNAME(0xff, 0xfe, "Econet ID") PORT_DIPLOCATION("S23:0,1,2,3,4,5,6,7")
|
||||
PORT_DIPNAME(0xff, 0xfe, "Econet ID") PORT_DIPLOCATION("S23:1,2,3,4,5,6,7,8")
|
||||
PORT_DIPSETTING( 0x00, "0" ) PORT_DIPSETTING( 0x01, "1" ) PORT_DIPSETTING( 0x02, "2" ) PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x04, "4" )
|
||||
PORT_DIPSETTING( 0x05, "5" ) PORT_DIPSETTING( 0x06, "6" ) PORT_DIPSETTING( 0x07, "7" ) PORT_DIPSETTING( 0x08, "8" ) PORT_DIPSETTING( 0x09, "9" )
|
||||
PORT_DIPSETTING( 0x0a, "10" ) PORT_DIPSETTING( 0x0b, "11" ) PORT_DIPSETTING( 0x0c, "12" ) PORT_DIPSETTING( 0x0d, "13" ) PORT_DIPSETTING( 0x0e, "14" )
|
||||
@ -659,17 +658,17 @@ INPUT_PORTS_END
|
||||
|
||||
|
||||
static INPUT_PORTS_START(bbc_config)
|
||||
PORT_START("BBCCONFIG")
|
||||
PORT_START("BBCCONFIG")
|
||||
|
||||
PORT_CONFNAME( 0x01, 0x00, "Speech Upgrade" )
|
||||
PORT_CONFSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
|
||||
PORT_CONFNAME( 0x01, 0x00, "Speech Upgrade" )
|
||||
PORT_CONFSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
|
||||
|
||||
PORT_CONFNAME( 0x18, 0x00, "Sideways RAM Type" )
|
||||
PORT_CONFSETTING( 0x00, DEF_STR( None ) )
|
||||
PORT_CONFSETTING( 0x08, "Solidisk 128K (fe62)" )
|
||||
PORT_CONFSETTING( 0x10, "Acorn 64K (fe30)" )
|
||||
PORT_CONFSETTING( 0x18, "Acorn 128K (fe30)" )
|
||||
PORT_CONFNAME( 0x18, 0x00, "Sideways RAM Type" )
|
||||
PORT_CONFSETTING( 0x00, DEF_STR( None ) )
|
||||
PORT_CONFSETTING( 0x08, "Solidisk 128K (fe62)" )
|
||||
PORT_CONFSETTING( 0x10, "Acorn 64K (fe30)" )
|
||||
PORT_CONFSETTING( 0x18, "Acorn 128K (fe30)" )
|
||||
// PORT_CONFSETTING( 0x20, "ATPL Sidewise 16K" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
@ -723,33 +722,28 @@ INTERRUPT_GEN_MEMBER(bbc_state::bbcb_vsync)
|
||||
}
|
||||
|
||||
|
||||
WRITE_LINE_MEMBER(bbc_state::bbcb_acia6850_irq_w)
|
||||
{
|
||||
m_acia_irq = state;
|
||||
|
||||
check_interrupts();
|
||||
}
|
||||
|
||||
|
||||
FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbc )
|
||||
FLOPPY_BBC_DFS_FORMAT,
|
||||
FLOPPY_BBC_CPM_FORMAT,
|
||||
FLOPPY_BBC_CPN_FORMAT,
|
||||
FLOPPY_ACORN_SSD_FORMAT,
|
||||
FLOPPY_ACORN_DSD_FORMAT,
|
||||
FLOPPY_OPUS_DDOS_FORMAT,
|
||||
FLOPPY_ACORN_CPM_FORMAT,
|
||||
FLOPPY_TORCH_CPN_FORMAT,
|
||||
FLOPPY_FSD_FORMAT
|
||||
FLOPPY_FORMATS_END
|
||||
FLOPPY_FORMATS_END0
|
||||
|
||||
FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbcm )
|
||||
FLOPPY_BBC_DFS_FORMAT,
|
||||
FLOPPY_BBC_ADFS_FORMAT,
|
||||
FLOPPY_BBC_CPM_FORMAT,
|
||||
FLOPPY_BBC_CPN_FORMAT,
|
||||
FLOPPY_BBC_DOS_FORMAT,
|
||||
FLOPPY_ACORN_SSD_FORMAT,
|
||||
FLOPPY_ACORN_DSD_FORMAT,
|
||||
FLOPPY_ACORN_ADFS_OLD_FORMAT,
|
||||
FLOPPY_ACORN_CPM_FORMAT,
|
||||
FLOPPY_TORCH_CPN_FORMAT,
|
||||
FLOPPY_ACORN_DOS_FORMAT,
|
||||
FLOPPY_FSD_FORMAT
|
||||
FLOPPY_FORMATS_END
|
||||
FLOPPY_FORMATS_END0
|
||||
|
||||
FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbcmc )
|
||||
FLOPPY_BBC_ADFS_FORMAT
|
||||
FLOPPY_FORMATS_END
|
||||
FLOPPY_ACORN_ADFS_OLD_FORMAT
|
||||
FLOPPY_FORMATS_END0
|
||||
|
||||
static SLOT_INTERFACE_START( bbc_floppies_525 )
|
||||
SLOT_INTERFACE("sssd", FLOPPY_525_SSSD)
|
||||
@ -772,21 +766,21 @@ WRITE_LINE_MEMBER(bbc_state::econet_clk_w)
|
||||
|
||||
// 4 x EPROM sockets (16K) in BBC-A, these should grow to 16 for BBC-B and later...
|
||||
static MACHINE_CONFIG_FRAGMENT( bbc_eprom_sockets )
|
||||
MCFG_GENERIC_SOCKET_ADD("exp_rom1", generic_linear_slot, "bbc_cart")
|
||||
MCFG_GENERIC_EXTENSIONS("bin,rom")
|
||||
MCFG_GENERIC_LOAD(bbc_state, exp1_load)
|
||||
MCFG_GENERIC_SOCKET_ADD("exp_rom1", generic_linear_slot, "bbc_cart")
|
||||
MCFG_GENERIC_EXTENSIONS("bin,rom")
|
||||
MCFG_GENERIC_LOAD(bbc_state, exp1_load)
|
||||
|
||||
MCFG_GENERIC_SOCKET_ADD("exp_rom2", generic_linear_slot, "bbc_cart")
|
||||
MCFG_GENERIC_EXTENSIONS("bin,rom")
|
||||
MCFG_GENERIC_LOAD(bbc_state, exp2_load)
|
||||
MCFG_GENERIC_SOCKET_ADD("exp_rom2", generic_linear_slot, "bbc_cart")
|
||||
MCFG_GENERIC_EXTENSIONS("bin,rom")
|
||||
MCFG_GENERIC_LOAD(bbc_state, exp2_load)
|
||||
|
||||
MCFG_GENERIC_SOCKET_ADD("exp_rom3", generic_linear_slot, "bbc_cart")
|
||||
MCFG_GENERIC_EXTENSIONS("bin,rom")
|
||||
MCFG_GENERIC_LOAD(bbc_state, exp3_load)
|
||||
MCFG_GENERIC_SOCKET_ADD("exp_rom3", generic_linear_slot, "bbc_cart")
|
||||
MCFG_GENERIC_EXTENSIONS("bin,rom")
|
||||
MCFG_GENERIC_LOAD(bbc_state, exp3_load)
|
||||
|
||||
MCFG_GENERIC_SOCKET_ADD("exp_rom4", generic_linear_slot, "bbc_cart")
|
||||
MCFG_GENERIC_EXTENSIONS("bin,rom")
|
||||
MCFG_GENERIC_LOAD(bbc_state, exp4_load)
|
||||
MCFG_GENERIC_SOCKET_ADD("exp_rom4", generic_linear_slot, "bbc_cart")
|
||||
MCFG_GENERIC_EXTENSIONS("bin,rom")
|
||||
MCFG_GENERIC_LOAD(bbc_state, exp4_load)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
@ -816,7 +810,7 @@ static MACHINE_CONFIG_START( bbca, bbc_state )
|
||||
|
||||
/* video hardware */
|
||||
MCFG_SCREEN_ADD("screen", RASTER)
|
||||
//MCFG_SCREEN_RAW_PARAMS( XTAL_17_73447MHz / 4, 1024, 80, 80 + 640 + 48, 625, 12, 12 + 256 + 13 )
|
||||
//MCFG_SCREEN_RAW_PARAMS( XTAL_17_73447MHz / 4, 1024, 5*16, 1024 - 3*16, 625, 12, 625 - 13 )
|
||||
MCFG_SCREEN_SIZE(640, 256)
|
||||
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 256-1)
|
||||
MCFG_SCREEN_REFRESH_RATE(50)
|
||||
@ -845,7 +839,7 @@ static MACHINE_CONFIG_START( bbca, bbc_state )
|
||||
/* sound hardware */
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
MCFG_SOUND_ADD("sn76489", SN76489, XTAL_16MHz/4) /* 4 MHz */
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||
|
||||
/* cassette */
|
||||
MCFG_CASSETTE_ADD( "cassette" )
|
||||
@ -860,7 +854,7 @@ static MACHINE_CONFIG_START( bbca, bbc_state )
|
||||
MCFG_DEVICE_ADD("acia6850", ACIA6850, 0)
|
||||
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(bbc_state, bbc_txd_w))
|
||||
MCFG_ACIA6850_RTS_HANDLER(WRITELINE(bbc_state, bbc_rts_w))
|
||||
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_acia6850_irq_w))
|
||||
MCFG_ACIA6850_IRQ_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE))
|
||||
|
||||
MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, nullptr)
|
||||
MCFG_RS232_RXD_HANDLER(WRITELINE(bbc_state, write_rxd_serial))
|
||||
@ -876,7 +870,7 @@ static MACHINE_CONFIG_START( bbca, bbc_state )
|
||||
MCFG_VIA6522_READPB_HANDLER(READ8(bbc_state, bbcb_via_system_read_portb))
|
||||
MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(bbc_state, bbcb_via_system_write_porta))
|
||||
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(bbc_state, bbcb_via_system_write_portb))
|
||||
MCFG_VIA6522_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_via_system_irq_w))
|
||||
MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE))
|
||||
|
||||
/* EPROM sockets */
|
||||
MCFG_FRAGMENT_ADD(bbc_eprom_sockets)
|
||||
@ -905,11 +899,11 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
|
||||
|
||||
/* user via */
|
||||
MCFG_DEVICE_ADD("via6522_1", VIA6522, XTAL_16MHz / 16)
|
||||
MCFG_VIA6522_READPB_HANDLER(READ8(bbc_state, bbcb_via_user_read_portb))
|
||||
MCFG_VIA6522_WRITEPA_HANDLER(DEVWRITE8("cent_data_out", output_latch_device, write))
|
||||
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(bbc_state, bbcb_via_user_write_portb))
|
||||
MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE("centronics", centronics_device, write_strobe))
|
||||
MCFG_VIA6522_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_via_user_irq_w))
|
||||
MCFG_VIA6522_READPB_HANDLER(READ8(bbc_state, bbcb_via_user_read_portb))
|
||||
MCFG_VIA6522_WRITEPA_HANDLER(DEVWRITE8("cent_data_out", output_latch_device, write))
|
||||
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(bbc_state, bbcb_via_user_write_portb))
|
||||
MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE("centronics", centronics_device, write_strobe))
|
||||
MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE))
|
||||
|
||||
/* adc */
|
||||
MCFG_DEVICE_ADD("upd7002", UPD7002, 0)
|
||||
@ -922,7 +916,7 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
|
||||
MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
|
||||
|
||||
/* fdc */
|
||||
MCFG_DEVICE_ADD("i8271" , I8271 , 0)
|
||||
MCFG_DEVICE_ADD("i8271", I8271, 0)
|
||||
MCFG_I8271_IRQ_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
|
||||
MCFG_I8271_HDL_CALLBACK(WRITELINE(bbc_state, motor_w))
|
||||
MCFG_I8271_OPT_CALLBACK(WRITELINE(bbc_state, side_w))
|
||||
@ -934,6 +928,7 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
|
||||
/* econet */
|
||||
MCFG_DEVICE_ADD("mc6854", MC6854, 0)
|
||||
MCFG_MC6854_OUT_TXD_CB(DEVWRITELINE(ECONET_TAG, econet_device, data_w))
|
||||
MCFG_MC6854_OUT_IRQ_CB(INPUTLINE("maincpu", M6502_NMI_LINE))
|
||||
MCFG_ECONET_ADD()
|
||||
MCFG_ECONET_CLK_CALLBACK(WRITELINE(bbc_state, econet_clk_w))
|
||||
MCFG_ECONET_DATA_CALLBACK(DEVWRITELINE("mc6854", mc6854_device, set_rx))
|
||||
@ -1093,6 +1088,9 @@ static MACHINE_CONFIG_DERIVED( acw443, bbcbp )
|
||||
MCFG_DEVICE_REMOVE("wd1770:1")
|
||||
|
||||
/* Add 32016 co-processor */
|
||||
//MCFG_DEVICE_MODIFY("tube")
|
||||
//MCFG_SLOT_DEFAULT_OPTION("32016copro")
|
||||
//MCFG_SLOT_FIXED(true)
|
||||
|
||||
/* Add ADAPTEC ACB-4000 Winchester Disc Controller */
|
||||
|
||||
@ -1116,6 +1114,9 @@ static MACHINE_CONFIG_DERIVED( abc310, bbcbp )
|
||||
MCFG_DEVICE_REMOVE("wd1770:1")
|
||||
|
||||
/* Add 80286 co-processor */
|
||||
//MCFG_DEVICE_MODIFY("tube")
|
||||
//MCFG_SLOT_DEFAULT_OPTION("80286copro")
|
||||
//MCFG_SLOT_FIXED(true)
|
||||
|
||||
/* Add ADAPTEC ACB-4000 Winchester Disc Controller */
|
||||
|
||||
@ -1219,7 +1220,7 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
|
||||
/* sound hardware */
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
MCFG_SOUND_ADD("sn76489", SN76489, XTAL_16MHz/4) /* 4 MHz */
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||
|
||||
/* rtc and cmos */
|
||||
MCFG_MC146818_ADD( "rtc", XTAL_32_768kHz )
|
||||
@ -1258,7 +1259,7 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
|
||||
MCFG_DEVICE_ADD("acia6850", ACIA6850, 0)
|
||||
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(bbc_state, bbc_txd_w))
|
||||
MCFG_ACIA6850_RTS_HANDLER(WRITELINE(bbc_state, bbc_rts_w))
|
||||
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_acia6850_irq_w))
|
||||
MCFG_ACIA6850_IRQ_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE))
|
||||
|
||||
MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, nullptr)
|
||||
MCFG_RS232_RXD_HANDLER(WRITELINE(bbc_state, write_rxd_serial))
|
||||
@ -1279,7 +1280,7 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
|
||||
MCFG_VIA6522_READPB_HANDLER(READ8(bbc_state, bbcb_via_system_read_portb))
|
||||
MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(bbc_state, bbcb_via_system_write_porta))
|
||||
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(bbc_state, bbcb_via_system_write_portb))
|
||||
MCFG_VIA6522_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_via_system_irq_w))
|
||||
MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE))
|
||||
|
||||
/* user via */
|
||||
MCFG_DEVICE_ADD("via6522_1", VIA6522, XTAL_16MHz / 16)
|
||||
@ -1287,7 +1288,7 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
|
||||
MCFG_VIA6522_WRITEPA_HANDLER(DEVWRITE8("cent_data_out", output_latch_device, write))
|
||||
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(bbc_state, bbcb_via_user_write_portb))
|
||||
MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE("centronics", centronics_device, write_strobe))
|
||||
MCFG_VIA6522_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_via_user_irq_w))
|
||||
MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE))
|
||||
|
||||
/* fdc */
|
||||
MCFG_WD1770_ADD("wd1770", XTAL_16MHz / 2)
|
||||
@ -1302,6 +1303,7 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
|
||||
/* econet */
|
||||
MCFG_DEVICE_ADD("mc6854", MC6854, 0)
|
||||
MCFG_MC6854_OUT_TXD_CB(DEVWRITELINE(ECONET_TAG, econet_device, data_w))
|
||||
MCFG_MC6854_OUT_IRQ_CB(INPUTLINE("maincpu", M6502_NMI_LINE))
|
||||
MCFG_ECONET_ADD()
|
||||
MCFG_ECONET_CLK_CALLBACK(WRITELINE(bbc_state, econet_clk_w))
|
||||
MCFG_ECONET_DATA_CALLBACK(DEVWRITELINE("mc6854", mc6854_device, set_rx))
|
||||
@ -1312,6 +1314,9 @@ MACHINE_CONFIG_END
|
||||
static MACHINE_CONFIG_DERIVED( bbcmt, bbcm )
|
||||
|
||||
/* Add 65C102 co-processor */
|
||||
//MCFG_DEVICE_MODIFY("tube_int")
|
||||
//MCFG_SLOT_DEFAULT_OPTION("65c102copro")
|
||||
//MCFG_SLOT_FIXED(true)
|
||||
|
||||
/* software lists */
|
||||
MCFG_SOFTWARE_LIST_ADD("flop_ls_65c102", "bbc_flop_65c102")
|
||||
@ -1321,6 +1326,9 @@ MACHINE_CONFIG_END
|
||||
static MACHINE_CONFIG_DERIVED( bbcmaiv, bbcm )
|
||||
|
||||
/* Add 65C102 co-processor */
|
||||
//MCFG_DEVICE_MODIFY("tube_int")
|
||||
//MCFG_SLOT_DEFAULT_OPTION("65c102copro")
|
||||
//MCFG_SLOT_FIXED(true)
|
||||
|
||||
/* Add Philips VP415 Laserdisc player */
|
||||
|
||||
@ -1364,6 +1372,9 @@ MACHINE_CONFIG_END
|
||||
static MACHINE_CONFIG_DERIVED( bbcm512, bbcm )
|
||||
|
||||
/* Add Intel 80186 co-processor */
|
||||
//MCFG_DEVICE_MODIFY("tube_int")
|
||||
//MCFG_SLOT_DEFAULT_OPTION("80186copro")
|
||||
//MCFG_SLOT_FIXED(true)
|
||||
|
||||
/* software lists */
|
||||
MCFG_SOFTWARE_LIST_ADD("flop_ls_80186", "bbc_flop_80186")
|
||||
@ -1622,7 +1633,7 @@ ROM_START(bbcb_us)
|
||||
/* rom page 9 24000 */
|
||||
/* rom page 10 28000 */
|
||||
/* rom page 11 2c000 */
|
||||
/* rom page 12 30000 IC72 VIEW */
|
||||
/* rom page 12 30000 IC72 VIEW2.1 */
|
||||
/* rom page 13 34000 IC73 US DNFS */
|
||||
/* rom page 14 38000 IC74 US BASIC */
|
||||
/* rom page 15 3c000 IC75 SPARE SOCKET */
|
||||
@ -1860,7 +1871,7 @@ ROM_START(bbcm)
|
||||
/* 34000 rom 13 IC24 ADFS */
|
||||
/* 38000 rom 14 IC24 View + MOS code */
|
||||
/* 3c000 rom 15 IC24 Terminal + Tube host + CFS */
|
||||
//ROM_LOAD("anfs424.rom", 0x20000, 0x4000, CRC(1b9f75fd) SHA1(875f71edd48f87c3a55371409d0cc2015d8b5853))
|
||||
//ROM_LOAD("anfs425-2201351.rom", 0x20000, 0x4000, CRC(c2a6655e) SHA1(14f75d36ffe9af14aaac42df55b4fe3729ba75cf))
|
||||
|
||||
ROM_REGION(0x4000, "os", 0)
|
||||
ROM_COPY("option", 0x40000, 0, 0x4000)
|
||||
@ -1973,7 +1984,7 @@ ROM_START(bbcmarm)
|
||||
/* 34000 rom 13 IC24 ADFS */
|
||||
/* 38000 rom 14 IC24 View + MOS code */
|
||||
/* 3c000 rom 15 IC24 Terminal + Tube host + CFS */
|
||||
//ROM_LOAD("anfs424.rom", 0x20000, 0x4000, CRC(1b9f75fd) SHA1(875f71edd48f87c3a55371409d0cc2015d8b5853))
|
||||
//ROM_LOAD("anfs425-2201351.rom", 0x20000, 0x4000, CRC(c2a6655e) SHA1(14f75d36ffe9af14aaac42df55b4fe3729ba75cf))
|
||||
|
||||
ROM_REGION(0x4000, "os", 0)
|
||||
ROM_COPY("option", 0x40000, 0, 0x4000)
|
||||
@ -2092,27 +2103,27 @@ ROM_START(pro128s)
|
||||
// ROM_LOAD("mos510o.epr", 0x00, 0x80, CRC(d8458039) SHA1(72c056d493e74ceca41f48936012b012b496a226))
|
||||
ROM_END
|
||||
|
||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
|
||||
COMP ( 1981, bbcb, 0, bbca, bbcb, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B w/8271 FDC", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1981, bbca, bbcb, 0, bbca, bbca, bbc_state, bbc, "Acorn", "BBC Micro Model A", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1982, torchf, bbcb, 0, torchf, torch, bbc_state, bbc, "Torch", "Torch CF240", MACHINE_IMPERFECT_KEYBOARD | MACHINE_NOT_WORKING)
|
||||
COMP ( 1982, torchh10, bbcb, 0, torchh10, torch, bbc_state, bbc, "Torch", "Torch CH240/10", MACHINE_IMPERFECT_KEYBOARD | MACHINE_NOT_WORKING)
|
||||
COMP ( 1982, torchh21, bbcb, 0, torchh21, torch, bbc_state, bbc, "Torch", "Torch CH240/21", MACHINE_IMPERFECT_KEYBOARD | MACHINE_NOT_WORKING)
|
||||
COMP ( 1982, bbcb_de, bbcb, 0, bbcb_de, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B (German)", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1983, bbcb_us, bbcb, 0, bbcb_us, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B (US)", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1984, bbcb1770, bbcb, 0, bbcb1770, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B w/1770 FDC", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1985, bbcbp, 0, bbcb, bbcbp, bbcbp, bbc_state, bbc, "Acorn", "BBC Micro Model B+ 64K", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1985, bbcbp128, bbcbp, 0, bbcbp128, bbcbp, bbc_state, bbc, "Acorn", "BBC Micro Model B+ 128K", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1985, abc110, bbcbp, 0, abc110, abc, bbc_state, bbc, "Acorn", "ABC 110", MACHINE_NOT_WORKING)
|
||||
COMP ( 1985, acw443, bbcbp, 0, acw443, abc, bbc_state, bbc, "Acorn", "ABC 210/Cambridge Workstation", MACHINE_NOT_WORKING)
|
||||
COMP ( 1985, abc310, bbcbp, 0, abc310, abc, bbc_state, bbc, "Acorn", "ABC 310", MACHINE_NOT_WORKING)
|
||||
COMP ( 1985, reutapm, bbcbp, 0, reutapm, bbcb, bbc_state, bbc, "Acorn", "Reuters APM", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING)
|
||||
COMP ( 1986, bbcm, 0, bbcb, bbcm, bbcm, bbc_state, bbc, "Acorn", "BBC Master 128", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1986, bbcmt, bbcm, 0, bbcmt, bbcm, bbc_state, bbc, "Acorn", "BBC Master Turbo", MACHINE_NOT_WORKING)
|
||||
COMP ( 1986, bbcmaiv, bbcm, 0, bbcmaiv, bbcm, bbc_state, bbc, "Acorn", "BBC Master AIV", MACHINE_NOT_WORKING)
|
||||
COMP ( 1986, bbcmet, bbcm, 0, bbcmet, bbcm, bbc_state, bbc, "Acorn", "BBC Master ET", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1986, bbcm512, bbcm, 0, bbcm512, bbcm, bbc_state, bbc, "Acorn", "BBC Master 512", MACHINE_NOT_WORKING)
|
||||
COMP ( 1986, bbcmarm, bbcm, 0, bbcmarm, bbcm, bbc_state, bbc, "Acorn", "ARM Evaluation System", MACHINE_NOT_WORKING)
|
||||
COMP ( 1986, bbcmc, 0, bbcm, bbcmc, bbcm, bbc_state, bbc, "Acorn", "BBC Master Compact", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1986, bbcmc_ar, bbcmc, 0, bbcmc, bbcm, bbc_state, bbc, "Acorn", "BBC Master Compact (Arabic)", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1987, pro128s, bbcmc, 0, pro128s, bbcm, bbc_state, bbc, "Olivetti", "Prodest PC 128S", MACHINE_IMPERFECT_GRAPHICS)
|
||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
|
||||
COMP ( 1981, bbcb, 0, bbca, bbcb, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B w/8271 FDC", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1981, bbca, bbcb, 0, bbca, bbca, bbc_state, bbc, "Acorn", "BBC Micro Model A", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1982, torchf, bbcb, 0, torchf, torch, bbc_state, bbc, "Torch Computers", "Torch CF240", MACHINE_IMPERFECT_KEYBOARD | MACHINE_NOT_WORKING)
|
||||
COMP ( 1982, torchh10, bbcb, 0, torchh10, torch, bbc_state, bbc, "Torch Computers", "Torch CH240/10", MACHINE_IMPERFECT_KEYBOARD | MACHINE_NOT_WORKING)
|
||||
COMP ( 1982, torchh21, bbcb, 0, torchh21, torch, bbc_state, bbc, "Torch Computers", "Torch CH240/21", MACHINE_IMPERFECT_KEYBOARD | MACHINE_NOT_WORKING)
|
||||
COMP ( 1982, bbcb_de, bbcb, 0, bbcb_de, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B (German)", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1983, bbcb_us, bbcb, 0, bbcb_us, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B (US)", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1984, bbcb1770, bbcb, 0, bbcb1770, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B w/1770 FDC", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1985, bbcbp, 0, bbcb, bbcbp, bbcbp, bbc_state, bbc, "Acorn", "BBC Micro Model B+ 64K", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1985, bbcbp128, bbcbp, 0, bbcbp128, bbcbp, bbc_state, bbc, "Acorn", "BBC Micro Model B+ 128K", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1985, abc110, bbcbp, 0, abc110, abc, bbc_state, bbc, "Acorn", "ABC 110", MACHINE_NOT_WORKING)
|
||||
COMP ( 1985, acw443, bbcbp, 0, acw443, abc, bbc_state, bbc, "Acorn", "ABC 210/Cambridge Workstation", MACHINE_NOT_WORKING)
|
||||
COMP ( 1985, abc310, bbcbp, 0, abc310, abc, bbc_state, bbc, "Acorn", "ABC 310", MACHINE_NOT_WORKING)
|
||||
COMP ( 1985, reutapm, bbcbp, 0, reutapm, bbcb, bbc_state, bbc, "Acorn", "Reuters APM", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING)
|
||||
COMP ( 1986, bbcm, 0, bbcb, bbcm, bbcm, bbc_state, bbc, "Acorn", "BBC Master 128", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1986, bbcmt, bbcm, 0, bbcmt, bbcm, bbc_state, bbc, "Acorn", "BBC Master Turbo", MACHINE_NOT_WORKING)
|
||||
COMP ( 1986, bbcmaiv, bbcm, 0, bbcmaiv, bbcm, bbc_state, bbc, "Acorn", "BBC Master AIV", MACHINE_NOT_WORKING)
|
||||
COMP ( 1986, bbcmet, bbcm, 0, bbcmet, bbcm, bbc_state, bbc, "Acorn", "BBC Master ET", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1986, bbcm512, bbcm, 0, bbcm512, bbcm, bbc_state, bbc, "Acorn", "BBC Master 512", MACHINE_NOT_WORKING)
|
||||
COMP ( 1986, bbcmarm, bbcm, 0, bbcmarm, bbcm, bbc_state, bbc, "Acorn", "ARM Evaluation System", MACHINE_NOT_WORKING)
|
||||
COMP ( 1986, bbcmc, 0, bbcm, bbcmc, bbcm, bbc_state, bbc, "Acorn", "BBC Master Compact", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1986, bbcmc_ar, bbcmc, 0, bbcmc, bbcm, bbc_state, bbc, "Acorn", "BBC Master Compact (Arabic)", MACHINE_IMPERFECT_GRAPHICS)
|
||||
COMP ( 1987, pro128s, bbcmc, 0, pro128s, bbcm, bbc_state, bbc, "Olivetti", "Prodest PC 128S", MACHINE_IMPERFECT_GRAPHICS)
|
||||
|
Loading…
Reference in New Issue
Block a user