From 9104c9d52336a879ad4dc519af003833acb63eca Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Sat, 16 Jul 2016 19:36:38 +0100 Subject: [PATCH] renamed bbc_dsk to acorn_dsk - split ssd/dsd formats - added opus ddos format - split adfs into oldmap and newmap formats for archimedes - logging --- scripts/src/lib.lua | 4 +- src/lib/formats/acorn_dsk.cpp | 665 ++++++++++++++++++++++++++++++++++ src/lib/formats/acorn_dsk.h | 154 ++++++++ src/lib/formats/bbc_dsk.cpp | 411 --------------------- src/lib/formats/bbc_dsk.h | 103 ------ src/mame/drivers/a310.cpp | 12 +- src/mame/drivers/bbc.cpp | 199 +++++----- 7 files changed, 933 insertions(+), 615 deletions(-) create mode 100644 src/lib/formats/acorn_dsk.cpp create mode 100644 src/lib/formats/acorn_dsk.h delete mode 100644 src/lib/formats/bbc_dsk.cpp delete mode 100644 src/lib/formats/bbc_dsk.h diff --git a/scripts/src/lib.lua b/scripts/src/lib.lua index 394fe189038..00bc51897d8 100644 --- a/scripts/src/lib.lua +++ b/scripts/src/lib.lua @@ -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", diff --git a/src/lib/formats/acorn_dsk.cpp b/src/lib/formats/acorn_dsk.cpp new file mode 100644 index 00000000000..5321cc00ea9 --- /dev/null +++ b/src/lib/formats/acorn_dsk.cpp @@ -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; +const floppy_format_type FLOPPY_ACORN_DSD_FORMAT = &floppy_image_format_creator; +const floppy_format_type FLOPPY_OPUS_DDOS_FORMAT = &floppy_image_format_creator; +const floppy_format_type FLOPPY_ACORN_ADFS_OLD_FORMAT = &floppy_image_format_creator; +const floppy_format_type FLOPPY_ACORN_ADFS_NEW_FORMAT = &floppy_image_format_creator; +const floppy_format_type FLOPPY_ACORN_DOS_FORMAT = &floppy_image_format_creator; +const floppy_format_type FLOPPY_ACORN_CPM_FORMAT = &floppy_image_format_creator; +const floppy_format_type FLOPPY_TORCH_CPN_FORMAT = &floppy_image_format_creator; diff --git a/src/lib/formats/acorn_dsk.h b/src/lib/formats/acorn_dsk.h new file mode 100644 index 00000000000..8982169a31b --- /dev/null +++ b/src/lib/formats/acorn_dsk.h @@ -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__ diff --git a/src/lib/formats/bbc_dsk.cpp b/src/lib/formats/bbc_dsk.cpp deleted file mode 100644 index 9b05f14f0be..00000000000 --- a/src/lib/formats/bbc_dsk.cpp +++ /dev/null @@ -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; -const floppy_format_type FLOPPY_BBC_ADFS_FORMAT = &floppy_image_format_creator; -const floppy_format_type FLOPPY_BBC_DOS_FORMAT = &floppy_image_format_creator; -const floppy_format_type FLOPPY_BBC_CPM_FORMAT = &floppy_image_format_creator; -const floppy_format_type FLOPPY_BBC_CPN_FORMAT = &floppy_image_format_creator; diff --git a/src/lib/formats/bbc_dsk.h b/src/lib/formats/bbc_dsk.h deleted file mode 100644 index 7ce8112f36c..00000000000 --- a/src/lib/formats/bbc_dsk.h +++ /dev/null @@ -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__ diff --git a/src/mame/drivers/a310.cpp b/src/mame/drivers/a310.cpp index 3202bd6d510..4b5f27395c1 100644 --- a/src/mame/drivers/a310.cpp +++ b/src/mame/drivers/a310.cpp @@ -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") diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp index c510fb29b54..57544d47ba9 100644 --- a/src/mame/drivers/bbc.cpp +++ b/src/mame/drivers/bbc.cpp @@ -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)