diff --git a/hash/msx1_cart.xml b/hash/msx1_cart.xml index 1fb47aee4a9..2ca9dc41cc3 100644 --- a/hash/msx1_cart.xml +++ b/hash/msx1_cart.xml @@ -674,7 +674,6 @@ Xyzolog - Electric Software 1986 ASCII - @@ -682,6 +681,9 @@ Xyzolog - Electric Software + + + @@ -16231,12 +16233,321 @@ legacy FM implementations cannot find it. + + + + Toshiba Kanji ROM Cartridge HX-M200 (Japan) + 1984 + Toshiba + + + + + + + + + + + EC-700 Word Processor (EC-701 + EC-702) (Japan) + 1985 + Konami + + + + + + + + + + + + + + + + + + + + + DPF-550 Controller + 5.25" SSDD floppy drive (Belgium/Netherlands) + 1985 + AVT + + + + + + + + + + + + CDX-2 + 5.25" DSDD floppy drive (Brazil) + 19?? + Microsol + + + + + + + + + + + + DDX + 5.25" DSDD floppy drive (Brazil, v3.0d) + 19?? + Digital Design + + + + + + + + + + + + DDX + 5.25" DSDD floppy drive (Brazil, v3.0) + 19?? + Digital Design + + + + + + + + + + + FD-03 Controller + 3.5" DSDD floppy drive v3.8 + 1986 + Yamaha + + + + + + + + + + + + FD-03 Controller + 3.5" DSDD floppy drive v3.5 + 1986 + Yamaha + + + + + + + + + + + + FD-051 Controller + FD-05 3.5" DSDD floppy drive + 1985 + Yamaha + + + + + + + + + + + FS-FD1 (Floppy controller + 3.5" DSDD floppy drive) (Japan) + 1987 + Panasonic + + + + + + + + + + + + FS-FD1A (3.5" DSDD floppy drive with integrated controller) (Japan) + 1987 + Panasonic + + + + + + + + + + + + + FS-CF351 Controller + FS-FD351 DSDD 3.5" Floppy drive (Japan) + 1985 + National + + + + + + + + + + + + + HB-3600 Controller + HB-6000 5.25" DSDD floppy drive (Brazil) + 19?? + Sharp + + + + + + + + + + HBD-20W (Floppy controller + 3.5" DSDD floppy drive) (Japan) + 1987 + Sony + + + + + + + + + + + + HBD-50 (Floppy controller + 3.5" SSDD floppy drive, SNYJX121) + 1984 + Sony + + + + + + + + + + + HBD-F1 (Floppy controller + 3.5" DSDD floppy drive) (Japan) + 1988 + Sony + + + + + + + + + + + + HX-F101PE Controller + 3.5" SSDD floppy drive (Europe) + 1985 + Toshiba + + + + + + + + + + + MFD-001 (Controller + enclosure with 1 5.25" DSDD floppy drive) (Europe) + 19?? + Sanyo + + + + + + + + + + + ML-30DC Controller + ML-30FD enclosure with 1 3.5" DSDD floppy drive (Japan) + 1985 + Mitsubishi + + + + + + + + + + + NMS-1200 Floppy controller + 3.5" DSDD floppy drive (Europe, v1.06) + 19?? + Philips + + + + + + + + + + + NMS-1200 Floppy controller + 3.5" DSDD floppy drive (Europe, v1.04) + 19?? + Philips + + + + + + + + + + + DPF-550 Controller + 5.25" SSDD floppy drive (Argentina) + 19?? + Talent + + + + + + + + + - VY-0010 (Floppy controller + 3.5" SSDD floppy drive) - 198? + VY-0010 (Floppy controller + 3.5" SSDD floppy drive) (Europe) + 1985 Philips @@ -16246,65 +16557,6 @@ legacy FM implementations cannot find it. - - - - - - FS-FD1 (Floppy controller + 3.5" DSDD floppy drive) - 198? - Panasonic - - - - - - - - - - - - FS-FD1A (3.5" DSDD floppy drive with integrated controller) - 198? - Panasonic - - - - - - - - - - - - FS-CF351 Controller + FS-FD351 DSDD 3.5" Floppy drive - 198? - National - - - - - - - - diff --git a/hash/msx1_flop.xml b/hash/msx1_flop.xml index 517cf45aa4a..404da8a054b 100644 --- a/hash/msx1_flop.xml +++ b/hash/msx1_flop.xml @@ -135,18 +135,7 @@ The following floppies came with the machines. - - MSX-DOS Tools (Bra, v4.3) - 1991 - Nemesis Informatica - - - - - - - - + MSX-DOS Tools (Bra, v2.1) 1984 Nemesis Informatica diff --git a/hash/msx1_flop_525.xml b/hash/msx1_flop_525.xml new file mode 100644 index 00000000000..37b43752a61 --- /dev/null +++ b/hash/msx1_flop_525.xml @@ -0,0 +1,22 @@ + + + + + + + + MSX-DOS Tools (Brazil, v4.3) + 1991 + Nemesis Informatica + + + + + + + + diff --git a/src/devices/bus/msx_cart/cartridge.cpp b/src/devices/bus/msx_cart/cartridge.cpp index a764f61f03c..e3488ba22ef 100644 --- a/src/devices/bus/msx_cart/cartridge.cpp +++ b/src/devices/bus/msx_cart/cartridge.cpp @@ -34,16 +34,13 @@ void msx_cart(device_slot_interface &device) { + msx_cart_disk_register_options(device); device.option_add_internal("arc", MSX_CART_ARC); device.option_add_internal("ascii8", MSX_CART_ASCII8); device.option_add_internal("ascii8_sram", MSX_CART_ASCII8_SRAM); device.option_add_internal("ascii16", MSX_CART_ASCII16); device.option_add_internal("ascii16_sram", MSX_CART_ASCII16_SRAM); device.option_add_internal("cross_blaim", MSX_CART_CROSSBLAIM); - device.option_add_internal("disk_vy0010", MSX_CART_VY0010); - device.option_add_internal("disk_fsfd1", MSX_CART_FSFD1); - device.option_add_internal("disk_fsfd1a", MSX_CART_FSFD1A); - device.option_add_internal("disk_fscf351", MSX_CART_FSCF351); device.option_add_internal("dooly", MSX_CART_DOOLY); device.option_add_internal("easispeech", MSX_CART_EASISPEECH); device.option_add_internal("fmpac", MSX_CART_FMPAC); @@ -73,6 +70,7 @@ void msx_cart(device_slot_interface &device) device.option_add_internal("super_swangi", MSX_CART_SUPER_SWANGI); device.option_add_internal("superloderunner", MSX_CART_SUPERLODERUNNER); device.option_add_internal("synthesizer", MSX_CART_SYNTHESIZER); + device.option_add_internal("ec701", MSX_CART_EC701); device.option_add("bm_012", MSX_CART_BM_012); device.option_add("moonsound", MSX_CART_MOONSOUND); } diff --git a/src/devices/bus/msx_cart/disk.cpp b/src/devices/bus/msx_cart/disk.cpp index bff8716439f..9b451b09101 100644 --- a/src/devices/bus/msx_cart/disk.cpp +++ b/src/devices/bus/msx_cart/disk.cpp @@ -5,23 +5,38 @@ * MSX Floopy drive interface add-on cartridges * * Currently supported: - * - National FS-CF351 + FS-FD351 - MB8877A - DSDD 3.5" Floppy drive + interface - * - Panasonic FS-FD1 - WD2793? - DSDD 3.5" Floppy drive + interface - * - Panasonic FS-FD1A - TC8566F - DSDD 3.5" Floppy drive with builtin interface + * - AVT DPF-550 + DD 5.25" Drive - FD1770 or FD179x? + * - Digital Design Drive DDX + DD 5.25" Drive - WD2793 + * - Microsol CDX-2 + DD 5.25" Drive - WD2793? + * - Mitsubishi ML-30DC + ML-30FD DSDD 3.5" Drive - WD2793 + * - National FS-CF351 + FS-FD351 DSDD 3.5" Drive - MB8877A + * - Panasonic FS-FD1 + DSDD 3.5" Drive - WD2793? + * - Panasonic FS-FD1A with DSDD 3.5" Drive - TC8566F * - Rom label reads: "FDC BIOS V1.0 / COPYRIGHT MEI / 1987 DASFD1AA1" + * - Philips NMS-1200 - Floppy interface - WD2793? * - Philips VY-0010 (Interface cartridge + 1 3.5" SS floppy drive) + * - Sanyo MFD-001 + DS 5.25" Drive - MB8877? + * - Sharp Epcom HB-3600 + HB-6000 DD 5.25" Drive - WD2793 + * - Sony HBD-20W + DSDD 3.5" Drive - WD2793 + * - Sony HBD-50 + SSDD 3.5" Drive - WD2793 + * - Missing version SNYJX130 + * - Sony HBD-F1 + DSDD 3.5" Drive - WD2793 + * - Talent DPF-550 + SS 5.25" Drive - WD1770 + * - Toshiba HX-F101PE + SS 3.5" Drive - WD2793 + * - Yamaha FD-03 + SSDD 3.5" Floppy drive - FD1793 (according to service manual) + * - Yamaha FD-051 + FD-05 DSDD 3.5" Drive - WD2793 + * - Loading seems slower than other units * * Not supported yet: * - Canon VF-100 - DSDD 3.5" Floppy drive + interface + 1 floppy disk containing MSX-DOS - * - Talent DPF-550/5 - WD1772 - DSDD 5.25" Floppy drive (360KB) plus interface (manufactured by Daewoo) - * - Rom label markings: MSX DISK / DPF 555D + * - Talent DPF-555 - WD1772 - DSDD 5.25" Floppy drive (360KB) plus interface (manufactured by Daewoo) + * - Rom label markings: MSX DISK / DPF 555D * * Drive only: * - Philps VY-0011 - 3.5" SSDD Floppy drive * - Talent DPF-560 - DSDD 5.25" Floppy drive * * To be investigated: - * - AVT DPF-500 - WD1772? - DD 5.25" Floppy drive + interface + 1 floppy disk containing MSX-DOS * - Daewoo CPF-350C - DD 3.5" Floppy drive * - Daewoo CPF-360C - DD 3.5" Floppy drive * - Daewoo MPF-550 - DSDD 5.25" Floppy drive + interface @@ -32,37 +47,24 @@ * - Hitachi MPF-310CH - DSDD Floppy drive * - hitachi MPC-310CH - Interface for MPF-310CH * - JVC HC-F303 - Floppy drive - * - Mitsubishi ML-30FD - DSDD 3.5" Floppy drive - * - Mitsubishi ML-30DC - Floppy interface - * - Philips NMS-1200 - Floppy interface * - Philips NMS-9111 - 3.5" Floppy drive * - Philips NMS-9113 - 3.5" Floppy drive * - Sakir AFD-01 - SSDD 3.5" Floppy drive - * - Sanyo MFD-001 - 360KB 5.25" Floppy drive + interface? * - Sanyo MFD-002 - 360KB 5.25" Floppy drive (2nd drive for MFD-001?) * - Sanyo MFD-25FD - DSDD 3.5" Floppy drive * - Sanyo MFD-35 - SSDD 3.5" Floppy drive + interface - * - Sharp Epcom HB-3600 - WD2793 - Floppy interface Intended to be used with HB-6000 (5.25" SS? drive), Brazil - * - Sold as part of HB-3600 + HB-6000 bundle according to wikipedia - * - Sharp Epcom HB-6000 - 360KB 5.25" drive - * - Sony HBD-100 - SSDD 3.5" Floppy drivbe - * - Sony HBD-20W - DSDD 3.5" Floppy drive + * - Sony HBD-100 - SSDD 3.5" Floppy drive * - Sony HBD-30X/30W - DSDD 3.5" drive - * - Sony HBD-50 - SSDD 3.5" drive (drive only?) - * - Sony HBD-F1 (interface only?) - WD2793 - 3.5" DSDD drive?? * - Sony HBX-30 (interface only, meant for 30W) - WD2793 - * - Sony WS2793-02 - WD2793? - Interface for HBD-50 * - Spectravideo SVI-213 - MB8877A - Floppy interface for SVI-707 * - Spectravideo SVI-707 - MB8877A - 5.25" SSDD? drive (320KB) - There seem to be 2 ROMs on the PCB, apparently one is for MSX and one is for CP/M operation? * - See https://plus.google.com/photos/115644813183575095400/albums/5223347091895442113?banner=pwa * - Spectravideo SVI-717 - Interface for 2 drives? * - Spectravideo SVI-787 - SSDD 3.5" Floppy drive * - Spectravideo SVI-801 - Interface - * - Toshiba HX-F100 - Floppy drive - * - Toshiba HX-F101 - SSDD 3.5" Floppy drive + interface - * - Yamaha FD-01 - SSDD 3.5" Floppy drive - * - Yamaha FD-03 - DSDD 3.5" Floppy drive - * - Yamaha FD-05 - DSDD 3.5" Floppy drive + * - Toshiba HX-F100 - Interface + SSDD 3.5" Floppy drive + * - Toshiba HX-F101 - Interface + SSDD or DSDD 3.5" Floppy drive + * - Yamaha FD-01 - Interface + SSDD 3.5" Floppy drive * - Other models: * - ACVS 3.5" Floppy drive interface * - Tradeco floppy interface @@ -83,7 +85,6 @@ * - Microsol DRX-360 5.25" Floppy drive FD * - Microsol DRX-720 5.25" Floppy drive 80 track (720KB) * - Microsol CDX-1 floppy interface - * - Microsol CDX-2 floppy interface * - Racidata 3.5" Floppy drive * - Racidata 5.25" Floppy drive * - Racidata floppy interface @@ -102,21 +103,55 @@ #include "emu.h" #include "disk.h" +#include "bus/msx_cart/cartridge.h" #include "formats/dmk_dsk.h" #include "formats/msx_dsk.h" +#include "imagedev/floppy.h" +#include "machine/wd_fdc.h" +#include "machine/upd765.h" #include "softlist_dev.h" -DEFINE_DEVICE_TYPE(MSX_CART_VY0010, msx_cart_vy0010_device, "msx_cart_vy0010", "MSX Cartridge - VY0010") -DEFINE_DEVICE_TYPE(MSX_CART_FSFD1, msx_cart_fsfd1_device, "msx_cart_fsfd1", "MSX Cartridge - FS-FD1") -DEFINE_DEVICE_TYPE(MSX_CART_FSFD1A, msx_cart_fsfd1a_device, "msx_cart_fsfd1a", "MSX Cartridge - FS-FD1A") -DEFINE_DEVICE_TYPE(MSX_CART_FSCF351, msx_cart_fscf351_device, "msx_cart_fscf351", "MSX Cartridge - FS-CF351") + +DECLARE_DEVICE_TYPE(MSX_CART_AVDPF550, msx_cart_avdpf550_device) +DECLARE_DEVICE_TYPE(MSX_CART_CDX2, msx_cart_cdx2_device) +DECLARE_DEVICE_TYPE(MSX_CART_DDX3, msx_cart_ddx3_device) +DECLARE_DEVICE_TYPE(MSX_CART_FD03, msx_cart_fd03_device) +DECLARE_DEVICE_TYPE(MSX_CART_FD051, msx_cart_fd051_device) +DECLARE_DEVICE_TYPE(MSX_CART_FSCF351, msx_cart_fscf351_device) +DECLARE_DEVICE_TYPE(MSX_CART_FSFD1, msx_cart_fsfd1_device) +DECLARE_DEVICE_TYPE(MSX_CART_FSFD1A, msx_cart_fsfd1a_device) +DECLARE_DEVICE_TYPE(MSX_CART_HB3600, msx_cart_hb3600_device) +DECLARE_DEVICE_TYPE(MSX_CART_HBD20W, msx_cart_hbd20w_device) +DECLARE_DEVICE_TYPE(MSX_CART_HBD50, msx_cart_hbd50_device) +DECLARE_DEVICE_TYPE(MSX_CART_HBDF1, msx_cart_hbdf1_device) +DECLARE_DEVICE_TYPE(MSX_CART_HXF101PE, msx_cart_hxf101pe_device) +DECLARE_DEVICE_TYPE(MSX_CART_MFD001, msx_cart_mfd001_device) +DECLARE_DEVICE_TYPE(MSX_CART_ML30DC, msx_cart_ml30dc_device) +DECLARE_DEVICE_TYPE(MSX_CART_NMS1200, msx_cart_nms1200_device) +DECLARE_DEVICE_TYPE(MSX_CART_TADPF550, msx_cart_tadpf550_device) +DECLARE_DEVICE_TYPE(MSX_CART_VY0010, msx_cart_vy0010_device) -void msx_cart_disk_device::floppy_formats(format_registration &fr) +void msx_cart_disk_register_options(device_slot_interface &device) { - fr.add_mfm_containers(); - fr.add(FLOPPY_MSX_FORMAT); - fr.add(FLOPPY_DMK_FORMAT); + device.option_add_internal("disk_avdpf550", MSX_CART_AVDPF550); + device.option_add_internal("disk_cdx2", MSX_CART_CDX2); + device.option_add_internal("disk_ddx3", MSX_CART_DDX3); + device.option_add_internal("disk_fd03", MSX_CART_FD03); + device.option_add_internal("disk_fd051", MSX_CART_FD051); + device.option_add_internal("disk_fscf351", MSX_CART_FSCF351); + device.option_add_internal("disk_fsfd1", MSX_CART_FSFD1); + device.option_add_internal("disk_fsfd1a", MSX_CART_FSFD1A); + device.option_add_internal("disk_hb3600", MSX_CART_HB3600); + device.option_add_internal("disk_hbd20w", MSX_CART_HBD20W); + device.option_add_internal("disk_hbd50", MSX_CART_HBD50); + device.option_add_internal("disk_hbdf1", MSX_CART_HBDF1); + device.option_add_internal("disk_hxf101pe", MSX_CART_HXF101PE); + device.option_add_internal("disk_mfd001", MSX_CART_MFD001); + device.option_add_internal("disk_ml30dc", MSX_CART_ML30DC); + device.option_add_internal("disk_nms1200", MSX_CART_NMS1200); + device.option_add_internal("disk_tadpf550", MSX_CART_TADPF550); + device.option_add_internal("disk_vy0010", MSX_CART_VY0010); } @@ -124,74 +159,57 @@ static void msx_floppies(device_slot_interface &device) { device.option_add("35dd", FLOPPY_35_DD); device.option_add("35ssdd", FLOPPY_35_SSDD); + device.option_add("525dd", FLOPPY_525_DD); + device.option_add("525ssdd", FLOPPY_525_SSDD); } -msx_cart_disk_device::msx_cart_disk_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) - : device_t(mconfig, type, tag, owner, clock) - , msx_cart_interface(mconfig, *this) - , m_floppy0(*this, "fdc:0") - , m_floppy1(*this, "fdc:1") - , m_floppy(nullptr) + +class msx_cart_disk_device : public device_t, public msx_cart_interface { -} +public: + virtual void initialize_cartridge() override; +protected: + msx_cart_disk_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int fdc_regs_start_page, int fdc_regs_end_page) + : device_t(mconfig, type, tag, owner, clock) + , msx_cart_interface(mconfig, *this) + , m_floppy0(*this, "fdc:0") + , m_floppy1(*this, "fdc:1") + , m_floppy(nullptr) + , m_fdc_regs_start_page(fdc_regs_start_page) + , m_fdc_regs_end_page(fdc_regs_end_page) + { } -msx_cart_disk_wd_device::msx_cart_disk_wd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) - : msx_cart_disk_device(mconfig, type, tag, owner, clock) - , m_fdc(*this, "fdc") + static void floppy_formats(format_registration &fr); + void softlist_35(machine_config &config); + void softlist_525(machine_config &config); + template void add_floppy_mconfig(machine_config &config); + + static constexpr int PAGE0 = 0; + static constexpr int PAGE1 = 1; + static constexpr int PAGE2 = 2; + static constexpr int PAGE3 = 3; + static constexpr bool F35 = true; + static constexpr bool F525 = false; + static constexpr bool DS = true; + static constexpr bool SS = false; + static constexpr bool FORCE_READY = true; + + required_device m_floppy0; + optional_device m_floppy1; + floppy_image_device *m_floppy; + int m_fdc_regs_start_page; + int m_fdc_regs_end_page; +}; + +void msx_cart_disk_device::floppy_formats(format_registration &fr) { + fr.add_mfm_containers(); + fr.add(FLOPPY_MSX_FORMAT); + fr.add(FLOPPY_DMK_FORMAT); } - -msx_cart_disk_type1_device::msx_cart_disk_type1_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) - : msx_cart_disk_wd_device(mconfig, type, tag, owner, clock) - , m_led(*this, "led0") - , m_side_control(0) - , m_control(0) -{ -} - - -msx_cart_disk_type2_device::msx_cart_disk_type2_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) - : msx_cart_disk_wd_device(mconfig, type, tag, owner, clock) - , m_led(*this, "led0") - , m_control(0) -{ -} - - -msx_cart_vy0010_device::msx_cart_vy0010_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : msx_cart_disk_type1_device(mconfig, MSX_CART_VY0010, tag, owner, clock) -{ -} - - -msx_cart_fsfd1_device::msx_cart_fsfd1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : msx_cart_disk_type1_device(mconfig, MSX_CART_FSFD1, tag, owner, clock) -{ -} - - -msx_cart_fscf351_device::msx_cart_fscf351_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : msx_cart_disk_type2_device(mconfig, MSX_CART_FSCF351, tag, owner, clock) -{ -} - - -msx_cart_disk_tc8566_device::msx_cart_disk_tc8566_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) - : msx_cart_disk_device(mconfig, type, tag, owner, clock) - , m_fdc(*this, "fdc") -{ -} - - -msx_cart_fsfd1a_device::msx_cart_fsfd1a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : msx_cart_disk_tc8566_device(mconfig, MSX_CART_FSFD1A, tag, owner, clock) -{ -} - - void msx_cart_disk_device::initialize_cartridge() { if (get_rom_size() != 0x4000) @@ -200,77 +218,107 @@ void msx_cart_disk_device::initialize_cartridge() } } - -void msx_cart_vy0010_device::device_add_mconfig(machine_config &config) +void msx_cart_disk_device::softlist_35(machine_config &config) { - // From VY-0010 schematic: - // HLT pulled high - // SSO/-ENMF + -DDEN + ENP + -5/8 - pulled low - // READY inverted in VY-0010 cartridge and pulled low on VY-0010/VY-0011 floppy drive - WD2793(config, m_fdc, 4_MHz_XTAL / 4); - m_fdc->set_force_ready(true); - - // Single sided 3.5" floppy drive - FLOPPY_CONNECTOR(config, "fdc:0", msx_floppies, "35ssdd", msx_cart_disk_device::floppy_formats); - // Attach software lists // We do not know in what kind of machine the user has inserted the floppy interface // so we list all msx floppy software lists. // - SOFTWARE_LIST(config, "flop_list").set_original("msx2_flop"); + SOFTWARE_LIST(config, "msx2_flop_list").set_original("msx2_flop"); SOFTWARE_LIST(config, "msx1_flop_list").set_compatible("msx1_flop"); } - -void msx_cart_fsfd1_device::device_add_mconfig(machine_config &config) +void msx_cart_disk_device::softlist_525(machine_config &config) { - WD2793(config, m_fdc, 4_MHz_XTAL / 4); - - // Double sided 3.5" floppy drive - FLOPPY_CONNECTOR(config, "fdc:0", msx_floppies, "35dd", msx_cart_disk_device::floppy_formats); - // Attach software lists - // We do not know in what kind of machine the user has inserted the floppy interface - // so we list all msx floppy software lists. - // - SOFTWARE_LIST(config, "flop_list").set_original("msx2_flop"); - SOFTWARE_LIST(config, "msx1_flop_list").set_compatible("msx1_flop"); + SOFTWARE_LIST(config, "msx1_flop_525_list").set_compatible("msx1_flop_525"); } - -void msx_cart_fsfd1a_device::device_add_mconfig(machine_config &config) +template +void msx_cart_disk_device::add_floppy_mconfig(machine_config &config) { - TC8566AF(config, m_fdc, 16'000'000); - - // Double sided 3.5" floppy drive - FLOPPY_CONNECTOR(config, "fdc:0", msx_floppies, "35dd", msx_cart_disk_device::floppy_formats); - - // Attach software lists - // We do not know in what kind of machine the user has inserted the floppy interface - // so we list all msx floppy software lists. - // - SOFTWARE_LIST(config, "flop_list").set_original("msx2_flop"); - SOFTWARE_LIST(config, "msx1_flop_list").set_compatible("msx1_flop"); + FLOPPY_CONNECTOR(config, "fdc:0", msx_floppies, Is35 ? (IsDS ? "35dd" : "35ssdd") : (IsDS ? "525dd" : "525ssdd"), msx_cart_disk_device::floppy_formats); + if (Is35) + softlist_35(config); + else + softlist_525(config); } -void msx_cart_fscf351_device::device_add_mconfig(machine_config &config) + + +class msx_cart_disk_tc8566_device : public msx_cart_disk_device { - MB8877(config, m_fdc, 4_MHz_XTAL / 4); - m_fdc->set_force_ready(true); +protected: + msx_cart_disk_tc8566_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_device(mconfig, type, tag, owner, clock, PAGE1, PAGE2) + , m_fdc(*this, "fdc") + { } - // Double sided 3.5" floppy drive - FLOPPY_CONNECTOR(config, "fdc:0", msx_floppies, "35dd", msx_cart_disk_device::floppy_formats); + required_device m_fdc; +}; - // Attach software lists - // We do not know in what kind of machine the user has inserted the floppy interface - // so we list all msx floppy software lists. - // - SOFTWARE_LIST(config, "flop_list").set_original("msx2_flop"); - SOFTWARE_LIST(config, "msx1_flop_list").set_compatible("msx1_flop"); -} +class msx_cart_disk_wd_device : public msx_cart_disk_device +{ +protected: + msx_cart_disk_wd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int fdc_regs_start_page = PAGE1, int fdc_regs_end_page = PAGE2) + : msx_cart_disk_device(mconfig, type, tag, owner, clock, fdc_regs_start_page, fdc_regs_end_page) + , m_fdc(*this, "fdc") + { } + + required_device m_fdc; + + virtual void device_reset() override + { + m_fdc->dden_w(false); + } + + template void add_mconfig(machine_config &config, FDCType &&type) + { + add_mconfig(config, type); + } + + template void add_mconfig(machine_config &config, FDCType &&type) + { + std::forward(type)(config, m_fdc, 4_MHz_XTAL / 4); + if (ForceReady) + m_fdc->set_force_ready(true); + add_floppy_mconfig(config); + } +}; + + + +class msx_cart_disk_type1_device : public msx_cart_disk_wd_device +{ +public: + virtual void initialize_cartridge() override; + +protected: + msx_cart_disk_type1_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int fdc_regs_start_page = PAGE1, int fdc_regs_end_page = PAGE2) + : msx_cart_disk_wd_device(mconfig, type, tag, owner, clock, fdc_regs_start_page, fdc_regs_end_page) + , m_led(*this, "led0") + , m_side_control(0) + , m_control(0) + { } + + // device-level overrides + virtual void device_start() override; + virtual void device_post_load() override; + + u8 side_control_r(); + u8 control_r(); + u8 status_r(); + void set_side_control(u8 data); + void set_control(u8 data); + + output_finder<> m_led; + u8 m_side_control; + u8 m_control; +}; + void msx_cart_disk_type1_device::device_start() { m_led.resolve(); @@ -284,50 +332,33 @@ void msx_cart_disk_type1_device::initialize_cartridge() msx_cart_disk_wd_device::initialize_cartridge(); page(1)->install_rom(0x4000, 0x7fff, get_rom_base()); - page(1)->install_read_handler(0x7ff8, 0x7ff8, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::status_r))); - page(1)->install_read_handler(0x7ff9, 0x7ff9, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_r))); - page(1)->install_read_handler(0x7ffa, 0x7ffa, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_r))); - page(1)->install_read_handler(0x7ffb, 0x7ffb, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_r))); - page(1)->install_read_handler(0x7ffc, 0x7ffc, read8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::side_control_r))); - page(1)->install_read_handler(0x7ffd, 0x7ffd, read8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::control_r))); - page(1)->install_read_handler(0x7fff, 0x7fff, read8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::status_r))); - page(1)->install_write_handler(0x7ff8, 0x7ff8, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::cmd_w))); - page(1)->install_write_handler(0x7ff9, 0x7ff9, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_w))); - page(1)->install_write_handler(0x7ffa, 0x7ffa, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_w))); - page(1)->install_write_handler(0x7ffb, 0x7ffb, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_w))); - page(1)->install_write_handler(0x7ffc, 0x7ffc, write8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::set_side_control))); - page(1)->install_write_handler(0x7ffd, 0x7ffd, write8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::set_control))); - - // TODO No idea why, but without this the other handlers do not get recognized - page(2)->install_rom(0xbff8,0xbff8, get_rom_base()); - page(2)->install_read_handler(0xbff8, 0xbff8, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::status_r))); - page(2)->install_read_handler(0xbff9, 0xbff9, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_r))); - page(2)->install_read_handler(0xbffa, 0xbffa, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_r))); - page(2)->install_read_handler(0xbffb, 0xbffb, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_r))); - page(2)->install_read_handler(0xbffc, 0xbffc, read8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::side_control_r))); - page(2)->install_read_handler(0xbffd, 0xbffd, read8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::control_r))); - page(2)->install_read_handler(0xbfff, 0xbfff, read8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::status_r))); - page(2)->install_write_handler(0xbff8, 0xbff8, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::cmd_w))); - page(2)->install_write_handler(0xbff9, 0xbff9, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_w))); - page(2)->install_write_handler(0xbffa, 0xbffa, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_w))); - page(2)->install_write_handler(0xbffb, 0xbffb, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_w))); - page(2)->install_write_handler(0xbffc, 0xbffc, write8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::set_side_control))); - page(2)->install_write_handler(0xbffd, 0xbffd, write8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::set_control))); + for (int i = m_fdc_regs_start_page; i <= m_fdc_regs_end_page; i++) + { + const offs_t base = 0x4000 * i; + page(i)->install_read_handler(base + 0x3ff8, base + 0x3ff8, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::status_r))); + page(i)->install_read_handler(base + 0x3ff9, base + 0x3ff9, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_r))); + page(i)->install_read_handler(base + 0x3ffa, base + 0x3ffa, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_r))); + page(i)->install_read_handler(base + 0x3ffb, base + 0x3ffb, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_r))); + page(i)->install_read_handler(base + 0x3ffc, base + 0x3ffc, read8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::side_control_r))); + page(i)->install_read_handler(base + 0x3ffd, base + 0x3ffd, read8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::control_r))); + page(i)->install_read_handler(base + 0x3fff, base + 0x3fff, read8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::status_r))); + page(i)->install_write_handler(base + 0x3ff8, base + 0x3ff8, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::cmd_w))); + page(i)->install_write_handler(base + 0x3ff9, base + 0x3ff9, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_w))); + page(i)->install_write_handler(base + 0x3ffa, base + 0x3ffa, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_w))); + page(i)->install_write_handler(base + 0x3ffb, base + 0x3ffb, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_w))); + page(i)->install_write_handler(base + 0x3ffc, base + 0x3ffc, write8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::set_side_control))); + page(i)->install_write_handler(base + 0x3ffd, base + 0x3ffd, write8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::set_control))); + } } void msx_cart_disk_type1_device::device_post_load() { - uint8_t data = m_control; - - // To make sure the FDD busy led status gets set correctly - m_control ^= 0x40; - - set_control(data); + set_control(m_control); } -void msx_cart_disk_type1_device::set_control(uint8_t data) +void msx_cart_disk_type1_device::set_control(u8 data) { - uint8_t old_m_control = m_control; + u8 old_m_control = m_control; m_control = data; @@ -361,7 +392,7 @@ void msx_cart_disk_type1_device::set_control(uint8_t data) } } -void msx_cart_disk_type1_device::set_side_control(uint8_t data) +void msx_cart_disk_type1_device::set_side_control(u8 data) { m_side_control = data; @@ -371,11 +402,6 @@ void msx_cart_disk_type1_device::set_side_control(uint8_t data) } } -void msx_cart_disk_type1_device::device_reset() -{ - m_fdc->dden_w(false); -} - u8 msx_cart_disk_type1_device::side_control_r() { return 0xfe | (m_side_control & 0x01); @@ -383,7 +409,7 @@ u8 msx_cart_disk_type1_device::side_control_r() u8 msx_cart_disk_type1_device::control_r() { - return ( m_control & 0x83 ) | 0x78; + return (m_control & 0x83) | 0x78; } u8 msx_cart_disk_type1_device::status_r() @@ -393,6 +419,175 @@ u8 msx_cart_disk_type1_device::status_r() +class msx_cart_fd051_device : public msx_cart_disk_type1_device +{ +public: + msx_cart_fd051_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_type1_device(mconfig, MSX_CART_FD051, tag, owner, clock, PAGE0, PAGE3) + { } + +protected: + virtual void device_add_mconfig(machine_config &config) override + { + add_mconfig(config, WD2793); + } +}; + + + +class msx_cart_fsfd1_device : public msx_cart_disk_type1_device +{ +public: + msx_cart_fsfd1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_type1_device(mconfig, MSX_CART_FSFD1, tag, owner, clock) + { } + +protected: + virtual void device_add_mconfig(machine_config &config) override + { + add_mconfig(config, WD2793); + } +}; + + + +class msx_cart_hb3600_device : public msx_cart_disk_type1_device +{ +public: + msx_cart_hb3600_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_type1_device(mconfig, MSX_CART_HB3600, tag, owner, clock) + { } + +protected: + virtual void device_add_mconfig(machine_config &config) override + { + add_mconfig(config, WD2793); + } +}; + + + +class msx_cart_hbd20w_device : public msx_cart_disk_type1_device +{ +public: + msx_cart_hbd20w_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_type1_device(mconfig, MSX_CART_HBD20W, tag, owner, clock) + { } + +protected: + virtual void device_add_mconfig(machine_config &config) override + { + add_mconfig(config, WD2793); + } +}; + + + +class msx_cart_hbd50_device : public msx_cart_disk_type1_device +{ +public: + msx_cart_hbd50_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_type1_device(mconfig, MSX_CART_HBD50, tag, owner, clock, PAGE0, PAGE3) + { } + +protected: + virtual void device_add_mconfig(machine_config &config) override + { + add_mconfig(config, WD2793); + } +}; + + + +class msx_cart_hbdf1_device : public msx_cart_disk_type1_device +{ +public: + msx_cart_hbdf1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_type1_device(mconfig, MSX_CART_HBDF1, tag, owner, clock) + { } + +protected: + virtual void device_add_mconfig(machine_config &config) override + { + add_mconfig(config, WD2793); + } +}; + + + +class msx_cart_ml30dc_device : public msx_cart_disk_type1_device +{ +public: + msx_cart_ml30dc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_type1_device(mconfig, MSX_CART_ML30DC, tag, owner, clock) + { } + +protected: + virtual void device_add_mconfig(machine_config &config) override + { + add_mconfig(config, WD2793); + // Optional second drive in the same enclosure + //FLOPPY_CONNECTOR(config, "fdc:1", msx_floppies, "35dd", msx_cart_disk_device::floppy_formats); + } +}; + + + +class msx_cart_nms1200_device : public msx_cart_disk_type1_device +{ +public: + msx_cart_nms1200_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_type1_device(mconfig, MSX_CART_NMS1200, tag, owner, clock) + { } + +protected: + virtual void device_add_mconfig(machine_config &config) override + { + add_mconfig(config, WD2793); + } +}; + + + +class msx_cart_vy0010_device : public msx_cart_disk_type1_device +{ +public: + msx_cart_vy0010_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_type1_device(mconfig, MSX_CART_VY0010, tag, owner, clock) + { } + +protected: + virtual void device_add_mconfig(machine_config &config) override + { + add_mconfig(config, WD2793); + } +}; + + + +class msx_cart_disk_type2_device : public msx_cart_disk_wd_device +{ +public: + virtual void initialize_cartridge() override; + +protected: + msx_cart_disk_type2_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int fdc_regs_start_page = PAGE1, int fdc_regs_end_page = PAGE2) + : msx_cart_disk_wd_device(mconfig, type, tag, owner, clock, fdc_regs_start_page, fdc_regs_end_page) + , m_led(*this, "led0") + , m_control(0) + { } + + // device-level overrides + virtual void device_start() override; + virtual void device_post_load() override; + + void set_control(u8 data); + u8 status_r(); + + output_finder<> m_led; + u8 m_control; +}; + void msx_cart_disk_type2_device::device_start() { m_led.resolve(); @@ -400,19 +595,9 @@ void msx_cart_disk_type2_device::device_start() save_item(NAME(m_control)); } -void msx_cart_disk_type2_device::device_reset() -{ - m_fdc->dden_w(false); -} - void msx_cart_disk_type2_device::device_post_load() { - uint8_t data = m_control; - - // To make sure the FDD busy led status gets set correctly - m_control ^= 0x40; - - set_control(data); + set_control(m_control); } void msx_cart_disk_type2_device::initialize_cartridge() @@ -420,29 +605,20 @@ void msx_cart_disk_type2_device::initialize_cartridge() msx_cart_disk_wd_device::initialize_cartridge(); page(1)->install_rom(0x4000, 0x7fff, get_rom_base()); - page(1)->install_read_handler(0x7fb8, 0x7fb8, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::status_r))); - page(1)->install_read_handler(0x7fb9, 0x7fb9, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_r))); - page(1)->install_read_handler(0x7fba, 0x7fba, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_r))); - page(1)->install_read_handler(0x7fbb, 0x7fbb, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_r))); - page(1)->install_read_handler(0x7fbc, 0x7fbc, read8smo_delegate(*this, FUNC(msx_cart_disk_type2_device::status_r))); - page(1)->install_write_handler(0x7fb8, 0x7fb8, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::cmd_w))); - page(1)->install_write_handler(0x7fb9, 0x7fb9, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_w))); - page(1)->install_write_handler(0x7fba, 0x7fba, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_w))); - page(1)->install_write_handler(0x7fbb, 0x7fbb, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_w))); - page(1)->install_write_handler(0x7fbc, 0x7fbc, write8smo_delegate(*this, FUNC(msx_cart_disk_type2_device::set_control))); - - // TODO No idea why, but without this the other handlers do not get recognized - page(2)->install_rom(0xbfb8,0xbfb8, get_rom_base()); - page(2)->install_read_handler(0xbfb8, 0xbfb8, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::status_r))); - page(2)->install_read_handler(0xbfb9, 0xbfb9, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_r))); - page(2)->install_read_handler(0xbfba, 0xbfba, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_r))); - page(2)->install_read_handler(0xbfbb, 0xbfbb, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_r))); - page(2)->install_read_handler(0xbfbc, 0xbfbc, read8smo_delegate(*this, FUNC(msx_cart_disk_type2_device::status_r))); - page(2)->install_write_handler(0xbfb8, 0xbfb8, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::cmd_w))); - page(2)->install_write_handler(0xbfb9, 0xbfb9, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_w))); - page(2)->install_write_handler(0xbfba, 0xbfba, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_w))); - page(2)->install_write_handler(0xbfbb, 0xbfbb, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_w))); - page(2)->install_write_handler(0xbfbc, 0xbfbc, write8smo_delegate(*this, FUNC(msx_cart_disk_type2_device::set_control))); + for (int i = m_fdc_regs_start_page; i <= m_fdc_regs_end_page; i++) + { + const offs_t base = 0x4000 * i; + page(i)->install_read_handler(base + 0x3fb8, base + 0x3fb8, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::status_r))); + page(i)->install_read_handler(base + 0x3fb9, base + 0x3fb9, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_r))); + page(i)->install_read_handler(base + 0x3fba, base + 0x3fba, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_r))); + page(i)->install_read_handler(base + 0x3fbb, base + 0x3fbb, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_r))); + page(i)->install_read_handler(base + 0x3fbc, base + 0x3fbc, read8smo_delegate(*this, FUNC(msx_cart_disk_type2_device::status_r))); + page(i)->install_write_handler(base + 0x3fb8, base + 0x3fb8, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::cmd_w))); + page(i)->install_write_handler(base + 0x3fb9, base + 0x3fb9, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_w))); + page(i)->install_write_handler(base + 0x3fba, base + 0x3fba, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_w))); + page(i)->install_write_handler(base + 0x3fbb, base + 0x3fbb, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_w))); + page(i)->install_write_handler(base + 0x3fbc, base + 0x3fbc, write8smo_delegate(*this, FUNC(msx_cart_disk_type2_device::set_control))); + } } void msx_cart_disk_type2_device::set_control(u8 data) @@ -487,31 +663,686 @@ u8 msx_cart_disk_type2_device::status_r() - -void msx_cart_fsfd1a_device::device_start() +class msx_cart_fscf351_device : public msx_cart_disk_type2_device { +public: + msx_cart_fscf351_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_type2_device(mconfig, MSX_CART_FSCF351, tag, owner, clock) + { } + +protected: + virtual void device_add_mconfig(machine_config &config) override + { + add_mconfig(config, MB8877); + } +}; + + + +class msx_cart_tadpf550_device : public msx_cart_disk_type2_device +{ +public: + msx_cart_tadpf550_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_type2_device(mconfig, MSX_CART_TADPF550, tag, owner, clock) + { } + +protected: + virtual void device_add_mconfig(machine_config &config) override + { + WD1770(config, m_fdc, 8_MHz_XTAL); + add_floppy_mconfig(config); + } +}; + + + +class msx_cart_disk_type5_device : public msx_cart_disk_wd_device +{ +public: + virtual void initialize_cartridge() override; + +protected: + msx_cart_disk_type5_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_wd_device(mconfig, type, tag, owner, clock) + , m_control(0) + { } + + // device-level overrides + virtual void device_start() override; + virtual void device_post_load() override; + + void control_w(u8 control); + virtual u8 status_r(); + + u8 m_control; +}; + +void msx_cart_disk_type5_device::device_start() +{ + save_item(NAME(m_control)); +} + +void msx_cart_disk_type5_device::initialize_cartridge() +{ + msx_cart_disk_wd_device::initialize_cartridge(); + + page(1)->install_rom(0x4000, 0x7fff, get_rom_base()); + + // Install IO read/write handlers + io_space().install_write_handler(0xd0, 0xd0, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::cmd_w))); + io_space().install_write_handler(0xd1, 0xd1, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_w))); + io_space().install_write_handler(0xd2, 0xd2, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_w))); + io_space().install_write_handler(0xd3, 0xd3, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_w))); + io_space().install_write_handler(0xd4, 0xd4, write8smo_delegate(*this, FUNC(msx_cart_disk_type5_device::control_w))); + io_space().install_read_handler(0xd0, 0xd0, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::status_r))); + io_space().install_read_handler(0xd1, 0xd1, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_r))); + io_space().install_read_handler(0xd2, 0xd2, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_r))); + io_space().install_read_handler(0xd3, 0xd3, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_r))); + io_space().install_read_handler(0xd4, 0xd4, read8smo_delegate(*this, FUNC(msx_cart_disk_type5_device::status_r))); +} + +void msx_cart_disk_type5_device::device_post_load() +{ + control_w(m_control); +} + +void msx_cart_disk_type5_device::control_w(u8 control) +{ + m_control = control; + + switch (m_control & 0x0f) + { + case 0x01: + m_floppy = m_floppy0 ? m_floppy0->get_device() : nullptr; + break; + + case 0x02: + m_floppy = m_floppy1 ? m_floppy1->get_device() : nullptr; + break; + + default: + m_floppy = nullptr; + break; + } + + if (m_floppy) + { + m_floppy->mon_w(BIT(m_control, 5) ? 0 : 1); + m_floppy->ss_w(BIT(m_control, 4) ? 1 : 0); + } + + m_fdc->set_floppy(m_floppy); +} + +u8 msx_cart_disk_type5_device::status_r() +{ + return 0x3f | (m_fdc->drq_r() ? 0 : 0x40) | (m_fdc->intrq_r() ? 0x80 : 0); } -void msx_cart_fsfd1a_device::device_reset() +class msx_cart_cdx2_device : public msx_cart_disk_type5_device { -} +public: + msx_cart_cdx2_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_type5_device(mconfig, MSX_CART_CDX2, tag, owner, clock) + { } + +protected: + virtual void device_add_mconfig(machine_config &config) override + { + add_mconfig(config, WD2793); + } +}; + + +class msx_cart_ddx3_device : public msx_cart_disk_type5_device +{ +public: + msx_cart_ddx3_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_type5_device(mconfig, MSX_CART_DDX3, tag, owner, clock) + { } + +protected: + virtual void device_add_mconfig(machine_config &config) override + { + add_mconfig(config, WD2793); + } +}; + + + +class msx_cart_fsfd1a_device : public msx_cart_disk_tc8566_device +{ +public: + msx_cart_fsfd1a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_tc8566_device(mconfig, MSX_CART_FSFD1A, tag, owner, clock) + { } + + virtual void initialize_cartridge() override; + +protected: + // device-level overrides + virtual void device_start() override { } + virtual void device_add_mconfig(machine_config &config) override + { + TC8566AF(config, m_fdc, 16'000'000); + add_floppy_mconfig(config); + } +}; void msx_cart_fsfd1a_device::initialize_cartridge() { msx_cart_disk_tc8566_device::initialize_cartridge(); page(1)->install_rom(0x4000, 0x7fff, get_rom_base()); - page(1)->install_read_handler(0x7ffa, 0x7ffa, read8smo_delegate(*m_fdc, FUNC(tc8566af_device::msr_r))); - page(1)->install_read_handler(0x7ffb, 0x7ffb, read8smo_delegate(*m_fdc, FUNC(tc8566af_device::fifo_r))); - page(1)->install_write_handler(0x7ff8, 0x7ff8, write8smo_delegate(*m_fdc, FUNC(tc8566af_device::dor_w))); - page(1)->install_write_handler(0x7ff9, 0x7ff9, write8smo_delegate(*m_fdc, FUNC(tc8566af_device::cr1_w))); - page(1)->install_write_handler(0x7ffb, 0x7ffb, write8smo_delegate(*m_fdc, FUNC(tc8566af_device::fifo_w))); - // TODO No idea why, but without this the other handlers do not get recognized - page(2)->install_rom(0xbffa,0xbffa, get_rom_base()); - page(2)->install_read_handler(0xbffa, 0xbffa, read8smo_delegate(*m_fdc, FUNC(tc8566af_device::msr_r))); - page(2)->install_read_handler(0xbffb, 0xbffb, read8smo_delegate(*m_fdc, FUNC(tc8566af_device::fifo_r))); - page(2)->install_write_handler(0xbff8, 0xbff8, write8smo_delegate(*m_fdc, FUNC(tc8566af_device::dor_w))); - page(2)->install_write_handler(0xbff9, 0xbff9, write8smo_delegate(*m_fdc, FUNC(tc8566af_device::cr1_w))); - page(2)->install_write_handler(0xbffb, 0xbffb, write8smo_delegate(*m_fdc, FUNC(tc8566af_device::fifo_w))); + for (int i = m_fdc_regs_start_page; i <= m_fdc_regs_end_page; i++) + { + const offs_t base = 0x4000 * i; + page(i)->install_read_handler(base + 0x3ffa, base + 0x3ffa, read8smo_delegate(*m_fdc, FUNC(tc8566af_device::msr_r))); + page(i)->install_read_handler(base + 0x3ffb, base + 0x3ffb, read8smo_delegate(*m_fdc, FUNC(tc8566af_device::fifo_r))); + page(i)->install_write_handler(base + 0x3ff8, base + 0x3ff8, write8smo_delegate(*m_fdc, FUNC(tc8566af_device::dor_w))); + page(i)->install_write_handler(base + 0x3ff9, base + 0x3ff9, write8smo_delegate(*m_fdc, FUNC(tc8566af_device::cr1_w))); + page(i)->install_write_handler(base + 0x3ffb, base + 0x3ffb, write8smo_delegate(*m_fdc, FUNC(tc8566af_device::fifo_w))); + } } + + + +class msx_cart_fd03_device : public msx_cart_disk_wd_device +{ +public: + msx_cart_fd03_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_wd_device(mconfig, MSX_CART_FD03, tag, owner, clock) + , m_led(*this, "led0") + , m_control(0) + { } + + virtual void initialize_cartridge() override; + +protected: + // device-level overrides + virtual void device_add_mconfig(machine_config &config) override; + virtual void device_start() override; + virtual void device_post_load() override; + + u8 status_r(); + u8 dskchg_r(); + void set_control(u8 data); + void dskchg_w(u8 data); + + output_finder<> m_led; + u8 m_control; +}; + +void msx_cart_fd03_device::device_add_mconfig(machine_config &config) +{ + add_mconfig(config, FD1793); +} + +void msx_cart_fd03_device::device_start() +{ + m_led.resolve(); + + save_item(NAME(m_control)); +} + +void msx_cart_fd03_device::initialize_cartridge() +{ + if (get_rom_size() != 0x4000 && get_rom_size() != 0x8000) + { + fatalerror("msx_cart_fd03_device: Invalid ROM size\n"); + } + + page(1)->install_rom(0x4000, 0x7fff, get_rom_base()); + if (get_rom_size() >= 0x8000) + page(2)->install_rom(0x8000,0xbfff, get_rom_base() + 0x4000); + for (int i = m_fdc_regs_start_page; i <= m_fdc_regs_end_page; i++) + { + const offs_t base = 0x4000 * i; + page(i)->install_read_handler(base + 0x3fc0, base + 0x3fc0, 0, 0x001c, 0, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::status_r))); + page(i)->install_read_handler(base + 0x3fc1, base + 0x3fc1, 0, 0x001c, 0, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_r))); + page(i)->install_read_handler(base + 0x3fc2, base + 0x3fc2, 0, 0x001c, 0, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_r))); + page(i)->install_read_handler(base + 0x3fc3, base + 0x3fc3, 0, 0x001c, 0, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_r))); + page(i)->install_read_handler(base + 0x3fe0, base + 0x3fef, read8smo_delegate(*this, FUNC(msx_cart_fd03_device::status_r))); + page(i)->install_read_handler(base + 0x3ff0, base + 0x3fff, read8smo_delegate(*this, FUNC(msx_cart_fd03_device::dskchg_r))); + page(i)->install_write_handler(base + 0x3fc0, base + 0x3fc0, 0, 0x001c, 0, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::cmd_w))); + page(i)->install_write_handler(base + 0x3fc1, base + 0x3fc1, 0, 0x001c, 0, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_w))); + page(i)->install_write_handler(base + 0x3fc2, base + 0x3fc2, 0, 0x001c, 0, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_w))); + page(i)->install_write_handler(base + 0x3fc3, base + 0x3fc3, 0, 0x001c, 0, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_w))); + page(i)->install_write_handler(base + 0x3fe0, base + 0x3fef, write8smo_delegate(*this, FUNC(msx_cart_fd03_device::set_control))); + page(i)->install_write_handler(base + 0x3ff0, base + 0x3fff, write8smo_delegate(*this, FUNC(msx_cart_fd03_device::dskchg_w))); + } +} + +void msx_cart_fd03_device::device_post_load() +{ + set_control(m_control); +} + +void msx_cart_fd03_device::set_control(u8 data) +{ + u8 old_m_control = m_control; + + m_control = data; + + switch (m_control & 0x03) + { + case 1: + m_floppy = m_floppy0 ? m_floppy0->get_device() : nullptr; + break; + + case 2: + m_floppy = m_floppy1 ? m_floppy1->get_device() : nullptr; + break; + + default: + m_floppy = nullptr; + break; + } + + if (m_floppy) + { + m_floppy->mon_w(BIT(m_control, 2) ? 0 : 1); + } + + m_fdc->set_floppy(m_floppy); + + if ((old_m_control ^ m_control) & 0x40) + { + m_led = BIT(~m_control, 6); + } +} + +u8 msx_cart_fd03_device::status_r() +{ + // bit 0 - drive 0 ready / has media + // bit 1 - drive 1 ready / has media + // bit 2 - diskchange drive 0 + // bit 3 - diskchange drive 1 + u8 result = 0x30; + if (!m_floppy0) + result |= 0x01; + if (!m_floppy1) + result |= 0x02; + if (m_floppy0 && m_floppy0->get_device()->dskchg_r()) + result |= 0x04; + if (m_floppy1 && m_floppy1->get_device()->dskchg_r()) + result |= 0x08; + + return result | (m_fdc->intrq_r() ? 0x80 : 0) | (m_fdc->drq_r() ? 0x40 : 0); +} + +u8 msx_cart_fd03_device::dskchg_r() +{ + if (m_floppy1) + m_floppy1->get_device()->dskchg_w(0); + + return 0xff; +} + +void msx_cart_fd03_device::dskchg_w(u8 data) +{ + if (m_floppy0) + m_floppy0->get_device()->dskchg_w(0); +} + + + +class msx_cart_hxf101pe_device : public msx_cart_disk_wd_device +{ +public: + msx_cart_hxf101pe_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_wd_device(mconfig, MSX_CART_HXF101PE, tag, owner, clock, PAGE1, PAGE1) + , m_side_motor(0) + , m_drive_select0(0) + , m_drive_select1(0) + { } + + virtual void initialize_cartridge() override; + +protected: + // device-level overrides + virtual void device_add_mconfig(machine_config &config) override; + virtual void device_start() override; + virtual void device_post_load() override; + + void set_side_motor(); + void select_drive(); + u8 side_motor_r(); + u8 select0_r(); + u8 select1_r(); + u8 status_r(); + void side_motor_w(u8 data); + void select0_w(u8 data); + void select1_w(u8 data); + + u8 m_side_motor; + u8 m_drive_select0; + u8 m_drive_select1; +}; + +void msx_cart_hxf101pe_device::device_add_mconfig(machine_config &config) +{ + add_mconfig(config, WD2793); +} + +void msx_cart_hxf101pe_device::device_start() +{ + save_item(NAME(m_side_motor)); + save_item(NAME(m_drive_select0)); + save_item(NAME(m_drive_select1)); +} + +void msx_cart_hxf101pe_device::initialize_cartridge() +{ + msx_cart_disk_wd_device::initialize_cartridge(); + + page(1)->install_rom(0x4000, 0x7fff, get_rom_base()); + page(1)->install_read_handler(0x7ff0, 0x7ff0, 0, 0x0008, 0, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::status_r))); + page(1)->install_read_handler(0x7ff1, 0x7ff1, 0, 0x0008, 0, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_r))); + page(1)->install_read_handler(0x7ff2, 0x7ff2, 0, 0x0008, 0, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_r))); + page(1)->install_read_handler(0x7ff3, 0x7ff3, 0, 0x0008, 0, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_r))); + page(1)->install_read_handler(0x7ff4, 0x7ff4, 0, 0x0008, 0, read8smo_delegate(*this, FUNC(msx_cart_hxf101pe_device::side_motor_r))); + page(1)->install_read_handler(0x7ff5, 0x7ff5, 0, 0x0008, 0, read8smo_delegate(*this, FUNC(msx_cart_hxf101pe_device::select0_r))); + page(1)->install_read_handler(0x7ff6, 0x7ff6, 0, 0x0008, 0, read8smo_delegate(*this, FUNC(msx_cart_hxf101pe_device::select1_r))); + page(1)->install_read_handler(0x7ff7, 0x7ff7, 0, 0x0008, 0, read8smo_delegate(*this, FUNC(msx_cart_hxf101pe_device::status_r))); + page(1)->install_write_handler(0x7ff0, 0x7ff0, 0, 0x0008, 0, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::cmd_w))); + page(1)->install_write_handler(0x7ff1, 0x7ff1, 0, 0x0008, 0, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_w))); + page(1)->install_write_handler(0x7ff2, 0x7ff2, 0, 0x0008, 0, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_w))); + page(1)->install_write_handler(0x7ff3, 0x7ff3, 0, 0x0008, 0, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_w))); + page(1)->install_write_handler(0x7ff4, 0x7ff4, 0, 0x0008, 0, write8smo_delegate(*this, FUNC(msx_cart_hxf101pe_device::side_motor_w))); + page(1)->install_write_handler(0x7ff5, 0x7ff5, 0, 0x0008, 0, write8smo_delegate(*this, FUNC(msx_cart_hxf101pe_device::select0_w))); + page(1)->install_write_handler(0x7ff6, 0x7ff6, 0, 0x0008, 0, write8smo_delegate(*this, FUNC(msx_cart_hxf101pe_device::select1_w))); +} + +void msx_cart_hxf101pe_device::device_post_load() +{ + select_drive(); +} + +void msx_cart_hxf101pe_device::select_drive() +{ + if (m_drive_select1) + { + m_floppy = m_floppy1 ? m_floppy1->get_device() : nullptr; + if (!m_floppy) + m_drive_select1 = 0; + } + + if (m_drive_select0) + { + m_floppy = m_floppy0 ? m_floppy0->get_device() : nullptr; + if (!m_floppy) + m_drive_select0 = 0; + } + + m_fdc->set_floppy(m_floppy); + + set_side_motor(); +} + +void msx_cart_hxf101pe_device::set_side_motor() +{ + if (m_floppy) + { + m_floppy->mon_w(BIT(m_side_motor, 1) ? 0 : 1); + m_floppy->ss_w(BIT(m_side_motor, 0)); + } +} + +u8 msx_cart_hxf101pe_device::side_motor_r() +{ + // bit 0 = side control + // bit 1 = motor control + return 0xfc | m_side_motor; +} + +u8 msx_cart_hxf101pe_device::select0_r() +{ + // This reads back a 1 in bit 0 if drive0 is present and selected + return 0xfe | m_drive_select0; +} + +u8 msx_cart_hxf101pe_device::select1_r() +{ + // This reads back a 1 in bit 0 if drive1 is present and selected + return 0xfe | m_drive_select1; +} + +u8 msx_cart_hxf101pe_device::status_r() +{ + return 0x3f | (m_fdc->intrq_r() ? 0 : 0x40) | (m_fdc->drq_r() ? 0 : 0x80); +} + +void msx_cart_hxf101pe_device::side_motor_w(u8 data) +{ + // Side and motor control + // bit 0 = side select + // bit 1 = motor on/off + m_side_motor = data; + set_side_motor(); +} + +void msx_cart_hxf101pe_device::select0_w(u8 data) +{ + // bit 0 - select drive 0 + m_drive_select0 = data; + select_drive(); +} + +void msx_cart_hxf101pe_device::select1_w(u8 data) +{ + // bit 1 - select drive 1 + m_drive_select1 = data; + select_drive(); +} + + + +class msx_cart_mfd001_device : public msx_cart_disk_wd_device +{ +public: + msx_cart_mfd001_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_wd_device(mconfig, MSX_CART_MFD001, tag, owner, clock) + , m_control(0) + { } + + virtual void initialize_cartridge() override; + +protected: + // device-level overrides + virtual void device_add_mconfig(machine_config &config) override; + virtual void device_start() override; + virtual void device_post_load() override; + + void set_side_motor(); + void select_drive(); + u8 status_r(); + void control_w(u8 data); + + u8 m_control; +}; + +void msx_cart_mfd001_device::device_add_mconfig(machine_config &config) +{ + add_mconfig(config, MB8877); +} + +void msx_cart_mfd001_device::initialize_cartridge() +{ + msx_cart_disk_wd_device::initialize_cartridge(); + + page(1)->install_rom(0x4000, 0x7fff, get_rom_base()); + for (int i = m_fdc_regs_start_page; i <= m_fdc_regs_end_page; i++) + { + const offs_t base = 0x4000 * i; + page(i)->install_read_handler(base + 0x3ff8, base + 0x3ff8, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::status_r))); + page(i)->install_read_handler(base + 0x3ff9, base + 0x3ff9, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_r))); + page(i)->install_read_handler(base + 0x3ffa, base + 0x3ffa, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_r))); + page(i)->install_read_handler(base + 0x3ffb, base + 0x3ffb, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_r))); + page(i)->install_read_handler(base + 0x3ffc, base + 0x3ffc, read8smo_delegate(*this, FUNC(msx_cart_mfd001_device::status_r))); + page(i)->install_write_handler(base + 0x3ff8, base + 0x3ff8, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::cmd_w))); + page(i)->install_write_handler(base + 0x3ff9, base + 0x3ff9, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_w))); + page(i)->install_write_handler(base + 0x3ffa, base + 0x3ffa, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_w))); + page(i)->install_write_handler(base + 0x3ffb, base + 0x3ffb, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_w))); + page(i)->install_write_handler(base + 0x3ffc, base + 0x3ffc, write8smo_delegate(*this, FUNC(msx_cart_mfd001_device::control_w))); + } +} + +void msx_cart_mfd001_device::device_start() +{ + save_item(NAME(m_control)); +} + +void msx_cart_mfd001_device::device_post_load() +{ + select_drive(); +} + +void msx_cart_mfd001_device::select_drive() +{ + if (BIT(m_control, 0)) + { + m_floppy = m_floppy0 ? m_floppy0->get_device() : nullptr; + } + + if (BIT(m_control, 1)) + { + m_floppy = m_floppy1 ? m_floppy1->get_device() : nullptr; + } + + m_fdc->set_floppy(m_floppy); + + if (m_floppy) + { + m_floppy->mon_w(BIT(m_control, 3) ? 0 : 1); + m_floppy->ss_w(BIT(m_control, 2)); + } +} + +u8 msx_cart_mfd001_device::status_r() +{ + return 0x3f | (m_fdc->intrq_r() ? 0x80 : 0) | (m_fdc->drq_r() ? 0x40 : 0); +} + +void msx_cart_mfd001_device::control_w(u8 data) +{ + // Drive, side and motor control + // bit 0 = select drive 0 + // bit 1 = select drive 1 + // bit 2 = side select + // bit 3 = motor on/off + m_control = data; + select_drive(); +} + + +class msx_cart_avdpf550_device : public msx_cart_disk_wd_device +{ +public: + msx_cart_avdpf550_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_disk_wd_device(mconfig, MSX_CART_AVDPF550, tag, owner, clock) + , m_control(0) + { } + + virtual void initialize_cartridge() override; + +protected: + // device-level overrides + virtual void device_add_mconfig(machine_config &config) override; + virtual void device_start() override; + virtual void device_post_load() override; + + void control_w(u8 control); + virtual u8 status_r(); + + u8 m_control; +}; + +void msx_cart_avdpf550_device::device_add_mconfig(machine_config &config) +{ + WD1770(config, m_fdc, 8_MHz_XTAL); + add_floppy_mconfig(config); +} + +void msx_cart_avdpf550_device::device_start() +{ + save_item(NAME(m_control)); +} + +void msx_cart_avdpf550_device::initialize_cartridge() +{ + msx_cart_disk_wd_device::initialize_cartridge(); + + page(1)->install_rom(0x4000, 0x7fff, get_rom_base()); + + // Install IO read/write handlers + io_space().install_write_handler(0xd0, 0xd0, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::cmd_w))); + io_space().install_write_handler(0xd1, 0xd1, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_w))); + io_space().install_write_handler(0xd2, 0xd2, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_w))); + io_space().install_write_handler(0xd3, 0xd3, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_w))); + io_space().install_write_handler(0xd5, 0xd5, write8smo_delegate(*this, FUNC(msx_cart_avdpf550_device::control_w))); + io_space().install_read_handler(0xd0, 0xd0, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::status_r))); + io_space().install_read_handler(0xd1, 0xd1, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_r))); + io_space().install_read_handler(0xd2, 0xd2, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_r))); + io_space().install_read_handler(0xd3, 0xd3, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_r))); + io_space().install_read_handler(0xd4, 0xd4, read8smo_delegate(*this, FUNC(msx_cart_avdpf550_device::status_r))); +} + +void msx_cart_avdpf550_device::device_post_load() +{ + control_w(m_control); +} + +void msx_cart_avdpf550_device::control_w(u8 control) +{ + m_control = control; + + switch (m_control & 0x03) + { + case 0x01: + m_floppy = m_floppy0 ? m_floppy0->get_device() : nullptr; + break; + + case 0x02: + m_floppy = m_floppy1 ? m_floppy1->get_device() : nullptr; + break; + + default: + m_floppy = nullptr; + break; + } + + if (m_floppy) + { + m_floppy->mon_w(0); + m_floppy->ss_w(BIT(m_control, 2) ? 1 : 0); + } + + m_fdc->set_floppy(m_floppy); +} + +u8 msx_cart_avdpf550_device::status_r() +{ + return 0x3f | (m_fdc->drq_r() ? 0 : 0x40) | (m_fdc->intrq_r() ? 0x80 : 0); +} + + +DEFINE_DEVICE_TYPE(MSX_CART_AVDPF550, msx_cart_avdpf550_device, "msx_cart_avdpf550", "MSX Cartridge - AVT DPF-550") +DEFINE_DEVICE_TYPE(MSX_CART_CDX2, msx_cart_cdx2_device, "msx_cart_cdx2", "MSX Cartridge - CDX-2") +DEFINE_DEVICE_TYPE(MSX_CART_DDX3, msx_cart_ddx3_device, "msx_cart_ddx3", "MSX Cartridge - DDX3.0") +DEFINE_DEVICE_TYPE(MSX_CART_FD03, msx_cart_fd03_device, "msx_cart_fd03", "MSX Cartridge - FD-03") +DEFINE_DEVICE_TYPE(MSX_CART_FD051, msx_cart_fd051_device, "msx_cart_fd051", "MSX Cartridge - FD-051") +DEFINE_DEVICE_TYPE(MSX_CART_FSFD1, msx_cart_fsfd1_device, "msx_cart_fsfd1", "MSX Cartridge - FS-FD1") +DEFINE_DEVICE_TYPE(MSX_CART_FSFD1A, msx_cart_fsfd1a_device, "msx_cart_fsfd1a", "MSX Cartridge - FS-FD1A") +DEFINE_DEVICE_TYPE(MSX_CART_FSCF351, msx_cart_fscf351_device, "msx_cart_fscf351", "MSX Cartridge - FS-CF351") +DEFINE_DEVICE_TYPE(MSX_CART_HB3600, msx_cart_hb3600_device, "msx_cart_hb3600", "MSX Cartridge - HB-3600") +DEFINE_DEVICE_TYPE(MSX_CART_HBD20W, msx_cart_hbd20w_device, "msx_cart_hbd20w", "MSX Cartridge - HBD-20W") +DEFINE_DEVICE_TYPE(MSX_CART_HBD50, msx_cart_hbd50_device, "msx_cart_hbd50", "MSX Cartridge - HBD-50") +DEFINE_DEVICE_TYPE(MSX_CART_HBDF1, msx_cart_hbdf1_device, "msx_cart_hbdf1", "MSX Cartridge - HBD-F1") +DEFINE_DEVICE_TYPE(MSX_CART_HXF101PE, msx_cart_hxf101pe_device, "msx_cart_hxf101pe", "MSX Cartridge - HX-F101PE") +DEFINE_DEVICE_TYPE(MSX_CART_MFD001, msx_cart_mfd001_device, "msx_cart_mfd001", "MSX Cartridge - MFD-001") +DEFINE_DEVICE_TYPE(MSX_CART_ML30DC, msx_cart_ml30dc_device, "msx_cart_ml30dc", "MSX Cartridge - ML-30DC") +DEFINE_DEVICE_TYPE(MSX_CART_NMS1200, msx_cart_nms1200_device, "msx_cart_nms1200", "MSX Cartridge - NMS-1200") +DEFINE_DEVICE_TYPE(MSX_CART_TADPF550, msx_cart_tadpf550_device, "msx_cart_tadpf550", "MSX Cartridge - Talent DPF-550") +DEFINE_DEVICE_TYPE(MSX_CART_VY0010, msx_cart_vy0010_device, "msx_cart_vy0010", "MSX Cartridge - VY0010") diff --git a/src/devices/bus/msx_cart/disk.h b/src/devices/bus/msx_cart/disk.h index 53407cfe0e7..0f6c12b183d 100644 --- a/src/devices/bus/msx_cart/disk.h +++ b/src/devices/bus/msx_cart/disk.h @@ -5,142 +5,6 @@ #pragma once -#include "bus/msx_cart/cartridge.h" -#include "machine/wd_fdc.h" -#include "machine/upd765.h" -#include "imagedev/floppy.h" - - -DECLARE_DEVICE_TYPE(MSX_CART_VY0010, msx_cart_vy0010_device) -DECLARE_DEVICE_TYPE(MSX_CART_FSFD1, msx_cart_fsfd1_device) -DECLARE_DEVICE_TYPE(MSX_CART_FSFD1A, msx_cart_fsfd1a_device) -DECLARE_DEVICE_TYPE(MSX_CART_FSCF351, msx_cart_fscf351_device) - - -class msx_cart_disk_device : public device_t, public msx_cart_interface -{ -public: - virtual void initialize_cartridge() override; - -protected: - msx_cart_disk_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); - - required_device m_floppy0; - optional_device m_floppy1; - floppy_image_device *m_floppy; - - static void floppy_formats(format_registration &fr); -}; - - -class msx_cart_disk_wd_device : public msx_cart_disk_device -{ -protected: - msx_cart_disk_wd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); - - required_device m_fdc; -}; - - -class msx_cart_disk_type1_device : public msx_cart_disk_wd_device -{ -public: - virtual void initialize_cartridge() override; - -protected: - msx_cart_disk_type1_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); - - // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; - virtual void device_post_load() override; - - u8 side_control_r(); - u8 control_r(); - u8 status_r(); - void set_side_control(u8 data); - void set_control(u8 data); - - output_finder<> m_led; - u8 m_side_control; - u8 m_control; - -}; - - -class msx_cart_disk_type2_device : public msx_cart_disk_wd_device -{ -public: - virtual void initialize_cartridge() override; - -protected: - msx_cart_disk_type2_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); - - // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; - virtual void device_post_load() override; - - void set_control(u8 data); - u8 status_r(); - - output_finder<> m_led; - u8 m_control; -}; - - -class msx_cart_vy0010_device : public msx_cart_disk_type1_device -{ -public: - msx_cart_vy0010_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - -protected: - virtual void device_add_mconfig(machine_config &config) override; -}; - - -class msx_cart_fsfd1_device : public msx_cart_disk_type1_device -{ -public: - msx_cart_fsfd1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - -protected: - virtual void device_add_mconfig(machine_config &config) override; -}; - - -class msx_cart_fscf351_device : public msx_cart_disk_type2_device -{ -public: - msx_cart_fscf351_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - -protected: - virtual void device_add_mconfig(machine_config &config) override; -}; - - -class msx_cart_disk_tc8566_device : public msx_cart_disk_device -{ -protected: - msx_cart_disk_tc8566_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); - - required_device m_fdc; -}; - - -class msx_cart_fsfd1a_device : public msx_cart_disk_tc8566_device -{ -public: - msx_cart_fsfd1a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - - virtual void initialize_cartridge() override; - -protected: - // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; - virtual void device_add_mconfig(machine_config &config) override; -}; - +void msx_cart_disk_register_options(device_slot_interface &device); #endif // MAME_BUS_MSX_CART_DISK_H diff --git a/src/devices/bus/msx_cart/konami.cpp b/src/devices/bus/msx_cart/konami.cpp index d9774e138e2..6b942c73489 100644 --- a/src/devices/bus/msx_cart/konami.cpp +++ b/src/devices/bus/msx_cart/konami.cpp @@ -13,6 +13,7 @@ DEFINE_DEVICE_TYPE(MSX_CART_SYNTHESIZER, msx_cart_synthesizer_device, DEFINE_DEVICE_TYPE(MSX_CART_SOUND_SNATCHER, msx_cart_konami_sound_snatcher_device, "msx_cart_sound_snatcher", "MSX Cartridge - Sound Snatcher") DEFINE_DEVICE_TYPE(MSX_CART_SOUND_SDSNATCHER, msx_cart_konami_sound_sdsnatcher_device, "msx_cart_sound_sdsnatcher", "MSX Cartridge - Sound SD Snatcher") DEFINE_DEVICE_TYPE(MSX_CART_KEYBOARD_MASTER, msx_cart_keyboard_master_device, "msx_cart_keyboard_master", "MSX Cartridge - Keyboard Master") +DEFINE_DEVICE_TYPE(MSX_CART_EC701, msx_cart_ec701_device, "msx_cart_ec701", "MSX Cartridge - Konami EC-701") msx_cart_konami_device::msx_cart_konami_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) @@ -524,3 +525,58 @@ uint8_t msx_cart_keyboard_master_device::io_00_r() { return m_vlm5030->bsy() ? 0x10 : 0x00; } + + + +msx_cart_ec701_device::msx_cart_ec701_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, MSX_CART_EC701, tag, owner, clock) + , msx_cart_interface(mconfig, *this) + , m_rombank(*this, "rombank") + , m_view(*this, "view") +{ +} + +void msx_cart_ec701_device::device_reset() +{ + m_view.select(0); +} + +void msx_cart_ec701_device::initialize_cartridge() +{ + m_rombank->configure_entries(0, 24, get_rom_base() + 0x20000, 0x4000); + + page(1)->install_view(0x4000, 0x7fff, m_view); + m_view[0].install_rom(0x4000, 0x7fff, get_rom_base()); + m_view[1].install_read_bank(0x4000, 0x7fff, m_rombank); + m_view[2].nop_read(0x4000, 0x7fff); + + page(2)->install_rom(0x8000, 0xbfff, get_rom_base() + 0x4000); + page(2)->install_write_handler(0xbff8, 0xbfff, write8smo_delegate(*this, FUNC(msx_cart_ec701_device::bank_w))); +} + +void msx_cart_ec701_device::bank_w(u8 data) +{ + data = ~data; + switch (data & 0x38) + { + case 0x00: // ic1 + m_view.select(0); + break; + case 0x20: // ic2 + m_view.select(1); + m_rombank->set_entry(data & 0x07); + break; + case 0x28: // ic3 + m_view.select(1); + m_rombank->set_entry(0x08 + (data & 0x07)); + break; + case 0x30: // ic4 + m_view.select(1); + m_rombank->set_entry(0x10 + (data & 0x07)); + break; + default: + m_view.select(2); + break; + } + +} diff --git a/src/devices/bus/msx_cart/konami.h b/src/devices/bus/msx_cart/konami.h index c2bdd25c478..f10ce460580 100644 --- a/src/devices/bus/msx_cart/konami.h +++ b/src/devices/bus/msx_cart/konami.h @@ -18,6 +18,7 @@ DECLARE_DEVICE_TYPE(MSX_CART_SYNTHESIZER, msx_cart_synthesizer_device) DECLARE_DEVICE_TYPE(MSX_CART_SOUND_SNATCHER, msx_cart_konami_sound_snatcher_device) DECLARE_DEVICE_TYPE(MSX_CART_SOUND_SDSNATCHER, msx_cart_konami_sound_sdsnatcher_device) DECLARE_DEVICE_TYPE(MSX_CART_KEYBOARD_MASTER, msx_cart_keyboard_master_device) +DECLARE_DEVICE_TYPE(MSX_CART_EC701, msx_cart_ec701_device) class msx_cart_konami_device : public device_t, public msx_cart_interface @@ -189,4 +190,25 @@ private: +class msx_cart_ec701_device : public device_t, public msx_cart_interface +{ +public: + msx_cart_ec701_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + +protected: + // device-level overrides + virtual void device_start() override { } + virtual void device_reset() override; + + virtual void initialize_cartridge() override; + +private: + void bank_w(u8 data); + + memory_bank_creator m_rombank; + memory_view m_view; +}; + + + #endif // MAME_BUS_MSX_CART_KONAMI_H diff --git a/src/lib/formats/msx_dsk.cpp b/src/lib/formats/msx_dsk.cpp index c70d113bb49..a2e92b7f88e 100644 --- a/src/lib/formats/msx_dsk.cpp +++ b/src/lib/formats/msx_dsk.cpp @@ -32,6 +32,14 @@ const char *msx_format::extensions() const // Unverified gap sizes const msx_format::format msx_format::formats[] = { + { /* 180K 5 1/4 inch double density single sided */ + floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM, + 2000, 9, 40, 1, 512, {}, 1, {}, 80, 50, 22, 80 + }, + { /* 360K 5 1/4 inch double density */ + floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM, + 2000, 9, 40, 2, 512, {}, 1, {}, 80, 50, 22, 80 + }, { /* 3 1/2 inch single sided double density */ // 80x4e 12x00 3xf6 fc // 26x4e 12x00 3xf5 fe 2x00 01 02 f7 24x4e 12x00 3xf5 fb 512xe5 f7