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:
Nigel Barnes 2016-07-16 19:36:38 +01:00
parent de7c161add
commit 9104c9d523
7 changed files with 933 additions and 615 deletions

View File

@ -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",

View 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
View 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__

View File

@ -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>;

View File

@ -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__

View File

@ -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")

View File

@ -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)