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