// license:BSD-3-Clause // copyright-holders:Olivier Galibert // CD 90-351 - Custom floppy drive controller (THMFC1) // // Handles up to two 3.5 dual-sided drives (DD 90-352) // or up to two 2.8 dual-sided QDD drivers (QD 90-280) #include "emu.h" #include "cd90_351.h" #include "imagedev/floppy.h" #include "machine/thmfc1.h" #include "formats/sap_dsk.h" #include "formats/thom_dsk.h" namespace { class cd90_351_device : public device_t, public thomson_extension_interface { public: cd90_351_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual ~cd90_351_device() = default; virtual void rom_map(address_map &map) override ATTR_COLD; virtual void io_map(address_map &map) override ATTR_COLD; protected: virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; virtual void device_start() override ATTR_COLD; virtual void device_reset() override ATTR_COLD; private: required_memory_region m_rom; memory_bank_creator m_rom_bank; static void floppy_formats(format_registration &fr); static void floppy_drives(device_slot_interface &device); void bank_w(u8 data); }; cd90_351_device::cd90_351_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, CD90_351, tag, owner, clock), thomson_extension_interface(mconfig, *this), m_rom(*this, "rom"), m_rom_bank(*this, "rom_bank") { } ROM_START(cd90_351) // Rom has been dumped from the system, so the unaccessible ranges are // missing (and probably totally unimportant) ROM_REGION( 0x2000, "rom", 0 ) ROM_LOAD ( "cd-351-0.rom", 0x0000, 0x7c0, CRC(2c0159fd) SHA1(bab5395ed8bc7c06f9897897f836054e6546e8e8) ) ROM_LOAD ( "cd-351-1.rom", 0x0800, 0x7c0, CRC(8e58d159) SHA1(dcf992c96e7556b2faee6bacd3f744e56998e6ea) ) ROM_LOAD ( "cd-351-2.rom", 0x1000, 0x7c0, CRC(c9228b60) SHA1(179e10107d5be91e684069dee80f94847b83201f) ) ROM_LOAD ( "cd-351-3.rom", 0x1800, 0x7c0, CRC(3ca8e5dc) SHA1(7118636fb5c597c78c2fce17b02aed5e4ba38635) ) ROM_END void cd90_351_device::rom_map(address_map &map) { map(0x000, 0x7bf).bankr(m_rom_bank); } void cd90_351_device::io_map(address_map &map) { map(0x10, 0x17).m("thmfc1", FUNC(thmfc1_device::map)); map(0x18, 0x18).w(FUNC(cd90_351_device::bank_w)); } const tiny_rom_entry *cd90_351_device::device_rom_region() const { return ROM_NAME(cd90_351); } void cd90_351_device::floppy_drives(device_slot_interface &device) { device.option_add("dd90_352", FLOPPY_35_DD); // device.option_add("qd90_280", FLOPPY_28_QDD); } void cd90_351_device::floppy_formats(format_registration &fr) { fr.add_pc_formats(); fr.add(FLOPPY_THOMSON_35_FORMAT); fr.add(FLOPPY_SAP_FORMAT); } void cd90_351_device::device_add_mconfig(machine_config &config) { THMFC1(config, "thmfc1", 16000000); FLOPPY_CONNECTOR(config, "thmfc1:0", floppy_drives, "dd90_352", floppy_formats).enable_sound(true); FLOPPY_CONNECTOR(config, "thmfc1:1", floppy_drives, nullptr, floppy_formats).enable_sound(true); } void cd90_351_device::device_start() { m_rom_bank->configure_entries(0, 4, m_rom->base(), 0x800); } void cd90_351_device::device_reset() { m_rom_bank->set_entry(0); } void cd90_351_device::bank_w(u8 data) { logerror("bank_w %d\n", data & 3); m_rom_bank->set_entry(data & 3); } } // anonymous namespace DEFINE_DEVICE_TYPE_PRIVATE(CD90_351, thomson_extension_interface, cd90_351_device, "cd90_351", "Thomson CD 90-351 Diskette Controller")